PHP/Laravel:为什么要调用这个函数?
我想了解为什么此函数在laravel中被调用两次,我定义了此工厂:PHP/Laravel:为什么要调用这个函数?,php,laravel,function,callback,Php,Laravel,Function,Callback,我想了解为什么此函数在laravel中被调用两次,我定义了此工厂: <?php use Faker\Generator as Faker; function my_callback (Faker $faker) { // <= LINE 5 return [ // some key-value pairs, don't focus on that 'id_ubicacion' => 1, 'nombre' =>
<?php
use Faker\Generator as Faker;
function my_callback (Faker $faker) { // <= LINE 5
return [
// some key-value pairs, don't focus on that
'id_ubicacion' => 1,
'nombre' => $faker->name,
'clase' => 'CONTROL ADMINISTRATIVO',
'codigo' => $faker->ean13,
// some other key-value pairs
];
} // <= LINE 29
$factory->define(App\Bien::class, 'my_callback');
如果您能解释一下,谢谢您:为什么函数
my_callback()
被多次调用?首先,我们必须了解测试运行程序是如何工作的
即使每个测试都是以随机顺序运行的,但事实并非如此。此外,您必须了解setUp
和tearDown
在每次测试前后都是运行的
在Laravel中的设置
方法中,如果应用程序未运行,它将刷新应用程序:
if (! $this->app) {
$this->refreshApplication();
}
所以我们可能会想,嘿,我们正在保持应用程序的一个实例运行,所以我们不应该再次要求ModelFactory
,对吗
错误
在每次测试后调用的tearDown
方法中,它实际上会在方法结束之前销毁应用程序:
if ($this->app) {
foreach ($this->beforeApplicationDestroyedCallbacks as $callback) {
call_user_func($callback);
}
$this->app->flush();
$this->app = null;
}
这意味着每次运行测试时都会包含您的ModelFactory
文件。但这发生在同一个PHP进程中。这就是为什么会出现已定义的函数错误
要证明这一点很简单,只需将其写入ModelFactory
文件:
global $a;
if (is_null($a)) {
$a = 0;
}
else {
$a++;
}
var_dump($a);
您将看到,$a
在每次运行测试时递增
要解决您的问题,您只需像这样使用:
$factory->define(App\Bien::class, function (Faker $faker) {
return [
// some key-value pairs, don't focus on that
'id_ubicacion' => 1,
'nombre' => $faker->name,
'clase' => 'CONTROL ADMINISTRATIVO',
'codigo' => $faker->ean13,
// some other key-value pairs
];
});
我不应该在工厂文件中声明任何函数,是吗?不,你不应该!
global $a;
if (is_null($a)) {
$a = 0;
}
else {
$a++;
}
var_dump($a);
$factory->define(App\Bien::class, function (Faker $faker) {
return [
// some key-value pairs, don't focus on that
'id_ubicacion' => 1,
'nombre' => $faker->name,
'clase' => 'CONTROL ADMINISTRATIVO',
'codigo' => $faker->ean13,
// some other key-value pairs
];
});