它';s可能会将fzaninot上的一些字符串格式化程序限制为Faker


It's possible limit some string formatters on fzaninotto 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

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));
    }

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

我不确定Faker的分叉是实现这一点的最简单方法。

考虑创建您自己的Provider类并将其添加到faker中。请参阅文档。

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

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来获得你想要的东西,只需编写你自己的提供者即可。