Как в Laravel выводить контент из контроллера, если вызывается другой контроллер
Начал изучать Laravel (8 версия). Допустим, есть двухколоночный сайт. В левом блоке постоянно на всех страницах выводится из базы данных или по результатам работы какого-то метода какого-то контроллера какой-то контент. Далее, создаю контроллер, который будет работать по определенному маршруту с основной частью контента сайта (условно, правый блок). Не могу понять, если в маршруте я вызываю тот метод контроллера, который отвечает за вывод контента в правый блок, то каким образом должен тогда наполняться левый блок? Каким образом вызвать метод контроллера, отвечающий за контент левого блока, который выводится всегда на всех страницах? В шаблоне blade на левый блок сайта стоят @yiled'ы, которые прописаны в @section других шаблонов, но как значение переменных из метода контроллера (который не вызывается из маршрута) попадет в переменные, стоящие в @section, отвечающие за левый блок сайта? Я даже в гугл запрос не могу нормально составить, чтобы получить ответ.
Ответы (3 шт):
Попробуйте достать ваш контроллер как сервис из контейра и вызвать нужную функцию. например где-то в шаблоне:
{{ app(OtherController::class)->renderSidebar() }};
Кроме контроллеров, существуют и другие понятия, а также сущности в 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 и с готовым примером.