重构PHP/Laravel控制器

重构PHP/Laravel控制器,php,laravel,laravel-4,refactoring,Php,Laravel,Laravel 4,Refactoring,我遇到了这样一种情况,我有一个控制器,负责返回一些需要显示的数据的视图,但是这些数据应该从多个视图中显示 让我们举一个例子(这不是一个真正的课程,只是为了了解这个想法): 这种情况下的默认数据是$posts,$userInfo,$otherData,我可以在其他10种方法中使用它,它会将它发送到视图 我在laravel中使用了View Composer,非常有用,但在这种情况下,问题是我从url获取值,因此我无法执行干净的动态视图生成器(如果我错了,请纠正我) 如何进行这种重构,以便在需要将新数

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

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

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

我在laravel中使用了
View Composer
,非常有用,但在这种情况下,问题是我从url获取值,因此我无法执行干净的动态视图生成器(如果我错了,请纠正我)


如何进行这种重构,以便在需要将新数据发送到所有这些视图时插入这些数据不会很痛苦?

通常在首选过滤器之前在
中设置这些值,然后您只需将变量设置为实例变量,您可以随意重用它们。您可以使用
route::parameter('nameOfParam')
从路由获取参数

例如:

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

我不认为有任何建议或常规做法可以将这些文件放在何处,但我更喜欢为它们创建一个新文件并将它们添加到自动加载程序。

好的,谢谢,我不知道这项技术,但我还是不太了解它,因为,我仍然需要编写变量以传入每个视图的
make
方法。如果我错了,请纠正我。另一个澄清是,您说在何处使用
Route::parameter('nameOfParam')
是因为在
之前使用
过滤器将参数作为该方法的参数?您关于需要Route::parameter()的断言是正确的。至于消除在每个操作中将它们插入视图层的需要,您可以使用view::share()或在控制器中编写一个helper方法,用从过滤器加载的参数准备给定的视图,然后在之后添加其他视图参数。这将很好地抽象逻辑并允许修改。
Route::parameter
Route::input
之间有什么区别?谢谢!但是如果我需要url中的参数呢?我有
http://myapp.dev/username
我需要用户名才能获得相同查询的结果?我还没有尝试使用视图生成器,但您应该能够使用
Route::parameter('username')
从路由中获取用户名参数。
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'));
});