2

我正在使用PhoneNumberBundle来验证我的应用程序中的电话号码。我还将NelmioAliceBundleAliceFixtureBundle一起使用。以此为起点,我正在为具有PhoneNumberBundle用于验证电话号码的断言的实体编写固定装置。这是该文件的一个片段:

/**
 * @AssertPhoneNumber(defaultRegion="VE")
 * @ORM\Column(name="phone", type="phone_number", length=11)
 */
protected $phone;

我不知道如何在夹具本身上使用外部库,所以我看到的唯一解决方案是编写自己的 faker 并返回格式正确的电话号码并传回夹具。然后我这样做了:

TananeFakerProvider.php

class TananeFakerProvider {

    public function formatPhoneNumber($fakePhoneNumber)
    {
        return $this->container->get('libphonenumber.phone_number_util')->parse($fakePhoneNumber);
    }

}

服务.yml

services:
    tanane.faker.provider:
        class: CommonBundle\Tools\TananeFakerProvider
        arguments: ["@service_container"]
        tags:
            -  { name: h4cc_alice_fixtures.provider }

最后是 Orders.yml(夹具):

FrontendBundle\Entity\Orders:
    Orders{1..50}:
        nickname: <text(15)>
        # trying to pass the fake number back to the custom faker
        phone: <formatPhoneNumber(phoneNumber())>
        email: <companyEmail()>
        fiscal_address: <address()>
        shipping_address: <address()>
        shipping_from: <randomElement(array('MRW','DOMESA', 'ZOOM'))>
        payment_type: @PaymentType*
        order_amount: <randomFloat(2)>
        bank: @Bank*
        transaction: <randomNumber()>
        comments: <sentence(15)>
        secure: <boolean(35)>
        person: <randomElement(array(@Natural*, @Legal*))> 
        status: @OrderStatus*

但我得到了这个错误:

[Symfony\Component\Debug\Exception\ContextErrorException] 注意:使用未定义的常量 phoneNumber - 在 /var/www/html/vendor/nelmio/alice/src/Nelmio/Alice/Loader/Base.php(630) 中假定为“phoneNumber” ) : eval()'d 代码行 1

所以我以错误的方式传递价值,有人可以帮我吗?或者也许给我另一个关于如何实现这一目标的想法?

4

2 回答 2

4

(在github上落户,但为了后代这里是一个副本)

您可以在 Alice 1.x 中使用以下内容:

FrontendBundle\Entity\Orders:
    Orders{1..50}:
        nickname: <text(15)>
        # trying to pass the fake number back to the custom faker
        phone: <formatPhoneNumber($this->fake('phoneNumber'))>

这在 2.x 行中:

FrontendBundle\Entity\Orders:
    Orders{1..50}:
        nickname: <text(15)>
        # trying to pass the fake number back to the custom faker
        phone: <formatPhoneNumber($fake('phoneNumber'))>
于 2014-09-29T20:26:41.107 回答
3

作为替代方案,您可以在实例化 Nelmio/Alice/Fixtures/Loader 类时将 Faker Provider 对象作为第二个参数传递。

1.- 创建提供者类

class MyCustomFakeProvider
{
    public function tell_me_something()
    {
        return 'something';
    }
}

2.-

use Nelmio\Alice\Fixtures\Loader;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;

class ExampleDataLoader extends AbstractFixture implements OrderedFixtureInterface
{
    public function loadMyDataFixtures() {       

        $myCustomFakeProvider = new MyCustomFakeProvider();
        $loader = new Loader('es_ES', $myCustomFakeProvider);
        $objects = $loader->load(__DIR__ . '/example.yml');

        $persister = new \Nelmio\Alice\Persister\Doctrine($manager);
        $persister->persist($objects);

3.- 最后创建一个 example.yml 文件(在本例中与 Loader 类处于同一级别),其中包含一些数据和对 tell_me_something() 的自定义调用

AppBundle\Entity\Example:
    examples_1{1..101}:
    title: <tell_me_something()> # MY CUSTOM METHOD
    description: <sentence()>
于 2017-01-13T13:56:42.433 回答