мне нужна помощь с определением классаООП на PHP, объекты behaivor на основе сессии
Я начинаю проект PHP 7.0, если вы не PHP гуру, но есть опыт работы с ООП, я уверен, вы также могли бы Помогите.
У меня есть следующие классы, которые помогают строить HTML страницы использования
interface PageBuilderInterface
{
public function getHTMLPage(): string;
public function getHead(): string;
public function getBody(): string;
public function getMenu(): string;
public function getMainArea(): string;
public function getFooter(): string;
}
class PageBuilder implements PageBuilderInterface
{
public function getHTMLPage(): string
{
return "<!doctype html><html>" .
$this->getHead() .
$this->getBody()
"</html>";
}
public function getHead(): string
{
return '<meta charset="utf-8">
<title>Page Title</title>';
}
public function getBody(): string
{
return "<body>" .
$this->getMenu() .
$this->getMainArea() .
$this->getFooter() .
"</body>";
}
public function getMenu(): string
{
return '<a href="index.php">Home</a> |
<a href="login.php">Login</a> |
<a href="register.php">Become Member</a> ';
}
public function getMainArea(): string
{
return '<h1>Main Content Here</h1>
<p>Loren Ipsun...</p>';
}
public function getFooter(): string
{
return '<div>Footer Page Here</div>';
}
}
:
$page = new PageBuilder();
echo $page->getHTMLPage();
Это просто и работает.
Теперь у меня есть новое требование: некоторые методы должны работать совсем по-другому в зависимости от пользователя на сеансе, например, у нас есть типы пользователей «Гость», «Основной член» и «Золотой член».
Ссылки на главном меню различны для каждого типа элемента, и должны быть в состоянии показать различную информацию для каждого члена (например, сообщения, кредиты, баланс или любой другой информации)
так,
PageBuilder :: getMenu()
должен возвращает некоторые ссылки, как
Главная | Вход | Стать участником для посетителя Главная | Сообщения | Выход для основных членов Главная | Сообщения | Баланс $ 208,23 | Выход для участников golder
В будущем мне может понадобиться больше «типов пользователей» и разные ссылки для них, то есть это должно быть легко изменить в будущем.
Я знаю: мне нужно, чтобы получить статус пользователя в getMenu() метод, но не уверен, которым из следующих вариантов является лучшим:
1 - создать пользователя от сеанса
public function getMenu(): string
{
$user = new User($_SESSION['id_user']);
$links = $user->getLinks(); // perhaps an array with links
return doSomeFormatToLinks($links);
}
2 - глобальный объект пользователя
public function getMenu(): string
{ global $user;
$links = $user->getLinks();
/* .... build html links here */
}
3 - в качестве параметра
public function getMenu(User $user): string
{
$links = $user->getLinks();
}
4 - объект пользователя в качестве настройки с конструктором
class PageBuilder implements PageBuilderInterface
{
private $user;
public function __construct(User $user)
{
$this->user = $user
}
}
5 класса атрибут объявления - аналогично, чем 4, но с сеттер
class PageBuilder implements PageBuilderInterface
{
private $user;
public function __construct()
{
$this->user = $user
}
public function setUser($this->user = $user)
{
$this->user = $user;
return $this;
}
}
6 - другие варианты?
Я ищу наилучший вариант, обращая внимание на принципы SOLID и смотря на то, чтобы его можно было легко осмелиться и протестировать с помощью phpunit, пытаясь отделить логин пользователя от логики «pagebuilder» так же, как и возможно
варианты 1 и 2: у меня плохое отношение к ним, они используют глобальный статус, это пахнет, разве это не так? вариант 3: я считаю, что это легко проверить. варианты 4 и 5: я думаю, что хорошая идея иметь пользователя как attitute, так как я мог использовать пользовательский статус для других методов в классе, но, с другой стороны, я беспокоюсь о семантировании, я говорю, что пользователь принадлежит к страницеbuilder ... вариант 6: Я уверен, что ваше предложение будет самым лучшим: D
спасибо за ваше время!
Использование класса для сборки html в наши дни не очень хорошая практика. Рассматривали ли вы использование современной структуры? Они делают большую часть этого из коробки, поэтому вы можете сосредоточиться на своем коде сайта. – Mei