依赖于抽象,而不是具体化

Depend on abstractions, not on concretions

例如,我想在没有任何框架的情况下使用现成的库编写我的项目,而不是重新发明自行车。

当然,在项目的发展过程中,我会编写自己的 classes,可以将其移出项目,例如 \Acme\Framework 命名空间。我的带有域层的项目文件将放置在 \Acme\ProjectName 命名空间下。

所以此时我想使用 Symfony 的 HttpFoundation 组件来处理 http 层。我需要将 Request class 注入控制器。但是 SOLID 原则说 classes 需要依赖于抽象而不是具体化。

这是否意味着我需要创建依赖于 Symfony 的 Request 的 class \Acme\Framework\Request 并使用它?或者我可以按原样使用 Symfony 的 Request

这种情况下的最佳做法是什么?

对不起我的英语,如果它伤害了你

意思是一般需要依赖泛型接口。以您的 HttpFoundation 请求为例,您可以将其包装到 PSR-7 adapter 中并让您的控制器接受 Psr\Http\Message\ServerRequestInterface。现在它不依赖于 Symfony 的 HttpFoundation 的细节,并且能够(当然需要一些额外的努力)与其他使用 PSR HTTP 消息接口的框架一起工作,比如 Zend Expressive(此时必须有更多)。