Я спрашиваю, можно ли передать массив как значение для некоторых элементов? Например, в моем случае я пытаюсь установить роли для объекта 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 другого массива. В любом случае, когда вы это выясните, я думаю, что вы должны отправить запрос на перенос документов или создать файл по крайней мере, потому что это, вероятно, не должно быть настолько сложным.