Intereting Posts
php imagepng () генерирует черное изображение только на сервере Строка с комой для плавания с точкой Как проверить правильность выполнения запроса UPDATE mysqli? Разделить строку PHP В PHP может кто-то объяснить клонирование против ссылки указателя? Определение прошедшего времени Почему FILTER_VALIDATE_URL возвращает FALSE только для этого URL-адреса? Простое шифрование Javascript, расшифровка PHP с помощью общего секретного ключа Как изменить разрешенную память выделенной памяти? strtotime («Первый понедельник ..»), когда в первый день месяца возвращается неверная дата как остановить форму submit, если пустые поля? Локальный хостинг Обновление Laravel Eloquent только в случае внесения изменений php: '0' как строка с пустым () Почему, если я зарегистрировался на своем веб-сайте как зарегистрированный пользователь, я не могу получить доступ к другим страницам после установки правил сеанса?

Настройка параметра как массива в генераторе Nelmio Alice

Я спрашиваю, можно ли передать массив как значение для некоторых элементов? Например, в моем случае я пытаюсь установить роли для объекта FOSUserBundle User который принимает roles в виде массива значений, а не простых значений. У меня это в моем кресле:

 UserBundle\Entity\User: User0: username: admin email: admin@local.com enabled: 1 plainPassword: admin roles: [ROLE_ADMIN] groups: @Group0 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> roles: 35%? [ROLE_ADMIN, ROLE_USER, ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] groups: @Group* 

Но это не работает, и я получаю эту ошибку:

[Symfony \ Component \ Debug \ Exception \ ContextErrorException] Catchable Fatal Error: аргумент 1, переданный в FOS \ UserBundle \ Model \ User :: setRoles (), должен быть из массива типов, заданной строки, вызываемой в / var / www / html / vendor / nelmio / alice / src / Nelmio / Alice / Loader / Base.php в строке 483 и определен в /var/www/html/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Model/User.php строке 530

Есть какие-нибудь советы по этому поводу?

Обновить ответ

Использование первого подхода с простым массивом в файле YAML:

После внесения некоторых изменений, поскольку @frumious предложил, что у прибора теперь есть это содержимое:

 UserBundle\Entity\User: User0: username: admin email: admin@local.com enabled: 1 plainPassword: admin roles: [ROLE_ADMIN] groups: @Group0 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> roles: [ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] groups: @Group* 

Таким образом, я буду назначать всегда две роли для каждого тестового пользователя, но у меня возникают некоторые проблемы с попыткой найти место, где должен быть помещен Faker , и какой код писать внутри него.

Но в любое время я пытаюсь выполнить набор, позвонив:

 h4cc_alice_fixtures:load:sets ./src/CommonBundle/DataFixtures/TananeSet.php 

Я получил эту ошибку:

[ErrorException] Catchable Fatal Error: аргумент 1 передан в Doctrine \ Common \ Collections \ ArrayCollection :: __ construct () должен быть из массива типов, заданного объекта, вызываемого в / var / www / html / vendor / doctrine / orm / lib / Доктрина / ORM / UnitOfWork.php o
n строка 555 и определена в /var/www/html/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php строке 47

