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.6.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Routing\Route;
16:
17: use ArrayAccess;
18: use RuntimeException;
19:
20: /**
21: * Matches entities to routes
22: *
23: * This route will match by entity and map its fields to the URL pattern by
24: * comparing the field names with the template vars. This makes it easy and
25: * convenient to change routes globally.
26: */
27: class EntityRoute extends Route
28: {
29: /**
30: * Match by entity and map its fields to the URL pattern by comparing the
31: * field names with the template vars.
32: *
33: * If a routing key is defined in both `$url` and the entity, the value defined
34: * in `$url` will be preferred.
35: *
36: * @param array $url Array of parameters to convert to a string.
37: * @param array $context An array of the current request context.
38: * Contains information such as the current host, scheme, port, and base
39: * directory.
40: * @return bool|string Either false or a string URL.
41: */
42: public function match(array $url, array $context = [])
43: {
44: if (empty($this->_compiledRoute)) {
45: $this->compile();
46: }
47:
48: if (isset($url['_entity'])) {
49: $entity = $url['_entity'];
50: $this->_checkEntity($entity);
51:
52: foreach ($this->keys as $field) {
53: if (!isset($url[$field]) && isset($entity[$field])) {
54: $url[$field] = $entity[$field];
55: }
56: }
57: }
58:
59: return parent::match($url, $context);
60: }
61:
62: /**
63: * Checks that we really deal with an entity object
64: *
65: * @throws \RuntimeException
66: * @param \ArrayAccess|array $entity Entity value from the URL options
67: * @return void
68: */
69: protected function _checkEntity($entity)
70: {
71: if (!$entity instanceof ArrayAccess && !is_array($entity)) {
72: throw new RuntimeException(sprintf(
73: 'Route `%s` expects the URL option `_entity` to be an array or object implementing \ArrayAccess, but `%s` passed.',
74: $this->template,
75: getTypeName($entity)
76: ));
77: }
78: }
79: }
80: