Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在控制器中向Symfony实体添加字段是否被认为是一种不好的做法?_Php_Symfony_Oop - Fatal编程技术网

Php 在控制器中向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

在控制器中向Symfony实体添加字段是否被认为是一种不好的做法?例如,假设我有一个简单的实体:

/**
 * @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实体之间是否没有关联?如果你这样做了,你可以简单地在