CakePHP 4: URL-адрес маршрута CakePHP Отсутствует маршрут

Я использую плагин аутентификации для входа в cakephp.

application.php, код метода configAuth()

protected function configAuth(): \Authentication\AuthenticationService
    {
        $authenticationService = new \Authentication\AuthenticationService([
            // 'unauthenticatedRedirect' => '/cake_invo/users/login' , //<= manually working fine
            'unauthenticatedRedirect' => \Cake\Routing\Router::url(['controller' => 'Users', 'action' => 'login']),
            'queryParam' => 'redirect',
        ]);

        // Load identifiers, ensure we check email and password fields
        $authenticationService->loadIdentifier('Authentication.Password', [
            'fields' => [
                'username' => 'email',
                'password' => 'password',
            ]
        ]);

        // Load the authenticators, you want session first
        $authenticationService->loadAuthenticator('Authentication.Session');
        // Configure form data check to pick email and password
        $authenticationService->loadAuthenticator('Authentication.Form', [
            'fields' => [
                'username' => 'email',
                'password' => 'password',
            ],
            // 'loginUrl' => '/cake_invo/users/login'  //<= manually working fine
            'loginUrl' => \Cake\Routing\Router::url(['controller' => 'Users', 'action' => 'login']),
        ]);

        return $authenticationService;
    }

метод промежуточного программного обеспечения

public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
        $middlewareQueue

            ->add(new ErrorHandlerMiddleware(Configure::read('Error')))

            ->add(new AssetMiddleware([
                'cacheTime' => Configure::read('Asset.cacheTime'),
            ]))

            ->add(new RoutingMiddleware($this))
            // add Authentication after RoutingMiddleware
            ->add(new \Authentication\Middleware\AuthenticationMiddleware($this->configAuth()));

        return $middlewareQueue;
    }

Получение ошибки как изображение

Как я могу решить эту проблему?

После подачи команды bin/cake routes

1 ответ

Решение

Проблема в том, что ваши маршруты еще не загружены, когда вы вызываете Router::url(), следовательно, он потерпит неудачу.

Хотя порядок промежуточного программного обеспечения правильный, то есть промежуточное ПО для аутентификации добавляется после промежуточного ПО маршрутизации, вы создаете службу аутентификации немедленно, вызывая $this->configAuth(), что означает, что Router::url() call будет вызываться до запуска какого-либо промежуточного программного обеспечения, особенно до запуска промежуточного программного обеспечения маршрутизации, которое отвечает за загрузку ваших маршрутов.

Вместо передачи встроенного экземпляра службы аутентификации настройте все, как показано в документации, то есть убедитесь, что вашApplication класс реализует \Authentication\AuthenticationServiceProviderInterfaceизмените свой configAuth метод соответствия AuthenticationServiceProviderInterface::getAuthenticationService(), а затем пройти $thisвместо этого конструктору промежуточного программного обеспечения аутентификации. Таким образом, метод будет вызываться только при запуске промежуточного программного обеспечения аутентификации, то есть после промежуточного программного обеспечения маршрутизации.

// ...
use Authentication\AuthenticationServiceInterface;
use Authentication\AuthenticationServiceProviderInterface;
use Cake\Http\BaseApplication;
use Psr\Http\Message\ServerRequestInterface;

class Application extends BaseApplication implements AuthenticationServiceProviderInterface
{
    // ...

    public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
    {
        // ...
        return $authenticationService;
    }

    public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
    {
        $middlewareQueue
            // ...
            ->add(new RoutingMiddleware($this))
            ->add(new AuthenticationMiddleware($this));

        return $middlewareQueue;
    }

    // ...
}
Другие вопросы по тегам