Конструктор класса
Всем здравствуйте!
Возник вопрос, насколько можно загружать конструктор класса, особенно если от него наследуются все остальные классы пример: AbstractController?
Почему возник вопрос:
Решил реализовать через конструктор заполнение полей в <head> таких как <meta>, <link> и т.д.
Если есть метод проще и стандартизированние будет интересно посмотреть!
Но вопрос насколько загруженность конструктора влияет на быстроту приложения так же остаётся.
Спасибо!
Ответы (4)
Делать заполнение этих полей в конструкторе контроллера не имеет никакого смысла. На момент создания контроллера у нас просто не может быть этих данных. Они появляются гораздо позже, после обращения экшена к модели.
Ну и заполнением этих полей должен заниматься слой View. Изучайте курс ООП в PHP.
Хотел таким методом избавится от дублирования кода в каждом контроллере к примеру стили и скрипты. Чтобы можно было изменять и подключать их примеру из админки в одном месте.
Пример мета тэг base:
abstract class AbstractController
{
/** @var View */
protected $view;
/** @var User|null */
protected $user;
/** @var string */
protected $base;
/**
* AbstractController constructor.
* @throws DbException
*/
public function __construct()
{
$this->user = UsersAuthService::getUserByToken();
$this->view = new View(__DIR__ . '/../../templates');
$this->view->setVar('user', $this->user);
$this->base = $_SERVER['HTTP_X_FORWARDED_PROTO'] . '://' . $_SERVER['HTTP_HOST'];
}
}
MainController:
public function main()
{
$title = 'Главная страница';
$description = 'Мой блог обо всём!';
$articles = Article::findAll();
$this->view->renderHtml('main/main.php', [
'articles' => $articles,
'title' => $title,
'description' => $description,
'base' => $this->base,
]);
}
Head:
<head>
<meta charset="UTF-8">
<title><?php echo $title ?? 'Заголовок' ?></title>
<?php if ($description) { ?>
<meta name="description" content="<?php echo $description ?>">
<?php } ?>
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href='/css/style.css'>
<script src="/script/jquery-3.4.1.min.js"></script>
<script defer src="/script/script.js"></script>
<base href="<?php echo $base ?>">
</head>
Такое проще положить в константу, а шаблоне это просто выводить. Ведь этот base будет один для всего сайта.