Symfony 3.4.0 Не удалось найти ни одной службы фикстуры для загрузки
11 ответов
Эта команда ищет все службы, отмеченные doctrine.fixture.orm
,
Есть два способа решить эту проблему.
Первый: любой класс, который реализует
ORMFixtureInterface
будет автоматически зарегистрирован с этим тегом.
<?php
namespace AppBundle\DataFixtures\ORM;
use Doctrine\Bundle\FixturesBundle\ORMFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
class LoadFixtures implements ORMFixtureInterface
{
public function load(ObjectManager $manager)
{
#your code
}
}
Второй: вам нужно вручную пометить
doctrine.fixture.orm
вDataFixtures
вsevice.yml
конфигурации.
services:
...
# makes classes in src/AppBundle/DataFixtures available to be used as services
# and have a tag that allows actions to type-hint services
AppBundle\DataFixtures\:
resource: '../../src/AppBundle/DataFixtures'
tags: ['doctrine.fixture.orm']
Я попробовал @ решение Александра, но оно не работает для меня.
Я решил ту же проблему, добавив службу тегов в класс, Symfony doc на services.yml
пакет файлов:
BlogBundle/Resources/config/services.yml
Services:
...
# Fixtures services
BlogBundle\DataFixtures\ORM\PostFixture:
tags: [doctrine.fixture.orm]
...
мой BlogBundle/DataFixtures/ORM/PostFixture.php
учебный класс:
...
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
...
class PostFixture implements FixtureInterface
{
public function load(ObjectManager $manager)
{
...
}
}
Источник Вдохновения: Synfony doc -> Сервисный контейнер -> Параметр автоконфигурации
Надеюсь, что это будет альтернативным решением
В 4.0.1 я должен реализовать конфигурацию сервиса, чтобы показать Symfony мою папку DataFixtures:
в config/services.yaml
services:
...
App\DataFixtures\:
resource: '../src/DataFixtures'
tags: [doctrine.fixture.orm]
если мой класс IMPLEMENTS FixtureInterface и без этого конфига, если это EXTENDS Fixture
Пример многоразового использования.
SRC /Acme/Bundle/UserBundle/DataFixtures/ ОРМ /DataFixtures.php
<?php
namespace Acme\Bundle\UserBundle\DataFixtures\ORM;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
class DataFixtures extends Fixture
{
/**
* Load data fixtures with the passed EntityManager
*
* @param ObjectManager $manager
*/
public function load(ObjectManager $manager)
{
#your code
}
}
в app/config/services.yml
Acme\Bundle\UserBundle\DataFixtures\:
resource: '../../src/Acme/Bundle/UserBundle/DataFixtures/'
добавьте данные ваших приборов:
php bin/console doctrine:fixtures:load --append
~/ DEV /domain.lan/ SRC /ProductBundle/DataFixtures/ ОРМ /ProductF ixture.php
<?php
namespace ProductBundle\DataFixtures\ORM;
use Doctrine\Bundle\FixturesBundle\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use ProductBundle\Entity\Product;
class ProductFixture implements FixtureInterface
{
public function load(ObjectManager $manager)
{
// create 20 products! Bam!
for ($i = 0; $i < 20; $i++) {
$product = new Product();
$product->setName('Product name' . $i);
$manager->persist($product);
}
$manager->flush();
}
}
Проблема решена, нужно было добавить сервис: (app/config/services.yml)
services:
# Product service
ProductBundle\:
resource: '../../src/ProductBundle/*'
exclude: '../../src/ProductBundle/{Entity,Repository,Tests}'
После долгих исследований нашел решение. Эта работа с:
- doctrine / doctrine-fixtures-bundle: ^ 3.0,
- Symfony ^ 3.3
Первый
- Определите свое приспособление.
<?php
namespace Where\MyFixtureBundle\FileFolder\IsLocated;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Nao\UserBundle\Entity\User;
class LoadData implements FixtureInterface
{
/**
* Load data fixtures with the passed EntityManager
*
* @param ObjectManager $manager
*/
public function load(ObjectManager $manager){
$object = new Entity();
$object->setFoo(bar)
...
$manager->persist($object);
$manager->flush();
}
}
Затем определите службу в файле service.yml пакета или непосредственно в "app / config / service.yml" (не рекомендуется)
# Fixtures service
your_service.name:
class: Full\Namespce\With\TheClassFixtureName
tags: [doctrine.fixture.orm] <-- important
Не забывайте, просто чтобы быть уверенным в следующем
composer du -o or composer dump-autoload -o
Попробуйте выполнить команду сейчас, чтобы загрузить данные.
Используйте Doctrine\Bundle\FixturesBundle\Fixture
Класс ProductFixture расширяет Fixture реализует FixtureInterface
см. документацию: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
Я прыгаю сюда через несколько лет, чтобы задокументировать для себя смешанное решение, которое я нашел в этой теме.
Я столкнулся с той же проблемой и нашел решение, используя несколько ответов, и я надеюсь, что это поможет.
Это был мой код:
namespace App\DataFixtures;
use App\Entity\Book;
use App\Factory\{BookFactory, UserFactory};
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
UserFactory::new()->createOne([
'email' => 'user2@user.hr',
'roles' => ['ROLE_ADMIN']
]);
UserFactory::new()->createOne([
'email' => 'user3@user.hr',
'roles' => ['ROLE_USER']
]);
BookFactory::new()->createMany(25);
$manager->flush();
}
}
поэтому я заменил расширенный Fixture ORMFixtureInterface. Итак, новый код выглядит так:
namespace App\DataFixtures;
use App\Entity\Book;
use App\Factory\{BookFactory, UserFactory};
use Doctrine\Bundle\FixturesBundle\ORMFixtureInterface;
use Doctrine\Persistence\ObjectManager;
class AppFixtures implements ORMFixtureInterface
{
public function load(ObjectManager $manager): void
{
UserFactory::new()->createOne([
'email' => 'user2@user.hr',
'roles' => ['ROLE_ADMIN']
]);
UserFactory::new()->createOne([
'email' => 'user3@user.hr',
'roles' => ['ROLE_USER']
]);
BookFactory::new()->createMany(25);
$manager->flush();
}
}
затем я пошел в services.yml и вставил это:
App\DataFixtures\:
resource: '%kernel.project_dir%/src/DataFixtures'
tags: ['doctrine.fixture.orm']
поэтому файл services.yml выглядит так:
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
App\DataFixtures\:
resource: '%kernel.project_dir%/src/DataFixtures'
tags: ['doctrine.fixture.orm']
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
а затем, как предложил @Spartacvs1, в вашем терминале выполните это
composer dump-autoload -o
Прочитав комментарий выше, я нашел решение в ответе @GuRu:
Msgstr " Второй вариант: вам нужно вручную пометить doctrine.fixture.orm для DataFixtures в конфигурации sevice.yml ".
Затем реализует ORMFixtureInterface в вашем классе приборов.
, на самом деле, мы должны добавить дополнительную конфигурацию внутри services.yml, чтобы решить эту проблему. Важно знать, я заметил эту проблему в версии ~3.4 Symfony.
С наилучшими пожеланиями
Мне также пришлось обновить app/AppKernel.php и добавить следующий массив bundles:
new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle()
Я хотел бы дать некоторый контекст проблемы, поскольку существующие ответы помогли мне, но не решили мой конкретный случай.
Поиск классов зависит от конфигурации внедрения службы:
# app/config/services.yml
###
services:
_defaults:
autowire: true
autoconfigure: true
public: false
DataFixtures\My\MyFixtures:
###
services:
_defaults:
autowire: true
autoconfigure: false
public: false
my_fixtures:
class: DataFixtures\My\MyFixtures
tags:
- doctrine.fixture.orm
###
services:
_defaults:
autowire: false
autoconfigure: true
public: false
my_fixtures:
class: DataFixtures\My\MyFixtures
arguments:
- '@fos_user.util.password_updater'
###
services:
_defaults:
autowire: false
autoconfigure: false
public: false
my_fixtures:
class: DataFixtures\My\MyFixtures
tags:
- doctrine.fixture.orm
arguments:
- '@fos_user.util.password_updater'
Для данного класса:
# fixtures/My/MyFixtures.php
<?php
declare(strict_types=1);
namespace DataFixtures\My;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
use FOS\UserBundle\Model\User;
class MyFixtures extends Fixture
{
public function __construct(PasswordUpdaterInterface $passwordUpdater)
{
$this->passwordUpdater = $passwordUpdater;
}
public function load(ObjectManager $om): void
{
$user = new User;
$user->setUsername('toto');
$user->setPlainPassword('tata');
$this->passwordUpdater->hashPassword($user);
$user->setEmail('toto@lupusmic.org');
$user->setEnabled(true);
$om->persist($user);
$om->flush();
}
private $passwordUpdater;
private $om;
}
The composer.json
:
# composer.json
{
"autoload-dev": {
"psr-4": {
"Tests\\": "tests",
"DataFixtures\\": "fixtures"
}
},
}
Загрузка в AppKernel:
# app/AppKernel.php
public function registerBundles()
{
$bundles = [];
// ...
// isTestEnvironement is a custom method to determine if `--env=test` given on CLI
if ($this->isTestEnvironement()) {
$bundles[] = new
Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle;
}
// ...
return $bundles;
}