CakePHP 3 "Контроллер класса XYZ не найден." только на производственном сервере - PullRequest
0 голосов
/ 02 мая 2018

У меня есть отдельный 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.

Код и среда на всех серверах (локальный dev, test и production) должны быть одинаковыми, но он работает только на локальной машине. Я даже не знаю, какой код отправлять, но вот некоторые:

Тестовый код 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 с разными префиксами. Только последний не работает (кроме локально).

Я нахожусь в конце моего остроумия здесь. Я знаю ответ смотрит мне прямо в лицо, но мне нужен кто-то еще, чтобы указать мне на это.

1 Ответ

0 голосов
/ 02 мая 2018

Все части ваших префиксов (разделенные /) изменяются с использованием Inflector::camelize(), что означает, что api/tv становится Api/Tv для поиска в файловой системе и Api\Tv для поиска в пространстве имен, поэтому ваш путь и ваше пространство имен неверно, так как Tv не будет совпадать с TV в чувствительных к регистру файловых системах.

Короче говоря, переименуйте вашу папку TV и часть пространства имен в Tv.

...