重构控制器PHP / Laravel

时间:2014-06-23 14:40:35

标签: php laravel laravel-4 refactoring

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

让我们举一个例子(不是真正的课程,只是为了得到这个想法):

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获取了值,所以我无法执行一个干净且动态的视图作曲家(如果我是我的话,请纠正我错)。

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

2 个答案:

答案 0 :(得分:1)

通常首选设置为beforeFilter或多个,然后您只需将变量设置为实例变量,您可以根据需要重复使用它们。您可以使用Route::parameter('nameOfParam')来获取路线中的参数。

beforeFilter and 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();
    }

答案 1 :(得分:1)

您可以查看视图作曲家。基本上他们所做的是将一些数据绑定到视图,这样无论何时调用视图,都会自动检索并添加该数据。它会将所有这些额外的逻辑保留在您的控制器之外,您不必再担心它了。

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'));
});

我不相信有任何推荐或常见做法,但我更喜欢为他们创建一个新文件并将其添加到自动加载器。