我正在使用 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 '';
}
}
}
从上面可以看到,我在checkBrandAssigned
内使用了beforeFilter
方法,如果条件成立,我将重定向到$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');
了,但是,如果我发表评论,我会说......
页面重定向不正确
我还在自己的位置创建了空白brand_retailer_view.ctp
文件。以下是我的错误的屏幕截图。
我也使用过Auth Component。我希望登录后使用brandRetailerView
和checkBrandAssigned
方法,因此我没有在 AppController.php 和 UsersController.php < / strong>。但是,我尝试在$this->Auth->allow
中添加checkBrandAssigned
,但仍然无法正常工作。
我尝试在$this->Auth->allow
中使用return parent::beforeFilter($event);
,但效果不佳。
我没有在我的UsersController.php
文件中添加任何多余的内容,因此不在这里添加。
有人可以帮助我为什么我遇到这个问题。即使我使用.htaccess
的工作原理,但是一旦我发表评论,我都会遇到错误。
答案 0 :(得分:1)
问题不在代码中,而是逻辑上
问题是因为与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'];
}
}
答案 1 :(得分:0)
最终我用下面的代码解决了。
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
页。
希望这会有所帮助。