У меня есть отдельный AppController для внешнего API моего сайта. Я могу без проблем подключиться к API, используя Postman на моей локальной машине разработки, но как только я перемещаю файлы на тестовый или производственный сайт, я получаю 404 ошибки типа «Не удалось найти пользователей класса контроллера».
{
"message": "Controller class Users could not be found.",
"url": "/api/tv/users/index",
"code": 404,
"file": "/var/www/html/site/vendor/cakephp/cakephp/src/Http/ControllerFactory.php",
"line": 100
}
Ubuntu 16.04, Apache, PHP 7.
Код и среда на всех серверах (локальных, тестовых и производственных) должны быть одинаковыми, но они работают только на локальном компьютере. Я даже не знаю, какой код публиковать, но вот некоторые:
Тестовый код Api / TV / UsersController:
namespace App\Controller\Api\TV;
class UsersController extends AppController
{
public function index()
{
$this->set([
'message' => 'Why wont you work?',
'_serialize' => [
'message'
]
]);
}
}
Маршруты:
Router::prefix('api', function(RouteBuilder $routes) {
$routes->connect('/v2', [
'controller' => 'users',
'action' => 'login',
'_method' => 'GET'
]);
...
$routes->fallbacks('DashedRoute');
});
Router::prefix('api/v3', function(RouteBuilder $routes) {
$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');
});
Router::prefix('api/tv', function(RouteBuilder $routes) {
$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');
});
Как видите, у меня есть несколько разных API с разными префиксами. Только последний не работает (кроме локального).
Я здесь на грани своего остроумия. Я знать ответ смотрит мне прямо в лицо, но мне нужно, чтобы кто-то еще указал мне на это.
Все части ваших префиксов (разделенных /
) изменяются с использованием Inflector::camelize()
, что означает, что api/tv
становится Api/Tv
для поиска в файловой системе и Api\Tv
для поиска в пространстве имен, поэтому ваш путь и пространство имен неверны, поскольку Tv
не будет соответствовать TV
на файловые системы, чувствительные к регистру.
Короче говоря, переименуйте папку TV
и часть пространства имен в Tv
.
Видишь ли, я сказал тебе, что это будет что-то простое. Спасибо! Я до сих пор не понимаю, почему это работает в моей среде разработки. Та же операционная система и настройка сервера.
Несмотря на то, что проблема кажется очевидной, всегда полезно размещать информацию о различных системах (ОС, PHP, Сервер, ...).