1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.3.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Database\Type;
16:
17: use Cake\Database\Type;
18:
19: /**
20: * Offers a method to convert values to ExpressionInterface objects
21: * if the type they should be converted to implements ExpressionTypeInterface
22: *
23: */
24: trait ExpressionTypeCasterTrait
25: {
26: /**
27: * Conditionally converts the passed value to an ExpressionInterface object
28: * if the type class implements the ExpressionTypeInterface. Otherwise,
29: * returns the value unmodified.
30: *
31: * @param mixed $value The value to converto to ExpressionInterface
32: * @param string $type The type name
33: * @return mixed
34: */
35: protected function _castToExpression($value, $type)
36: {
37: if (empty($type)) {
38: return $value;
39: }
40:
41: $baseType = str_replace('[]', '', $type);
42: $converter = Type::build($baseType);
43:
44: if (!$converter instanceof ExpressionTypeInterface) {
45: return $value;
46: }
47:
48: $multi = $type !== $baseType;
49:
50: if ($multi) {
51: return array_map([$converter, 'toExpression'], $value);
52: }
53:
54: return $converter->toExpression($value);
55: }
56:
57: /**
58: * Returns an array with the types that require values to
59: * be casted to expressions, out of the list of type names
60: * passed as parameter.
61: *
62: * @param array $types List of type names
63: * @return array
64: */
65: protected function _requiresToExpressionCasting($types)
66: {
67: $result = [];
68: $types = array_filter($types);
69: foreach ($types as $k => $type) {
70: $object = Type::build($type);
71: if ($object instanceof ExpressionTypeInterface) {
72: $result[$k] = $object;
73: }
74: }
75:
76: return $result;
77: }
78: }
79: