【问题标题】:cakephp3 load plugin for special prefixcakephp3 为特殊前缀加载插件
【发布时间】:2017-11-16 15:43:21
【问题描述】:

我有 Cakephp 3 应用程序,我想加载这个插件和它下面的事件监听器只是为了管理员前缀。 (不是整个项目)。

我怎样才能做到这一点?

这是我的

配置/bootstrap.php

我在哪里加载这个插件。 (我在文件末尾加载这些)

...

Plugin::load('Josegonzalez/Upload');

\Cake\Event\EventManager::instance()->on(new \App\Controller\Event\AppEventListener());

我希望这些仅在管理员前缀上运行

【问题讨论】:

    标签: cakephp plugins prefix


    【解决方案1】:

    您不能有条件地运行基于 boostrap.php 内的 routing 的代码,因为您的应用的路由配置尚未加载。

    你必须这样做老派风格并使用$_SERVER['REQUEST_URI']

    $url = $_SERVER['REQUEST_URI'];
    $admin = '/admin/';
    if(substr($url, 0, strlen($admin)) === $admin) {
        Plugin::load('Josegonzalez/Upload');
        \Cake\Event\EventManager::instance()->on(new \App\Controller\Event\AppEventListener());
    }
    

    更新

    你的插件应该有它自己的引导文件。其中包含

    上传/config/bootstrap.php:

    \Cake\Event\EventManager::instance()->on(new \App\Controller\Event\AppEventListener());
    

    然后,应用程序的引导程序会告诉 CakePHP 在加载插件时包含引导程序。

    App/config/bootstrap.php:

        Plugin::load('Josegonzalez/Upload', ['bootstrap' => true]);
    

    你不应该有条件地加载你的插件。

    我认为您正在搜索对插件请求的身份验证。您希望仅授权管理员使用您的插件。这不是插件问题。这是一个身份验证问题,您应该使用插件中的身份验证组件来验证请求是否有效,并且当前用户是管理员。

    【讨论】:

    • 谢谢。还有其他地方可以加载此事件侦听器(我可以使用 cakephp 的工具来执行此操作吗?使用 $_SERVER 感觉不好(此事件正在使用“Model.initialize”顺便说一句)
    • 没有。我不需要此插件的身份验证。我的应用程序包含 2 部分。第一个是管理网络面板,第二个是普通用户的网站。在管理面板中,我需要上传照片,但我不需要在网站主页中使用它(上传插件)。这就是为什么我想为管理员前缀加载这个插件。并且 eventListener 正在处理为管理面板加载所需的行为(例如我的自定义时间戳和.....)。这与访问管理无关,我希望它仅在我处于管理员前缀时才为我的模型加载(因为我的模型对于管理员和主站点是相同的)
    【解决方案2】:

    引用 cakephp 插件文档https://book.cakephp.org/3.0/en/plugins.html#plugin-routes

    您还可以在应用程序的路由列表中加载插件路由。这样做可以让您更好地控制插件路由的加载方式,并允许您将插件路由包装在其他范围或前缀中。

    所以你可以这样做

      Router::scope('/', function ($routes) {
           // Connect other routes.
            $routes->scope('/admin', function ($routes) {
            $routes->loadPlugin('Josegonzalez/Upload');
           });
           });
    

    对于您的事件监听器,将其加载到插件引导配置中

        // inside plugin bootstra.php
        \Cake\Event\EventManager::instance()->on(new 
         \App\Controller\Event\AppEventListener());
    

    【讨论】:

    • 非常感谢。我读了几次那个文档,我不知道我是怎么错过的。我可以在 AdminAppController (所有管理控制器都在扩展它的控制器)中加载事件侦听器吗? (考虑是“Model.initialize”事件)
    • @hamidreza 是的,只需将实现方法implementedEvents 描述为doc 即可
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    相关资源
    最近更新 更多