我正在使用这个库,遇到了一个无法解决的问题。
我喜欢一些有限制大小的字段,例如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来获得你想要的东西,只需编写你自己的提供者即可。