Php 在控制器中向Symfony实体添加字段是否被认为是一种不好的做法?
在控制器中向Symfony实体添加字段是否被认为是一种不好的做法?例如,假设我有一个简单的实体:Php 在控制器中向Symfony实体添加字段是否被认为是一种不好的做法?,php,symfony,oop,Php,Symfony,Oop,在控制器中向Symfony实体添加字段是否被认为是一种不好的做法?例如,假设我有一个简单的实体: /** * @ORM\Entity * @ORM\Table(name="user") */ class User extends BaseUser { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protect
/**
* @ORM\Entity
* @ORM\Table(name="user")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
}
public function getId()
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
}
}
然后在UserController.php中,我要执行以下操作:
foreach($users as $user){
$user->postsCount = someMethodThatWillCountPosts();
}
这样以后PostScont就可以显示在细枝上了。这是个坏习惯吗
编辑:
在mysql数据库上统计帖子是很重要的,每个用户将有超过50000个元素需要统计
Edit2:
请注意,这些问题不是关于某个特定的问题,而是关于Symfony中面向对象编程的好的和坏的实践。正如@Rooneyl解释的那样,如果用户和post之间有关系,那么您可以在控制器中轻松地进行计数。但是如果您希望从控制器内部构造和使用更复杂的查询。为了隔离、重用和测试这些查询,最好为实体创建一个自定义存储库类。然后可以将包含查询逻辑的方法存储在此类中 为此,请将存储库类名添加到实体的映射定义中:
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\ProductRepository")
*/
class Product
{
//...
}
条令可以通过前面用于生成缺少的getter和setter方法的相同命令,为应用程序中的所有实体生成空存储库类:
$ php bin/console doctrine:generate:entities AppBundle
如果您选择自己创建存储库类,它们必须扩展
条令\ORM\EntityRepository
更新的答案
在许多情况下,实体之间的关联会变得相当大。即使是在博客这样的简单场景中。在可以对帖子进行评论的地方,您必须始终假设一篇帖子会吸引数百条评论。在条令2.0中,如果你访问了一个关联,它总是会被完全加载到内存中。如果您的关联包含数百或数千个实体,这可能会导致相当严重的性能问题
在原则2.1中,为关联引入了一个称为额外延迟的特性。默认情况下,关联标记为Lazy,这意味着第一次访问关联时将填充关联的整个集合对象。如果将关联标记为额外延迟,则可以调用集合上的以下方法,而不会触发集合的全部负载:正如@Rooneyl解释的那样,如果用户和post之间存在关系,则可以在控制器中轻松获得计数。但是如果您希望从控制器内部构造和使用更复杂的查询。为了隔离、重用和测试这些查询,最好为实体创建一个自定义存储库类。然后可以将包含查询逻辑的方法存储在此类中 为此,请将存储库类名添加到实体的映射定义中:
// src/AppBundle/Entity/Product.php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\ProductRepository")
*/
class Product
{
//...
}
条令可以通过前面用于生成缺少的getter和setter方法的相同命令,为应用程序中的所有实体生成空存储库类:
$ php bin/console doctrine:generate:entities AppBundle
如果您选择自己创建存储库类,它们必须扩展
条令\ORM\EntityRepository
更新的答案
在许多情况下,实体之间的关联会变得相当大。即使是在博客这样的简单场景中。在可以对帖子进行评论的地方,您必须始终假设一篇帖子会吸引数百条评论。在条令2.0中,如果你访问了一个关联,它总是会被完全加载到内存中。如果您的关联包含数百或数千个实体,这可能会导致相当严重的性能问题
在原则2.1中,为关联引入了一个称为额外延迟的特性。默认情况下,关联标记为Lazy,这意味着第一次访问关联时将填充关联的整个集合对象。如果将关联标记为额外延迟,则可以调用集合上的以下方法,而不会触发集合的全部负载:“而是关于面向对象编程中的好做法和坏做法”
如果是这种情况,那么您真的不应该在控制器中有任何业务逻辑,您应该将其转移到服务
因此,如果您需要在将实体传递给twig模板之前对其执行某些操作,那么您可能希望在返回结果之前在特定的服务中执行这些操作,或者使用一个自定义存储库类(可能使用其他服务类)来执行此操作
i、 e.那么控制器的动作看起来更像:
public function someAction()
{
//using custom repository
$users = $this->usersRepo->getWithPostCount()
//or using some other service
//$users = $this->usersFormatter->getWithPostCount(x)
return $this->render('SomeBundle:Default:index.html.twig', [
users => $users
]);
}
如何做完全取决于您自己,这里的要点是最佳实践不鼓励在controller中使用任何业务逻辑。想象一下,您需要在另一个控制器或其他服务中执行相同的操作。如果您没有将它封装在它自己的服务中,那么每次都需要编写它
顺便说一句,请阅读:
“而是关于面向对象编程中的好的和坏的实践”
如果是这种情况,那么您真的不应该在控制器中有任何业务逻辑,您应该将其转移到服务
因此,如果您需要在将实体传递给twig模板之前对其执行某些操作,那么您可能希望在返回结果之前在特定的服务中执行这些操作,或者使用一个自定义存储库类(可能使用其他服务类)来执行此操作
i、 e.那么控制器的动作看起来更像:
public function someAction()
{
//using custom repository
$users = $this->usersRepo->getWithPostCount()
//or using some other service
//$users = $this->usersFormatter->getWithPostCount(x)
return $this->render('SomeBundle:Default:index.html.twig', [
users => $users
]);
}
如何做完全取决于您自己,这里的要点是最佳实践不鼓励在controller中使用任何业务逻辑。想象一下,您需要在另一个控制器或其他服务中执行相同的操作。如果您没有将它封装在它自己的服务中,那么每次都需要编写它
顺便说一句,请阅读:
用户类和posts实体之间是否没有关联?如果你这样做了,你可以简单地在