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.1.2
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Database\Type;
16:
17: use Cake\Database\Driver;
18: use Cake\Database\Type;
19: use Cake\Database\TypeInterface;
20: use InvalidArgumentException;
21: use PDO;
22:
23: /**
24: * String type converter.
25: *
26: * Use to convert string data between PHP and the database types.
27: */
28: class StringType extends Type implements OptionalConvertInterface, TypeInterface
29: {
30: /**
31: * Convert string data into the database format.
32: *
33: * @param mixed $value The value to convert.
34: * @param \Cake\Database\Driver $driver The driver instance to convert with.
35: * @return string|null
36: */
37: public function toDatabase($value, Driver $driver)
38: {
39: if ($value === null || is_string($value)) {
40: return $value;
41: }
42:
43: if (is_object($value) && method_exists($value, '__toString')) {
44: return $value->__toString();
45: }
46:
47: if (is_scalar($value)) {
48: return (string)$value;
49: }
50:
51: throw new InvalidArgumentException(sprintf(
52: 'Cannot convert value of type `%s` to string',
53: getTypeName($value)
54: ));
55: }
56:
57: /**
58: * Convert string values to PHP strings.
59: *
60: * @param mixed $value The value to convert.
61: * @param \Cake\Database\Driver $driver The driver instance to convert with.
62: * @return string|null
63: */
64: public function toPHP($value, Driver $driver)
65: {
66: if ($value === null) {
67: return null;
68: }
69:
70: return (string)$value;
71: }
72:
73: /**
74: * Get the correct PDO binding type for string data.
75: *
76: * @param mixed $value The value being bound.
77: * @param \Cake\Database\Driver $driver The driver.
78: * @return int
79: */
80: public function toStatement($value, Driver $driver)
81: {
82: return PDO::PARAM_STR;
83: }
84:
85: /**
86: * Marshals request data into PHP strings.
87: *
88: * @param mixed $value The value to convert.
89: * @return string|null Converted value.
90: */
91: public function marshal($value)
92: {
93: if ($value === null) {
94: return null;
95: }
96: if (is_array($value)) {
97: return '';
98: }
99:
100: return (string)$value;
101: }
102:
103: /**
104: * {@inheritDoc}
105: *
106: * @return boolean False as database results are returned already as strings
107: */
108: public function requiresToPhpCast()
109: {
110: return false;
111: }
112: }
113: