Laravel ViewServiceProvide不采用多个视图

时间:2019-06-24 05:09:11

标签: php laravel laravel-5 laravel-blade

我的Laravel版本是 5.8.23

根据Laravel View Composer上的文档,为了将视图编辑器一次附加到多个视图,请在第一个参数内部的数组中传递视图,例如:

View::composer(['profile', 'dashboard'],
    'App\Http\View\Composers\MyViewComposer');

当我尝试使用类似的方法时,数组中的第二个值无法获得在 AnimalComposer.php

中传递的值

我的代码:

View::composer(['animal.edit', ' animal.create'],
            'App\Http\Views\Composers\AnimalComposer'
        );

我在animal / create.blade.php中得到errorException

  

未定义变量:animalType

但是,如果我使用多个View :: composer来将数据发送到blade.php,它工作正常。

public function boot()
{
    View::composer('animal.edit',
        'App\Http\Views\Composers\AnimalComposer'
    );
    View::composer('animal.create',
        'App\Http\Views\Composers\AnimalComposer'
    );
}

编辑我的AnimalComposer.php文件

//AnimalComposer.php

namespace App\Http\Views\Composers;
use App\AnimalType;
use App\Helpers\GenderHelper;

class AnimalComposer
{
    public function compose($view)
    {
        $animalType = AnimalType::pluck('name', 'id');
        $genderLists = GenderHelper::getGenderSelectArray();

        $view->with('animalType', $animalType)
            ->with('genderLists', $genderLists);
    }

}

我想念什么吗?每次将AnimalComposer发送到视图时,都需要使用View :: composer吗? Laravel现在不支持数组内的多个视图吗?

2 个答案:

答案 0 :(得分:1)

执行以下步骤,

  1. 创建View Composer服务提供商。
make:provider ViewComposerServiceProvider
  1. 将提供程序添加到confing / app.php
  'providers' => [
     ...
        App\Providers\ViewComposerServiceProvider::class,
     ...
  ];

3。在ViewComposerServiceProvider中,我创建了composeHeader和composeFooter方法进行演示,您可以通过这种方式创建自己的方法。

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->composeHeader();
        $this->composeFooter();
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    private function composeHeader()
    {
        view()->composer('front.layouts.partials.header', 'App\Http\ViewComposers\HeaderComposer@compose');
    }

    private function composeFooter()
    {
        view()->composer('front.layouts.partials.footer', 'App\Http\ViewComposers\FooterComposer@compose');
    }
  1. 在App \ Http \ ViewComposers \ FooterComposer和App \ Http \ ViewComposers \ HeaderComposer中,您可以通过这种方式共享对象或集合
use App\Models\Admin\Menu;
class HeaderComposer
{
    /**
     * Create a new profile composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function compose(View $view)
    {
        $menuitems = Menu::where('parent_id',0)->where('status',1)->get();
        $view->with('menuitems', $menuitems);
    }
}
  1. composer dump-autoload

  2. 现在,您可以在任何位置的front.layouts.partials.header部分中访问$ menuitems集合。

就这样

答案 1 :(得分:1)

在查看了Laravel阐明的源代码之后,还有一种称为composer s 的方法,其中的键成为回调:

View::composers(
    [
        'App\Http\Views\Composers\AnimalComposer' => ['animal.edit', ' animal.create']
    ]);

vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesEvents@composers中所示。文档中未提及。

@Bimal Prasad Pandey的主张是坚定的。如果您从事的是大型项目,那么Bimal的想法是可取的。