Это заставляет меня думать, что проблема здесь связана с переменной $groups в объекте User . Это часть кода для этого объекта:

 /** * @ORM\Entity * @ORM\Table(name="fos_user") * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false) * @ORM\Entity(repositoryClass="UserBundle\Entity\Repository\UserRepository") */ class User extends BaseUser { /** * Hook timestampable behavior * updates createdAt, updatedAt fields */ use TimestampableEntity; /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\ManyToMany(targetEntity="Group") * @ORM\JoinTable(name="fos_user_user_group", * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")} * ) */ protected $groups; /** * @ORM\Column(name="deletedAt", type="datetime", nullable=true) */ protected $deletedAt; } 

Как я могу исправить эту ошибку? Что я должен передать как параметр для groups ?

Использование второго подхода: определение службы

Следуя другому предложению от @frumious, я определяю следующее:

 services: roles.faker.provider: class: CommonBundle\Tools\RolesFakerProvider tags: - { name: h4cc_alice_fixtures.provider } 

И это метод:

 namespace CommonBundle\Tools; class RolesFakerProvider { public function randomRoles() { $names = ['ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO']; return [$names[array_rand($names)]]; } } 

Затем я сделал следующие изменения:

 UserBundle\Entity\User: User0: username: admin email: admin@local.com enabled: 1 plainPassword: admin roles: [ROLE_ADMIN] groups: @Group0 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> # BEFORE #roles: [ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] # AFTER roles: <randomRoles> groups: @Group* 

И этот ответ возвращает эту ошибку:

[Symfony \ Component \ Debug \ Exception \ ContextErrorException] Catchable Fatal Error: аргумент 1, переданный в FOS \ UserBundle \ Model \ User :: setRoles (), должен быть из массива типов, заданной строки, вызываемой в / var / www / html / vendor / nelmio / alice / src / Nelmio / Alice / Loader / Base.php в строке 483 и определен в /var/www/html/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Model/User.php строке 530

Что заставляет меня думать, что функция не возвращает array или что-то еще не получается, любые советы по этому поводу тоже?

По сути, это просто предположение, основанное на быстром просмотре документов, но я подозреваю, что проблема может быть в roles: 35%? [ROLE_ADMIN, ROLE_USER, ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] roles: 35%? [ROLE_ADMIN, ROLE_USER, ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] бит после roles: интерпретируется как одна строка, потому что он не начинается с [ в качестве нормального массива YAML потребуется.

Что касается решения, я подозреваю, что вы не можете сделать это прямо в YAML.

Один (не проверенный) вариант: используйте собственный метод Faker :

обманщик

 public function roles() { return = ['ROLE_ADMIN', 'ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO']; } 

YAML

 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> roles: 35%? <roles()> groups: @Group* 

Заключительный запрос: вы действительно хотите, чтобы Алиса назначила все эти роли пользователю 35% времени? Если нет, и на самом деле вы хотите, чтобы какой-либо из них зависел от одного из них в каждом пользователе, тогда я предполагаю, что вам нужен по-прежнему настраиваемый метод, но вместо него следует использовать логику выбора вместо YAML.

РЕДАКТИРОВАТЬ

Ах, похоже, что вам нужны случайные одиночные роли для каждого тестового экземпляра, и в этом случае вам понадобится специальный код:

 public function randomRole() { $names = ['ROLE_ADMIN', 'ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO']; return $names[array_rand($names)]; } 

Согласно Алисе, похоже, вы можете придерживаться этого прямо в YAML, как это:

 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> roles: <?php $names = ['ROLE_ADMIN', 'ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO']; echo $names[array_rand($names)]; ?> groups: @Group* 

Или в документах AliceFixturesBundle рассказывается, как включить отдельный поставщик (как описано выше)

services.yml

 services: your.faker.provider: class: YourProviderClass tags: - { name: h4cc_alice_fixtures.provider } 


Это предложение не работает, сохраняя потомство, но двигаясь вниз!

Я подумал, что, возможно, вы можете это сделать, определяя массив отдельно вверху, а затем ссылаясь на него, используя Alice Value Objects , но поскольку массив не является нормальным объектом, я не вижу, как его создать. Вам нужно что-то вроде этого:

 Array: Array0: [ROLE_ADMIN, ROLE_USER, ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] UserBundle\Entity\User: User0: username: admin email: admin@local.com enabled: 1 plainPassword: admin roles: [ROLE_ADMIN] groups: @Group0 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> roles: 35%? @Array0 groups: @Group* 

Я считаю, что проблема заключается в том, что вам нужно установить массив ролей, поэтому вы не можете просто вернуть одну роль. Либо сделайте это в строке:

 User{1..10}: username: <firstNameMale> email: <companyEmail> enabled: <boolean(35)> plainPassword: <lexify> roles: <?php $names = ['ROLE_ADMIN', 'ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO']; echo '['.$names[array_rand($names)].']'; ?> groups: @Group* 

Другая проблема может заключаться в том, что когда вы даете массив чему-то, он может распаковать его как список arg. Попытайтесь передать его [ ['Foo'] ] т. Е. Массив как первый arg другого массива. В любом случае, когда вы это выясните, я думаю, что вы должны отправить запрос на перенос документов или создать файл по крайней мере, потому что это, вероятно, не должно быть настолько сложным.