使用AppServiceProvider中的View() - > Composer()进行问题

时间:2016-02-23 23:54:06

标签: laravel laravel-5

我正在尝试使用AppServiceProvider中的启动方法将数据传递到视图,并按照其中一个Laracast基础视频中列出的步骤进行操作。但是,在尝试使用此变量时,我的控制器出现错误。

在我的AppServiceProvider中:

public function boot()
{
    view()->composer('home', function($view){
        $view->with('current', Post::orderBy('created_at', 'desc')->first());
    });
}

因此,据我所知,这应该将数据传递到我的主视图,因此我不需要在控制器中为该视图使用的所有方法中继续引用它。然后我有一个带有以下方法的homeController:

public function index()
{
    //Get user
    $user = Auth::user();

    //OMDB API setup - Get Movie name, remove spaces, add into API request
    $movie_one = str_replace(" ", "+", $current->movie_one);


    $movie_two = str_replace(" ", "+", $current->movie_two);

    return view('home', compact(array('user')));

}

之前我在这个方法中添加了一个名为current的变量来从我的Post表中获取一个条目,但是想要将它添加到AppServiceProvider中,因为我必须重新也可以在其他方法中声明它。我遇到的问题是我尝试在此方法中再次使用$current对象,但它不可用?我收到以下错误:

ErrorException in homeController.php line 30:

未定义的变量:当前

我可以在这做什么?我可以将数据传递给控制器​​以及主视图吗?或者那是不可能的?

1 个答案:

答案 0 :(得分:1)

您在boot方法中编写的代码只能在主视图中访问,如果您也想访问内部控制器Post object,您必须遵循此操作,通过此方法您可以访问控制器中的Post对象,视图一样。

app()->singleton('current',function($app){
    return Post::orderBy('created_at', 'desc')->first();
});

因此,在您的代码中,您可以像这样访问Post对象,

$post_obj = App::make('current');
$post_obj->movie_two;

或直接

App::make('current')->movie_two;