php – 如何在Yii或slug麻烦中使用beforeAction

Yii开发jedis!

我正在研究一些旧的Yii项目,必须向他们添加一些功能. Yii是非常合乎逻辑的框架,但它有一些我无法理解的东西.也许我还没理解Yii-way.所以我将逐步描述我的问题.对于不耐烦的人 – 最后简要提问.

简介:我想在我的项目中添加人类可读的URL.
现在网址如下:www.site.com/article/359
我希望它们看起来像这样:www.site.com/article/how-to-make-pretty-urls
非常重要:旧格式网址上必须提供旧文章,新网址上必须提供新文章.

第1步:首先,我在config / main.PHP中更新了重写规则:

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

我在文章表中添加了新的texturl列.因此,我们将在这里存储人类可读的新文章的部分内容.然后我用texturl更新了一篇文章进行测试.

第2步:应用程序在ArticleController的actionView中显示文章,所以我在那里添加了这个用于预处理ID参数的代码

if (is_numeric($id)) {
    // User try to get /article/359
    $model = $this->loadModel($id); // Article::model()->findByPk($id);
    if ($model->text_url !== null) {
        // If article with ID=359 have text url -> redirect to /article/text-url
        $this->redirect(array('view','id' => $model->text_url),true,301);
    }
} else {
    // User try to get /article/text-url
    $model = Article::model()->findByAttributes(array('text_url' => $id));
    $id = ($model !== null) ? $model->id : null ;
}

然后开始遗留代码

$model = $this->loadModel($id); // Load article by numeric ID
// etc

它完美无缺!但…

第3步:但我们有许多ID参数的动作!我们要做什么?使用该代码更新所有操作?我认为这很难看.我找到了CController::beforeAction方法.看起来不错!所以我声明beforeAction并在那里放置ID preproccess:

protected function beforeAction($action) {
    $actionToRun = $action->getId(); 
    $id = Yii::app()->getRequest()->getQuery('id');
    if (is_numeric($id)) {
        $model = $this->loadModel($id);
        if ($model->text_url !== null) {
            $this->redirect(array('view',301);
        } 
    } else {
        $model = Article::model()->findByAttributes(array('text_url' => $id));
        $id = ($model !== null) ? $model->id : null ;
    }
    return parent::beforeAction($action->runWithParams(array('id' => $id)));
}

是的,它适用于两种URL格式,但它执行actionView TWICE并显示两次页面!我该怎么办?我完全糊涂了.我有没有选择正确的方法解决我的问题?

简而言之:我可以在执行任何操作之前执行ID(GET参数),然后使用仅修改的ID参数运行请求的操作(一次!)?

最后一行应该是:
return parent::beforeAction($action);

还问你我没有得到你的步骤:3.

如你所说,你有很多控制器,你不需要在每个文件中编写代码,所以你使用的是beforeAction:
但是你只有与所有控制器的文章相关的text_url?

$model = Article::model()->findByAttributes(array('text_url' => $id));

=====更新回答======

我已更改此功能,请立即查看.

如果$id不是nummeric,那么我们将使用model找到它的id并设置$_GET [‘id’],因此在进一步的控制器中它将使用该numberic id.

protected function beforeAction($action) {          
    $id = Yii::app()->getRequest()->getQuery('id');
    if(!is_numeric($id)) // $id = how-to-make-pretty-urls
    {
        $model = Article::model()->findByAttributes(array('text_url' => $id));
        $_GET['id'] = $model->id ; 
    }
    return parent::beforeAction($action);
}

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...