Чат Telegram
Группа ВКонтакте
Новый комментарий


ilyaOrlov

После команды "doctrine:fixtures:load" вылезает ошибка:

Cannot autowire service "App\DataFixtures\AppFixtures": argument "$slugify"
   of method "__construct()" references class "Cocur\Slugify\Slugify" but no
  such service exists.

Несколько изменил конструктор, и записи в БД создались безо всяких ошибок:

public function __construct()
    {
        $this->faker = Factory::create();
        $this->slug = Slugify::create();
    }

Объясните, в чем причина такого поведения? Не получается разобраться(

lolychank

Дело в том, что Slugify не является внутренним сервисом Symfony. Для таких случаев фреймворк требует объявлять сервисы в config/services.yaml. В следующей статье об этой ошибке написано и показано, как исправить.

valera

а у меня после команды "doctrine:fixtures:load" такая ошибка:

The autoloader expected class "App\DataFixtures\AppFixtures" to be defined   
  in file "/home/user/var/www/symfony-my-pro/vendor/composer/../../src/DataFi  
  xtures/AppFixtures.php". The file was found but the class was not in it, th  
  e class name or namespace probably has a typo. 
lolychank

У вас опечатка или в неймспейсе, или в названии класса. И загружайте фикстуры с флагом -n, то есть

php bin/console doctrine:fixtures:load -n
valera

не могу найти проблему, вроде всё как надо, опечаток нет, но пишет ошибку
The autoloader expected class "App\DataFixtures\AppFixtures" to be defined in file "/home/user/var/www/symfony-my-pro/vendor/composer/../../src/DataFi xtures/AppFixtures.php". The file was found but the class was not in it, th e class name or namespace probably has a typo.
и почему такой странный путь, зачем нам в папку vendor?

<?php

namespace App\DataFixtures;
namespace App\Entity;

use Cocur\Slugify\Slugify;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Faker\Factory;

class AppFixtures extends Fixture
{
    private $faker;
    private $slug;

    public function __construct()
    {
        $this->faker = Factory::create();
        $this->slug = Slugify::create();
    }

    public function load(ObjectManager $manager)
    {
        $this->loadPosts($manager);
    }

    public function loadPosts(ObjectManager $manager){
        for ($i = 1; $i < 20; $i++) {
            $post = new Post();
            $post->setTitle($this->faker->text(100));
            $post->setSlug($this->slug->slugify($post->getTitle()));
            $post->setBody($this->faker->text(1000));
            $post->setCreatedAt($this->faker->dateTime);

            $manager->persist($post);
        }

        $manager->flush();
    }
}
lolychank

У вас два немспейса объявлены. Удалите App\Entity.

cyprusscorpion

Настройка
App\DataFixtures\AppFixtures:
$slugify: 'Cocur\Slugify\Slugify'
в файле config/services.yaml
у меня лично не работает.
Пришлось импортировать Slugify,
убирать параметр из конструктора
и создавать объект с помощью метода create().
Вот так:
namespace App\DataFixtures;

use Cocur\Slugify\Slugify;
use App\Entity\Post;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Faker\Factory;

class AppFixtures extends Fixture
{
private $faker;
private $slug;

public function __construct()
{
    $this->faker = Factory::create();
    $this->slug = Slugify::create();
}

Только после этого Entity благополучно записалась в базу :))

lolychank

Какая ошибка была?

cyprusscorpion

PHP Fatal error: Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of App\DataFixtures\Slugify, string given, called in /home/cyprusscorpion/PhpstormProjects/blog_symfony2/var/cache/dev/ContainerSofzcof/getDoctrine_FixturesLoadCommandService.php on line 22 in /home/cyprusscorpion/PhpstormProjects/blog_symfony2/src/DataFixtures/AppFixtures.php:17
Stack trace:

0 /home/cyprusscorpion/PhpstormProjects/blog_symfony2/var/cache/dev/ContainerSofzcof/getDoctrine_FixturesLoadCommandService.php(22): App\DataFixtures\AppFixtures->__construct('Cocur\Slugify\S...')

1 /home/cyprusscorpion/PhpstormProjects/blog_symfony2/var/cache/dev/ContainerSofzcof/srcDevDebugProjectContainer.php(961): require('/home/cyprussco...')

2 /home/cyprusscorpion/PhpstormProjects/blog_symfony2/var/cache/dev/ContainerSofzcof/getConsole_CommandLoaderService.php(68): ContainerSofzcof\srcDevDebugProjectContainer->load('getDoctrine_Fix...')

3 /home/cyprus in /home/cyprusscorpion/PhpstormProjects/blog_symfony2/src/DataFixtures/AppFixtures.php on line 17

lolychank

Ну так он же показывает, почему ошибка - потому что скомпилированный контейнер из кэша не соответствует тому, что есть в реальности. Выполните php bin/console cache:clear. Правильно объявленный сервис в config/services.yaml не может не работать. А еще, можно не объявлять его как сервис, а заинжектить SlugifyInterface, тогда все будет работать и без сервиса.

cyprusscorpion

Кэш очистил, ошибка та же. Не пойму, что компилятору не нравится. В файле getDoctrine_FixturesLoadCommandService.php, который в папке cache, в конструкторе при создании объекта указан параметр типа Сосur\Slugify\Slugify, только он обрамлен одинарными кавычками и обратные слэши экранированы:

new \App\DataFixtures\AppFixtures('Cocur\Slugify\Slugify')

cyprusscorpion

new \App\DataFixtures\AppFixtures('Cocur\Slugify\Slugify')

