Il laravel当你被告知要渲染一些数据时,你会解释你应该从控制器发送数据到视图
Route::get('/', function()
$posts = MyRep::giveMeAllPosts();
return View::make('listing', $posts);
});
带视图的
@foreach($posts as $post)
<li>{{ $post->title }} - {{ $post->published_at }}</li>
@endforeach
有没有办法可以渲染整个视图的对象(例如Models,ModelViews或其他类型)?
类似的东西:
<!-- View stored in resources/views/greeting.php -->
@foreach($posts as $post)
{{ $post->presenter('listing')->render()}}
@endforeach
其中每个项目的视图在其他视图中定义。
<!-- View stored in resources/views/listing.php -->
<li>{{ $post->title }} - {{ $post->published_at }}</li>
这样:列表的视图将与项目视图
分离答案 0 :(得分:0)
你不能只使用include吗?
@foreach($posts as $post)
@include('listing')
@endforeach
它将使用您的观点:
<!-- View stored in resources/views/listing.php -->
<li>{{ $post->title }} - {{ $post->published_at }}</li>
但是如果您仍然需要从模型或存储库中渲染某些内容,则可以执行以下操作:
{{ $post->render('listing') }}
在你的模型中你会这样做:
public function render($what)
{
$data = $this->produceListinData($what);
return View::render($data->viewName, compact('data'));
}
当然,更好的方法是使用视图展示器,就像你一样,但是你可能需要安装一个软件包来帮助你,或创建自己的软件包。这是我使用的那个:https://github.com/laracasts/Presenter。
编辑:
无论如何,我100%同意您关于从模型访问视图的评论。在这种情况下,一个不错的设计解决方案是创建一个渲染服务和一个存储库,通过您的存储库使用您的渲染服务,您的模型永远不会知道视图的存在。