将值传递给多个视图

时间:2015-05-19 06:51:55

标签: php yii2

我为控制器提供了此代码(我使用基本模板进行测试:

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\filters\VerbFilter;
use app\models\LoginForm;
use app\models\ContactForm;

class SiteController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout'],
                'rules' => [
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'yii\captcha\CaptchaAction',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

    public function actionIndex()
    {
        $param = $this->somefunction();
        return $this->render('index', [
             "param" => $param
        ]);
    }

    public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }

    public function actionContact()
    {
         $param = $this->somefunction();
        $model = new ContactForm();
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();
        } else {
            return $this->render('contact', [
                'model' => $model,
                 "param" => $param
            ]);
        }
    }

    public function actionAbout()
    {
         $param = $this->somefunction();
        return $this->render('about', [
             "param" => $param
        ]);
    }
}

正如您所注意到的,我将param传递给具有相同内容的多个视图,因此我想要一些节省时间的方式只将一次发送到所有视图。

这可能吗?

目前,我正在使用会话来存储值并在必需的视图中调用会话。我想要更方便的东西

2 个答案:

答案 0 :(得分:2)

您可以使用Controller和View事件来实现这一目标。

将此添加到您的控制器:

use yii\web\View;

...

public function beforeAction($action)
{
    if (!parent::beforeAction($action)) {
        return false;
    }

    $this->view->on(View::EVENT_BEFORE_RENDER, function() {
        $this->view->params['param'] = ...;
    });

    return true;
}

如果你想在多个控制器中使用它,可以为它创建另一个控制器(从yii\web\Controller扩展)并覆盖beforeAction,然后从自定义控制器扩展控制器,或者在应用程序boostrap期间使用{ {1}}。

此外,您可以添加一些条件:

BoostrapInterface

并且自定义参数将仅在这些操作中传递。

答案 1 :(得分:0)

在您的控制器中,您可以重新定义init ()功能,因此您可以为控制器的变量分配您感兴趣的值