Yii Login路由访问顺序

337 阅读2分钟

1、问题描述
在我们输入后台的ip或者域名的时候,浏览器展示给我们的url如下:
/index.php?r=site%2Flogin
但是很显然, SiteController控制器下的默认动作是 index,因此这里就产生了两个问题:

  • Yii是如何在运行 web/index.php后知道要去访问 site/index的?
  • 访问 site/index后,怎么跳转到 site/login页面的?

本文主要围绕这两个问题进行讲解。

2、应用主体
Yii中一个很重要的概念就是应用主体,Yii在创建应用主体的时候有个属性为$defaultRoute指定了默认要访问的控制器,其定义在yii\web\Application中,我们来看一下 web/index.php的代码:

<?php
... ...
(new yii\web\Application($config))->run();

大家可以看到,最后一行代码是创建了一个yii\web\Application的实例,因此Yii会按照实例里配置的$defaultRoute来将请求发送到相对应的控制器。

那如何改变默认的路由呢?

大家可以在 $config中去修改默认的路由配置,比如说在 config/main-local.php中修改:

<?php
$config = [
    ... ...
    'defaultRoute' => "site1"
];
... ...

3、默认动作
默认的动作是在 \yii\base\Controller中定义的,属性名称为:$defaultAction,从代码中得知,默认的值如下:

public $defaultAction = 'index';
到这里为止,大家应该知道为什么Yii在url中没有注明任何路由信息的时候会把请求发送到 site/index了,至于要改变这个规则,只需要修改默认的属性值就可以。

4、访问控制
接下来,我们讨论一下为什么在未登录的情况下会跳转到 site/login,要知道在 site/index中并没有跳转的代码:

class SiteController extends Controller {
    ... ...
    public function actionIndex() {
        return $this->render('index');
    }
    ... ...
}

那它怎么获得用户登录的信息,并把未登录的请求转发到 site/login呢?大家注意,在如下代码中使用了权限控制:

class SiteController extends Controller {
    /**
     * {@inheritdoc}
     */
    public function behaviors() {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
            ... ...
                    //允许授权的用户访问login,index动作
                    [
                        'actions' => ['logout', 'index'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
      ... ...
        ];
    }
    ... ...
}

也就是说 site/index是需要用户登录后才可以访问的,判断访问权限的代码在上述指定的 AccessControl类中:

class AccessControl extends ActionFilter {
    protected function denyAccess($user) {
        if ($user !== false && $user->getIsGuest()) {
            $user->loginRequired();
        } else {
            throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
        }
    }
    ... ...
}

当用户未登录时,会调用 denyAccess()方法,这个方法会调用 $user->loginRequired()来执行接下来的跳转任务:

public function loginRequired($checkAjax = true, $checkAcceptHeader = true) {
    ...
        return Yii::$app->getResponse()->redirect($this->loginUrl);
    ...
}

也就是说跳转的目的地是 this>loginUrl的值,我们看一下它的值是什么:publicthis->loginUrl的值,我们看一下它的值是什么: `public loginUrl = ['site/login'];`
大家可以看到,其值是 site/login,到此大家应该可以理解为什么在未登录的情况下会跳转到 site/login页面了。
以上就是本次分享的所有内容,想要了解更多欢迎前往公众号:PHP开源社区,每日干货分享