gpt4 book ai didi

design-patterns - 如何在 Symfony2 中拥有模型管理器?

转载 作者:行者123 更新时间:2023-12-05 01:30:28 26 4
gpt4 key购买 nike

抱歉,如果这个问题已经得到解答,我找不到任何答案。

我在 Symfony2 中构建这个模型:

class LogEntry {
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var \DateTime $log_timestamp
*
* @ORM\Column(name="log_timestamp", type="datetime")
*/
private $log_timestamp;

/**
* @var TranslationMapping $source
*
* @ORM\ManyToOne(targetEntity="TranslationMapping", cascade={"persist"})
* @ORM\JoinColumn(name="source", referencedColumnName="id")
*/
private $source;

/**
* @var TranslationMapping $target
*
* @ORM\ManyToOne(targetEntity="TranslationMapping", cascade={"persist"})
* @ORM\JoinColumn(name="target", referencedColumnName="id")
*/
private $target;
...
}

像这样使用 TranslationMapping:
/**
* LogAnalyzer\Bundle\CombatLogBundle\Entity\TranslationMapping
*
* @ORM\Table(name="TranslationMapping", uniqueConstraints={@ORM\UniqueConstraint(name="idValue_idx", columns={"stringId", "stringValue"})})
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class TranslationMapping
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string $stringId
*
* @ORM\Column(name="stringId", type="string", length=255)
*/
private $stringId;

/**
* @var string $stringValue
*
* @ORM\Column(name="stringValue", type="string", length=255)
*/
private $stringValue;


/**
* @ORM\PrePersist
*/
public function beforePersist()
{
if ($this->stringId == null) {
$this->stringId = "laGen_".time();
}
}

LogEntry 是基于通过正则表达式解析的字符串构建的。
TranslationMapping 表示一个键/值存储的翻译字符串。

目前我正在做的是:
  • 检索字符串以构建 LogEntry
  • 从 LogEntryRepository 中的字符串构建 LogEntry
    $logEntry = new LogEntry();
    $source = new TranslationMapping();
    if ($logEntry->getSourceIsPlayer()) {
    $source->setValueKey(str_replace("@", "", $matches["source"][0]));
    } else {
    $source->setValueKey($matches["source"][0], $matches["source_id"][0]);
    if (isset($matches["source_companion_name"][0])) { // It's a companion !
    $companion = new TranslationMapping();
    $companion->setValueKey($matches["source_companion_name"][0], $matches["source_companion_id"][0]);
    $logEntry->setSourceCompanion($companion);
    $source->setValueKey(str_replace("@", "", $matches["source"][0])); // And the source is the player's character name
    }
    }
    $logEntry->setSource($source);
    $logEntry->setTargetIsPlayer(strpos($matches["target"][0], "@") !== false);
    $target = new TranslationMapping();
    if ($logEntry->getTargetIsPlayer()) {
    $target->setValueKey(str_replace("@", "", $matches["target"][0]));
    } else {
    $target->setValueKey($matches["target"][0], $matches["target_id"][0]);
    if (isset($matches["target_companion_name"][0])) { // It's a companion !
    $companion = new TranslationMapping();
    $companion->setValueKey($matches["target_companion_name"][0], $matches["target_companion_id"][0]);
    $logEntry->setTargetCompanion($companion);
    $target->setValueKey(str_replace("@", "", $matches["target"][0])); // And the target is the player's character name
    }
    }
    $logEntry->setTarget($target);
  • 显示日志条目

  • 我的问题是,如果键/值对尚不存在,我想创建一个翻译映射实体。但是,我不知道该怎么做,因为:
  • 我无法从另一个存储库访问 TranslationMappingRepository
  • 我无法从存储库访问服务
  • 我不能使用 INSERT ... ON DUPLICATE KEY UPDATE 查询通过 Doctrine2

  • 基本上我想要做的是为我的 TranslationMapping 实体获取一个管理器,它将管理数据库操作(如果需要,获取和插入)并通过所有 Symfony 应用程序公开实体,主要是对存储库。

    我已经尝试了几种解决方案并且没有选择,有人知道我如何实现这一目标吗?

    谢谢。

    最佳答案

    基本上,您想创建一个 S2 服务并将您的实体管理器注入(inject)其中。手册中有很多示例,但如果您确实需要,我可以发布一个。

    存储库在处理一种实体类型时很棒,但正如您发现的那样,在处理多种类型时就不那么好了。我很少他们再使用它们了。只需将功能包装在服务中即可。

    不幸的是,INSERT ... ON DUPLICATE KEY UPDATE 不是标准 sql,因此 Doctrine 不支持,尽管您可以将其添加为自定义函数。但最好的办法是检查 key 是否存在,然后进行相应调整。一定要捕获任何异常以防万一。

    我并没有真正详细阅读您的代码,但 S2 确实有一堆翻译内容。其中一些可能也有帮助。

    更新:

    可以在此处找到有关创建服务的信息:
    http://symfony.com/doc/current/book/service_container.html

    在您的 services.xml 文件中,您可能有以下内容:

    <service 
    id="zayso.core.project.manager"
    class="Zayso\ZaysoBundle\Component\Manager\ProjectManager" public="true">
    <argument type="service" id="doctrine.orm.entity_manager" />
    </service>

    你的经理会有一个 __construct 像:
    class ProjectManager
    {
    protected $em = null;

    public function getEntityManager() { return $this->em; }

    public function __construct($em) { $this->em = $em; }

    然后在您的 Controller 中,您将执行以下操作:
    $manager = $this->get(zayso.core.project.manager);
    $manager->newLogEntry($params);

    关于design-patterns - 如何在 Symfony2 中拥有模型管理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9927611/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com