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

时间:2016-05-20 16:38:19

标签: yii controller yii2 migration

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

我已按照Yii2 and Yii1 integration manual中的说明进行操作。

我的应用程序运行正常。

我也尝试了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

我无法使用我习惯的网址方案访问它,因此似乎找不到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>的默认网址映射无法处理命名空间控制器有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

  

似乎/无法处理命名空间控制器的默认网址映射是否有办法解决这个问题?

要支持命名空间控制器,您需要将CWebModule::$controllerNamespace用于模块控制器,或CWebApplication::$controllerNamespace用于全局应用程序控制器。然后,给定范围内的所有控制器都需要命名空间。如果只想在某些控制器中使用namepsaces,则需要使用CWebApplication::$controllerMapCWebModule::$controllerMap并为指定的路由配置控制器类。

然而,在Yii 1.1应用程序中运行Yii 2.0控制器很可能根本不起作用。如果您只想将应用程序的某些部分移动到Yii 2,我建议将其配置并作为单独的应用程序运行,并使用重写规则路由到正确的应用程序。例如,如果您将user模块移至Yii 2,则可以在.htaccess中使用此模块:

RewriteEngine on

# Yii 2 rules
RewriteRule ^user index-yii2.php [L]

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php [L]

index.php文件中,您应该在Yii 1.1中引导您的应用程序,在index-yii2.php中您有Yii 2应用程序。

答案 1 :(得分:0)

集成的主要目标是使用仅在Yii 2中提供的一些功能。想象一下,您仍然有一个正在运行的Yii 1应用程序。但是你添加了一些带有新功能的外部库。

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

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