从yii2中的布局访问组件中的数组

时间:2017-11-17 16:29:13

标签: yii2

我需要在每个控制器的每个页面加载时检查notifications表中的记录。

所以我在一个组件中写了它,组件在bootstraping过程中执行。

我需要在布局中提供通知,以便我可以在通知菜单中显示它们。

下面是我到目前为止所尝试的内容:

组件:

namespace admin\components;

use Yii;
use yii\base\Component;
use admin\models\Notification;

class NotificationManager extends \yii\base\Component{
  public function init() {

    $notifications = Notification::find()->orderBy('id DESC')->asArray()->all();
    //echo "<pre>"; print_r($notifications);exit;

    if(count($notifications)>0){
      foreach ($notifications as $notif) {
        if($notif['type'] == 'courier')
          $courier_notifications[] = $notif;
        elseif($notif['type'] == 'order')
          $order_notifications[] = $notif;
      }

      Yii::$app->view->params['courier_notifications'] = $courier_notifications;
      Yii::$app->view->params['order_notifications'] = $order_notifications;
    }
  }
}

布局:

$courier_notifications = $this->params['courier_notifications'];

我不确定哪个部分出错:在组件或布局中? 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果你真的想要进入自举模式,你需要实现yii\base\BootstrapInterface并将你的逻辑放在bootstrap($app)方法中,以便通过设置{的值来使站点在整个站点可用。 {1}}你的逻辑结果。

另一种常见方法是将新方法Yii::$app->params['notifications']或任何您想要命名的方法添加到组件中,移动其中的所有逻辑,然后在布局/视图等中,使用{{ 1}}。您还可以向其传递其他参数并增强逻辑。

public function displayNotifications必须替换为您在Yii应用配置中注册自定义组件的名称(Yii::$app->notificationManager->displayNotifications()用于基本应用,notificationManager用于高级应用)。

LE - 如果您只为引导程序注册了组件,则还应在组件数组中注册它。

web.php

答案 1 :(得分:1)

我不确定为什么在bootstrap期间你的组件执行无法将值添加到params.But认为这是一个过度杀伤。

您可以在必要时将逻辑移动到组件方法并在布局中访问

组件。

namespace admin\components;

use Yii;
use yii\base\Component;
use admin\models\Notification;

class NotificationManager extends Component{

  public function notifications($type = 'courier') {
     $notifications = Notification::find()
            ->where(['type' => $type])
            ->orderBy('id DESC')
            ->asArray()->all();
     return $notifications;
  }
}

在配置文件

中的“组件”部分下添加组件类
'notificationManager ' => [
        'class' => 'admin\components\NotificationManager'
 ]

布局

$courier_notifications = yii::$app->notificationManager->notifications('courier');