将Yii2控制器与Yii1控制器相结合



yii model (1)

我有一个相当大的Yii1应用程序,我想慢慢迁移到Yii2。 我想逐渐做到这一点。

我遵循了Yii2和Yii1集成手册中的说明

而我的应用程序运行良好。

我也尝试了yii2-yii-bridge的技巧,而且似乎也经过一些调整后才起作用。

我的问题是,现在我知道我的应用程序中有两个版本的Yii,我该如何开始添加Yii2风格的控制器?

如果我创建一个简单的Yii2风格的控制器,像这样:

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;


class SecondController extends Controller {

    public function behaviors()
    {
        return [
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'only' => ['index'],
                'rules' => [
                    // allow authenticated users
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                    // everything else is denied
                ],
            ],
        ];
    }

    public function actionIndex()
    {
        Yii::trace("(!!!) SecondController::index called!!!");
        return "SecondController::index!!";
    }

} // class

我无法使用我习惯的URL方案访问它,所以http://local.url/second/index似乎没有找到。

但是,如果我按照我一直所做的方式创建Yii1风格,那么它就解决了:

class ThirdController extends Controller {

    public function accessRules() {
        return array(
            array('allow',
                'actions' => array('index'),
                'users' => array('*'),
            ),
        );
    }


    public function actionIndex() {
        Yii::trace("ThirdController::index called!!!");
        return "ThirdController::index!!";
    }

}

似乎<controller>/<action>的默认url映射不能处理名称空间控制器是否有办法解决这个问题?


Answer #1

整合的主要目标是使用仅在Yii 2中可用的一些功能。假设您仍然有一个正在运行的Yii 1应用程序。 但是你添加了一些新的功能的外部库。

为了能够使用Yii 2的控制器,您应该与Yii 1内核进行深度集成。

我只能建议分割请求到应用程序的索引文件,例如在.htaccess中,并在Yii 2中创建一些新的功能。