После команды "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();
}
Объясните, в чем причина такого поведения? Не получается разобраться(
Дело в том, что Slugify не является внутренним сервисом Symfony. Для таких случаев фреймворк требует объявлять сервисы в config/services.yaml. В следующей статье об этой ошибке написано и показано, как исправить.
public function __construct(\Cocur\Slugify\SlugifyInterface $slugify)
Теперь для автора урока: Это ужасно! Моя упертость конечно поможет мне пройти весь этот курс, но подача материала отвратительная. Судя по первому уроку это все для новичков, так как местами расписано достаточно глубоко и понятно. Но! Если человек делает все с нуля и идет по этим урокам, то на данном этапе у него будет просто куча ошибок и он не поймет что с ними делать. Комменты тому подтверждение. Многие навтыкали свои костыли и решили, что раз работает значит ок. На самом деле решают их вопросы мануал самого Symfony и мануалы всех указанных пакетов. Но блин, зачем тогда этот урок? Если пишете для новичков, то пишите на чистом листе, с объяснением того что, куда и зачем. Либо выкладывайте исходники, чтобы разбираться самим! Я соглашусь, что обучающийся должен и сам работать над проектом, делать домашку, но тогда дайте ему рабочую базу и задание.
если у кого будет join(): Argument #2 ($array) must be of type ?array, string given
8
в файле Lorem.php на 95 строке
return join($words, ' ') . '.';
заменить на
return join(' ', $words) . '.';
и все последующие , у вас будут еще 2 ошибки также , поменяйте местами аргументы
а у меня после команды "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.
не могу найти проблему, вроде всё как надо, опечаток нет, но пишет ошибку 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();
}
}
Настройка
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 благополучно записалась в базу :))
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:
Ну так он же показывает, почему ошибка - потому что скомпилированный контейнер из кэша не соответствует тому, что есть в реальности. Выполните php bin/console cache:clear. Правильно объявленный сервис в config/services.yaml не может не работать. А еще, можно не объявлять его как сервис, а заинжектить SlugifyInterface, тогда все будет работать и без сервиса.
Кэш очистил, ошибка та же. Не пойму, что компилятору не нравится. В файле getDoctrine_FixturesLoadCommandService.php, который в папке cache, в конструкторе при создании объекта указан параметр типа Сосur\Slugify\Slugify, только он обрамлен одинарными кавычками и обратные слэши экранированы:
new \App\DataFixtures\AppFixtures('Cocur\Slugify\Slugify')
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
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 и там остался код:
У меня было такая проблема http://prntscr.com/otssge, параметрам в конструктор был передан путь до класса Slugify и он был определен как string, а в конструкторе тайпхинтинг хочет объект а не строка
в сервисе FixturesLoad я вызвал метод create чтобы был передан объект http://prntscr.com/otstk9 , не знаю ли правильно, я только начинаю изучать фреймворк, или проста нужно было вызывать метод create() в сам конструктор и убрать тайпхинтинг.
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>
Но записи в БД не появляются в чем может быть проблема?
вот такая ошибка, прбовал что пишут в комментах и чего то никак
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
А это нормально, что я создал базу в кодировке utf8_general_ci, а Doctrine пишет туда таблицы в utf8mb4_unicode_ci?
Разобрался. Для тех кто в танке как я: utf8_general_ci является устаревшей кодировкой. Лучше использовать utf8mb4_general_ci, но это может вызвать проблемы с сортировкой. Так что всю базу лучше сразу делать в utf8mb4_unicode_ci.
Автор наверное зря начал с курса symfony. Это фреймворк не для новичков, я бы вам посоветовал для начала Laravel посмотреть, там порог вхождения полегче. И в принципе основы MVC в пред.курсе именно больше для него подходят, хотя и с орехами, т.к. Он вынес логику некоторую в контроллеры, хотя этим должны заниматься репозитории
очень много ошибок тексте и нет полного исходника, чтобы понять, где косяк
Поскольку мы работаем с постами, создадим приватный метод loadPosts, который вызовем в методе load
public function loadPosts(ObjectManager $manager)
что не так? )))
не видно пространство имен, вылезла такая ошибка
> symfony console doctrine:fixtires:load
In DefinitionErrorExceptionPass.php line 54:
Cannot autowire service "App\DataFixtures\AppFixtures": argument "$slugify" of method "__construct()" references class "Cocur\Slugify\Slugify" but no such service exists.
exit status 1
а после создания AppFixture phpstorm ругается
symfony console doctrine:fixtires:load
In DefinitionErrorExceptionPass.php line 54:
Cannot autowire service "App\DataFixtures\AppFixtures": argument "$slugify" of method "__construct()" references class "Cocur\Slugify\Slugify" but no such service exists.
exit status 1
[тыц](https://php.zone/uploads/img/20200627c2c106625c5ffdeb510fc00ac5390aecfc2bdcfad06113f4459796757b8ed3ab.png)
будет создано 19 записей базы, а не 20!!
!
нельзя было нормальный визуальный редактор прикрутить?
[critical] Uncaught Error: Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of Cocur\Slugify\Slugify, string given, called in ...
и в config/services.yaml прописал то, что здесь советовали.
и изменял public function __construct(), так как здесь написано.
и в файл config/bundles.php добавил, то что здесь писали.
Нифига не работает!!! Одна и та же ошибка!!!!
Подскажите пожалуйста, что делать с
Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of Cocur\Slugify\Slugify, string given, called in C:\OpenServer\domains\blog\var\cache\dev\ContainerCRTSZ74\getDoctrine_FixturesLoadCommandService.php on line 34
в config/services.yaml прописал со след урока, но ошибка все равно появляется
Пробовал повторить на symfony 6, и тоже на php 8, но cocur/slugify ругается в фикстурах. Посмотрел в доке, он вроде теперь через интерфейс реализовывается. Но у меня не вышло это сделать. Запили через SluggerInterface
use Symfony\Component\String\Slugger\SluggerInterface;
public function __construct(SluggerInterface $slugger)
{
$this->faker = Factory::create();
$this->slugger = $slugger;
}
а потом естественно прочитал что 8 php не будет работать))
Uncaught Error: Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of Cocur\Slugify\Slugify, string given, called in /var/www/myblog.local/var/cache/dev/ContainerP7gMFKr/getDoctrine_FixturesLoadCommandService.php on line 36
После команды "doctrine:fixtures:load" вылезает ошибка:
Несколько изменил конструктор, и записи в БД создались безо всяких ошибок:
Объясните, в чем причина такого поведения? Не получается разобраться(
Дело в том, что Slugify не является внутренним сервисом Symfony. Для таких случаев фреймворк требует объявлять сервисы в config/services.yaml. В следующей статье об этой ошибке написано и показано, как исправить.
Сюда напишу, чтобы было повыше.
Для начала тем, кто хочет докопаться до истины:
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
и в конструкторе пишем:
Теперь для автора урока: Это ужасно! Моя упертость конечно поможет мне пройти весь этот курс, но подача материала отвратительная. Судя по первому уроку это все для новичков, так как местами расписано достаточно глубоко и понятно. Но! Если человек делает все с нуля и идет по этим урокам, то на данном этапе у него будет просто куча ошибок и он не поймет что с ними делать. Комменты тому подтверждение. Многие навтыкали свои костыли и решили, что раз работает значит ок. На самом деле решают их вопросы мануал самого Symfony и мануалы всех указанных пакетов. Но блин, зачем тогда этот урок? Если пишете для новичков, то пишите на чистом листе, с объяснением того что, куда и зачем. Либо выкладывайте исходники, чтобы разбираться самим! Я соглашусь, что обучающийся должен и сам работать над проектом, делать домашку, но тогда дайте ему рабочую базу и задание.
нельзя плюсик поставить, согласен с каждым словом )
если у кого будет join(): Argument #2 ($array) must be of type ?array, string given
8
в файле Lorem.php на 95 строке
return join($words, ' ') . '.';
заменить на
return join(' ', $words) . '.';
и все последующие , у вас будут еще 2 ошибки также , поменяйте местами аргументы
а у меня после команды "doctrine:fixtures:load" такая ошибка:
У вас опечатка или в неймспейсе, или в названии класса. И загружайте фикстуры с флагом -n, то есть
не могу найти проблему, вроде всё как надо, опечаток нет, но пишет ошибку
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?
У вас два немспейса объявлены. Удалите App\Entity.
Настройка
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;
Только после этого Entity благополучно записалась в базу :))
Какая ошибка была?
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
Ну так он же показывает, почему ошибка - потому что скомпилированный контейнер из кэша не соответствует тому, что есть в реальности. Выполните php bin/console cache:clear. Правильно объявленный сервис в config/services.yaml не может не работать. А еще, можно не объявлять его как сервис, а заинжектить SlugifyInterface, тогда все будет работать и без сервиса.
Кэш очистил, ошибка та же. Не пойму, что компилятору не нравится. В файле getDoctrine_FixturesLoadCommandService.php, который в папке cache, в конструкторе при создании объекта указан параметр типа Сосur\Slugify\Slugify, только он обрамлен одинарными кавычками и обратные слэши экранированы:
new \App\DataFixtures\AppFixtures('Cocur\Slugify\Slugify')
new \App\DataFixtures\AppFixtures('Cocur\Slugify\Slugify')
\ не копируется здесь )
а в файле слэши двойные )
Вы не должны ничего смотреть в этих файлах, это кэш. Симфони знает, как с ними работать. Заинжектите в конструктор SlugifyInterface вместо Slugify.
Если вот так:
то делал, ошибка та же )
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
Что только ни делал, конструктор с параметром Slugify $slugify не работает, только так:
Все просто решается - надо для вендорной этой либы прописать autowire в services.yaml.
Вот так:
Вот тут можно посмотреть Symfony4 use external class library as a service
У меня ругалось на базу данных
пока не добавил в phpMyAdmin таблицу post вручную
Еще у меня была вот такая ошибка:
В файле src/DataFixtures/AppFixtures.php я добавил:
Возникали также проблемы с Slugify. В итоге сработало вот так:
И еще я перед этим пробовал менять config/services.yaml и там остался код:
Не знаю, может ли это иметь значение ))
У меня было такая проблема http://prntscr.com/otssge, параметрам в конструктор был передан путь до класса Slugify и он был определен как string, а в конструкторе тайпхинтинг хочет объект а не строка
в сервисе FixturesLoad я вызвал метод create чтобы был передан объект http://prntscr.com/otstk9 , не знаю ли правильно, я только начинаю изучать фреймворк, или проста нужно было вызывать метод create() в сам конструктор и убрать тайпхинтинг.
Там явно конструктор ждет объект, или он сам его создает?
решил добавив в service:
Cocur\Slugify\Slugify:
autowire: true
Там оказывается жестка формат кода надо соблюдать, а я писал без всяких отступах
Но записи в БД не появляются в чем может быть проблема?
То же самое. Ошибок нет, но нет и записей в таблице.
Прошу прощения, невнимательность. Не надо отвечать :)
вот такая ошибка, прбовал что пишут в комментах и чего то никак
А это нормально, что я создал базу в кодировке utf8_general_ci, а Doctrine пишет туда таблицы в utf8mb4_unicode_ci?
Разобрался. Для тех кто в танке как я: utf8_general_ci является устаревшей кодировкой. Лучше использовать utf8mb4_general_ci, но это может вызвать проблемы с сортировкой. Так что всю базу лучше сразу делать в utf8mb4_unicode_ci.
Почему геттер позволяет возвращать null?
public function getId(): ?int
{
return $this->id;
}
знак '?' перед int значит либо целое число вернуть либо null
Автор наверное зря начал с курса symfony. Это фреймворк не для новичков, я бы вам посоветовал для начала Laravel посмотреть, там порог вхождения полегче. И в принципе основы MVC в пред.курсе именно больше для него подходят, хотя и с орехами, т.к. Он вынес логику некоторую в контроллеры, хотя этим должны заниматься репозитории
очень много ошибок тексте и нет полного исходника, чтобы понять, где косяк
Symfony 4.4.10
Нифига не работает!!!!
Ошибка:
и в config/services.yaml прописал то, что здесь советовали.
и изменял public function __construct(), так как здесь написано.
и в файл config/bundles.php добавил, то что здесь писали.
Нифига не работает!!! Одна и та же ошибка!!!!
Подскажите пожалуйста, что делать с
Argument 1 passed to App\DataFixtures\AppFixtures::__construct() must be an instance of Cocur\Slugify\Slugify, string given, called in C:\OpenServer\domains\blog\var\cache\dev\ContainerCRTSZ74\getDoctrine_FixturesLoadCommandService.php on line 34
в config/services.yaml прописал со след урока, но ошибка все равно появляется
Всем привет!
У меня после вот такой команды:
php bin/console doctrine:fixtures:load
Вылезает вот такая бяка:
In AbstractMySQLDriver.php line 112:
An exception occurred in driver: SQLSTATE[HY000] [2002] ??????????? ?? ???????????, ?.?. ???????? ????????? ?????? ?????? ?? ???????????.
In Exception.php line 18:
SQLSTATE[HY000] [2002] ??????????? ?? ???????????, ?.?. ???????? ????????? ?????? ?????? ?? ???????????.
In PDOConnection.php line 38:
SQLSTATE[HY000] [2002] ??????????? ?? ???????????, ?.?. ???????? ????????? ?????? ?????? ?? ???????????.
doctrine:fixtures:load [--append] [--group GROUP] [--em EM] [--shard SHARD] [--purge-with-truncate] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>
Подскажите, плиз, в чем дело, и что делать!
Извините!
Сам затупил. Не запустил Сервер БД.
у кого ошибка при импорте фикстур на php 8
пакет faker не поддерживается и нужно использовать его форк composer require fakerphp/faker
Пробовал повторить на symfony 6, и тоже на php 8, но cocur/slugify ругается в фикстурах. Посмотрел в доке, он вроде теперь через интерфейс реализовывается. Но у меня не вышло это сделать. Запили через SluggerInterface
а потом естественно прочитал что 8 php не будет работать))
У всех у кого вылазит ошибка:
в файл config/bundles.php добавьте:
и вместо Slugify используйте SlugifyInterface
Предлагаемый план битвы:
вводим пару строк в БД руками и делаем вывод в браузере (код берём из след.урока)