【问题标题】:Load different Data Fixtures depending on configuration in Symfony 3根据 Symfony 3 中的配置加载不同的数据夹具
【发布时间】:2017-06-21 16:47:12
【问题描述】:

目前,我们正在为一些在线商店(以及未来可能的新商店)开发一套微服务。出于商业原因,我们将有相同软件的不同实现,因此每个商店都会要求它的一个。

我需要根据实现在数据库上设置不同的初始数据包,这意味着每个数据夹具不同。

我正在寻找一种根据配置参数(company_name、company_slug...)加载正确装置的好方法。最好的方法是什么?

【问题讨论】:

    标签: symfony symfony-3.3


    【解决方案1】:

    如果您使用doctrine/doctrine-fixtures-bundle,您可以在文件params.yml 中使用参数,然后在容器的加载函数中获取它。像这样的

    //parameters.yml
    parameters
         config: "Cloud" //it can be anyelse
    

    并且在fixturesLoad文件中

    public function setContainer(ContainerInterface $container = null)
    {
        var_dump('getting container here');
        $this->container = $container;
    }
    
    /**
     * {@inheritDoc}
     */
    public function load(ObjectManager $manager)
    {
        $config = $this->container->getParameter('config'); //"Cloud"
        if($config == "Cloud"){
             //Do something
        }else{
             //Do something else
        }
    }
    

    在我看来,这是更好的方法,因为parameters.yml 会随着实施而变化,而您只需要在每个环境中进行更改。

    【讨论】:

    • 但是每次我有一个新的实现时我都必须修改文件,而不是仅仅添加一个文件(并且还有一个超大的固定装置文件),不是吗?
    【解决方案2】:

    可以通过将数据存储在自定义参数文件中来完成。

    使用名为“company_slug”的全局参数作为 datafixtures 包的键,如下所示:

    parameters:
        datafixtures:
            # Company 1 datafixtures
            company1:
                defaultusers:
                    0:
                        name: john
                        email: john@company1.lol
                    1:
                        name: steve
                        email: steve@company1.lol
            # Company 2 datafixtures
            company2:
                defaultusers:
                    0:
                        name: anna
                        email: anna@company2.lol
                    1:
                        name: eva
                        email: eva@company2.lol
    

    然后使用此参数开发数据夹具:

    public function load(ObjectManager $manager)
    {
        $companySlug = $this->container->getParameter('company_slug');
        if (array_key_exists($companySlug, $this->container->getParameter('datafixtures'))) {
            $dataFixtures = $this->container->getParameter('datafixtures')[$companySlug];
        } else {
            throw $this->createException('No datafixtures parameters found for the company slug '.$companySlug);
        }
    
        foreach ($dataFixtures['defaultusers'] as $u) {
            $user = new User();
            $user->setUserName($u['name']);
            $user->setEmail($u['email']);
            $manager->persist($user);
            $manager->flush();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 2013-12-03
      • 2016-03-05
      • 1970-01-01
      • 2019-12-31
      相关资源
      最近更新 更多