Cakephp 3 - 页面没有正确重定向
Cakephp 3 - The page isn’t redirecting properly
我正在使用 Cakephp 3.x,其中我在 AppController
中创建了一个方法(checkBrandAssigned ) 在其中我检查了我的逻辑并根据我的需要重定向到另一个页面。下面是方法的样子。
AppController.php
public function checkBrandAssigned(){
$this->loadModel('Users');
$user_data = $this->Users->find()
->select(['user_id'])
->where([
'user_type' => SALES_REPRESENTETIVE,
'user_status' => STATUS_INACTIVE,
'user_id NOT IN (SELECT ub_user_id FROM fp_user_brand)'
])
->order([ 'user_modified_date'=>'DESC'])
->first();
if (!empty($user_data)) {
return $user_data->user_id;
} else {
return '';
}
}
下面是我的 AppController.php 文件的完整片段。
<?php
class AppController extends Controller {
public function initialize() {
parent::initialize();
switch ($this->request->session()->read('Auth.User.user_type')):
case COMPANY_ADMIN :
$loginRedirectUrl = ['controller' => 'users', 'action' => 'dashboardCompanyAdmin'];
break;
default : $loginRedirectUrl = ['controller' => 'users', 'action' => 'dashboardSalesRep'];
break;
endswitch;
}
public function checkBrandAssigned(){
$this->loadModel('Users');
$user_data = $this->Users->find()
->select(['user_id'])
->where([
'user_type' => SALES_REPRESENTETIVE,
'user_status' => STATUS_INACTIVE,
'user_id NOT IN (SELECT ub_user_id FROM fp_user_brand)'
])
->order([ 'user_modified_date'=>'DESC'])
->first();
if (!empty($user_data)) {
return $user_data->user_id;
} else {
return '';
}
}
}
正如您在上面看到的,我在 beforeFilter
中使用了 checkBrandAssigned
方法,如果我的条件成立,我将重定向到 $this->redirect(['controller' => 'Users', 'action' => 'brandRetailerView','?'=>['repId'=>'6b12337d37870e4afb708a20f4f127af']]);
.
下面是我的 UsersController.php 文件。
UsersController.php
class UsersController extends AppController {
public function initialize() {
parent::initialize();
}
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
public function brandRetailerView() {
die('inside my function');
}
}
如你所见,我已经输入 die('inside my function');
我可以看到这段文字,但是,如果我评论它,我会收到错误提示...
The page isn’t redirecting properly
我还在各自的位置创建了空白 brand_retailer_view.ctp
文件。下面是我的错误截图。
我也用过Auth Component。我希望在登录后使用 brandRetailerView
和 checkBrandAssigned
方法,因此我没有在 $this->Auth->allow
中添加 AppController.php 和 UsersController.php。但是,我尝试在 $this->Auth->allow
中添加 checkBrandAssigned
,但仍然无法正常工作。
我曾尝试在我的 UsersController.php
中使用 return parent::beforeFilter($event);
,但效果不佳。
我没有在 .htaccess
文件中添加任何额外内容,因此我不会在此处添加。
谁能帮我解决这个问题。即使我使用 die
它的工作,但只要我评论它,我就会遇到上述错误。
问题不在代码中,在逻辑中
问题是因为无论 checkBrandAssigned() 返回的条件如何,重定向都将指向用户控制器,在过滤用户控制器之前,将再次检查条件并再次重定向到用户控制器。
它会变成无限循环的重定向,在 die() 的情况下它正在工作,因为 die() 在重定向发生之前打破了循环。
要解决此问题,请从 beforeFillter 中删除重定向检查并将其放在其他位置...
添加这个以在 AppController 中启用 cookie。
use Cake\Controller\Component\CookieComponent;
并更新条件如下。
if (!isset($this->Cookie->read('checkedInLast30Secs'))) {
$this->Cookie->write('checkedInLast30Secs',
[
'value' => true,
'expires' => '+30 secs'
]
);
if (!empty($checkSalesRepId)) {
$this->redirect(['controller' => 'Users', 'action' => 'brandRetailerView', '?' => ['repId' => '6b12337d37870e4afb708a20f4f127af']]);
// $this->dashboardUrl = ['controller' => 'users', 'action' => 'brandRetailerView'];
} else {
$this->dashboardUrl = ['controller' => 'users', 'action' => 'dashboardCompanyAdmin'];
}
}
最终我用下面的代码解决了。
case COMPANY_ADMIN :
if (!empty($checkSalesRepId)) {
if($this->request->params['action'] != 'brandRetailerView'){
$this->redirect(['controller' => 'Users', 'action' => 'brandRetailerView','?'=>['repId'=>$checkSalesRepId]]);
}
else {
$this->dashboardUrl = ['controller' => 'users', 'action' => 'dashboardSalesManager'];
}
}
这里我只是简单的检查一下当前的动作是不是brandRetailerView
。如果是这样,我将重定向到 brandRetailerView
页面,否则重定向到 dashboardSalesManager
页面。
希望这对您有所帮助。
我正在使用 Cakephp 3.x,其中我在 AppController
中创建了一个方法(checkBrandAssigned ) 在其中我检查了我的逻辑并根据我的需要重定向到另一个页面。下面是方法的样子。
AppController.php
public function checkBrandAssigned(){
$this->loadModel('Users');
$user_data = $this->Users->find()
->select(['user_id'])
->where([
'user_type' => SALES_REPRESENTETIVE,
'user_status' => STATUS_INACTIVE,
'user_id NOT IN (SELECT ub_user_id FROM fp_user_brand)'
])
->order([ 'user_modified_date'=>'DESC'])
->first();
if (!empty($user_data)) {
return $user_data->user_id;
} else {
return '';
}
}
下面是我的 AppController.php 文件的完整片段。
<?php
class AppController extends Controller {
public function initialize() {
parent::initialize();
switch ($this->request->session()->read('Auth.User.user_type')):
case COMPANY_ADMIN :
$loginRedirectUrl = ['controller' => 'users', 'action' => 'dashboardCompanyAdmin'];
break;
default : $loginRedirectUrl = ['controller' => 'users', 'action' => 'dashboardSalesRep'];
break;
endswitch;
}
public function checkBrandAssigned(){
$this->loadModel('Users');
$user_data = $this->Users->find()
->select(['user_id'])
->where([
'user_type' => SALES_REPRESENTETIVE,
'user_status' => STATUS_INACTIVE,
'user_id NOT IN (SELECT ub_user_id FROM fp_user_brand)'
])
->order([ 'user_modified_date'=>'DESC'])
->first();
if (!empty($user_data)) {
return $user_data->user_id;
} else {
return '';
}
}
}
正如您在上面看到的,我在 beforeFilter
中使用了 checkBrandAssigned
方法,如果我的条件成立,我将重定向到 $this->redirect(['controller' => 'Users', 'action' => 'brandRetailerView','?'=>['repId'=>'6b12337d37870e4afb708a20f4f127af']]);
.
下面是我的 UsersController.php 文件。
UsersController.php
class UsersController extends AppController {
public function initialize() {
parent::initialize();
}
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
public function brandRetailerView() {
die('inside my function');
}
}
如你所见,我已经输入 die('inside my function');
我可以看到这段文字,但是,如果我评论它,我会收到错误提示...
The page isn’t redirecting properly
我还在各自的位置创建了空白 brand_retailer_view.ctp
文件。下面是我的错误截图。
我也用过Auth Component。我希望在登录后使用 brandRetailerView
和 checkBrandAssigned
方法,因此我没有在 $this->Auth->allow
中添加 AppController.php 和 UsersController.php。但是,我尝试在 $this->Auth->allow
中添加 checkBrandAssigned
,但仍然无法正常工作。
我曾尝试在我的 UsersController.php
中使用 return parent::beforeFilter($event);
,但效果不佳。
我没有在 .htaccess
文件中添加任何额外内容,因此我不会在此处添加。
谁能帮我解决这个问题。即使我使用 die
它的工作,但只要我评论它,我就会遇到上述错误。
问题不在代码中,在逻辑中
问题是因为无论 checkBrandAssigned() 返回的条件如何,重定向都将指向用户控制器,在过滤用户控制器之前,将再次检查条件并再次重定向到用户控制器。
它会变成无限循环的重定向,在 die() 的情况下它正在工作,因为 die() 在重定向发生之前打破了循环。
要解决此问题,请从 beforeFillter 中删除重定向检查并将其放在其他位置...
添加这个以在 AppController 中启用 cookie。
use Cake\Controller\Component\CookieComponent;
并更新条件如下。
if (!isset($this->Cookie->read('checkedInLast30Secs'))) {
$this->Cookie->write('checkedInLast30Secs',
[
'value' => true,
'expires' => '+30 secs'
]
);
if (!empty($checkSalesRepId)) {
$this->redirect(['controller' => 'Users', 'action' => 'brandRetailerView', '?' => ['repId' => '6b12337d37870e4afb708a20f4f127af']]);
// $this->dashboardUrl = ['controller' => 'users', 'action' => 'brandRetailerView'];
} else {
$this->dashboardUrl = ['controller' => 'users', 'action' => 'dashboardCompanyAdmin'];
}
}
最终我用下面的代码解决了。
case COMPANY_ADMIN :
if (!empty($checkSalesRepId)) {
if($this->request->params['action'] != 'brandRetailerView'){
$this->redirect(['controller' => 'Users', 'action' => 'brandRetailerView','?'=>['repId'=>$checkSalesRepId]]);
}
else {
$this->dashboardUrl = ['controller' => 'users', 'action' => 'dashboardSalesManager'];
}
}
这里我只是简单的检查一下当前的动作是不是brandRetailerView
。如果是这样,我将重定向到 brandRetailerView
页面,否则重定向到 dashboardSalesManager
页面。
希望这对您有所帮助。