在laravel中渲染具有整个视图的对象

时间:2014-09-08 15:48:40

标签: laravel laravel-4

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>

这样:列表的视图将与项目视图

分离

1 个答案:

答案 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%同意您关于从模型访问视图的评论。在这种情况下,一个不错的设计解决方案是创建一个渲染服务和一个存储库,通过您的存储库使用您的渲染服务,您的模型永远不会知道视图的存在。