依赖注入php网站

时间:2014-11-03 15:52:33

标签: php dependency-injection web dependencies code-injection

我读的关于依赖注入越多,我就越感到困惑。我知道它是什么,这不是问题。试图在纸上做一些设计这就是我提出来的,不知何故,在我看来,我忽略了一些东西。

首先,我想象构建一个实际的服务器,它将接受传入的请求并将响应返回给用户。

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中并向管理员发送邮件你是这个页面上的第一个访客,...

1 个答案:

答案 0 :(得分:1)

你应该将它们分开。你有一些我认为有点奇怪的假设。让我们从他们开始吧。

  

传入的http请求的主要目的是回馈一些html

我已经构建了只返回JSON而不是HTML的PHP​​后端。我在后端和前端之间有一个非常强大的边界。我只使用后端从数据库中提供数据,或者在数据库中添加/编辑数据。前端只是一个PHP脚本,可以按照我想要的方式构建页面。

  

因为它是网络,理论上从来没有用于设置者   一切都可以在构造函数中注入

你可以使用构造函数,但你也没有。你可以使用setter。依赖注入实际上只是扭转了流动。

但你走在正确的轨道上。您需要一些负责构建页面的类。所以,让它只负责你构建你的页面,并承担其他责任。记录,身份验证等内容应该不在此范围内。

例如,如果您想要记录,您可以让构建器创建您的页面,然后您的记录器可以监听构建器正在执行的所有操作(例如,使用观察者模式)。因此,如果您的构建器说:“我创建了主页”,您可以使用实际监听构建器的记录器进行记录。

即使在构建器启动之前,也应该进行身份验证。如果您已经知道用户不应该在页面上,那么您不希望您的构建器开始工作。您可以使用数据库,并将任何usertype / pagerequest组合列入白名单。

然后,对于数据处理,我会创建一个后端,它只处理应该返回数据的请求,或者保存它。然后前端可以通过拉动它来进行通信以获得它的内容。

我希望这可以解决一些问题,但我很乐意回答更多不确定的问题。