是否可以使用CakePHP3在插件中创建插件?

时间:2017-01-09 16:07:24

标签: cakephp-3.0

我想在 Cakephp3 的插件中创建一个插件。我找到了Cakephp2的解决方案,但它似乎在Cakephp3中无效:

Is it possible to create a plugin inside a plugin with CakePHP?

我怎么能在Cakephp3中做到这一点?

1 个答案:

答案 0 :(得分:1)

我将假设您的问题是在CakePHP 3.x应用程序中插入加载插件,而不是创建插件: - )

注意:这个答案假定您使用composer安装了Cake。

举个例子,假设我们想要创建一个插件主题,这个插件将包含其他插件,蓝色红色

按照惯例,主题插件应包含在 your_app / plugins / Themes 蓝色红色插件可以分别包含在 your_app / plugins / Themes / plugins / Blue your_app / plugins / Themes / plugins / Red 中。

your_app / config / bootstrap.php 中,添加以下内容:

Plugin::load('Themes', ['bootstrap' => true]);

(有关插件配置的信息,请参阅https://book.cakephp.org/3.0/en/plugins.html#plugin-configuration

上面的代码告诉Cake加载Themes插件,并查找并加载插件的bootstrap文件。

如果您还没有这样做,请在 your_app / plugins / Themes / config / bootstrap.php 中创建Themes插件的引导程序文件,并使其看起来类似于:

<?php

use Cake\Core\Plugin;

// load the red and blue child plugins
Plugin::load('Themes/plugins/Red');
Plugin::load('Themes/plugins/Blue');

重要:由于您尝试手动编写插件而不是通过编辑器进行安装,因此您需要修改 your_app / composer.json 以包含某些内容像:

"autoload": {
    "psr-4": {
        "App\\": "src",
        "Red\\": "./plugins/Themes/plugins/Red/src",
        "Blue\\": "./plugins/Themes/plugins/Blue/src"
    }
}

(有关自动加载插件类的详细信息,请参阅https://book.cakephp.org/3.0/en/plugins.html#autoloading-plugin-classes。)

现在,从 your_app / 中运行:

php composer.phar dumpautoload

(或等效命令,具体取决于计算机在计算机上的安装方式)

这告诉作曲家刷新自动加载缓存。如果您要检查 your_app / vendor / cakephp-plugins.php ,您应该会看到Themes插件文件夹的路径已添加到预先存在的插件路径列表中。

现在,在应用程序的主控制器中,您应该可以拥有以下内容:

public function initialize()
{
    // load (supposedly-existing) components from the "Red" or "Blue" themes
    // load GradientComponent of the "Red" theme
    $this->loadComponent('Red.Gradient');

    // load ColorComponent of the "Blue" theme
    $this->loadComponent('Blue.Color');

    // use what you asked for...
    $this->Color->someMethod(['data']);

    parent::initialize();
}

另外,要使用视图文件(您希望主题插件提供:-)):

public function beforeRender(Event $event)
{
    // use the "home" layout from the Red theme
    $this->viewBuilder()->setLayout('Themes/plugins/Red.home');

    parent::beforeRender($event);
}