2012-03-29 1 views
4

申し訳ありませんが、この質問に既に回答されている場合、私は何も見つかりませんでした。Symfony2でモデルマネージャを使用するには?

私はSymfony2の中で、このモデルを構築しています。このようなTranslationMappingで

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; 
... 
} 

は:

/** 
* 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(); 
     } 
    } 

ログ・エントリは、正規表現によって解析された文字列に基づいて構築されています。 TranslationMappingは、キー/値格納された変換文字列を表します。私がやっている現在

です:

ログ・エントリ

を表示LogEntryRepository

$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にアクセスすることはできません。しかし、私は以来、それを行うことができますどのように表示されません基本的に私は何をしようとしているDoctrine2

    経由DUPLICATE KEY UPDATEクエリINSERT ... ONしてDB操作を管理するでしょう私のTranslationMappingエンティティのためのマネージャーを取得します(必要に応じて&挿入をフェッチ)して公開することですすべてのSymfonyアプリケーションを通してエンティティ主にリポジトリに。

    私はいくつかのソリューションを試して、オプションを使い果たしました。誰かがこれをどのように達成できるかの手掛かりを持っていますか?

    ありがとうございました。

  • 答えて

    5

    基本的には、S2サービスを作成し、そのサービスにエンティティマネージャを注入する必要があります。私はあなたが本当にそれを必要とする場合は、私は1つを投稿することができますが、マニュアルの例をたくさん。

    リポジトリは1つのエンティティタイプを扱うときには優れていますが、見つかったように、複数のタイプを扱うときはそれほど多くありません。私はもうそれらを使うことはめったにありません。サービスの機能をまとめておくだけです。

    INSERT ... ON DUPLICATE KEY UPDATEは残念なことに標準SQLではないため、Doctrineではサポートされていませんが、カスタム関数として追加できます。しかし、あなたの最善の策は、鍵が存在するかどうかを確認し、それに応じて調整することです。場合によっては例外をキャッチしてください。

    私は実際にあなたのコードを詳細に調べていませんでしたが、S2にはたくさんの翻訳が含まれています。それもいくつかは助けになる可能性があります。

    UPDATE:サービスの作成に関する

    情報はここで見つけることができます:

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

    あなたのマネージャー__constructを持っているでしょう:あなたのservices.xmlファイルで http://symfony.com/doc/current/book/service_container.html

    あなたは何かなどを持っているかもしれませんlike:

    class ProjectManager 
    { 
        protected $em = null; 
    
        public function getEntityManager() { return $this->em; } 
    
        public function __construct($em) { $this->em = $em; } 
    

    そしてあなたのコントローラーであなたのような何かをするでしょう:

    $manager = $this->get(zayso.core.project.manager); 
    $manager->newLogEntry($params); 
    
    +0

    お返事ありがとうございます。私はsymfonyのウェブサイト上で例を見つけられませんでした。あなたがリンクを提供できればうれしいです。 Symfonyが提供する翻訳については、実際にはそれが意味するものではありません。私はこのようにしてみましたが、最終的に私自身の実装が必要であることを見ました。 –

    +0

    更新していただきありがとうございます、私はあなたのポイントを持っていなかった。 TranslationMappingをサービスにデポートしようとしましたが、LogEntryの作成を追放するのはもっと賢い方法です。ありがとう! –

    関連する問題