2014-06-23 65 views
0

我得到了一个情况,我有一个控制器负责返回视图与需要显示它的一些数据,但这些数据应该从多个视图中显示。重构控制器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获得值,所以我无法执行干净动态的作曲家视图(纠正我,如果我错了)。

你怎么做这种重构,当你需要新的数据发送到所有这些意见不会痛苦地插入它?

回答

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(); 
    } 
+0

好的,谢谢我不知道这个技术,但是我仍然看不到很多动态因为我仍然需要编写变量来传递每个视图的'make'方法。如我错了请纠正我。另外一个解释是你说使用'Route :: parameter('nameOfParam')'的地方是因为使用'before'过滤器的参数作为该方法的参数? – Fabrizio

+0

您对Route :: parameter()的需求断言是正确的。至于不需要在每个操作中将它们插入到视图层中,只需使用View :: share()或者只需在控制器中编写一个辅助方法来准备给定的视图,并从过滤器中加载参数,然后添加其他视图参数。这会很好地抽象逻辑并仍然允许修改。 – machuga

+0

'Route :: parameter'和'Route :: input'有什么区别? –

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

我不相信有在哪里把这些建议的或普遍的做法,但我更喜欢为他们创造一个新的文件,并将它们添加到自动加载。

+0

谢谢!但是如果我需要一个来自url的参数呢?例如我有'http:// myapp.dev/username',我需要用户名来获得相同查询的结果? – Fabrizio

+0

我还没有尝试过与视图作曲家,但你应该能够使用'路线::参数('用户名');'从路线抓取用户名参数。 – user3158900