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: /**
28: * Conditionally converts the passed value to an ExpressionInterface object
29: * if the type class implements the ExpressionTypeInterface. Otherwise,
30: * returns the value unmodified.
31: *
32: * @param mixed $value The value to converto to ExpressionInterface
33: * @param string $type The type name
34: * @return mixed
35: */
36: protected function _castToExpression($value, $type)
37: {
38: if (empty($type)) {
39: return $value;
40: }
41:
42: $baseType = str_replace('[]', '', $type);
43: $converter = Type::build($baseType);
44:
45: if (!$converter instanceof ExpressionTypeInterface) {
46: return $value;
47: }
48:
49: $multi = $type !== $baseType;
50:
51: if ($multi) {
52: return array_map([$converter, 'toExpression'], $value);
53: }
54:
55: return $converter->toExpression($value);
56: }
57:
58: /**
59: * Returns an array with the types that require values to
60: * be casted to expressions, out of the list of type names
61: * passed as parameter.
62: *
63: * @param array $types List of type names
64: * @return array
65: */
66: protected function _requiresToExpressionCasting($types)
67: {
68: $result = [];
69: $types = array_filter($types);
70: foreach ($types as $k => $type) {
71: $object = Type::build($type);
72: if ($object instanceof ExpressionTypeInterface) {
73: $result[$k] = $object;
74: }
75: }
76:
77: return $result;
78: }
79: }
80: