【问题标题】:Laravel best way to call a controller inside a view?Laravel 在视图中调用控制器的最佳方法?
【发布时间】:2019-11-12 11:25:34
【问题描述】:

我有一个包含子块的页面。 每个块都需要有一个特定的渲染(使用特定的模板)。 为此我不得不在我的刀片模板中使用@php。

这是我的代码:

PageController.php

public function edit(Page $page)
{
    return view('pages.edit', compact('page')); 
}

查看页面/edit.blade.php

<section id="contents" class="contents ui-sortable">
    @foreach ($page->blocs as $bloc)
        @php
            echo $bloc->id;
            echo App\Http\Controllers\BlocController::renderBloc($bloc);
        @endphp
    @endforeach
</section>

BlocController.php

public static function renderBloc(Bloc $bloc) {
    echo $bloc->id;
    return view('blocs.show.' . $bloc->bloc_type, [
        'bloc' => $bloc, 
        'data' => json_decode($bloc->data)
    ]);
}

然后是bloc的一个例子

resources/views/blocs/show/text.blade.php

@extends('blocs.show')
@section('bloc')
{{ $bloc->id }} 
@endsection

resources/views/blocs/show.blade.php

<section class="bloc bloc_{{ $bloc->bloc_type }}" data-bid="{{ $bloc->id }}">
    {{$bloc->id}}
    @yield('bloc')
</section>  

我有两个问题:

  • 我认为这不是一个好方法吗?我不喜欢在模板中使用@php。我很想对此发表意见?也许我需要使用服务提供商?
  • 模板 (resources/views/bloc/show/text.blade.php) 中的 $bloc->id 错误(它显示了 foreach 中第一个子 bloc 的 id,即使我所有的 echo $bloc -> 显示好 id 之前的 id(page/edit/blade.php,BlocController.php,resources/view/blocs/show.blade.php)。这是我做错事的另一个证明我猜?李>

谢谢

【问题讨论】:

    标签: laravel laravel-blade


    【解决方案1】:

    如果你必须在你的视图中使用控制器,那只意味着你没有那么好的架构。 Laravel 的 Blade 可以轻松地通过控制器完成您尝试解决的问题。

    您可以将@include 与参数一起使用并摆脱@php

    resources/views/pages/edit.blade.php

    @foreach ($page->blocs as $bloc)
      @include('blocs.show', ['bloc' => $bloc])
    @endforeach
    

    resources/views/blocs/show.blade.php

    <section class="bloc bloc_{{ $bloc->bloc_type }}" data-bid="{{ $bloc->id }}">
        {{$bloc->id}}
        @include('blocs.show.' . $bloc->bloc_type, [
                            'bloc' => $bloc,
                            'data' => json_decode($bloc->data)
                        ])
    </section>  
    

    resources/views/blocs/show/text.blade.php

    Bloc ID = {{ $bloc->id }}
    Bloc Text = {{ $data->text }} 
    

    【讨论】:

    • 谢谢,这太棒了!我仍然有关于它在子模板中显示的值的问题(总是显示所有元素的列表的第一个 Id)。你有想法吗 ? resources/views/blocs/show/text.blade.php @extends('blocs.show') @section('bloc') Bloc ID = {{ $bloc->id }} Bloc Text = {{ $data->text }} @endsection 以 4 个区块为例:Bloc ID = 154 Bloc Text = text first bloc Bloc ID = 154 Bloc Text = text first bloc Bloc ID = 154 Bloc Text = text first bloc Bloc ID = 154 Bloc Text = text first bloc 我认为问题出在yield()
    • 你确定吗?当你按照我的建议重写代码时,它不应该发生
    • 是的,这很奇怪。如果我在 resources/views/blocs/show.blade.php 中显示 {{$bloc->id}} 我有正确的值。但是如果我在 resources/views/blocs/show/text.blade.php 中显示 {{$bloc->id}} 它总是显示第一个 id。关于 yield() 的东西?我应该为这个特定问题创建一个新帖子吗?
    • 我找到了一种方法,我不使用yield,只是包含。我要编辑你的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多