Зависимость инъекций php сайт

Чем больше я читаю о внедрении зависимости, тем больше путаюсь. Я знаю, для чего это, это не проблема. Попытка сделать некоторый дизайн на бумаге — это то, что я придумал, и почему-то мне кажется, что я что-то упускаю.

Сначала я представлял себе создание реального сервера, который будет принимать входящие запросы и возвращать ответы пользователю.

class Server {
private $responseBuilder;

public function __construct($responseBuilder) {
$this->responseBuilder = $responseBuilder;
}

public function run() {
// create socket, receive request
$response = $this->responsebuilder->build($request);
// send response
}
}

class Response {
private $method;
private $message;
private $url;

// getters & setters
}

class ServerBuilder {
public build() {
// construction logic
return new Server(new ResponseBuilder());
}
}

Поскольку Apache используется для обработки запросов к серверу, мы можем заменить сервер чем-то, что просто отправляет ответ.

$bldr = new ResponseBuilder();
$response = $bldr->build();
// send response some way

Обратите внимание, что ResponseBuilder имеет прямой доступ к запросу ($ _SERVER [‘..’])
и поэтому у него есть все, что нужно, чтобы выбрать правильный ответ.

PHP, однако, позволяет нам создавать и отправлять ответы в строке. Таким образом, мы могли бы иметь объект Controller для каждой страницы или что-то еще, что отправляло бы ответ и имел конструктор для этого.

$bldr = new ControllerBuilder();
$controller = $bldr->build();
$controller->run();

class ExampleController implements Controller {
public function run() {
header("HTTP/1.1 404 Not Found");
echo 'sorry, page not found';
}
}

Это все имеет смысл для меня. Но давайте снова посмотрим на пример с сервером.
Он вызывает $ responseBuilder-> build () и возвращает ответ. Но это будет означать, что сборщик (или другие сборщики, если мы разделим его) также несет ответственность за все остальное, что может произойти, например, аутентификацию пользователя, запись в базу данных, … и я не могу понять, что запись в базу данных будет частью построения графа объекта.
Это было бы как: Отправить мне свой запрос. О, вы хотите домашнюю страницу? Я напишу вам ваш ответ, и пока я делаю это, я также буду делать некоторые вещи, которые не имеют ничего общего с его сборкой, например, записывать то, что я только что сделал, и сохранять некоторые ваши данные в куки и отправлять письмо администратору, что Вы первый посетитель на этой странице, …

2

Решение

Вы должны отделить их. У вас есть несколько предположений, которые я считаю немного странными. Давайте начнем с них.

Основная цель входящего http-запроса — вернуть html

Я создал PHP бэкэнды, которые возвращают только JSON вместо HTML. У меня была действительно сильная граница между задней и передней частью. Я использовал только бэкэнд для передачи мне данных из базы данных или добавления / редактирования данных в базе данных. Фронт-энд был просто PHP-скриптом, который создавал бы страницы так, как я хотел.

Поскольку это сеть, теоретически нет смысла использовать сеттеры.
все может быть введено в конструктор

Вы можете использовать конструктор, но у вас его тоже нет. Вы можете использовать сеттеры. Внедрение зависимостей на самом деле просто переворачивает поток.

Вы на правильном пути, хотя. Вам нужен какой-то класс, который отвечает за создание ваших страниц. Поэтому возьмите на себя ответственность только за создание своих страниц и возьмите на себя другие обязанности. Такие вещи, как логирование, аутентификация и т. Д. Должны быть вне этого.

Например, если вы хотите вести журнал, вы можете попросить своего создателя создать свою страницу, и тогда ваш регистратор сможет прослушать все, что делает ваш строитель (например, с помощью шаблона наблюдателя). Поэтому, если ваш строитель говорит: «Я создал домашнюю страницу», вы можете войти в нее с помощью своего регистратора, который фактически слушает вашего сборщика.

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

Затем для обработки данных я бы создал бэкэнд, который обрабатывал бы только запросы, которые должны возвращать данные, или сохранять их. Затем передний конец может общаться, чтобы получить его содержимое, потянув его.

Я надеюсь, что это прояснит некоторые вещи, но я буду рад ответить на более сложные вопросы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]