PHP/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' =>

我想了解为什么此函数在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' => $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
    ];
});