cyprusscorpion

\ не копируется здесь )

cyprusscorpion

а в файле слэши двойные )

lolychank

Вы не должны ничего смотреть в этих файлах, это кэш. Симфони знает, как с ними работать. Заинжектите в конструктор SlugifyInterface вместо Slugify.

cyprusscorpion

Если вот так:

    public function __construct(SlugifyInterface $slugify)
    {
        $this->faker = Factory::create();
        $this->slug = $slugify;
    }

то делал, ошибка та же )

cyprusscorpion

PHP Fatal error: Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of Cocur\Slugify\SlugifyInterface, string given, called in /home/cyprusscorpion/PhpstormProjects/blog_symfony2/var/cache/dev/ContainerSofzcof/getDoctrine_FixturesLoadCommandService.php on line 22 in /home/cyprusscorpion/PhpstormProjects/blog_symfony2/src/DataFixtures/AppFixtures.php:18

cyprusscorpion

Что только ни делал, конструктор с параметром Slugify $slugify не работает, только так:

    public function __construct()
    {
        $this->faker = Factory::create();
        $this->slug = Slugify::create();
    }
webdev177

Все просто решается - надо для вендорной этой либы прописать autowire в services.yaml.

Вот так:

Cocur\Slugify\Slugify:
    autowire: true

Вот тут можно посмотреть Symfony4 use external class library as a service

Serge

У меня ругалось на базу данных

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'symfony4.post' doesn't exist

пока не добавил в phpMyAdmin таблицу post вручную

Serge

Еще у меня была вот такая ошибка:

Attempted to load class "Post" from namespace "App\DataFixtures".  
Did you forget a "use" statement for "App\Entity\Post"? 

В файле src/DataFixtures/AppFixtures.php я добавил:

use App\Entity\Post;

Возникали также проблемы с Slugify. В итоге сработало вот так:

<?php

namespace App\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Cocur\Slugify\Slugify;
use Faker\Factory;
use App\Entity\Post;

class AppFixtures extends Fixture
{
    private $faker;

    private $slug;

    public function __construct(Slugify $slugify)
    {
        $this->faker = Factory::create();
        $this->slug = $slugify;
    }

    public function load(ObjectManager $manager)
    {
        $this->loadPosts($manager);
    }

    public function loadPosts(ObjectManager $manager)
    {

        for ($i = 1; $i < 20; $i++) {
            $post = new Post();
            $post->setTitle($this->faker->text(100));
            $post->setSlug($this->slug->slugify($post->getTitle()));
            $post->setBody($this->faker->text(1000));
            $post->setCreatedAt($this->faker->dateTime);

            $manager->persist($post);
        }
        $manager->flush();
    }

}

И еще я перед этим пробовал менять config/services.yaml и там остался код:

    Cocur\Slugify\Slugify:
        autowire: true

Не знаю, может ли это иметь значение ))

Iliusha99

У меня было такая проблема http://prntscr.com/otssge, параметрам в конструктор был передан путь до класса Slugify и он был определен как string, а в конструкторе тайпхинтинг хочет объект а не строка
в сервисе FixturesLoad я вызвал метод create чтобы был передан объект http://prntscr.com/otstk9 , не знаю ли правильно, я только начинаю изучать фреймворк, или проста нужно было вызывать метод create() в сам конструктор и убрать тайпхинтинг.

Iliusha99

Там явно конструктор ждет объект, или он сам его создает?

Iliusha99

решил добавив в service:
Cocur\Slugify\Slugify:
autowire: true
Там оказывается жестка формат кода надо соблюдать, а я писал без всяких отступах

polvanovv
D:\OpenServer\OSPanel\domains\blog>php bin/console doctrine:fixtures:load

 Careful, database "blog_db" will be purged. Do you want to continue? (yes/no) [no]:
 > y

   > purging database
   > loading App\DataFixtures\AppFixtures

D:\OpenServer\OSPanel\domains\blog>

Но записи в БД не появляются в чем может быть проблема?

Androbim

То же самое. Ошибок нет, но нет и записей в таблице.

Androbim

Прошу прощения, невнимательность. Не надо отвечать :)

Metey

вот такая ошибка, прбовал что пишут в комментах и чего то никак

 php bin/console doctrine:fixtures:load 
PHP Fatal error:  Uncaught Symfony\Component\Debug\Exception\FatalThrowableError: Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of App\DataFixtures\Slugify, string given, called in /home/dmitry/www/test.project/var/cache/dev/ContainerCxf1txa/getDoctrine_FixturesLoadCommandService.php on line 23 in /home/dmitry/www/test.project/src/DataFixtures/AppFixtures.php:16
Stack trace:
#0 /home/dmitry/www/test.project/var/cache/dev/ContainerCxf1txa/getDoctrine_FixturesLoadCommandService.php(23): App\DataFixtures\AppFixtures->__construct('Cocur\\Slugify\\S...')
#1 /home/dmitry/www/test.project/var/cache/dev/ContainerCxf1txa/srcApp_KernelDevDebugContainer.php(420): require('/home/dmitry/ww...')
#2 /home/dmitry/www/test.project/vendor/symfony/dependency-injection/Container.php(433): ContainerCxf1txa\srcApp_KernelDevDebugContainer->load('getDoctrine_Fix...')
#3 /home/dmitry/www/test.project/vendor/symfony/dependency-injection/Argument/ServiceLocator.php(40): Symfony\Component\DependencyInjection\Contain in /home/dmitry/www/test.project/src/DataFixtures/AppFixtures.php on line 16
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
Логические задачи с собеседований