Опция автозагрузки плагина CakePhp3.7 недоступна - PullRequest
0 голосов
/ 31 мая 2019

До CakePhp3.7 можно было загрузить плагин с помощью опции автозагрузки:

Plugin::load('ContactManager', ['autoload' => true]);

Это было очень полезно, если вы не могли (или не хотели) использовать composer для автозагрузки плагинов.

Начиная с версии 3.7.0: Plugin :: load () и опция автозагрузки устарели.

$this->addPlugin('ContactManager');

Должен использоваться вместо Plugin :: load. Но опция автозагрузки недоступна в addPlugin ().

Как я могу скопировать функцию автозагрузки в CakePhp3.7 без использования composer?

1 Ответ

1 голос
/ 31 мая 2019

Ну, вы ничего не можете сделать, кроме как повторно реализовать / реплицировать то, что делает Plugin::load(), то есть зарегистрировать автозагрузчик, см .:

Например, вы можете поместить его в свой Application класс:

use Cake\Core\ClassLoader;
use Cake\Core\Plugin;

// ...

class Application extends BaseApplication
{
    // ...

    protected static $_loader;

    public function bootstrap()
    {
        // ...

        $this->addPlugin('ContactManager', ['autoload' => true]);
    }

    public function addPlugin($name, array $config = [])
    {
        parent::addplugin($name, $config);

        $config += [
            'autoload' => false,
            'classBase' => 'src',
        ];

        if ($config['autoload'] === true) {
            if (!isset($config['path'])) {
                $config['path'] = Plugin::getCollection()->findPath($name);
            }

            if (empty(static::$_loader)) {
                static::$_loader = new ClassLoader();
                static::$_loader->register();
            }
            static::$_loader->addNamespace(
                str_replace('/', '\\', $name),
                $config['path'] . $config['classBase'] . DIRECTORY_SEPARATOR
            );
            static::$_loader->addNamespace(
                str_replace('/', '\\', $name) . '\Test',
                $config['path'] . 'tests' . DIRECTORY_SEPARATOR
            );
        }

        return $this;
    }

    // ...
}

Пока \Cake\Core\ClassLoader неустарела, но это может стать в какой-то момент, так что вам, возможно, придется заново это реализовать.

...