如何在Yii2中编写全局函数并在任何视图中访问它们(不是自定义方式)

int*_*mwa 9 php yii-components yii2

Yii1.1有一个CComponent类,它有一个CBaseController,它是CController的基类.有一个/protected/components/Controller.php类,它允许在任何视图中访问该类中的任何函数.

Yii2不再拥有CComponent类.所述Yii2引导指示"的Yii 2.0断CComponent在1.1类分为两类:YII \基\对象和YII \基地\组件".有没有人知道如何在Yii2和任何视图中编写全局函数,就像在Yii1.1中使用/protected/components/Controller.php一样?

几个类似的主题讨论自定义答案,但我想知道是否有正式的方法,而不是自定义的方式.

Bha*_*han 9

按照步骤:
1)创建以下目录"backend/components"
2)在"components"文件夹中创建"BackendController.php"控制器

<?php    
    namespace backend\components;
    use Yii;

    class BackendController extends \yii\web\Controller
    {
        public function init(){
            parent::init();

        }
        public function Hello(){
            return "Hello Yii2";
        }
    }
Run Code Online (Sandbox Code Playgroud)

3)所有支持的控制器扩展到"BackendController"(如).

<?php
namespace backend\controllers;

use Yii;
use backend\components\BackendController;

class SiteController extends BackendController
{

    public function beforeAction($event)
    {
        return parent::beforeAction($event);
    }

    public function actionIndex(){
        /* You have to able for call hello function to any action and view */
        //$this->Hello(); exit;

        return $this->render('index');
    }
}
Run Code Online (Sandbox Code Playgroud)

4)创建你的动作视图页面"index.php"(如)

<?php
print $this->Hello();
?>
Run Code Online (Sandbox Code Playgroud)

  • 逻辑完成所有这一切,除了在视图中它应该是`$ this-> context-> Hello()`而不是`$ this-> Hello()` (4认同)

Sam*_*aye 5

视图中无法访问控制器功能.

在Yii1中,视图附加到控制器,而在Yii2中,视图附加到View类(这是Yii2中的核心变化之一).正如您所注意到的,这将分离控制器和视图逻辑,但也使全局函数更难.

Yii2本身也需要全球功能.他们已经制作了"助手",事实上有许多助手:https://github.com/yiisoft/yii2/tree/master/framework/helpers,每个人都提供自己的一套全局功能供使用.

如果你还没有猜到,这是在Yii2中做全局变量的最好方法.它也是标准兼容的方式(PSR-2或其他),被认为是比普通全局变量更好的编码.

所以,你应该用你的全局变量制作你自己的自定义助手,例如:

class MyHelpers
{
    public static function myGlobalToDoSomethingAwesome()
    {
        return $awesomeness;
    }
}
Run Code Online (Sandbox Code Playgroud)

并在你的视图/控制器中引用它,就像你会帮助你一样:

use common\components\MyHelpers;
MyHelpers::myGlobalToDoSomethingAwesome();
Run Code Online (Sandbox Code Playgroud)