2

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

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

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

我想保持我的代码干燥,所以想编写代码来访问名称值对一次,以及如何在单独的包中使用它。

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

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

  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生成管理Pair实体的 CRUD。


这就是你应该如何进行:

  1. 创建您的应用程序包 ( MyAppBundle)。
  2. (可选)创建共享捆绑包 (MySharedBundle)
  3. 将捆绑包引用到应用程序内核中。
  4. 创建PairPairRepository进入MyAppBundle.
  5. (可选)将这些类移动到MySharedBundle
  6. 创建派生对类到MyAppBundle.
于 2012-08-08T12:36:05.627 回答