【发布时间】:2014-11-15 23:05:17
【问题描述】:
我对依赖注入的了解越多,我就越感到困惑。我知道它的用途,那不是问题。尝试在纸上做一些设计,这是我的想法,但在我看来,我似乎忽略了一些东西。
首先,我设想构建一个实际的服务器,它可以接受传入的请求并将响应返回给用户。
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 允许我们内联构建和发送响应。因此,我们可以为每个页面或其他发送响应的对象创建一个控制器对象,并为此创建一个构建器。
$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 中,然后向管理员发送一封邮件你是这个页面上的第一个访问者,...
【问题讨论】:
-
让我把这个做对,你想把它用作后端。向它发送任何数据的请求,找到与数据匹配的页面,并显示它?
-
php 中的一切不都是后端吗?反正。我是这样看的。因为它是网络,所以理论上 setter 没有用,因为所有东西都可以注入构造函数中。传入的 http 请求的主要目的是返回一些 html。依赖注入用于通过使用在构造函数中注入所有内容的构建器或工厂来组装 html。但是在组装过程中必须完成一些副作用,例如写入数据库,我不认为这是构建器的任务
-
不是,你可以只用PHP来创建接口(前端),或者你可以用它来保存数据库或处理模型数据(后端)
-
但是在服务器上构建接口不仍然是后端工作吗?无论如何,是的,这基本上就是我想要的。获取传入的 http 请求,构建接口并发送 http 响应。我的理论示例将使用 buildResponse() 执行此操作。问题是副作用属于哪里。如果不在界面构建过程中,那么在哪里。
标签: php dependency-injection web dependencies code-injection