Торт PHP 4: Торт PHP Маршрут URL-адрес Отсутствует маршрут - PullRequest
0 голосов
/ 04 февраля 2020

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

приложение. 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;
    }

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

enter image description here

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

После выдачи команды bin / торт маршрутов

enter image description here

1 Ответ

2 голосов
/ 05 февраля 2020

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

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

Вместо передачи встроенного экземпляра службы аутентификации настройте параметры , как показано в документе , то есть убедитесь, что ваш 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;
    }

    // ...
}
...