CakePhp3.7插件自动加载选项不可用

时间:2019-05-30 22:46:46

标签: cakephp cakephp-3.x

在CakePhp3.7之前,可以使用自动加载选项加载插件:

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

如果您不能(或不想)使用作曲家来自动加载插件,这将非常有用。

从3.7.0版开始:不推荐使用Plugin :: load()和autoload选项。

$this->addPlugin('ContactManager');

应该代替Plugin :: load使用。但是autoload选项在addPlugin()上不可用。

如何在不使用作曲家的情况下复制CakePhp3.7中的自动加载功能?

1 个答案:

答案 0 :(得分:1)

好吧,除了重新实现/复制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,但它可能会在某一时刻出现,因此您可能也必须重新实现。