Php 从yii2中的模块控制器设置布局

Php 从yii2中的模块控制器设置布局,php,layout,views,yii2,Php,Layout,Views,Yii2,我在主视图文件夹的layouts文件夹中有三个布局。我添加了一个名为subDomain的模块。在我的子域模块中,我有一个名为HomeController的控制器。在HomeController中有一个名为getDomain()的操作 在getDomain()操作中,我想将主布局更改为getDomainLayout。但使用代码时出现错误: $this->layout=“getDomainLayout” Yii2抛出: Invalid Parameter – yii\base\InvalidPara

我在主视图文件夹的layouts文件夹中有三个布局。我添加了一个名为subDomain的模块。在我的子域模块中,我有一个名为HomeController的控制器。在HomeController中有一个名为
getDomain()
的操作

getDomain()
操作中,我想将主布局更改为
getDomainLayout
。但使用代码时出现错误:

$this->layout=“getDomainLayout”

Yii2抛出:

Invalid Parameter – yii\base\InvalidParamException    
The view file does not exist: \myyii2\modules\subDomain\views\layouts\bersih.php

有几种方法可以解决这个问题

在适当的模块目录中创建布局文件 下面的示例显示了一些
子域
模块的规范目录结构,包括其布局(domain.php):

按照这个简单的结构,您可以在模块的控制器中按名称设置任何布局:

namespace myApp\modules\subDomain\controllers;

class HomeController extends Controller {
    public function actionGetDomain() {            
        $this->layout = 'domain'; // equals 'myApp/modules/subDomain/views/layouts/domain'
    }
}
这是最可取的方法,因为模块是自包含的软件单元,由自己的模型、布局、控制器等组成

指定包含布局文件的目录的完整路径 在某些情况下,您可能希望使用位于模块目录之外的布局文件:

class HomeController extends Controller {
    public function actionGetDomain() {
        $this->layout = '@app/views/layouts/main';
    }
}
myApp/frontend/views/layouts/main.php
其中是当前运行的应用程序的基本路径,例如:

myApp/frontend
abstract class AdminBaseController extends Controller
{
    public function beforeAction($action)
    {
        $this->layout = '@app/views/admin/layouts/main.php';
        return parent::beforeAction($action);
    }
    ...
}
在这种情况下,请确保main.php布局文件存在于以下目录中:

class HomeController extends Controller {
    public function actionGetDomain() {
        $this->layout = '@app/views/layouts/main';
    }
}
myApp/frontend/views/layouts/main.php

如果我需要控制器中的不同布局,我只需添加以下代码

 public function beforeAction($action)
 {
    $this->layout = 'layout'; //your layout name
    return parent::beforeAction($action);
 }
确保您的布局存在于适当的文件夹中

'@app/views/layouts/layout.php'

您还可以在
construtor
中设置
layout
属性,如下所示:

class ArticlesController extends Controller
{
  public function __construct($id, $module, $config = array()) {
    parent::__construct($id, $module, $config);
    $this->layout='main4articles';
  }
....

您可以添加$this->layout='main';在模块init方法中。main.php应该位于layouts下的modules view文件夹中。

在应用程序中使用不同布局的另一种方便方法是创建一个抽象类。例如:

myApp/frontend
abstract class AdminBaseController extends Controller
{
    public function beforeAction($action)
    {
        $this->layout = '@app/views/admin/layouts/main.php';
        return parent::beforeAction($action);
    }
    ...
}
然后扩展控制器

class ArticlesController extends AdminBaseController { ... }
class DefaultController extends Controller
{
     public $layout = 'main.php';
}

您可以在控制器中设置变量

class ArticlesController extends AdminBaseController { ... }
class DefaultController extends Controller
{
     public $layout = 'main.php';
}
或者通过传递完整的路径

public $layout = '@frontend/modules/idModule/views/layouts/main.php';

如果您想在模块内部默认设置它,您可以通过编写

$this->layout   =   '@frontend/modules/user/views/layouts/main';
在模块类的
init()
函数中,完整的代码如下所示

 public function init() {

    parent::init();
    $this->layout = '@frontend/modules/user/views/layouts/main';
    // custom initialization code goes here
}

在呈现模板之前,在控制器中设置
$this->layout
,对我不起作用。可能是因为它是一个.twig模板?