0

我想为我提出这个问题。为了更好地理解PHPLaravel

public function up()
{
    Schema::create('tasks', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->timestamps();
    });
}

这实际上是一个带有静态函数的方法吗?在这个静态函数内部还有另一个......?我不得不说我是Frameworks的初学者。

这是我第一次和一个人一起玩。

4

2 回答 2

4

如果您的困惑更多是关于代码如何工作而不是它的作用,那么它实际上是一个非常复杂的主题。首先,它不是真正的静态方法。

Laravel 使用了一种叫做Facades的东西,它允许你“静态地”调用方法,这可能会让刚接触框架的人感到困惑。简而言之,门面非常方便,因为当您使用 Laravel 的门面调用方法时,它会为您“屏蔽”大量实例对象,然后调用该方法。

让我们以Schema这个例子为例。Schema这堂课在哪里?如果您查看config/app.php文件内部,您会在别名下看到这行代码:

'Schema'    => Illuminate\Support\Facades\Schema::class,

Schema因此是 的别名Illuminate\Support\Facades\Schema

所以,如果你看一看Illuminate\Support\Facades\Schema,你就会发现它extends Facade。这是 Laravel 的门面之一。这个目录有很多 Laravel 的门面。无论如何,在这个类的顶部,你还会看到一个方便的注释,上面写着:

@see \Illuminate\Database\Schema\Builder

打开那个文件,这就是你的Schema班级。在幕后,Laravel 为你实例化了这个对象。为什么会有这么大的问题?看一下构造函数。此类的依赖项之一是Illuminate\Database\Connection. 打开那个类,它有更多的依赖关系。外观不必一直手动实例化所有这些类,而是为您完成工作。因此,当您这样做时Schema::create(...,Laravel 会实例化所有这些依赖项并调用类create中的方法Illuminate\Database\Schema\Builder。非常棒,对吧?如果您查看该文件,您将看到该方法:

/**
 * Create a new table on the schema.
 *
 * @param  string    $table
 * @param  \Closure  $callback
 * @return \Illuminate\Database\Schema\Blueprint
 */
public function create($table, Closure $callback)
{
    $blueprint = $this->createBlueprint($table);

    $blueprint->create();

    $callback($blueprint);

    $this->build($blueprint);
}

您可以看到它不是静态方法。Laravel 在幕后创建一个新实例,然后调用该方法。

第一个参数接受一个字符串,这将是您正在创建的表的名称。然后它接受一个闭包。在这种情况下,正如@Kostas Mitsarakis 所说,您正在创建一个名为tasks. id该表有一个名为等的自动递增列。

于 2015-11-23T19:59:32.380 回答
1

它创建了一个tasks带有idas auto incrementcolumn和 nameas column的表。varcharcreated_atupdated_attimestamp

更多信息在这里

于 2015-11-23T19:21:44.013 回答