【问题标题】:laravel 4 - pull similar data in multiple controllers into many viewslaravel 4 - 将多个控制器中的相似数据拉入多个视图
【发布时间】:2014-07-21 00:30:31
【问题描述】:

我有这样的用户路线:

用户/13/posts/10
用户/13/videos/443
用户/13/items/4002

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

什么是最好的方式来提取所有这些信息,而不是在每个控制器中的每个功能都做?

我在 routes.php 中尝试过 view:composer(这很糟糕),但我无法获取用户 ID 并获取相关信息。

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

另外,如果这是最好的解决方案,那么我应该将我的视图作曲家存储在哪里?

谢谢!

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    使用视图合成器自动用数据填充视图:

    首先为任何URI 创建一个路由模式,例如user/13user/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',
        ));
    
    });
    

    然后在app/viewcomposers文件夹中创建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
        }
    }
    

    最后,您需要在composer.json 文件中的autoload->classmap 中添加新的class,例如:

    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            // ...
            "app/viewcomposers"
    ]
    

    最后,只需从项目根目录中的command prompt/terminal 运行composer dump-autoload。而已。现在,每当请求具有任何id 的任何用户的URI 时,那些view composers 将运行以准备视图。

    【讨论】:

    • 谢谢!但由于某种原因,viewComposers.php 似乎没有自动加载(即使我将他添加到类映射 + 运行转储自动加载。PS 我在本地服务器(WAMP)上工作。我试图写“dd('test );" 查看文件是否自动加载,但我什么也没得到
    • 您是否在classmap 中添加了条目,并且您是否从命令提示符运行composer dump-autoload
    【解决方案2】:

    我认为您在谈论急切加载。 你可以这样接近,

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

    见,Eager Loading

    【讨论】:

    • 那么我的每一种方法都必须一遍又一遍地做吗?即使这些数据是相同的并且嵌套在同一条路线中? (用户)
    • 你可以有一个 UserRepository 类,在其中编写一个像 getAllItems() 这样的函数,其中包含这个急切的加载代码,然后从你的控制器内部调用它的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多