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。我希望在登录后使用 brandRetailerViewcheckBrandAssigned 方法,因此我没有在 $this->Auth->allow 中添加 AppController.phpUsersController.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 页面。

希望这对您有所帮助。