Symfony2:几个bundle来访问存储在数据库中的名称值

时间:2012-08-08 12:16:44

标签: php symfony

我是Symfony2的新手,我正在将一个旧的Symfony1应用移植到v2。

在我的旧应用程序中,我在一个很棒的大YML文件中定义了所有模型。因此,各种“组件”能够引用相同的名称值对(存储在YML文件中)。

我现在将功能分解为捆绑包,我想彻底解耦捆绑包。我仍然需要访问名称值对,但我想集中存储它 - 这次在数据库中。

我想保留我的代码DRY,因此想要编写仅用于访问名称值对的代码,以及一些如何在单独的包中使用它。

我还想提供集中式CRUD工具来维护名称值对。

总结一下,我的两个问题如下:

  1. 如何提供访问存储在数据库中的名称值对的功能(实现一次),并将此功能提供给需要它的捆绑包?

  2. 为维护名称值对提供CRUD功能的最佳方法是什么? (它是通过创建另一个捆绑?) 我不确定

1 个答案:

答案 0 :(得分: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为经理Pair实体生成CRUD。


  3. 你应该怎么做:

    1. 创建应用程序包(MyAppBundle)。
    2. (可选) 创建共享捆绑包(MySharedBundle
    3. 将捆绑包引用到应用程序内核中。
    4. PairPairRepository创建为MyAppBundle
    5. (可选) 将这些课程移至MySharedBundle
    6. 将派生对类创建为MyAppBundle