Как в Laravel выводить контент из контроллера, если вызывается другой контроллер

Начал изучать Laravel (8 версия). Допустим, есть двухколоночный сайт. В левом блоке постоянно на всех страницах выводится из базы данных или по результатам работы какого-то метода какого-то контроллера какой-то контент. Далее, создаю контроллер, который будет работать по определенному маршруту с основной частью контента сайта (условно, правый блок). Не могу понять, если в маршруте я вызываю тот метод контроллера, который отвечает за вывод контента в правый блок, то каким образом должен тогда наполняться левый блок? Каким образом вызвать метод контроллера, отвечающий за контент левого блока, который выводится всегда на всех страницах? В шаблоне blade на левый блок сайта стоят @yiled'ы, которые прописаны в @section других шаблонов, но как значение переменных из метода контроллера (который не вызывается из маршрута) попадет в переменные, стоящие в @section, отвечающие за левый блок сайта? Я даже в гугл запрос не могу нормально составить, чтобы получить ответ.


Ответы (3 шт):

Автор решения: Кирилл

Попробуйте достать ваш контроллер как сервис из контейра и вызвать нужную функцию. например где-то в шаблоне:

{{ app(OtherController::class)->renderSidebar() }};
→ Ссылка
Автор решения: Oleg Dmitrochenko

Кроме контроллеров, существуют и другие понятия, а также сущности в Laravel.

То что вы хотите сделать, можно через View Composers: https://laravel.com/docs/8.x/views#view-composers

Если вам нужно модифицировать результат этого блока в зависимости от страницы, вы можете использовать экземпляр Request.

Также вы можете передавать значение через расшаривание переменных в представлении: https://laravel.com/docs/8.x/views#sharing-data-with-all-views

Или же вы можете использовать инъекции: https://laravel.com/docs/8.x/blade#service-injection

Но если результаты блоков привязаны к URL или какой-то сущности, то лучше передавать данные через контроллер и вызов view(), а при отсутствии данных вы можете использовать другое представление (компонент, данные). Это можно сделать с помощью расширения представлений, условий в Blade и даже условий в контроллере.

→ Ссылка
Автор решения: Саня

Для этого можно использовать метод callAction() класса Controller. Вот инструкция подробнее https://hccoder.info/category/laravel/post-1139 и с готовым примером.

→ Ссылка