@a0xh

Как отрендерить компонент Blade в Laravel?

Есть такой класс компонента:

<?php

namespace App\Application\Components;

use Closure;
use Illuminate\View\Component;
use Illuminate\Support\Facades\View;
use Illuminate\Http\Request;

class Navigation extends Component
{
    public function __construct(private Request $request) {}

    /**
     * Get the view / contents that represent the component.
     */
    public function render(): \Illuminate\View\View
    {
        return View::make('admin::components.navigation', [
            'routes' => $this->registerRoutes()
        ]);
    }

    private function registerRoutes(): array
    {
        return [
            [
                'name' => 'messages.admin.statistics.index',
                'active' => $this->isActiveRoute('admin.statistics.index'),
                'path' => route('admin.statistics.index'),
            ],
            [
                'name' => 'messages.admin.user.index',
                'active' => $this->isActiveRoute('admin.user.index'),
                'path' => route('admin.user.index'),
            ],

            /* ... */
        ];
    }

    private function isActiveRoute(string $path): bool
    {
        return $this->request->routeIs($path);
    }
}


Но admin::components.navigation не видит переменную $routes. Еще пробовал так, но тоже дохлый номер:

return Blade::render('components.navigation ', [
    'routes' => $this->registerRoutes()
]);


Хотя во вьхах содержимое компонента <x-admin::navigation /> без проблем отображается, единственное, не видит передаваемые переменные из метода render(). Структура DDD'шная, поэтому путь к фолдеру у компонентов отличается от обычного. Мне кажется, что с этим связано, но точно не уверен.
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
@a0xh Автор вопроса
РЕШЕНИЕ

В сервис-провайдере:

/**
 * App\Infrastructure\Providers\RepositoryServiceProvider.php
 */
public function boot(): void
{
    Blade::componentNamespace('App\\Application\\Components\\', 'admin');
    Blade::component('admin::navigation', Navigation::class);

    /* ... */
}


В компоненте:

/**
 * App\Application\Components\Navigation.php
 */
public function render(): \Illuminate\View\View
{
    return View::make('admin::components.navigation', [
        'routes' => $this->registerRoutes()
    ]);
}


Во вьюхе:

<x-admin::navigation />
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы