cakephp 4 - Компонент аутентификации не найден при выпечке нового контроллера

Я не могу использовать выпечку торта, у меня ошибка относительно компонента аутентификации. Приложение использует этот компонент. Что я упустил?

Вот полный журнал:

bin/cake bake controller styles                                         1 ↵
Baking controller class for Styles...

Creating file /opt/applications/p35/src/Controller/StylesController.php
Wrote `/opt/applications/p35/src/Controller/StylesController.php`
Bake is detecting possible fixtures...
Exception: The request object does not contain the required `authentication` attribute
In [/opt/applications/p35/vendor/cakephp/authentication/src/Controller/Component/AuthenticationComponent.php, line 141]

2020-03-13 18:20:25 Error: [Exception] The request object does not contain the required `authentication` attribute in /opt/applications/p35/vendor/cakephp/authentication/src/Controller/Component/AuthenticationComponent.php on line 141
Stack Trace:
- /opt/applications/p35/vendor/cakephp/authentication/src/Controller/Component/AuthenticationComponent.php:229
- /opt/applications/p35/src/Controller/AppController.php:82
- /opt/applications/p35/vendor/cakephp/cakephp/src/Controller/Controller.php:212
- /opt/applications/p35/vendor/cakephp/bake/src/Command/TestCommand.php:339
- /opt/applications/p35/vendor/cakephp/bake/src/Command/TestCommand.php:245
- /opt/applications/p35/vendor/cakephp/bake/src/Command/TestCommand.php:120
- /opt/applications/p35/vendor/cakephp/bake/src/Command/ControllerCommand.php:201
- /opt/applications/p35/vendor/cakephp/bake/src/Command/ControllerCommand.php:147
- /opt/applications/p35/vendor/cakephp/bake/src/Command/ControllerCommand.php:64
- /opt/applications/p35/vendor/cakephp/cakephp/src/Console/BaseCommand.php:175
- /opt/applications/p35/vendor/cakephp/cakephp/src/Console/CommandRunner.php:336
- /opt/applications/p35/vendor/cakephp/cakephp/src/Console/CommandRunner.php:171
- /opt/applications/p35/bin/cake.php:12

Благодарность

И строка 82 AppController.php в публичной функции initialize()

76    $this->loadComponent('Authentication.Authentication',[
77              'requireIdentity'=>true,
78              'logoutRedirect' => '/users/login']);
79
80
81    $this->user=$this->Authentication->getIdentity();
82        $result = $this->Authentication->getResult();
83        if ($result->isValid()) {
84          $identity=$this->Authentication->getIdentity();
85
            ...

person dype    schedule 13.03.2020    source источник
comment
Какую именно версию плагина аутентификации вы используете? Найдите "cakephp/authentication" в файле composer.lock, если вы не уверены.   -  person ndm    schedule 13.03.2020
comment
Кроме того, что именно делает строка 82 в вашем AppController и в каком контексте она находится?   -  person ndm    schedule 13.03.2020
comment
имя: cakephp/authentication, версия: 2.1.0, grep authentication composer.json cakephp/authentication: ^2.0,   -  person dype    schedule 14.03.2020
comment
Я обновил исходный пост строкой 82   -  person dype    schedule 14.03.2020
comment
Видя, откуда в родительском объекте он вызывается, я предполагаю, что код находится в методе контроллера initialize()?   -  person ndm    schedule 14.03.2020
comment
Да, il находится в инициализации.   -  person dype    schedule 14.03.2020


Ответы (1)


При запекании тестов контроллера Baking создаст экземпляр связанного класса контроллера, чтобы получить модель по умолчанию для этого контроллера. Он использует эту модель для отображения связанного прибора, который добавляется к свойству $fixtures сгенерированного тестового примера контроллера. .

При создании экземпляра контроллера его метод initialize() будет вызываться во время построения, и именно здесь начинается проблема. Вы вызываете $this->Authentication->getResult() в методе initialize() вашего контроллера, в результате чего компонент проверки подлинности ищет необходимые данные проверки подлинности в объекте запроса, прикрепленном к контроллеру, и, конечно же, он не находит такие данные, поскольку проверка подлинности не выполнялась.

Вместо этого вы должны переместить логику, которая вызывает компонент аутентификации, в метод обратного вызова контроллера beforeFilter(), этот метод по умолчанию будет выполняться только тогда, когда фабрика контроллера или обработчик исключений вызывает метод контроллера startupProcess(), который обычно находится либо в фактическом контексте HTTP-запроса, или в контексте модульного теста, где могут быть предоставлены, возможно, необходимые данные аутентификации.

Смотрите также

person ndm    schedule 14.03.2020
comment
спасибо за эти объяснения, это очень ясно, и это решает мою проблему. - person dype; 15.03.2020