Cakephp 3-页面无法正确重定向

时间:2019-02-22 10:12:59

标签: php cakephp cakephp-3.0

我正在使用 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文件。以下是我的错误的屏幕截图。

enter image description here

我也使用过Auth Component。我希望登录后使用brandRetailerViewcheckBrandAssigned方法,因此我没有在 AppController.php UsersController.php < / strong>。但是,我尝试在$this->Auth->allow中添加checkBrandAssigned,但仍然无法正常工作。

我尝试在$this->Auth->allow中使用return parent::beforeFilter($event);,但效果不佳。

我没有在我的UsersController.php文件中添加任何多余的内容,因此不在这里添加。

有人可以帮助我为什么我遇到这个问题。即使我使用.htaccess的工作原理,但是一旦我发表评论,我都会遇到错误。

2 个答案:

答案 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页。

希望这会有所帮助。