Laravel 5.4:将变量解析为视图的最佳实践

时间:2017-02-24 16:34:05

标签: php laravel laravel-5.4

例如,我想在默认视图中添加一个变量(default.blade.php)

我当然可以将我的变量直接定义到视图文件中,如下所示:

@php ($user = Sentinel::getUser())

但不建议这样做。

我应该在AppServiceProvider.php上添加吗? (https://laravel.com/docs/5.4/views#sharing-data-with-all-views

但是哪个电话?像这样:

public function boot()
    { $user = Sentinel::getUser(); }

此获取:未定义的变量:user

public function boot()
    { View::share('user', Sentinel::getUser()); }

这得到了试图获取非对象的属性,因此Sentinel并没有真正声明

或在控制器中

public function __construct()
    {
        //user
        $user = Sentinel::getUser();
        view()->share('user',$user);            

    }

我也尝试进入我的控制器

public function boot()
    {
        return view('layouts/default')->with('user', Sentinel::getUser(););
    }

public function boot()    {
        view()->composer('layouts.default', function($view)     {
            $view->with('user', Sentinel::getUser());

        });     
    }

仍然得到"未定义的变量:user"

2 个答案:

答案 0 :(得分:1)

我们的想法是在服务提供商的引导方法中调用View :: XXXXX ......

最简单的方法是在应用服务提供商的视图上调用共享...这将使其可供所有视图使用...但请注意,此值何时得到解决,它将在启动时解决...

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

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

您还可以创建一个视图编辑器,它将在渲染特定视图或视图集之前运行...您可以为其提供视图/类或视图/闭包......这将在视图渲染之前进行评估...

绑定视图作曲家类:

public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );
}

或者附上一个封闭......然后做你需要的东西来启动那个封闭......

public function boot()
    {
        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
}

你可以绑定到View :: share等所有视图,但是在你的情况下使用一个简单的基于闭包的作曲家......将评估推到视图渲染之前......

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            $view->with('user', Sentinel::getUser() );
        });

希望这会有所帮助......

答案 1 :(得分:0)

在你的控制器中,定义一个类似的函数:

public function index() {
   $user = Sentinel::getUser();

   //The parameter of the view is your blade file relative to your directory
   //resources/views/default.blade.php
   return view('default')->with('user', $user);
}

在您的web.php(路线文件)中,添加此

//First parameter is the url, second is the controller/function
Route::get('/', 'YourControllerName@index');

现在在localhost [可选]

中测试视图

http://localhost:8000