CakePHP 3 - 管理员路由到插件不工作

时间:2015-12-30 22:43:51

标签: cakephp cakephp-3.0

我正在创建一个我希望在我的应用程序的管理部分中集成的插件。我的管理部分的应用程序结构如下所示:

src/Controller/Admin/AdminsController.php
src/Controller/Admin/ProductsController.php
src/Controller/Admin/BlogsController.php

AdminsController.php看起来像这样:

namespace App\Controller\Admin;

use App\Controller\AppController;
use Cake\Event\Event;
use Cake\Network\Exception\ForbiddenException;

class AdminsController extends AppController{

我的管理员控制器,即BlogsController.php看起来像这样:

namespace App\Controller\Admin;

use App\Controller\Admin\AdminsController;

class BlogsController extends AdminsController {

我的插件有FeedbacksController,看起来就像上面的博客控制器,它也使用了应用中的AdminsControllerplugin/AkkaFeedback/src/Controller/Admin/FeedbacksController.php

namespace App\Controller\Admin;

use App\Controller\Admin\AdminsController;

class FeedbacksController extends AdminsController {`

另外,在我的插件中,我有plugin/AkkaFeedback/src/Controller/FeedbacksController.php

我的意图是/admin/feedbacks指向此控制器。这甚至可以在CakePHP中实现吗?我尝试了许多可能性而没有成功。以下是我尝试过的以及其他没有成功的事情:

Router::prefix('admin', function ($routes) {
    $routes->connect('/', ['controller' => 'Dashboards', 'action' => 'index']);

    $routes->connect('/feedbacks', ['plugin' => 'AkkaFeedback', 'controller' => 'Feedbacks', 'action' => 'index']);

    // I have tried this
    //$routes->connect('/feedbacks', ['plugin' => 'AkkaFeedback', 'controller' => 'Feedbacks', 'action' => 'index', 'prefix' => 'admin']); // I have also tried this

    // And this without succcess
    // /admin/akka_feedback/feedbacks
    // $routes->plugin('AkkaFeedback', function ($routes) {
    //    $routes->connect('/:controller');
    // });

    $routes->fallbacks('InflectedRoute');
});

我得到的错误是:Controller class Feedbacks could not be found.,但插件中的ControllerController/Admin都有一个Feedbacks类。

不确定还有什么可以尝试。任何想法将不胜感激!

3 个答案:

答案 0 :(得分:3)

经过一些研究之后,我可以通过在插件的routes.php文件plugins/AkkaFeedback/config/routes.php中添加以下内容来使其工作:

Router::prefix('admin', function ($routes) {
    $routes->plugin('AkkaFeedback', function ($routes) {
        $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => 'DashedRoute']);
        $routes->connect('/:controller/:action/*', [], ['routeClass' => 'DashedRoute']);
    });
});

与添加到应用程序的routes.php文件的路由一起使用。config/routes.php

Router::prefix('admin', function ($routes) {
    $routes->connect('/', ['controller' => 'Dashboards', 'action' => 'index']);
    $routes->connect('/feedbacks', ['plugin' => 'AkkaFeedback', 'controller' => 'Feedbacks', 'action' => 'index']);
    $routes->connect('/feedbacks/:action/*', ['plugin' => 'AkkaFeedback', 'controller' => 'Feedbacks']);

    $routes->fallbacks('InflectedRoute');
});

我不确定这是不是最好的方法,但它现在有效。

答案 1 :(得分:2)

您的FeebacksController namespace declaration不正确。它应该是:

namespace AkkaFeedback\Controller\Admin;

use App\Controller\Admin\AdminsController;

class FeebacksController extends AdminsController {`

答案 2 :(得分:1)

config/routes.php

Router::prefix('admin', function ($routes) {
    $routes->fallbacks(DashedRoute::class);
});

plugins/CustomPlugin/config/routes.php

Router::prefix('admin', function ($routes) {
    $routes->plugin('CustomPlugin', ['path' => '/custom-plugin'], function ($routes) {
        $routes->fallbacks(DashedRoute::class);
    });
});

这似乎是最好的方法,它运作正常。 通过这种方式,我可以在根项目中以及插件中有一个Admin部分。