我是Symfony2的新手,我正在将一个旧的Symfony1应用移植到v2。
在我的旧应用程序中,我在一个很棒的大YML文件中定义了所有模型。因此,各种“组件”能够引用相同的名称值对(存储在YML文件中)。
我现在将功能分解为捆绑包,我想彻底解耦捆绑包。我仍然需要访问名称值对,但我想集中存储它 - 这次在数据库中。
我想保留我的代码DRY,因此想要编写仅用于访问名称值对的代码,以及一些如何在单独的包中使用它。
我还想提供集中式CRUD工具来维护名称值对。
总结一下,我的两个问题如下:
如何提供访问存储在数据库中的名称值对的功能(实现一次),并将此功能提供给需要它的捆绑包?
为维护名称值对提供CRUD功能的最佳方法是什么? (它是通过创建另一个捆绑?) 我不确定
答案 0 :(得分:0)
您可以创建一个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];
}
}
使用SensioGenerationBundle
为经理Pair
实体生成CRUD。
你应该怎么做:
MyAppBundle
)。MySharedBundle
)Pair
和PairRepository
创建为MyAppBundle
。MySharedBundle
MyAppBundle
。