Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Начал изучать 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, не должны изменяться мною и используются только для получения данных из одной таблицы. Где тогда разместить всю подобную логику? Создавать файлы, в которых будет класс с нужной логикой и потом в контроллере создавать объект этого класс и обращаться к методам?