Может ли кто-нибудь помочь мне разобраться с сделкой с Cakephp 3.3 и проблемой BeforeFilter/Auth Redirect, с которой я столкнулся.CakePHP3 BeforeFilter & Auth Redirect
Я использую компонент Auth по умолчанию. Я создал настраиваемый компонент, который дополнительно проверяет переменную сеанса (Registration), и если эта переменная не задана, перенаправляется на страницу, предназначенную для выбора, чтобы установить желаемую регистрацию.
Вот мой пользовательский компонент:
<?php
namespace App\Controller\Component;
use Cake\Controller\Component;
use Cake\Network\Request;
class RegistrationCheckComponent extends Component
{
private $_allowedActions = [];
private $_superUserBypass = false;
public $components = ['Auth'];
public function superUserBypass($val = false) {
$this->_superUserBypass = $val;
}
public function allow(Array $allowedActions = []) {
$this->_allowedActions = $allowedActions;
}
public function verify() {
if($this->_superUserBypass) {
return true;
}
$session = $this->request->session();
//if Auth Registration is not set
if(!$session->read('Auth.Registration')) {
//if requested action is not in the array of allowed actions, redirect to select registration
if(!in_array($this->request->param('action'), $this->_allowedActions)) {
return $this->redirect();
};
return true;
}
return true;
}
public function redirect() {
$controller = $this->_registry->getController();
return $controller->redirect($this->config('redirect'));
}
}
Не все диспетчерские требует переменных регистраций необходимо установить, поэтому я решил пойти с компонентом подходом. Компонент однако загружен в AppController по этой линии:
$this->loadComponent('RegistrationCheck', ['redirect' => ['controller' => 'Users', 'action' => 'registrations']]);
В контроллерах, которые требуют регистрации переменной для установки, я включаю следующую функцию beforeFilter:
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
return $this->RegistrationCheck->verify();
}
Теперь я что некоторые интеграционные тесты определены, вот один из них:
public function testUnauthenticatedEdit()
{
$this->get('/teams/edit');
$this->assertRedirect(['controller' => 'Users', 'action' => 'login']);
}
Итак, после того, как я реализовал свой RegistrationCheck компонент, я побежал Интеграционные тесты. Я ожидал, что тест пройдет, это не так. Интересно то, что он фактически вернул перенаправление на Users-> registrations, а не на Users-> login, как я и ожидал.
Мне кажется, что перенаправление RegistrationCheck происходит до перенаправления компонента Auth. Я не уверен, что это огромная сделка, потому что переадресация на регистрацию без набора Auth приведет к перенаправлению обратно на логин, но кажется неправильным игнорировать его ... также я просто хотел бы немного понять о том, что происходит на самом деле.
Может ли кто-нибудь предложить изменения в моем коде, которые гарантировали бы, что компонент Auth обрабатывается до компонента RegistrationCheck?
Заранее спасибо.