重构控制器PHP / Laravel


Refactor Controllers PHP / Laravel

我得到了一种情况,我有一个控制器,负责返回视图与一些需要显示它的数据,但这些数据应该从多个视图显示。

让我们举一个例子(不是一个真正的类,但只是为了了解这个想法):

class UserMapController extends BaseController
{
    public function index($username)
    {
       $posts = Post::all();
       $userInfo = User::findByUsername(username);
       $otherData = Book::all();
       return View::make('user.profile',compact('posts','userInfo','otherData'));
    }
    public function albums($username)
    {
       $posts = Post::all();
       $userInfo = User::findByUsername(username);
       $otherData = Book::all();
       $album = Album::findByUsername($username);
       return View::make('user.albums',compact('posts','userInfo','otherData','username','album'));
    }
}

在这种情况下,默认的数据是$posts, $userInfo, $otherData,我可以在其他10个方法中使用它,它将把它发送到视图。

我在laravel中使用View Composer,非常有帮助,但在这种情况下,问题是我从url中获得值,所以我不能执行一个干净和动态的视图作曲家(如果我错了,请纠正我)。

你如何做这种重构,当你需要新的数据发送给所有的视图时,不会痛苦地插入它?

通常在beforeFilter或多个中设置这些是首选,然后您只需将变量设置为实例变量,您可以根据需要重用它们。可通过Route::parameter('nameOfParam')从路由中获取参数。

beforeFilter和controller filter docs

的例子:

<?php

class MyController extends BaseController
{
    public function __construct()
    {
        $this->beforeFilter("@posts");
    }
    public function index()
    {
        return View::make('index', ['posts' => $this->posts]);
    }
    protected function posts()
    {
        $this->posts = Post::all();
    }

您可以查看视图作曲家。基本上它们所做的是绑定一些数据到一个视图这样当你调用一个视图时,数据就会被自动检索和添加。它将把所有这些额外的逻辑从你的控制器中移除,你再也不用担心它了。

View::composer(array('user.profile','user.albums'), function($view)
{
    $posts = Post::all();
    $userInfo = User::findByUsername(username);
    $otherData = Book::all();
    $view->with(compact('posts', 'userInfo', 'otherData'));
});
View::composer('user.albums', function($view)
{
    $album = Album::findByUsername($username);
    $view->with(compact('album'));
});

我不认为有任何推荐或通用的做法放在哪里,但我更喜欢为它们创建一个新文件,并将它们添加到自动加载器