如果您的困惑更多是关于代码如何工作而不是它的作用,那么它实际上是一个非常复杂的主题。首先,它不是真正的静态方法。
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
该表有一个名为等的自动递增列。