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


ilyaOrlov 21.01.2019 в 23:45

После команды "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 22.01.2019 в 00:03

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

vtolstov 16.10.2019 в 13:16

Сюда напишу, чтобы было повыше.
Для начала тем, кто хочет докопаться до истины:
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html#doctrine-mapping-types - типы данных согласно Doctrine
https://github.com/fzaninotto/Faker - особенно про форматы Faker`а
https://github.com/cocur/slugify - установка Slugify на Symfony 3 и 4

От себя кратко по уроку:
не забудьте прописать use Faker\Factory;
можно не писать use Cocur\Slugify\Slugify;

По установке Slugify добавляем в файле config/bundles.php

Cocur\Slugify\Bridge\Symfony\CocurSlugifyBundle::class => ['all' => true],

и в конструкторе пишем:

public function __construct(\Cocur\Slugify\SlugifyInterface $slugify)

Теперь для автора урока: Это ужасно! Моя упертость конечно поможет мне пройти весь этот курс, но подача материала отвратительная. Судя по первому уроку это все для новичков, так как местами расписано достаточно глубоко и понятно. Но! Если человек делает все с нуля и идет по этим урокам, то на данном этапе у него будет просто куча ошибок и он не поймет что с ними делать. Комменты тому подтверждение. Многие навтыкали свои костыли и решили, что раз работает значит ок. На самом деле решают их вопросы мануал самого Symfony и мануалы всех указанных пакетов. Но блин, зачем тогда этот урок? Если пишете для новичков, то пишите на чистом листе, с объяснением того что, куда и зачем. Либо выкладывайте исходники, чтобы разбираться самим! Я соглашусь, что обучающийся должен и сам работать над проектом, делать домашку, но тогда дайте ему рабочую базу и задание.

valera 31.03.2019 в 23:58

а у меня после команды "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 01.04.2019 в 08:20

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

php bin/console doctrine:fixtures:load -n
valera 01.04.2019 в 23:02

не могу найти проблему, вроде всё как надо, опечаток нет, но пишет ошибку
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 01.04.2019 в 23:19

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

cyprusscorpion 14.04.2019 в 17:46

Настройка
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 14.04.2019 в 17:52

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

cyprusscorpion 14.04.2019 в 18:08

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 14.04.2019 в 18:12

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

cyprusscorpion 14.04.2019 в 18:47

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

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

cyprusscorpion 14.04.2019 в 18:49

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

cyprusscorpion 14.04.2019 в 18:50

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

cyprusscorpion 14.04.2019 в 18:50

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

lolychank 14.04.2019 в 18:55

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

cyprusscorpion 14.04.2019 в 18:59

Если вот так:

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

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

cyprusscorpion 14.04.2019 в 19:01

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 15.04.2019 в 10:27

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

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

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

Вот так:

Cocur\Slugify\Slugify:
    autowire: true

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

Serge 07.08.2019 в 12:26

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

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

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

Serge 07.08.2019 в 12:29

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

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 17.08.2019 в 10:09

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

Iliusha99 17.08.2019 в 10:30

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

Iliusha99 17.08.2019 в 11:16

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

polvanovv 01.09.2019 в 15:08
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 11.09.2019 в 19:39

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

Androbim 11.09.2019 в 19:47

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

Metey 24.09.2019 в 16:42

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

 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
vtolstov 16.10.2019 в 08:13

А это нормально, что я создал базу в кодировке utf8_general_ci, а Doctrine пишет туда таблицы в utf8mb4_unicode_ci?

Разобрался. Для тех кто в танке как я: utf8_general_ci является устаревшей кодировкой. Лучше использовать utf8mb4_general_ci, но это может вызвать проблемы с сортировкой. Так что всю базу лучше сразу делать в utf8mb4_unicode_ci.

rweb 09.11.2019 в 21:52

Почему геттер позволяет возвращать null?
public function getId(): ?int
{
return $this->id;
}

Логические задачи с собеседований