在laravel中使用整个视图渲染对象

在laravel中使用整个视图渲染对象,laravel,laravel-4,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 }}

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
是否有任何方法可以使对象(例如模型、模型视图或其他类型)呈现整个视图

诸如此类:

<!-- 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>

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

您不能只使用include吗

@foreach($posts as $post)
    @include('listing')
@endforeach
它将使用您的视图:

<!-- View stored in resources/views/listing.php -->
<li>{{ $post->title }} - {{ $post->published_at }}</li>
在您的模型中,您将执行以下操作:

public function render($what)
{
    $data = $this->produceListinData($what);

    return View::render($data->viewName, compact('data'));
}
当然,最好像您那样使用视图演示器,但您可能需要安装一个软件包来帮助您,或者创建自己的。这是我使用的一个:

编辑:


无论如何,我100%同意你关于从模型访问视图的评论。在这种情况下,一个很好的设计解决方案是创建一个渲染服务和一个存储库,通过存储库使用渲染服务,您的模型将永远不必知道视图的存在。

您的示例将起作用,但它不会将两个Viwe解耦。假设我的帖子是一辆汽车,根据它的品牌名称,它有不同的观点:ford.blade.php、mercedes.blade.tpl。选择我要包含的视图的逻辑必须在视图之外,明白了吗。编辑以提供一种在模型、存储库或服务中执行此操作的方法…从模型中访问视图听起来有点奇怪。是吗?是的,我同意。编辑以解释我对此的看法。
public function render($what)
{
    $data = $this->produceListinData($what);

    return View::render($data->viewName, compact('data'));
}