Laravel ViewServiceProvide не принимает несколько представлений - PullRequest
1 голос
/ 24 июня 2019

Моя версия 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'
        );

Я получаю errorException в animal / create.blade.php

Неопределенная переменная: 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'
    );
}

РЕДАКТИРОВАТЬ Файл My 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);
    }

}

Я что-то упустил? Нужно ли использовать View :: composer каждый раз, когда я отправляю AnimalComposer в представление? Разве Laravel теперь не поддерживает множественные представления внутри массива?

Ответы [ 2 ]

1 голос
/ 24 июня 2019

После просмотра исходного кода подсветки Laravel, существует также метод, называемый composer s , где ключ становится обратным вызовом:

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

Как видно из vendor/laravel/framework/src/Illuminate/View/Concerns/ManagesEvents@composers. Это не упомянуто в документации.

@ Предложение Бимала Прасада Пандея убедительно. Если вы работаете над большим проектом, идея Бимала предпочтительнее.

1 голос
/ 24 июня 2019

Выполните следующие действия,

  1. Создание представления поставщика услуг композитора.
make:provider ViewComposerServiceProvider
Добавление провайдера в 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');
    }
в 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);
    }
}

composer dump-autoload

Теперь вы можете получить доступ к коллекции $ menuitems в партиалах front.layouts.partials.header в любом месте.

Это все

...