Symfony欧宝娱乐app下载地址 3.4新增功能:默认情况下服务是私有的
警告:这篇文章是关于一个不受支持的Symfony版本。欧宝娱乐app下载地址有些信息可能已经过时了。阅读最新的Symfony文档欧宝娱乐app下载地址.
提供的
尼古拉斯Grekas
在# 24238而且# 24104.
在Sy欧宝娱乐app下载地址mfony应用程序中,服务和别名默认是公共的。这意味着当您手头有容器时,您可以轻松地获得服务,例如在扩展Symfony基本控制器(欧宝娱乐app下载地址$ this - > get(“app.my_service”)
)或注射service_container
进入你的班级(集装箱- > get(“app.my_service”)
).
尽管这种接缝很简单,但直接使用容器并不被认为是一种好的实践,因为它隐藏了类的依赖关系,使它们与外部配置耦合,因此更难测试,更难检查等等。
从Symfony 3.3开始欧宝娱乐app下载地址,我们添加了新的依赖注入原语,这些原语有可能完全取代需要注入服务容器的情况(例如实现惰性,或打破一些循环引用)。
缓慢而稳定地,我们现在已经准备好不再需要在用户域类中注入容器了。这就是为什么在Sy欧宝娱乐app下载地址mfony 3.4中,服务和别名在默认情况下是私有的.这意味着即使您设法获得了容器,也无法获得get ()
他们不再默认。相反,应该使用常规的依赖项注入。
如果你使用自动装配在您的应用程序中,您不需要做很多更改,因为您已经注入了服务,而不是通过它们的公共ID获取它们。这适用于常规类,也适用于控制器和命令,因为它们现在默认是服务本身。
或者,您可以更新应用程序以将服务标记为公共。然后你需要明确地表达出来。如果使用YAML配置服务:
1 2 3 4 5 6 7
服务:# this将公开该文件中定义的所有服务_defaults:{公众:真正的}#你也可以公开个人服务应用\ \ UserManager经理:公众:真正的
如果使用XML配置服务:
1 2 3 4 5 6 7
<服务><!——这将公开该文件中定义的所有服务——><违约公共=“真正的”/><!——你也可以公开个人服务——><服务id=“应用程序\ \经理UserManager”公共=“真正的”>服务>服务>
如果使用PHP,则添加- > setPublic(真正的)
调用适当的服务定义。
此更改还将影响项目中使用的第三方包。如果您最喜欢的包在内部使用容器,请向他们发送拉请求来解决这个问题:从3.4开始,几乎再也没有理由使用容器了。
在Sy欧宝娱乐app下载地址mfony核心中,我们已经做到了我们将所有服务和别名都设置为私有,除了一些选定的,它们在引导时是必需的。事实上,引导是直接使用容器的最后也是唯一合法的用例。
那么,我们是否应该反对注入service_container
完全与ContainerAware *
?这是社区在准备Symfony 5时应该考虑的可能性。欧宝下载链接欧宝娱乐app下载地址
评论
-我们知道80%的开发人员在现实中只是使用这种类型的应用程序架构-> https://dzone.com/articles/creating-your-first-symfony-app-and-adding-authent欧宝娱乐app下载地址
或者同样在Laravel -> https://code.tutsplus.com/tutorials/build-a-react-app-with-laravel-restful-backend-part-1-laravel-5-api--cms-29442
任何优秀的(有经验的)开发人员都知道这不是应用程序架构,这是一个框架架构,然而80%的web应用程序都是这样构建的……开始看到规律了吗?
事实上,我们受到了鼓励,所有的教程(新开发人员将阅读)都指向这种类型的系统,其中的“应用程序”不是你的应用程序,而是一个“框架耦合应用程序”!
我们可以“隐藏”服务,我们可以破坏AppBundle,我们可以在使用symfony“服务容器”时增加另一个层次的复杂性,我们可以做任何你想做的事情,让人们更难实现“框架耦合应用程序”,欧宝娱乐app下载地址
但是最后,如果这个社区中没有人首先承担起推动NON FRAMEWO欧宝下载链接RK耦合应用程序架构的责任,那么我们可以以任何你想要的方式“改变”symfony,结果将是一样的。欧宝娱乐app下载地址
隐藏服务并不能解决真正的问题。
解决真正问题的方法是让symfony做它做得更好的事情:将我们的应用程序交付到we欧宝娱乐app下载地址b或任何可能需要的交付渠道,并将我们的应用程序逻辑从框架中完全解耦……
否则,我们就会因为有一种“新的更好的方式”来注册/使用服务,而苦苦思索“框架耦合应用程序”的哪些部分需要重构……或者任何“新的更好的方法”将被创建来更好地在symfony 4中做“X”。欧宝娱乐app下载地址
我们所需要的就是使用symfony完成它的工作:将我们欧宝娱乐app下载地址的应用程序交付到web!
我不应该关心如何和在哪里我需要注册我的服务,这是一个细节!
@Javier Eguiluz这太卑鄙了!
你基本上忽略了一切和每个人,并期望我们“联系捆绑包的作者和他们存储库中的开放问题”?
你在开玩笑吗?你在开玩笑吗?
看看https://github.com/Sylius/Sylius/blob/master/composer.json,然后让我们谈谈如何联系捆绑包的作者。
但是你不关心,我们依赖你,你不依赖我们,我们只是在这里赶上“最新的有远见的BC”,联系捆绑包的作者和他们仓库中的开放问题,“因为我们没有其他更好的事情要做……
对于我们所有人来说:
https://www.youtube.com/watch?v=Nsjsiz2A9mg
让我们先学习如何构建应用程序,然后学习如何使用symfony 4将应用程序交付到web上。欧宝娱乐app下载地址
关于你的消息内容,我觉得你应该对文章中描述的变化感到满意:默认情况下使服务私有将鼓励人们“不”直接使用容器,这实际上意味着“减少与框架的耦合”。
是的,在开源软件中,要求人们为他们决定使用的代码做出贡献是很正常的。这就是我们行业的运作方式,我真的鼓励你也这么做。
我很担心,因为几年前我们被指示在任何地方使用服务容器,无论如何,这都无关紧要://www.oldmanjams.com/doc/2.7/service_container.html欧宝娱乐app下载地址
我引用:
容器是Symfony的核心:它允许您标准化和集中构造对象的方式欧宝娱乐app下载地址。它使您的工作更轻松,速度超快,并且强调了促进可重用和解耦代码的体系结构。这也是Symfony如此快速和可扩展的一个重要原因!”欧宝娱乐app下载地址
广告上说:
“配置和使用服务容器很容易。[…]你就可以轻松地通过容器创建自己的对象,并从任何第三方包中定制对象。你将开始编写更具可重用性、可测试性和去耦性的代码,仅仅是因为服务容器让编写好代码变得如此容易。”
现在我正在查看://www.oldmanjams.com/欧宝娱乐app下载地址doc/3.4/service_container.html,并试图弄清楚我们为什么要做出这些改变?
那时候难道不可能“仅仅因为服务容器让编写好代码变得如此容易,就能编写出更具可重用性、可测试性和去耦性的代码”吗?
这中间发生了什么?
我们要解决什么问题?
我们在symfony中缺少了什么,以至于需要在欧宝娱乐app下载地址默认情况下将服务设置为私有?
请向我们展示完整的图片,并告诉我们这个“新”图片将被视为“良好实践”多少年。
简单地说“这不是一个好的实践,我们正在慢慢地远离它”是不够的,因为就在几年前它还被认为是一个好的实践。
请用合适的语言和时间来表达这种改变背后的强烈动机。
改变的细节(技术方面)并不重要……真的。
重要的是你和其他核心贡献者(只要有机会,我就会尊重和赞扬他们)告诉我们为什么。
亲切的问候,
Petru。
我很担心,因为几年前我们被要求使用
>服务容器在任何地方,无论如何,这都没有关系。
如果这篇博文让人困惑,我很抱歉,但这个想法没有改变。您的应用程序仍然处处使用服务容器,我们强烈建议始终使用服务容器。
唯一的区别是,以前我们不关心你是否在控制器/命令中直接访问容器(通过"$this->get(…)"),现在我们说这是错误的,最好直接注入你需要的服务(在命令构造函数或控制器动作方法中)。
@Javier Eguiluz我完全理解在“任何地方”和“任何地方”使用容器的结果-从经验来看,这种方法不会导致干净的代码,因为没有什么可以阻止你在任何类中使用ContainerAwareTrait,它直接将整个容器(因此整个symfony框架)与你的类耦合-去过那里,做过-不OK!欧宝娱乐app下载地址
但是,如果没有什么能阻止你(从技术的角度来看)在“任何地方”和“任何地方”使用容器,那么从我的角度来看,使服务私有只会使事情不必要地复杂化,我们将处于相同的情况,我们不是在修复任何东西,我们只是试图保护开发人员免受他们自己的伤害,我不同意这种方法。
这就是我“咆哮”的全部想法,让我们不要试图让symfony“保护开发者免受他们自己的伤害”,让我们尝试做两件事:欧宝娱乐app下载地址
1.教育我们的社区构建不与s欧宝下载链接ymfony或任何其他框架耦合的应用程序欧宝娱乐app下载地址
2.将symfo欧宝娱乐app下载地址ny技术推向一个不需要保护开发者自己的方向,而是通过提供最好的web框架平台来将他们的非框架耦合应用程序交付到web(或任何渠道)。
如果由我来决定(但不是),我会完全删除ContainerAwareTrait和在用户域直接访问服务容器的能力-这是修复的家伙!
我该怎么做呢?
首先,我会沟通为什么需要这样做,以及替代方案是什么;
那么我将确保从用户区“移除”服务容器只发生在symfony 4中,这样所有的bundle开发人员都有足够的时间来适应。欧宝娱乐app下载地址
否则,我们只能推广“好的实践”,这些实践的半衰期很短,并不能推动我们的社区达到更高的“专业性”,而是不断重新评估什么是今天的好实践,什么是去年的好实践。欧宝下载链接
让我们停止试图治疗症状(使服务私有),而是解决房间里的大象(服务容器不应该在用户域中可用)。
所有的美好祝愿,希望我们都能从中学到有用的东西。
这篇文章已经更新了,希望能更清楚。
$ this - >容器> (SomeType::类);
为什么要使服务私有?
尽管这很简单,但直接使用容器并不被认为是一个好的实践,因为它隐藏了类的依赖关系,使它们与外部配置耦合,因此更难测试,更难检查等。
如何使用私人服务?
评论截止。
为了确保评论保持相关性,旧帖子将被关闭。
如果他们不考虑这个变化,外部捆绑包将在4.0崩溃(他们实际上依赖于服务是公共的)
Pierre Rineau is a certified Symfony engineer.
Get certified! Online exams available in all countries.
Register Now