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\Datasource;
16:
17: use Cake\ORM\TableRegistry;
18: use InvalidArgumentException;
19:
20: /**
21: * Class FactoryLocator
22: */
23: class FactoryLocator
24: {
25: /**
26: * A list of model factory functions.
27: *
28: * @var callable[]
29: */
30: protected static $_modelFactories = [];
31:
32: /**
33: * Register a callable to generate repositories of a given type.
34: *
35: * @param string $type The name of the repository type the factory function is for.
36: * @param callable $factory The factory function used to create instances.
37: * @return void
38: */
39: public static function add($type, callable $factory)
40: {
41: static::$_modelFactories[$type] = $factory;
42: }
43:
44: /**
45: * Drop a model factory.
46: *
47: * @param string $type The name of the repository type to drop the factory for.
48: * @return void
49: */
50: public static function drop($type)
51: {
52: unset(static::$_modelFactories[$type]);
53: }
54:
55: /**
56: * Get the factory for the specified repository type.
57: *
58: * @param string $type The repository type to get the factory for.
59: * @throws \InvalidArgumentException If the specified repository type has no factory.
60: * @return callable The factory for the repository type.
61: */
62: public static function get($type)
63: {
64: if (!isset(static::$_modelFactories['Table'])) {
65: static::$_modelFactories['Table'] = [TableRegistry::getTableLocator(), 'get'];
66: }
67:
68: if (!isset(static::$_modelFactories[$type])) {
69: throw new InvalidArgumentException(sprintf(
70: 'Unknown repository type "%s". Make sure you register a type before trying to use it.',
71: $type
72: ));
73: }
74:
75: return static::$_modelFactories[$type];
76: }
77: }
78: