Php 在Nelmio Alice夹具生成器中将参数设置为数组

Php 在Nelmio Alice夹具生成器中将参数设置为数组,php,symfony,fixtures,Php,Symfony,Fixtures,我在问,是否可以将数组作为某些元素的值传递?例如,在我的例子中,我试图为一个FOSUserBundle用户实体设置角色,该实体将角色作为一个值数组,而不是普通值。我的固定装置中有: UserBundle\Entity\User: User0: username: admin email: admin@local.com enabled: 1 plainPassword: admin roles: [ROLE_

我在问,是否可以将数组作为某些元素的值传递?例如,在我的例子中,我试图为一个FOSUserBundle
用户
实体设置角色,该实体将
角色
作为一个值数组,而不是普通值。我的固定装置中有:

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*
我得到了这个错误:

[ErrorException]可捕获的致命错误:参数1传递给 条令\Common\Collections\ArrayCollection::\uuu construct()必须为 在中调用的类型数组、给定的对象 /var/www/html/vendor/doctrine/orm/lib/doctrine/orm/UnitOfWork.php o
n第555行,并在中定义 /var/www/html/vendor/doctor/collections/lib/doctor/Common/collections/ArrayCollection.php 第47行

这让我认为这里的问题与
User
实体中的
$groups
变量有关。这是该实体上的一段代码:

/**
 * @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;

}
我怎样才能纠正这个错误?对于
,我应该传递什么作为参数

使用第二种方法:定义服务

根据@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*
UserBundle\Entity\User:
用户0:
用户名:admin
电邮:admin@local.com
启用:1
密码:admin
角色:[角色\管理员]
组:@Group0
用户{1..10}:
用户名:
电邮:
启用:
密码:
#以前
#角色:[角色\u配置文件\u一,角色\u配置文件\u二]
#之后
角色:
组:@Group*
而这一个却返回了这个错误:

[Symfony\Component\Debug\Exception\ContextErrorException]可捕获 致命错误:参数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行


这让我觉得函数没有返回一个
数组
,或者其他什么地方出了问题,关于这一点也有什么建议吗?

基本上只是基于文档的猜测,但我怀疑问题可能在于
角色:35%?[ROLE\u ADMIN,ROLE\u USER,ROLE\u PROFILE\u ONE,ROLE\u PROFILE\u TWO]
角色:后的位被解释为单个字符串,因为它不像普通YAML数组那样以
[
开头

至于解决方案,我怀疑你不能像那样直接在YAML中完成

一个(未经验证)选项:使用:

骗子

亚马尔

根据它,看起来你可以像这样在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*
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*

这个建议不起作用,为子孙后代保留,但已被删除

我想也许你可以在顶部单独定义数组,然后使用Alice引用它,但是由于数组不是一个普通对象,我看不出如何实例化它。你可能需要这样的东西:

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*
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*
数组:
数组0:[角色\管理员、角色\用户、角色\配置文件\一、角色\配置文件\二]
UserBundle\Entity\User:
用户0:
用户名:admin
电邮:admin@local.com
启用:1
密码:admin
角色:[角色\管理员]
组:@Group0
用户{1..10}:
用户名:
电邮:
启用:
密码:
角色:35%?@Array0
组:@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*
用户{1..10}:
用户名:
电邮:
启用:
密码:
角色:
组:@Group*
另一个问题可能是,当你给某个东西一个数组时,它可能会将其解包为一个arg列表即,一个数组作为另一个数组的第一个参数。无论哪种方式,一旦你弄明白了,我认为你应该发送一个文档拉取请求或提交一个问题,至少因为这可能不会这么复杂。

试试这个

roles: <randomElements(['ROLE_ADMIN', 'ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO'], 2)>
角色:
randoments
args:
1-数组“从中获取元素的数组。默认为a-f”。
2-整数“要获取的元素数”。
3-布尔值“允许多次拾取元素。默认值为false”。


它将返回数组。

第一种方法因以下错误而失败:
加载文件。/src/Tanane/CommonBundle/DataFixtures/TananeSet.php'…php致命错误:在/var/www/html/Tanane/vendor/nelmio/alice/src/nelmio/alice/Loader/Base.php第358行
中找不到Class'array',第二种方法,我应该在那里编写php code?我在阅读,但不清楚我该怎么写我自己的赝品。啊,我正在使用Alice集合加载修复程序这不是我需要的,也许我在这里误解了什么。我想要的是分配任何角色,但一直以来我的意思是,例如,对于User1,可以是
角色配置文件\u ONE
,对于User2,可以是ld可以是
ROLE\u PROFILE\u TWO
和User3可以是
ROLE\u PROFILE\u ONE
等等,也许可以在一个最小值和任意最大值之间混合使用,这样它就可以为每个用户随机分配一个或多个角色,你会怎么做呢?嗨@frumious你能看看我在主要帖子中制作的版本吗?这非常困难,不是吗方法1:你能不能把@Group*放在方括号里,
组:[@Group*]
?方法2:如果你的服务被正确注入,并且方法实际上被调用了(方法,按照定义,显然返回一个数组!)。我会在YAML中在线尝试它(
角色:
等等),也可以使用[](
角色:[]
)。如果这样做有效,而服务不起作用,我会调试/log/
die()
,尝试在
services:
    your.faker.provider:
        class: YourProviderClass
        tags:
            -  { name: h4cc_alice_fixtures.provider }
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*
roles: <randomElements(['ROLE_ADMIN', 'ROLE_USER', 'ROLE_PROFILE_ONE', 'ROLE_PROFILE_TWO'], 2)>