laravel 4 - 将多个控制器中的类似数据拉入多个视图中

时间:2014-05-31 09:04:59

标签: php laravel laravel-4 laravel-routing

我有这样的用户路线:

用户/ 13 /文章/ 10
用户/ 13 /视频/ 443
user / 13 / items / 4002

我想在每次加载帖子/视频/项目视图时提取与“user / 13”相关的所有数据。 我还加载侧边栏@include('inc / blog-sidebar'),此文件包含所有视图中相同且与'user / 13'相关的数据。

如果不在每个控制器中按功能执行此操作,那么获取所有这些信息的最佳方法是什么?

我已经尝试过了:routes.php中的composer(这是坏的),我无法获取用户ID并获取相关信息。

View::composer('posts.show', function($view)
{
    $author = User::find(1);
    $view->with('author',$author);
});

另外,如果这是最佳解决方案,那么我应该在哪里存储我的视图编辑器?

谢谢!

2 个答案:

答案 0 :(得分:1)

使用视图编辑器自动使用数据填充视图:

首先为URIuser/13这样的任何user/15创建一个路由模式(在routes.php文件中):

// Composers will be used only for this url pattern, i.e. "user/13" or "user/15"
Route::when('user/*', 'prepareView');

然后像这样创建prepareView过滤器:

Route::filter('prepareView', function($route, $request) {

    // Register your three view composers
    View::composers(array(
        // Call the "postsViewComposer" method from
        // ViewComposers for "posts.show" view
        'ViewComposers@postsViewComposer' => 'posts.show',

        // Call the "videsViewComposer" method from
        // ViewComposers for "videos.show" view
        'ViewComposers@videsViewComposer' => 'videos.show',

        // Call the "itemsViewComposer" method from
        // ViewComposers for "items.show" view
        'ViewComposers@itemsViewComposer' => 'items.show',
    ));

});

然后在ViewComposers文件夹中创建app/viewcomposers类:

class ViewComposers {

    public function postsViewComposer($view)
    {
         // Get user id, for example, 15
        $id = Route::current()->parameter('id');

        // Then use it to retrieve the model   
        $author = User::find($id);
        return $view->with('author', $author);
    }

    public function videsViewComposer($view)
    {
        // Logic for this view composer
    }

    public function itemsViewComposer($view)
    {
        // Logic for this view composer
    }
}

最后,您需要在class的{​​{1}}文件中添加新的composer.json,例如:

autoload->classmap

最后,只需从项目的根目录中运行"autoload": { "classmap": [ "app/commands", "app/controllers", // ... "app/viewcomposers" ] 中的composer dump-autoload即可。就是这样。现在,只要请求任何command prompt/terminal用户的URI,就会运行id来准备视图。

答案 1 :(得分:0)

我认为你在谈论急切的加载。 你可以这样做,

User::with('posts','videos')->get();

请参阅Eager Loading