Php 在Nelmio Alice夹具生成器中将参数设置为数组
我在问,是否可以将数组作为某些元素的值传递?例如,在我的例子中,我试图为一个FOSUserBundlePhp 在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_
用户
实体设置角色,该实体将角色
作为一个值数组,而不是普通值。我的固定装置中有:
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 on第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)>