我正在创建一个我希望在我的应用程序的管理部分中集成的插件。我的管理部分的应用程序结构如下所示:
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
,看起来就像上面的博客控制器,它也使用了应用中的AdminsController
:plugin/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.
,但插件中的Controller
和Controller/Admin
都有一个Feedbacks类。
不确定还有什么可以尝试。任何想法将不胜感激!
答案 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部分。