Php ORM会导致糟糕的编码实践吗?

Php ORM会导致糟糕的编码实践吗?,php,orm,coding-style,doctrine,Php,Orm,Coding Style,Doctrine,在我们的团队中,我们在PHP中使用ORM,我在两个单独的项目中注意到,尽管我们详细讨论了良好的MVC设计,但ORM似乎允许人们从视图层进行DB查询,并创建难以维护的代码 我倾向于这样一种观点,即ORM使得在程序员没有想到的情况下进行查询变得太容易了。通过将ORM对象返回到视图层,程序员实际上是在将数据库连接泄漏到不应该有它的层 我对ORM的想法正确吗?如果是这样,为什么它如此受欢迎?如果我没有正确思考,我应该如何解决这些问题?我想说你没有正确思考。ORM本身并不会促进坏的实践,至少不会以您正在经

在我们的团队中,我们在PHP中使用ORM,我在两个单独的项目中注意到,尽管我们详细讨论了良好的MVC设计,但ORM似乎允许人们从视图层进行DB查询,并创建难以维护的代码

我倾向于这样一种观点,即ORM使得在程序员没有想到的情况下进行查询变得太容易了。通过将ORM对象返回到视图层,程序员实际上是在将数据库连接泄漏到不应该有它的层


我对ORM的想法正确吗?如果是这样,为什么它如此受欢迎?如果我没有正确思考,我应该如何解决这些问题?

我想说你没有正确思考。ORM本身并不会促进坏的实践,至少不会以您正在经历的方式

ORM是一种工具,就像任何其他框架、api或其他东西一样,您可以正确地使用它,也可以不正确地使用它

听起来问题更像是团队中的开发人员对MVC模式没有清晰的理解。我首先要解决这个问题

我认为MVC模式的一个常见问题是,开发人员倾向于使用视图和控制器来完成他们不应该做的事情。原因可能有很多,但每当你处理类似的事情时,我认为问题通常是从类似的想法开始的:

这是一件很简单的小事,我就在这里做,这里有 在那里干什么都没有意义

基本上,当尝试将设计和业务逻辑解耦时,总会出现这样的情况,即在表示层中更容易实现实际属于业务层的某些部分。这并不意味着开发人员不好,但可能显示出缺乏经验或懒惰。我知道我曾多次为这件事感到内疚,比如在为Android开发的时候,但从来没有专业化过:


试着找出一些使用了您注意到的一些错误实践的示例案例,并使用某种编码dojo,您作为一个团队使代码变得很好并得到正确实现,如果您有时间,请展示将东西放在其所属位置的实际好处。我强烈建议不要使用实际的代码,除非您自己编写了代码,或者负责该代码的开发人员可以在其他开发人员面前被破坏。但这显然取决于你公司的文化,以及开发者是否对这类事情感兴趣和开放。我个人希望在我的工作场所也有类似的事情。

我想说的是,你的想法不正确。ORM本身并不会促进坏的实践,至少不会以您正在经历的方式

ORM是一种工具,就像任何其他框架、api或其他东西一样,您可以正确地使用它,也可以不正确地使用它

听起来问题更像是团队中的开发人员对MVC模式没有清晰的理解。我首先要解决这个问题

我认为MVC模式的一个常见问题是,开发人员倾向于使用视图和控制器来完成他们不应该做的事情。原因可能有很多,但每当你处理类似的事情时,我认为问题通常是从类似的想法开始的:

这是一件很简单的小事,我就在这里做,这里有 在那里干什么都没有意义

基本上,当尝试将设计和业务逻辑解耦时,总会出现这样的情况,即在表示层中更容易实现实际属于业务层的某些部分。这并不意味着开发人员不好,但可能显示出缺乏经验或懒惰。我知道我曾多次为这件事感到内疚,比如在为Android开发的时候,但从来没有专业化过:


