【问题标题】:Load fixtures from custom bundle从自定义包中加载固定装置
【发布时间】:2019-12-03 23:37:33
【问题描述】:

我正在为 Symfony 构建一个简单的包,我想知道是否可以运行位于其中的固定装置,因为它不在项目 src 根文件夹中。 这是我的项目结构:

Project
|
+--AdminBundle <- My custom bundle
|  +--Controller
|  +--DataFixtures
|  |  |
|  |  +--AdminFixtures.php <- The fixtures I want to run
|  | 
|  +--DependencyInjection
|  +--Entity
|  +--Resources
|
+--assets
+--bin
+--config
+--public
+--src
+--templates
+--vendor

这是AdminFixtures.php的代码


namespace ExampleVendor\AdminBundle\DataFixtures;

use App\AdminBundle\Entity\User;
use App\AdminBundle\Entity\Profile;
use Doctrine\Bundle\FixturesBundle\Fixture;

use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Bundle\FixturesBundle\ORMFixtureInterface;
use Doctrine\Bundle\FixturesBundle\FixtureGroupInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class AdminFixtures extends Fixture implements FixtureGroupInterface {
    private $passwordEncoder;


    public function __construct(UserPasswordEncoderInterface $passwordEncoder) {
        $this->passwordEncoder = $passwordEncoder;
    }

    public function load(ObjectManager $manager) {
        // Fixtures stuff
    }

    /**
     * This method must return an array of groups
     * on which the implementing class belongs to
     *
     * @return string[]
     */
    public static function getGroups(): array {
        return ['admin'];
    }
}

当我运行php bin/console doctrine:fixtures:load 我收到一条错误消息:

[错误] 找不到任何要加载的夹具服务。

我读到每一个实现FixtureGroupInterface 的类都会自动注册为fixture,但我认为这不起作用,因为我在这里寻求帮助。

如何手动将其注册为夹具?如何使php bin/console doctrine:fixtures:load 命令起作用??

【问题讨论】:

    标签: php symfony doctrine-orm symfony4


    【解决方案1】:

    我不太了解 DoctrineFixtures 捆绑包,因此每个实现某个接口的 已加载 类最终都可能会被使用,但我想只有在您确保src 目录已加载,看看你的 composer.json 它应该包含类似的内容:

    ................
        "autoload": {
            "psr-4": {
                "": "src/",
            }
        },
    

    并考虑添加类似的内容: (假设您在 AdminBundle 中使用“Admin\”作为类的命名空间)

    ................
        "autoload": {
            "psr-4": {
                "": "src/",
                "Admin\\": "AdminBundle/",
            }
        },
    

    另外,了解 symfony 的人最终会纠正我,但我不确定你是否应该再创建这样的包。 Admin 是您应用程序的一个模块,您将其放在 src/Admin 中,或者您考虑在其他地方重用它并将其作为适当的库放在您的供应商中?

    【讨论】:

    • 是的,它将是一个通过composer从git存储库安装的可重用包,某些项目可能有它,需要数据库交互的项目,现在它在根文件夹中进行开发,当完成后,我会将其上传到存储库,然后将其安装为供应商包。关于 psr-4 命名空间,我已经这样做了,所以我可以在我的项目中使用我的包中的类,但是我无法使用 fixtures 命令从那里加载fixtures
    • 您是否必须在服务声明中设置标签?关于在供应商目录中处理你的包,这里有一些提示:carlosbuenosvinos.com/… & medium.com/pvtl/local-composer-package-development-47ac5c0e5bb4
    • 也可能和你的问题有关:stackoverflow.com/questions/50984433/…
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多