2015-12-30 3 views
3

Я создаю плагин, который я хочу интегрировать в раздел администрирования моего приложения. Моя структура приложения для секции администратора выглядит следующим образом:CakePHP 3 - Admin Routing to Plugin Not Working

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 в плагине.

Не уверен, что еще попробовать. Любые идеи были бы хорошы!

ответ

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']); 
    }); 
}); 

В сочетании с маршрутами, добавленных к Файл route.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'); 
}); 

Я не уверен, что это лучший способ, но он работает в настоящее время.

+0

Вот как я сделал это для [me] (https://github.com/dereuromark/cakephp-sandbox/blob/3.0/plugins/Sandbox/config/routes.php). – mark

+0

Спасибо, Марк. Хотелось, чтобы я раньше встретил ваш процесс. Это спасло бы мне несколько часов головной боли. :) –

+0

В дополнение к этим изменениям маршрута мне пришлось внести некоторые изменения в мой файл composer.json. [См. Раздел «Поваренная книга» в разделе «Автозагрузка плагинов»] (https://book.cakephp.org/3.0/en/plugins.html#autoloading-plugin-classes) –

2

Неправильный номер FeebacksController namespace declaration. Оно должно быть:

namespace AkkaFeedback\Controller\Admin; 

use App\Controller\Admin\AdminsController; 

class FeebacksController extends AdminsController {` 
+0

Спасибо за это! Это несколько работает, но теперь я сталкиваюсь с другой проблемой маршрутизации. Я получаю следующую ошибку: массив «Соответствие маршрута» ('controller' => 'Users', 'action' => 'login', 'prefix' => 'admin', 'plugin' => 'AkkaFeedback', ' _ext '=> NULL,) "не удалось найти. '. Кажется, что он имеет какое-то отношение к разрешению, однако для тестирования я добавил '$ this-> Auth-> allow();' в 'beforeFilter()', но по-прежнему возникает такая же проблема. –

+0

@AndreS, что ошибка auth связана с тем, что компонент auth пытается перенаправить на страницу входа, а ваш ключ 'loginAction', вероятно, специально не говорит * not *, чтобы использовать плагин. Зайдите http://book.cakephp.org/3.0/en/controllers/components/authentication.html (search loginAction) – jeremyharris

+0

@jeremyharris Спасибо за ваш вклад. Я подозревал, что это из-за этого, хотя я специально рассказывал Application, чтобы не заботиться о том, кто обращается к этому контроллеру плагина с помощью '$ this-> Auth-> allow()'. Оказалось, приложение перенаправлялось еще до того, как оно попало в контроллер, потому что мои маршруты не были настроены правильно. Все хорошо сейчас! –

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 в корневом проекте, а также в плагине.