2

私は Symfony2 を初めて使用し、古い Symfony1 アプリを v2 に移植しています。

私の古いアプリでは、すべてのモデルを 1 つの大きな YML ファイルで定義していました。そのため、さまざまな「コンポーネント」が同じ名前と値のペア (YML ファイルに格納されている) を参照できました。

現在、機能をバンドルに分解しており、バンドルを完全に分離したいと考えています。名前と値のペアにアクセスする必要がありますが、今回はデータベースに一元的に保存したいと考えています。

私は自分のコードを DRY に保ちたいので、名前と値のペアに一度だけアクセスするためのコードを書きたいと思っています。

また、名前と値のペアを維持するための集中型 CRUD 機能を提供したいと考えています。

要約すると、私の2つの質問は次のとおりです。

  1. データベースに格納されている名前と値のペアにアクセスする機能を (一度実装して) 提供し、それを必要とするバンドルでこの機能を利用できるようにするにはどうすればよいですか?

  2. 名前と値のペアを維持するための CRUD 機能を提供する最良の方法は何ですか? (さらに別のバンドルを作成することによるものですか?)よくわかりません

4

1 に答える 1

0
  1. Doctrine エンティティを作成し、必要なキーをリクエストできます。DRY をコーディングするには、ベース エンティティを使用し、それを各ペア タイプに拡張します。

    Pair実在物:

    namespace MyBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @MappedSuperclass
     */
    class Pair
    {
        /**
         * @Column(type="string", unique=true)
         * @var string
         */
        protected $name;
    
        /**
         * @Column(type="string")
         * @var string
         */
        protected $value;
    
        // Getters & setters
        // ...
    }
    

    SportPair実在物:

    namespace MyBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    
    /**
     * @Entity(repositoryClass="MyBundle\Entity\PairRepository")
     * @Table(name="sport_pairs")
     */
    class SportPair extends Pair
    {
        /**
         * @Id
         * @GeneratedValue(strategy="AUTO")
         * @Column(name="id", type="integer")
         * @var int
         */
        protected $id;
    }
    

    Pairリポジトリ:

    namespace MyBundle\Entity;
    
    use Doctrine\ORM\EntityRepository;
    
    class PairRepository extends EntityRepository
    {
        private $cache = array();
    
        public function getValue($key)
        {
            if (!isset($this->cache[$key])) {
                $pair = $this->findOneBy(array('name' => $key));
                if (null !== $pair) {
                    $this->cache[$key] = $pair->getValue();
                }
            }
    
            return $this->cache[$key];
        }
    }
    
  2. エンティティSensioGenerationBundleを管理するための CRUD を生成するために使用します。Pair


それがあなたが進むべき方法です:

  1. アプリケーション バンドルを作成します ( MyAppBundle)。
  2. (オプション)共有バンドルを作成する (MySharedBundle)
  3. バンドルをアプリケーション カーネルに参照します。
  4. Pairとを作成PairRepositoryしますMyAppBundle
  5. (オプション)これらのクラスをMySharedBundle
  6. 派生ペア クラスを に作成しますMyAppBundle
于 2012-08-08T12:36:05.627 に答える