在刀片中使用视图共享

时间:2019-05-17 03:37:09

标签: php laravel laravel-5 laravel-5.4

在视图上显示代码时,将显示错误消息。就是

  

未定义变量:noti_count(视图:C:\ laravel \ Procure \ resources \ views \ layouts \ user.blade.php)

我还不习惯在controller中使用视图共享。需要一些指导:

public function __construct()
{
    if (Auth::check())
    {
        if (Auth::User()->role == "Normal User")
        {       
            $noti_count = Notification
                              ::where('receive_id','=',Auth::user()->id)
                              ->count();

            view()->share('noti_count', $noti_count);

        }
        else if (Auth::User()->role == "PWD")
        {
            # code...
        }
        elseif (Auth::User()->role == "Senior Citizen")
        {
            # code...
        }
        else
        {       

        }    
    }    
}

刀片视图代码

<span class="badge badge-danger badge-counter">{!! $noti_count !!}+</span>

3 个答案:

答案 0 :(得分:3)

view()->share()应该在服务提供商的启动程序中使用。

您可以使用 AppServiceProvider ,或者创建一个新的提供程序,并且不要忘记将其添加到 config / app.php 中的提供程序数组的末尾。 / p>

注意,当没有用户登录时,$noti_count将是未定义的。因此,您必须先检查它:

@isset($noti_count)
<span class="badge badge-danger badge-counter">{!! $noti_count !!}+</span>
@endisset

答案 1 :(得分:1)

您可以查看文档的Sharing Data Will All Views部分。它说:

  

使用所有视图共享数据

     

有时,您可能需要与所有视图共享一条数据   由您的应用程序呈现。您可以使用视图来这样做   门面的share方法。通常,您应该致电share   在服务提供商的boot方法中。您可以随意将它们添加到   AppServiceProvider或生成单独的服务提供商以   安置他们:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }
}

如您所见,这有助于跨多个视图共享数据。您当然可以这样做(文档非常清楚),但是如果您要做一些条件操作,为什么不将数据返回视图呢?像这样:

public $data;

public function __construct()
{
    if ($condition)
    {
        $this->data = 'Data for first option';
    }
    else if ($condition_two)
    {
        $this->data = 'Some other data';
    }
    else
    {
        $this->data = 'Another amount of data';
    }
}

然后进入控制器内部的方法:

public function myMethod()
{
    // some stuff

    return view('my_view')->withData($this->data);
}

答案 2 :(得分:0)

public function __construct()
{        
    \View::share('key','value');
}

然后在刀片文件中:

<span class="badge badge-danger badge-counter">{{ $key }}</span>