Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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 创建具有默认属性的实体对象的最佳方法_Php_Symfony - Fatal编程技术网

Php 创建具有默认属性的实体对象的最佳方法

Php 创建具有默认属性的实体对象的最佳方法,php,symfony,Php,Symfony,我的博客包中有一个帖子实体。帖子可以有很多评论。当我创建一个新的评论实体以附加到帖子时,我必须设置一组属性,例如 $comment->setTimestamp( new \DateTime() ); $comment->setUserId( $this->getUser()->getId() ); $comment->setHost( $this->getClientIP() ); 默认时区在实体的构造函数中很容易实现。如何在构造实体时自动设置userid和

我的博客包中有一个帖子实体。帖子可以有很多评论。当我创建一个新的评论实体以附加到帖子时,我必须设置一组属性,例如

$comment->setTimestamp( new \DateTime() );
$comment->setUserId( $this->getUser()->getId() );
$comment->setHost( $this->getClientIP() );

默认时区在实体的构造函数中很容易实现。如何在构造实体时自动设置userid和clientip?getClientIP目前是控制器中的一个函数。这应该是服务。我可以拥有一个为我创建注释的工厂吗?

您可以从实体构造调用任何实体方法,并且可以将任何内容从控制器传递到注释的新实例。 例如,在控制器操作中获取时间戳、用户ID和主机,并将它们作为参数传递给注释实体的构造。
在构造中调用setter方法

您可以在控制器中为此创建帮助器函数

protected function getNewComment() {
    $comment = new Comment();
    $comment->setTimestamp( new \DateTime() );
    $comment->setUserId( $this->getUser()->getId() );
    $comment->setHost( $this->getClientIP() );

    return $comment;
}
然后

$comment = $this->getNewComment();

在我看来,最好的选择是
类CommentFactory extends EntityFactory

工厂将负责为您创建实体,您将传递所需实体(如用户实体),它将为您返回新对象:

$commentFactory = new CommentFactory($user, $client, $whatever);
$comment = $commentFactory->getNewComment();

谢谢你的回复。注释可能不是一个很好的例子,因为这将由一个控制器处理。如果我想在许多控制器的帖子中添加评论,我需要一个工厂来创建带有默认值的评论,比如user和ip。是的,我可以将其移动到服务中吗。说注释实际上是一个注释对象,并且可以附加到其他实体?所以我可以调用一个note服务或工厂来设置默认值?当然,如果您可以获得所有依赖项。您可以将
security
传递给服务并获取当前用户,但我不知道这是
$this->getClientIP()
。如果您可以从
请求中提取IP
,那么充当工厂的服务是一个好主意。我还打算将getIP()放入客户机服务中。您可以将客户机服务作为参数传递给您的服务,并为该时间戳创建新的注释。。。看看Gedmo包()。它有以下功能:timestable-在创建、更新甚至属性更改时更新日期字段。我认为你没有使用条令2?这也是我的想法。EntityFactory类在哪里?我在API中找不到它。它不存在,您需要将其设置为:)。它应该是一个抽象类,具有在工厂上下文中有意义的未定义方法(
create()
,等等)