小编fru*_*ous的帖子

Symfony2/Doctrine2 - ManyToOne - 保存反面

我是Symfony和Doctrine的新手.

我有一个实体"用户"和一个实体"类型".一个用户可以拥有一个喜欢的类型,一个类型可以拥有许多具有该特定类型作为收藏的用户.所以我需要一个多(用户)到一个(类型)的关系.

我实现了它,它工作正常(大多数情况下).但有一件事我不明白.

如果我做这样的事情它的作用:

$user = new User();
$type = new Type();

$user->setFavoriteType($type);
$em->persist($user);
$em->persist($type);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

生成对象并将其存储到DB.并且正确设置了favorite_type_id.所以改变拥有方可以按预期工作.

但是如果我将用户添加到反面(仅)并刷新实体管理器,则不设置favorite_type_id.

$user = new User();
$type = new Type();

$type->getUsers()->add($user); //same with $type->addUser($user);
$em->persist($user);
$em->persist($type);
$em->flush();
Run Code Online (Sandbox Code Playgroud)

这是为什么?有没有理由说它不能从反面起作用?我真的必须手动设置吗?如果我操作类型实体中的addUser方法,如"$ user-> setFavoriteType($ this)",它可以工作.但这不应该是学说的任务吗?

文件说

更新双向关联时,Doctrine仅检查双方中的一方以查找这些更改.这被称为协会的拥有方.

所以这似乎是通缉行为,是吗?但为什么?由于表现?语义原因?

如果有人可以向我解释或告诉我我做错了什么,我会很高兴的.

entity one-to-many many-to-one symfony doctrine-orm

9
推荐指数
1
解决办法
2175
查看次数

使用Symfony2实现Factory模式的最佳实践

我正在制作一个可以发送电子邮件或短信的信使,并且可以立即发送或稍后发送(信息保存在数据库中).我已经做了两个解决方案,但两个都不令我满意.

我正在将代码集中在一个Factory中,而Factory模式的代码非常简单:

class MessageFactory
{
     static public function get($type,$em)
     {
          $instance = null;
          switch ($type) {
              case 'email':
                    $instance = new EmailMessage($em);
                    break;
   ....
  return $instance;
}

class EmailMessage implements MessangerInterface
{
 ...
   public function send( $eMessage,array $receivers, $time=NULL)
   {

interface MessangerInterface
{
  public function send($message,array $receivers);
}
Run Code Online (Sandbox Code Playgroud)

第一个解决方案:只需调用普通的静态方法

$messanger = Factory\MessageFactory::get('email',$em);
$messanger->send($eMessage, array('tom'=>'tom@gmail.com'));
Run Code Online (Sandbox Code Playgroud)

这是一个糟糕的解决方案,因为我需要将Doctrine Manager作为参数传递给方法

第二种解决方案:将其用作Symfony 2服务

services:
my.messanger:
    class: Bundle\Factory\MessangerInterface
    factory_class: Bundle\Factory\MessageFactory
    factory_method: get
    arguments:
        messanger_type: %messanger.type%
Run Code Online (Sandbox Code Playgroud)

并且还将学说作为论据传递.但是使用这样的解决方案我不能在我的代码中选择messanger.type,它使用配置参数定义为emailsms; 我需要在代码中具有选择类型的能力.

另外我有一个问题,我需要在课堂上发送电子邮件或短信,这意味着我需要一个外部服务,得到这样的:

class EmailMessage …
Run Code Online (Sandbox Code Playgroud)

factory-pattern symfony

7
推荐指数
1
解决办法
1万
查看次数

使用YAML在Symfony2中进行Doctrine映射

我对Symfony2中的Doctrine的YAML配置有疑问.

我通过"doctrine:generate:entity"创建了一个实体,并选择了YAML作为映射格式.这没有在../Entity/"MyEntity".php上添加任何元数据,这将允许我更新或创建我的架构.

举个例子,如果我跑

./app/console doctrine:schema:create
Run Code Online (Sandbox Code Playgroud)

它失败了,说:

[RuntimeException]                                                 
Bundle "MySuperBundle" does not contain any mapped entities.
Run Code Online (Sandbox Code Playgroud)

我的自动化已经设置为"true".

如果我选择使用注释配置,这不会是一个问题.

我错过了什么?我还有什么额外的步骤吗?

提前谢谢,问候,

伊万

yaml entity entities symfony doctrine-orm

4
推荐指数
1
解决办法
8361
查看次数