Я создаю форумную систему на PHP, и я спотыкаюсь над раздражающей проблемой при написании кода для вставки новой темы. Я использую кучу объектов, таких как User, Post и Topic, все они берут объект PDO в свой конструктор (инъекция зависимостей).
Примечание. Я знаю, что подобные вопросы были заданы раньше, но все ответы, которые я нашел, рекомендуют использовать инъекцию зависимостей, и в этом случае я не считаю это очень понятным или удобным в использовании, поскольку будет не менее 3, а иногда и больше, зависимостей для ввода многих различных функций.
В настоящее время, когда я создаю новую тему (поток), она вызывает страницу синтаксического анализа, которая выполняет всю проверку: пользователь должен быть зарегистрирован, заголовок должен иметь длину не менее 3 символов и т.д. Чтобы избежать вложенных if
, я обертываю весь этот код внутри функции, поэтому я могу просто использовать return
чтобы выйти, когда что-то пойдет не так.
Проблема заключается в том, что моя функция не имеет доступа к объектам User, Post и Topic, созданным на странице init
, которая требуется на всех страницах автоматически.
Я знаю об dependency injection
, но мне не имеет смысла передавать четыре разных объекта в качестве параметров моей функции.
Здесь приведен пример кода для этой функции newTopic
, которая находится внутри страницы синтаксического анализа, упомянутой выше:
if(!empty($_POST['newTopic']))
newTopic();
function newTopic()
{
//Check that the user is connected
if(!$User->isConnected())
return false;
//Other checks ...
$Topic->new($author, $title, $content);
}
Конечно, объекты $User
и $Topic
недоступны внутри функции. Я могу либо передать его как параметр, либо использовать global
. Я знаю, что использование global
не рекомендуется, однако я не думаю, что передача четырех разных объектов для каждой функции намного лучше.
Вопрос: Что самое лучшее в этом случае? Передавать мои объекты в качестве параметров функции newTopic
? Использовать global
? Использовать вложенные, if
вместо функции?
Вы можете отделить логику создания новой темы, такую как проверки, возможно, операции с БД и т.д., И создание нового объекта класса Topic. Обратите внимание, что создание объекта Topic необходимо, чтобы он был постоянным сразу. Класс темы может быть только структурой данных темы.
Может быть хорошим местом для строителя.
$builder = new TopicBulder()->setAuthor($author)->setTitle($title)->setContent($content)->getTopic();
Где TopicBuilder - это класс с каждым возвращаемым методом и ссылкой на $ this.
class TopicBuilder {
private $topic;
function __construct() {
$this->topic = new Topic();
}
public function setAuthor($author) {
$this->topic->setAuthor($author);
return $this;
}
....
public function getTopic() {
return $this->topic.
}
}
Или что-то более чистое, чем это;)
newTopic
для проверки ввода пользователя, отображения сообщения об ошибках и всего, и класс `Topic` отвечает в основном за доступ к БД. Та же проблема возникает, если я выполняю проверку внутри класса `Topic`, так как он также не имеет доступа к классу` User` (например, чтобы проверить, вошел ли пользователь в систему).