【问题标题】:Laravel View ComposerLaravel 视图编辑器
【发布时间】:2016-02-02 17:04:20
【问题描述】:

我正在关注 laravel 的教程,但有些东西我不明白。它被称为使用视图作曲家。

  1. -我有一个从app/http/routes.php 调用的模板,给定一个 URL:

    Route::get('cats/create', function(){return view('cats.create');});

这是cats/create.blade.php

@extends('master')
@section('header')
  <h2> Add a new cat </h2>
@stop
@section('content')
{!! Form::open(['url'=>'/cats']) !!}
 @include('partials.forms.cat')
{!! Form::close() !!}
@stop
  1. -此模板包括另一个(部分)覆盖表单 HTML 的模板

    <div class="form-group">
    
     {!! Form::label('name','Name') !!}
    
     <div class="form-controls">
    
      {!! Form::text('name', null, ['class' => 'form-control']) !!}
    
     </div>
    
    </div>
    
    <div class="form-group">
    
     {!! Form::label('date_of_birth', 'Date of Birth') !!}
    
    <div class="form-controls">
      {!! Form::date('date_of_birth', null, ['class' => 'form-control']) !!}
    
     </div>
    
    </div>
    
    <div class="form-group">
    
     {!! Form::label('breed_id','Breed') !!}
    
     <div class="form-controls">
    
     {!! Form::select('breed_id', $breeds, null, ['class' => 'form-control']) !!} 
    
     </div>
    
    </div>
    
    {!! Form::submit('Save Cat', ['class' => 'btn-primary']) !!}
    
  2. -现在使用视图编辑器以便在调用此局部视图时自动填充选择元素。在AppServiceProvider:

public function boot(ViewFactory $view)
    {
      $view->composer('partials.forms.cat','Furbook\Http\Views\Composers\CatFormComposer');
}

4.- 这就是CatFormComposer

class CatFormComposer
{
    protected $breeds;

    public function __construct(Breed $breeds)
    {
        $this->breeds = $breeds;
    }

    public function compose(View $view)  {
        $breeds = $this->breeds;
        $view->with('breeds', $breeds->lists('name', 'id'));
    }
}

它有效。我不明白的是,$breeds 参数是如何传递给类的构造函数的?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    所有 View Composer 都由 laravel 服务容器解析。因此,当您键入提示 Breed $breeds 时,laravel 将使用 php reflection api 查找预期的类并注入该类的实例(在这种情况下:容器将找到 Breed 类,创建 new繁殖并将实例传递给构造函数)。

    为了更深入地了解,您可以查看service locator 模式

    【讨论】:

    • 谢谢,我明白了...为什么他们不能在构造函数中声明和实例化一个 var $breeds 呢?是不是更具可读性?
    • 遵循构造函数注入,在测试和松耦合的情况下获得了很大的好处。如果他们像您所说的那样在范围内本地实例化它,这将使视图作曲家的测试变得困难,而不能确保正确实现 Breed 类。另一方面,构造函数注入帮助我们模拟 Breed 实现并通过构造函数注入。归根结底,它有助于我们遵守 SOLID 原则。
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2020-09-18
    • 2012-07-27
    相关资源
    最近更新 更多