Symfonyob娱乐下载 5.3新增功能:使用属性自动装配服务
2021年5月18日·发表的哈维尔Eguiluz
警告:这篇文章是关于一个不受支持的Symfony版本。ob娱乐下载有些信息可能已经过时了。阅读最新的Symfony文档ob娱乐下载.
用属性自动装配迭代器/定位器
提供的
亚历山大·图雷克而且尼古拉斯Grekas在# 40406.
传统的方式使用服务标记在Syob娱乐下载mfony应用程序中涉及这些步骤:
- 将一些标记应用到一个或多个服务上(手动或自动地将一个标记应用到实现某种接口的所有服务上);
- 添加一些服务配置,告诉Symfony将所有带有该标记的服务注入到另一个服务中;ob娱乐下载
- 准备其他服务作为PHP迭代器接收带标记的服务。
这个过程很快就会变得重复和无聊。这就是为什么在Symfonyob娱乐下载 5.3中我们改进了这个特性注入带有PHP属性的标记服务.
假设您的应用程序需要注入所有标记为自定义标记的服务app.handler
.首先,将此标记自动应用于所有类实现特定PHP接口的服务:
1 2 3 4 5 6
#配置/ services.yaml服务:_instanceof:App \处理器\ HandlerInterface:标签:(“app.handler”)#……
现在,使用new# (TaggedIterator)
PHP属性注入所有带有该标记的服务。您不需要添加任何额外的配置;只添加这个新属性就足够了:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /处理/ HandlerCollection.php名称空间应用程序\处理程序;使用ob娱乐下载\组件\DependencyInjection\属性\TaggedIterator;类HandlerCollection{私人$处理程序;公共函数__construct(# (TaggedIterator(“app.handler”)] iterable$处理程序){$这->处理程序=$处理程序;}}
类似地,Symfonyob娱乐下载 5.3包含一个新的# (TaggedLocator)
属性来注入服务定位器所有服务都带有一些标签:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /处理/ HandlerCollection.php名称空间应用程序\处理程序;使用Psr\容器\ContainerInterface;使用ob娱乐下载\组件\DependencyInjection\属性\TaggedLocator;类HandlerCollection{私人$处理程序;公共函数__construct(# (TaggedLocator(“app.handler”)] ContainerInterface$处理程序){$这->处理程序=$处理程序;}}
选择与属性自动连接别名
提供的
尼古拉斯Grekas
在# 40800.
自动装配的别名当您的应用程序使用自动装配并且有相同类型的多个实现时需要。例如,考虑以下情况作用域HTTP客户端创建用于GitHub API:
1 2 3 4 5 6 7 8 9
#配置/包/ framework.yaml框架:http_client:scoped_clients:githubApi:范围:“https://api \ .github \ com”标题:接受:“application / json vnd.github.v3 +”#……
如果希望在服务中注入这个有作用域的HTTP客户端,仅使用构造函数参数进行类型提示是不够的HttpClientInterface
.您必须使用接口作为类型提示和自动装配别名(githubApi
)作为变量名:
12 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\合同\HttpClient\HttpClientInterface;类GitHubDownloader{私人$githubApi;公共函数__construct(HttpClientInterface$githubApi){$这->githubApi =$githubApi;}/ /……}
这种机制工作得很好,但是必须使用一些特定的变量名对一些开发人员来说太死板了。在Syob娱乐下载mfony 5.3中您可以使用任何变量名因为我们引入了a#(目标)
属性选择自动装配别名。下面是Symfony 5.3中的相同示例:ob娱乐下载
12 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\DependencyInjection\属性\目标;使用ob娱乐下载\合同\HttpClient\HttpClientInterface;类GitHubDownloader{私人$httpClient;公共函数__construct(#(目标(“githubApi”)] HttpClientInterface$httpClient){$这->httpClient =$httpClient;}/ /……}
发表在#生活在边缘
评论
理查德作者Lynskey
2021年5月19日说在33
我很高兴看到注释在5.3中得到了更多的喜爱!
Marc Romera
2021年6月11日说在17:11
太酷了!检查它,并缺乏工作与推广属性,将是棒极了!
例如:
public function __construct(#[Target('githubApi')] private HttpClientInterface $httpClient)
{
}
例如:
public function __construct(#[Target('githubApi')] private HttpClientInterface $httpClient)
{
}
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
Javier Eguiluz is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now