【问题标题】:Rendering object with an entire view in laravel在laravel中用整个视图渲染对象
【发布时间】:2014-09-08 15:48:40
【问题描述】:

当你被告知渲染一些数据时,我会解释你应该将数据从控制器发送到视图

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>

这样:listing的视图将与item view解耦

【问题讨论】:

    标签: laravel laravel-4


    【解决方案1】:

    你不能只使用包含吗?

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

    【讨论】:

    • 您的示例可以工作,但不会将这两个视图解耦。假设我的“帖子”是一辆汽车,根据它的品牌名称,它有不同的视图:ford.blade.php、mercedes.blade.tpl。选择我要包含的视图的“逻辑”必须在视图之外。
    • 知道了。编辑为提供一种在您的模型、存储库或服务中执行此操作的方法...
    • 从模型访问视图听起来有点奇怪。不是吗?
    • 是的,我同意。编辑以解释我对此的看法。
    猜你喜欢
    • 2019-09-04
    • 2022-01-09
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2019-07-06
    • 2023-02-18
    相关资源
    最近更新 更多