2012-08-08 45 views
2

我是Symfony2的新手,我正在将一个旧的Symfony1应用程序移植到v2。Symfony2:几个包可以访问存储在数据库中的名称值

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

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

我想让我的代码保持干爽,所以想写代码来访问名称值对只有一些和如何在单独的捆绑使用。

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

总之,我的2个问题如下:

  1. 我怎样才能提供的功能(实现一次)来访问存储在数据库中的名称值对,并提供此功能需要它捆绑?

  2. 为维护名称值对提供CRUD功能的最佳方式是什么? (它是通过创建另一个包?) 我不知道

回答

0
  1. 您可以创建一个主义实体,并要求您需要的按键。为了编码干后,用碱实体并将其扩展到每对类型:

    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. 创建PairPairRepositoryMyAppBundle
  5. (可选)移动这些类MySharedBundle
  6. 创建派生对类转换成MyAppBundle
+0

感谢您的回答。我想确保我正确理解您提出的解决方案。在上面的例子中,所使用的名称空间似乎表明Pair(和PairRepository)实体代码是为每个** bundle编写的。我的理解是否正确? (即每个包将其Pair和PairRepository类复制到其文件夹中)?。我试图避免这样的做法,因为它是**不干**。请澄清。 – 2012-08-10 07:46:40

+0

您可以在软件包之间共享代码。你只写一次,然后重新使用这个包。 Symfony的'FrameworkBundle'就是这样工作的。 – Florent 2012-08-10 08:13:31

+0

是的,这就是我想要做的(即写一次,然后重新使用该包)。然而,我不明白你的回答是如何解决这个问题的 - 除非'MyBundle'(来自你的代码片段)是一个新的bundle,它被**用来获取/列出一个特定的对。在这种情况下,我仍然不清楚。例如,如果我有以下名称对列表:ReadingCategory,SportsCategory,FoodCategory,** 1。**是否需要创建3个单独的包(每个名称对列表专用一个包)? ** 2。**我如何(例如)在代码中从'BundleB'引用'BundleA'? – 2012-08-10 08:47:43

相关问题