Cakephp 3 - страница не перенаправляет должным образом - PullRequest
0 голосов
/ 22 февраля 2019

Я использую 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 file.

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 .Я хочу, чтобы после входа в систему использовались методы brandRetailerView и checkBrandAssigned, поэтому я не добавил в свои $this->Auth->allow в AppController.php и UsersController.php .Тем не менее, я попытался добавить checkBrandAssigned в $this->Auth->allow, но все равно не работает.

Я пытался использовать return parent::beforeFilter($event); в моем UsersController.php, но он также не работает.

Я не добавил ничего лишнего в свой файл .htaccess, поэтому я не добавляю сюда.

Может кто-нибудь помочь мне, почему у меня эта проблема.Даже если я использую die, он работает, но как только я это комментирую, я получаю ошибку выше.

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

В конце концов я решил с кодом ниже.

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.

Надеюсь, это поможет.

0 голосов
/ 23 февраля 2019

проблема не в коде, а в логике

проблема в том, что независимо от условия, возвращаемого checkBrandAssigned (), перенаправление будет на пользовательский контроллер, а перед фильтрацией пользовательского контроллера условиебудет проверен снова и снова будет перенаправлен на пользовательский контроллер.

это станет бесконечным циклом перенаправления, в случае die () это работает, потому что die () прерывает цикл до того, как произойдет перенаправление.

, чтобы решить эту проблему, удалите проверку перенаправления из beforeFillter и поместите куда-нибудь еще ...

добавьте это, чтобы включить куки в AppController.

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'];
        }
    }
...