Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 14.08.2019 18:42:36

Вызов одного контроллера из другого для генерации шапки сайта

Начал изучать laravel (версия 5.8) да и в целом паттерн MVC. Возникло несколько вопросов.
Вопрос 1) Хочу чтобы в шапке сайта была информация из БД. Для этого создал контроллер специально для шапки сайта и представление. Контроллер шапки сайта берет данные из БД и передает их в представление. Представление генерирует шапку сайта используя переданные в него данные и возвращает HTML код шапки (получается не HTML страница, а просто тег div внутри которого находится код шапки).
Работу всего это я представляю так:
Пользователь хочет увидеть страницу сайта, на которой должна быть шапка сайта. Вызывается контроллер, который обрабатывает запрашиваемую страницу. Контроллер получает данные которые нужны на запрашиваемой страницы (допустим новости) и так же вызывает контроллер шапки сайта, который генерирует HTML код шапки сайта. После этого контроллер запрашиваемой страницы передает данные новостей и HTML код шапки сайта в представление. Ну и представление подключает CSS и JS файлы, подставляет HTML код шапки сайта в заранее заготовленное место, отображает новости и все это уже отправляется пользователю.
Реализовать у меня получилось это вот так:

Контроллер шапки:

namespace App\Http\Controllers;
use Illuminate\Http\Request;
class headerSite extends Controller
{
	public static function test(Request $request)
	{
		$headerData = "SiteName";
		return view("headersite", ["headerData"=>$headerData]);
	}
}

Представление шапки:

<div style="background-color: #05ffb0;">
<?php echo $headerData ?>
</div>

Контроллер запрашиваемой страницы:

namespace App\Http\Controllers;
use Illuminate\Http\Request;
class index extends Controller
{
	public function first(Request $request)
	{
		$headerCode = headerSite::test($request);
		$contentData = "Content text";
		return view("myindex",["headerCode"=>$headerCode,"contentData"=>$contentData]);
	}
}

Представление запрашиваемой страницы (только <body>):

<body>
	<?php echo $headerCode ?>
	Content: 
	<?php echo $contentData ?>
</body>

Ну и сам вопрос: Как по нормальному такое сделать? Мне кажется статический метод и вызов контроллера из другого контроллера - это не самое правильное решение, но это единственное которое у меня заработало.
Ну или возможно такой вариант:
Создать файл модели шапки сайта, в котором будет получение и/или обработка данных нужных для шапки. Создать представление, в котором используются данные из модели шапки сайта. Потом контроллер страниц, где нужна шапка сайта, помимо вызова модели страницы вызовет еще и модель шапки сайта и все эти данные передаст в представление страницы, а представление страницы уже как-то дополнительно подключит представление шапки сайта.
В общем как правильно?

Вопрос 2) Допустим по запросу пользователя нужно не получить данные из БД, а сгенерировать их или вообще нужно прочитать определенный файл на компьютере. Это вроде можно сделать в laravel в контроллере, но в паттерне MVC вся эта логика должна быть, не в контроллере, а в модели. Насколько я понял, в laravel модели, которые были сгенерированны с помощью make:model, не должны изменяться мною и используются только для получения данных из одной таблицы. Где тогда разместить всю подобную логику? Создавать файлы, в которых будет класс с нужной логикой и потом в контроллере создавать объект этого класс и обращаться к методам?

Не в сети

#2 14.08.2019 22:31:15

Re: Вызов одного контроллера из другого для генерации шапки сайта

Не надо тебе обращаться к другому контроллеру. Всё делается на уровне шаблонов.

То что ты просишь делается через "наследование шаблонов". Не знаю зачем так назвали, на наследование в ООП это не похоже. smile
В команде @extends указываешь где находятся твои шапка и попка. То, что надо туда передать для вывода обрамляешь в блоки @section или @stack
Чтобы постоянно не передавать одни и те же "глобальные" параметры в каждый вызов, описываешь их один раз во View Composers

Всё нормально описано в офф. доках.
https://laravel.ru/docs/v5/blade
https://laravel.com/docs/5.8/views#view-composers

Не в сети

Подвал раздела