2016-03-14 09:46:25 2749次浏览 2条回答 0 悬赏 45 金钱

想动态生成URL,意思是url与Controller不再是对应关系,对应关系去数据库里读。

具体使用的场景是:

做一个CMS,内容的网址可以自定义,因此不可能让一篇文章对应一个Controller,也不现实。
有没有办法把这些请求都转发到某个或者某几个controller去,然后把当前的request,url信息也传递过去,然后再那几个controller里统一处理这些请求?

  • 回答于 2016-03-14 11:30 举报

    url不是可以传参么?根据文章id,一个文章的controller就可以处理所有文章了额。。

    6 条回复
    回复于 2016-03-14 12:05 回复

    连controller都是变化的,比如http://www.abc.com/****/***/*** *号部分随便填

    回复于 2016-03-14 12:32 回复

    可以首先拦截请求,根据需要转发到任意url

    回复于 2016-03-14 12:59 回复

    具体如何操作呢?

    我试了urlManager貌似转到统一的action后能拿到以前的action,但是rules不知道怎么写才能匹配所有的请求。也试过了catchAll,但是这个catchAll转过去后,就无法得知之前的action是什么了

    回复于 2016-03-15 09:35 回复

    根据你的描述,我大概懂了。解决方法可以使绑定beforerequest方法,在请求处理之前,处理请求的url,通过数据库匹配真实的controller。。
    文档如下:

    应用在处理请求过程中会触发事件,可以在配置文件配置事件处理代码,如下所示:
    

    [

    'on beforeRequest' => function ($event) {
        // ...
    },
    

    ]
    on eventName 语法的用法在 Configurations 一节有详细描述.

    另外,在应用主体实例化后,你可以在引导启动 阶段附加事件处理代码,例如:

    \Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {

    // ...
    

    });
    yii\base\Application::EVENT_BEFORE_REQUEST

    该事件在应用处理请求before之前,实际的事件名为 beforeRequest。

    在事件触发前,应用主体已经实例化并配置好了,所以通过事件机制将你的代码嵌入到请求处理过程中非常不错。 例如在事件处理中根据某些参数动态设置yii\base\Application::language语言属性。

    回复于 2016-03-17 08:14 回复

    您好,可否问一下这个是文档的哪一章节。我认真看一下

    回复于 2016-03-17 13:57 回复

    http://www.yiichina.com/doc/guide/2.0/structure-applications 应用事件。不过上面我copy的已经是他全部的介绍了。

  • 回答于 2016-03-14 16:21 举报

    '<controller:\w+>/<user_id:\d+>/<id:\d+>' => '<controller>/view',

    1 条回复
    回复于 2016-03-17 08:01 回复

    你这个只能匹配有限的URL

您需要登录后才可以回答。登录 | 立即注册
kissgxd
总监

kissgxd

注册时间:2015-06-09
最后登录:2019-05-07
在线时长:26小时5分
  • 粉丝3
  • 金钱3810
  • 威望30
  • 积分4370

热门问题