namespace backend\modules\article\controllers;
use yii\web\Controller;
class ArticleController extends Controller
{
public function actionCreate()
{
$module=\Yii::$app->controller->module;
//echo $module->basePath;
return $this->render('create');
}
}
上面渲染视图,按理说默认应该渲染模块(Module)下面的布局文件backend/modules/article/views/layouts/main.php,然而实际上却是渲染的应用(Application)下面的backend/views/layouts/main.php。
但是在应用的模块配置下设置layout的属性却又是正常的了,设置的是默认的值。
'modules'=>[
'article'=>[
'class'=>'backend\modules\article\Module',
'layout'=>'main'
]
],
请问这是怎么回事?
其实本质上得理解查找视图layout的机制。
在yii2中有几个地方可以设置layout
选项:
Controller::$layout
Module::$layout
Application::$layout Application其实就是一个Module
所以最终都会调用Module::getLayoutPath()
这个方法来查找布局文件。
回到你的问题,当没有设置article/Module::$layout
的时候内部会冒泡去从父级module
寻找设置了layout
属性的父级Module
,这最终会找到Application
那么已经知道会根据Module::basePath
来查找视图所在的文件夹,那么顺理成章的就会出现你问题的那种现象了。