Настройка параметра в виде массива в nelmio Alice fixture generator

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

UserBundleEntityUser:
    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*

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

[SymfonyComponentDebugExceptionContextErrorException] Уловимая фатальная ошибка: Аргумент 1 передан FOSUserBundleModelUser:: setRoles () должен иметь тип array, string given, вызывается в /var/www в/HTML-код/поставщик/nelmio/Алиса/ГРЦ/Nelmio/Алиса/грузчик/базы.php в строке 483 и определен в /var/www/html/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/модель / пользователь.в PHP строки 530

любые советы по этому?

обновление ответа

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

после сделал некоторые изменения, как @frumious предложил приспособление теперь такого содержания:

UserBundleEntityUser:
    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] уловимая фатальная ошибка: Аргумент 1 передан DoctrineCommonCollectionsArrayCollection::_ _ construct() должен иметь тип array, object given, вызывается в /var/www в/HTML-код/поставщик/учение/ОРМ/Либ/учение/ОРМ/UnitOfWork.php o
N строка 555 и определена в в /var/www в/HTML-код/поставщик/учение/коллекции/Либ/учение/общее/сборники/ArrayCollection.РНР строка 47

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

/**
 * @ORMEntity
 * @ORMTable(name="fos_user")
 * @GedmoSoftDeleteable(fieldName="deletedAt", timeAware=false)
 * @ORMEntity(repositoryClass="UserBundleEntityRepositoryUserRepository")
 */
class User extends BaseUser {
    /**
     * Hook timestampable behavior
     * updates createdAt, updatedAt fields
     */
    use TimestampableEntity;

    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORMManyToMany(targetEntity="Group")
     * @ORMJoinTable(name="fos_user_user_group",
     *      joinColumns={@ORMJoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORMJoinColumn(name="group_id", referencedColumnName="id")}
     * )
     */
    protected $groups;

    /**
     * @ORMColumn(name="deletedAt", type="datetime", nullable=true)
     */
    protected $deletedAt;

}

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

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

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

services:
    roles.faker.provider:
        class: CommonBundleToolsRolesFakerProvider
        tags:
            -  { name: h4cc_alice_fixtures.provider }

и это метод:

namespace CommonBundleTools;

class RolesFakerProvider {

    public function randomRoles()
    {
        $names = ['ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO'];

        return [$names[array_rand($names)]];
    }

}

затем я внес эти изменения:

UserBundleEntityUser:
    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*

и этот возвращает эту ошибку вместо этого:

[SymfonyComponentDebugExceptionContextErrorException] Уловимый Фатальная ошибка: Аргумент 1 передан FOSUserBundleModelUser:: setRoles() должен иметь тип array, строка задана, вызывается в /var/www в/HTML-код/поставщик/nelmio/Алиса/ГРЦ/Nelmio/Алиса/грузчик/базы.РНР на линии 483 и defin ed в /var/www/html/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/модель / пользователь.РНР строка 530

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

2 ответов


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

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

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

Факер

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)];
}

по данным Алиса похоже, вы можете вставить это прямо в ЯМЛ, как это:

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 расскажите, как включить отдельного провайдера (как описано выше)

услуги.в формате YML

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


этот предложение не работает, сохраняя для потомства, но перемещается вниз по дну!

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

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