它可能会限制fzaninotto Faker上的一些字符串格式化程序

时间:2016-05-12 11:15:43

标签: php laravel-5 faker

我正在使用这个库,我遇到了一个我未能解决的问题。

我喜欢一些限制大小的字段,例如userName(Faker \ Provider \ Internet)。我认为,对于这个领域,使用带有255的字符串并且限制为15,这不是一个好主意。

在为我的桌子生成种子的一些崩溃后,我读了代码。

protected static $userNameFormats = array(
        '{{lastName}}.{{firstName}}',
        '{{firstName}}.{{lastName}}',
        '{{firstName}}##',
        '?{{lastName}}',
    );
public function userName()
    {
        $format = static::randomElement(static::$userNameFormats);
        $username = static::bothify($this->generator->parse($format));

        return strtolower(static::transliterate($username));
    }

为了与我的程序一起使用,我认为创建一个fork。在这个fork修改代码

protected static $userNickFormats = array(
       '{{firstName}}',
       '{{firstName}}#',
       '{{firstName}}##',
       '{{firstName}}###',
       '?{{lastName}}##',
    );


public function userNick($limit = 15)
    {
        $format = static::randomElement(static::$userNickFormats);
        $username = static::bothify($this->generator->parse($format));
        while (strlen($username) > $limit) {
            $username = static::bothify($this->generator->parse($format));
        }

        return strtolower(static::transliterate($username));
    }

我认为有一个最好的方法。

1 个答案:

答案 0 :(得分:2)

我不确定Faker的分叉是最简单的方法。

考虑创建自己的Provider类并将其添加到faker。 请参阅the documentation

在你的情况下,它可能看起来像这样(从文档公然复制的代码):

userNickProvider.php

<?php

class UserNick extends \Faker\Provider\Base
{
    protected static $userNickFormats = array(
       '{{firstName}}',
       '{{firstName}}#',
       '{{firstName}}##',
       '{{firstName}}###',
       '?{{lastName}}##',
    );


    public function userNick()
    {
        $format = static::randomElement(static::$userNickFormats);
        $username = static::bothify($this->generator->parse($format));

        return strtolower(static::transliterate($username));
    }    
}

至于你需要的限制,有一个名为valid()的修饰符可以用于任何faker方法。您只需提供一个返回bool的函数,决定生成的值是否为有效值,否则生成另一个等等。因此,您无需在提供程序功能中执行此操作。

首先验证者:

$max15 = function($string) {
    return mb_strlen($string) <= 15;
};

然后你可以像这样使用它:

$faker = new Faker\Generator();
$faker->addProvider(new UserNick($faker));

$name = $faker->valid($max15)->userNick;

总结:
你不必分叉Faker来获得你想要的东西,只需编写你自己的Provider。