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;
}
// ...
}