我遇到一种情况,我有一个控制器负责返回带有一些需要显示的数据的视图,但是这些数据应该从多个视图中显示。
让我们举一个例子(不是真正的课程,只是为了得到这个想法):
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获取了值,所以我无法执行一个干净且动态的视图作曲家(如果我是我的话,请纠正我错)。
你如何做这种重构,当你需要将新数据发送到所有这些视图时,插入它会不会很痛苦?
答案 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'));
});
我不相信有任何推荐或常见做法,但我更喜欢为他们创建一个新文件并将其添加到自动加载器。