我读的关于依赖注入越多,我就越感到困惑。我知道它是什么,这不是问题。试图在纸上做一些设计这就是我提出来的,不知何故,在我看来,我忽略了一些东西。
首先,我想象构建一个实际的服务器,它将接受传入的请求并将响应返回给用户。
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()并获得响应。但这意味着构建器(或其他构建器,如果我们拆分它)也对可能发生的任何其他事情负责,例如验证用户,写入数据库,......而且我无法理解这样的事实:写入数据库将是对象图构造的一部分。 这就像:发送给我你的请求。哦,你想要的主页?我会为你建立你的回复,当我在这里时,我也会做一些与构建它无关的事情,例如记录我刚刚做的事情,并将一些数据保存在cookie中并向管理员发送邮件你是这个页面上的第一个访客,...
答案 0 :(得分:1)
你应该将它们分开。你有一些我认为有点奇怪的假设。让我们从他们开始吧。
传入的http请求的主要目的是回馈一些html
我已经构建了只返回JSON而不是HTML的PHP后端。我在后端和前端之间有一个非常强大的边界。我只使用后端从数据库中提供数据,或者在数据库中添加/编辑数据。前端只是一个PHP脚本,可以按照我想要的方式构建页面。
因为它是网络,理论上从来没有用于设置者 一切都可以在构造函数中注入
你可以使用构造函数,但你也没有。你可以使用setter。依赖注入实际上只是扭转了流动。
但你走在正确的轨道上。您需要一些负责构建页面的类。所以,让它只负责你构建你的页面,并承担其他责任。记录,身份验证等内容应该不在此范围内。
例如,如果您想要记录,您可以让构建器创建您的页面,然后您的记录器可以监听构建器正在执行的所有操作(例如,使用观察者模式)。因此,如果您的构建器说:“我创建了主页”,您可以使用实际监听构建器的记录器进行记录。
即使在构建器启动之前,也应该进行身份验证。如果您已经知道用户不应该在页面上,那么您不希望您的构建器开始工作。您可以使用数据库,并将任何usertype / pagerequest组合列入白名单。
然后,对于数据处理,我会创建一个后端,它只处理应该返回数据的请求,或者保存它。然后前端可以通过拉动它来进行通信以获得它的内容。
我希望这可以解决一些问题,但我很乐意回答更多不确定的问题。