试着找出一些使用了您注意到的一些错误实践的示例案例,并使用某种编码dojo,您作为一个团队使代码变得很好并得到正确实现,如果您有时间,请展示将东西放在其所属位置的实际好处。我强烈建议不要使用实际的代码,除非您自己编写了代码,或者负责该代码的开发人员可以在其他开发人员面前被破坏。但这显然取决于你公司的文化,以及开发者是否对这类事情感兴趣和开放。我个人希望在我的工作场所有类似的事情。

从视图进行查询是一种不好的做法。你可以做到这一点,但是最好通过Ajax请求或者任何你认为合适的方法来完成它。

从视图中进行查询是一个错误的做法。你可以做到这一点,但是最好通过Ajax请求或者任何你认为合适的方法来完成它。


p> 我不知道在视图层中进行小型ORM调用必然是不好的。例如,我可能将foreach Category::getAll作为$Category:作为在页面上列出类别的循环。连接不会泄漏到视图的范围内,或者无论如何它肯定不应该泄漏,因为它是由ORM封装的。我可以在控制器中分配此调用的结果,并将对象数组传递给模板,我当然会处理更复杂的调用,但在视图中,我认为简单的情况是可以的

在我的经验中,ORMs最大的问题是n+1数据库查询计数的增长。通常情况下,屏幕上的一:多列表可以从单个查询中呈现,但ORM使使用一个表的主循环,然后对次表的每个实例执行单独的选择变得非常方便。这是低效的,但您只会注意到,当您的数据库由于必须处理的查询数量不断增加而开始吱吱作响时

最好的防范措施是让开发人员在开发模式下运行工具栏,如Symfony2工具栏、PHP调试或类似工具,向他们显示构建屏幕所需的查询数量。当琐碎的屏幕开始需要超过50个查询或任何您指定的上限时,它们需要重构


此外,选择一个具有合理表达查询语法的ORM也是值得的,否则您的开发人员将退回到原始SQL模式,这就挫败了将ORM放在首位的一些原因。出于同样的原因——Daniel很好地阐述了这一点——为您的开发人员提供有效使用ORM的培训是一个好主意。

我不知道在视图层进行小型ORM调用必然是不好的。例如,我可能将foreach Category::getAll作为$Category:作为在页面上列出类别的循环。连接不会泄漏到视图的范围内,或者无论如何它肯定不应该泄漏,因为它是由ORM封装的。我可以在控制器中分配此调用的结果,并将对象数组传递给模板,我当然会处理更复杂的调用,但在视图中,我认为简单的情况是可以的

在我的经验中,ORMs最大的问题是n+1数据库查询计数的增长。通常情况下,屏幕上的一:多列表可以从单个查询中呈现,但ORM使使用一个表的主循环,然后对次表的每个实例执行单独的选择变得非常方便。这是低效的,但您只会注意到,当您的数据库由于必须处理的查询数量不断增加而开始吱吱作响时

最好的防范措施是让开发人员在开发模式下运行工具栏,如Symfony2工具栏、PHP调试或类似工具,向他们显示构建屏幕所需的查询数量。当琐碎的屏幕开始需要超过50个查询或任何您指定的上限时,它们需要重构


此外,选择一个具有合理表达查询语法的ORM也是值得的,否则您的开发人员将退回到原始SQL模式,这就挫败了将ORM放在首位的一些原因。出于同样的原因——Daniel也很好地阐述了这一点——为您的开发人员提供有效使用ORM的培训是一个好主意。

我已经回答了,但了解您正在使用什么ORM会很有兴趣。此外,您是否尝试过简单的体系结构规则,例如精简控制器、胖模型?Symfony不是ORM可能是推进还是条令?我的意思是说内置的int条令ORM模块。我一直都有这样的想法:胖服务层瘦控制器和瘦DAO层在这个例子中是ORM层,虽然我个人更倾向于一个单独的模型和自建DAO层。我已经回答了,但我想知道你在使用什么ORM。另外,您是否尝试过简单的体系结构规则,例如瘦控制器、胖模型?Symfony不是ORM:可能是推进还是条令?我的意思是说构建的int条令ORM模块。我一直都有这样的想法:胖服务层瘦控制器&瘦DAO层在这个例子中是ORM层,尽管我个人更倾向于一个单独的模型和自建DAO层。