我需要在每个控制器的每个页面加载时检查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'];
我不确定哪个部分出错:在组件或布局中? 感谢您的帮助。
答案 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');