【发布时间】:2018-04-11 10:31:38
【问题描述】:
我有一个 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 中,应用程序被设置为带有 mod rewrite 的别名 - 在 WAMP 和 CentOS 服务器上:
http://server-or-localhost/myapp/
本地和服务器的区别:
- 服务器是Linux,大写/小写问题?
- 相同的 PHP 版本,但 也许服务器 PHP 上缺少一些模块?
- 服务器将http重定向到https
【问题讨论】:
-
在大多数情况下,这是一个区分大小写的问题,因此您必须显示相关的控制器文件内容和名称。此外,无论何时收到错误,请始终发布 complete 错误,即包括 full 堆栈跟踪(最好是复制从日志中以正确可读的方式提供),以及错误页面的屏幕截图,因为它可能包含更多详细信息。
-
查看错误页面,您的控制器命名空间/类/文件名看起来像那里显示的示例吗?
-
是的,确实如此 - 在上面添加了它。
-
路径/文件名匹配吗?你确定你已经部署了文件吗?如果两者都为真,则检查权限是否允许服务器/PHP 读取文件。还可以尝试在新服务器上减少自动加载器。
-
路径/文件名匹配我相信 - 我粘贴了错误消息中的路径并且文件在那里。所以我认为确认文件已部署。许可就好了。它是 CakePHP 3.2 和 PHP 7。
标签: php cakephp cakephp-3.0