gpt4 book ai didi

php - 在 Nelmio Alice fixture 生成器中将参数设置为数组

转载 作者:可可西里 更新时间:2023-11-01 12:53:19 24 4
gpt4 key购买 nike

我想问是否可以将数组作为某些元素的值传递?例如,在我的例子中,我正在尝试为 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: Argument 1 passed to FOS\UserBundle\Model\User::setRoles() must be of the type array, string given, called in /var/www/html/vendor/nelmio/alice/src/Nelmio/Alice/Loader/Base.php on line 483 and defined in /var/www/html/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Model/User.php line 530

对此有什么建议吗?

更新答案

在 YAML 文件中使用第一种方法和普通数组:

按照@frumious 的建议进行一些更改后, fixture 现在具有以下内容:

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: Argument 1 passed to Doctrine\Common\Collections\ArrayCollection::__construct() must be of the type array, object given, called in /var/www/html/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php o
n line 555 and defined in /var/www/html/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php line 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;

}

我该如何修复该错误?我应该将什么作为参数传递给 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: Argument 1 passed to FOS\UserBundle\Model\User::setRoles() must be of the type array, string given, called in /var/www/html/vendor/nelmio/alice/src/Nelmio/Alice/Loader/Base.php on line 483 and defin ed in /var/www/html/vendor/friendsofsymfony/user-bundle/FOS/UserBundle/Model/User.php line 530

这让我觉得函数没有返回 array 或者其他什么东西出错了,关于这个有什么建议吗?

最佳答案

基本上只是基于快速查看文档的猜测,但我怀疑问题可能出在 roles: 35%? [ROLE_ADMIN, ROLE_USER, ROLE_PROFILE_ONE, ROLE_PROFILE_TWO] roles: 之后的位被解释为单个字符串,因为它不是以 [ 开头作为普通的 YAML 数组需要。

至于解决方案,我怀疑您不能直接在 YAML 中那样做。

一个(未证实)选项:使用 custom Faker method :

伪造者

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*

最终查询:您真的希望 Alice 在 35% 的时间内将所有这些角色分配给用户吗?如果不是,并且实际上您希望在每个用户中基于概率选择其中一个,那么我想您仍然需要一个自定义方法,但将选择逻辑放在那里而不是 YAML 中。

编辑

啊,听起来你希望每个测试实例都有随机的单一角色,在这种情况下你需要像这样的自定义代码:

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

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

根据 Alice看起来您可以像这样将其直接粘贴在 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 docs告诉你如何包含一个单独的提供者(如上所述)

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*

关于php - 在 Nelmio Alice fixture 生成器中将参数设置为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com