У меня есть приложение CakePHP 3 и разные плагины. Плагины загружаются и обращаются к ним на машине разработчика Windows, WAMP, все работает нормально.
Попав на сервер CentOS, префиксная маршрутизация плагина, например, 'admin', перестает работать, получая ошибку отсутствующего контроллера:
Ошибка журнала:
2018-04-11 12:40:23 Error: [Cake\Routing\Exception\MissingControllerException] Controller class Contacts could not be found.
Exception Attributes: array (
'class' => 'Contacts',
'plugin' => 'Contacts',
'prefix' => 'admin',
'_ext' => NULL,
)
Request URL: /myapp/contacts/admin/contacts
Referer URL: https://***/myapp/anotherplugin/participants
Stack Trace:
#0 /srv/www/myapp/myapp-app/webroot/index.php(36): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
#1 /srv/www/myapp/myapp-app/index.php(16): require('/srv/www/mya...')
#2 {main}
Контроллер существует и содержит:
namespace Contacts\Controller\Admin;
use Contacts\Controller\AppController;
use Cake\ORM\TableRegistry;
use Authentication\Utility\TimeUtility;
use Cake\I18n\Time;
use Cake\Core\Configure;
class ContactsController extends AppController{
Маршрутизация без префикса кажется временем. Плагины добавляются в bootstrap.php следующим образом:
Plugin::load('Contacts', ['bootstrap' => false, 'routes' => true]);
В файле маршрутизации плагинов:
<?php
use Cake\Routing\Router;
Router::plugin('Contacts', function ($routes) {
$routes->fallbacks('InflectedRoute');
});
Router::plugin('Contacts', function ($routes) {
$routes->prefix('admin', function ($routes) {
$routes->fallbacks('InflectedRoute');
});
});
В Apache приложение настраивается как псевдоним с перезаписью мода - как на WAMP, так и на сервере CentOS:
http://server-or-localhost/myapp/
Различия между локальным и серверным:
Глядя на страницу с ошибкой, выглядит ли ваше пространство имен / класс / имя файла контроллера как показанный там пример?
Да, есть - добавлено выше.
И соответствует ли путь / имя файла? И вы уверены, что развернули файл? Если оба значения верны, проверьте, позволяют ли разрешения серверу / PHP читать файл. Также попробуйте перенаправить автозагрузчик на новый сервер.
Я считаю, что путь / имя файла совпадает - я вставил путь из сообщения об ошибке, и файл был там. Думаю, это подтверждает, что файл развернут. Разрешение в порядке. Это CakePHP 3.2 и PHP 7.
Взрыв! Убедитесь, что в вашем CakePHP версии 3.2.0 есть эта ошибка. Исправлено в 3.2.1.
https://bakery.cakephp.org/2016/01/30/cakephp_3110_and_321_released.html
Теперь работает.
В большинстве случаев это проблема чувствительности к регистру, поэтому вам нужно будет показать содержимое и имена задействованных файлов контроллера. Также при получении ошибок всегда публикуйте ошибка полный, то есть включая трассировку стека полный (в идеале скопированный из журналов, где он доступен в удобочитаемом виде), и снимок экрана страницы с ошибкой, поскольку он может содержать дополнительную информацию.