我正在使用这个库,我遇到了一个我未能解决的问题。
我喜欢一些限制大小的字段,例如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));
}
我认为有一个最好的方法。
答案 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。