2

私は CakePHP 3 を使用しており、ユーザーがログインした後にデフォルト ルートを変更しようとしています。ユーザーによって異なるデフォルト ルートを設定したいと考えていますrole_id

私は解決策を見つけましたが、CakePHP 2 専用です。CakePHP 3 では使用できません。ブートストラップで Session コンポーネントを使用できません。

だから私は自分のAppControllerでこれを試しました

public $redirects = [
    'admin' => ['controller' => 'Clients', 'action' => 'statistics'],
    'user' => ['controller' => 'Clients', 'action' => 'index'],
];
public function initialize()
{
    parent::initialize();
    ...
    if ($this->Auth->user()) 
        Configure::write('Route.default', $this->redirects[$this->Auth->user('role_id')]);
    else
        Configure::write('Route.default', ['controller' => 'Users', 'action' => 'login']);
    Router::scope('/', function($routes) {
        $routes->connect('/', Configure::read('Route.default'));
        $routes->fallbacks('InflectedRoute');
    });
}

私のデフォルトルートは

$routes->connect('/', \Cake\Core\Configure::read('Route.default'));

Route.defaultそして、bootstrap.phpで次のように定義しました

Configure::write('Route.default', ['controller' => 'Users', 'action' => 'login']);

しかし、/ページを開くと、users/loginすでにログインしていてもページが表示されます

だから私は前にリダイレクトを追加しましたRouter::scope

if (
    $this->Auth->user() 
    && $this->request->params['controller'] == 'Users' 
    && $this->request->params['action'] == 'login'
) {
    $this->redirect(Configure::read('Route.default'));
}

誰でもそれを手伝ってもらえますか?

4

2 に答える 2

4

ちょっと私は解決策を見つけました!

次のように App\Routing\Filter にファイルを作成します。

  <?php
namespace App\Routing\Filter;

use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;

class HFilter extends DispatcherFilter {

    public function beforeDispatch(Event $event) {
        $request = $event->data['request'];
        if (isset($request->url) && $request->url == '') {
            if ($request->session()->read('Auth.User')){
                $request->params['controller'] = 'Users';
                $request->params['action'] = 'index';
            } else { 
                $request->params['controller'] = 'Pages';
                $request->params['action'] = 'home';
            } 
        }
    }
}
?>

そのような名前にフィルターを付けずにbootstrap.phpファイルに追加した後

DispatcherFactory::add('H');
DispatcherFactory::add('Asset');
DispatcherFactory::add('Routing');
DispatcherFactory::add('ControllerFactory');
于 2016-01-06T15:22:41.073 に答える