2015-11-23 4 views
0

Я хочу поставить этот вопрос для меня. Чтобы лучше понять PHP и Laravel.Что означает этот код ...?

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

Это на самом деле метод со статической функцией внутри него? И внутри этой статической функции другой ...? Я должен сказать, что я новичок с Frameworks.

Это мой первый раз, когда вы играете с одним.

+0

'up()' запускает «новую схему», где я предполагаю, что схема является либо компонентом, либо моделью в Laraval (никогда не использовала ее). Функция внутри этого вызова - это [функция обратного вызова] (http://php.net/manual/en/language.types.callable.php) - используется для указания 'Schema :: create' того, что она должна делать с результатами его обработки. –

+0

Также обратите внимание, что 'create' является [статическим методом] (http://php.net/manual/en/language.oop5.static.php) класса' Schema'. –

ответ

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. Это один из фасадов Ларавеля. В этом каталоге есть тонна фасадов Ларавеля. Во всяком случае, в верхней части этого класса, вы также увидите небольшой удобный комментарий, который говорит:

@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 и т. Д.

+0

Большое спасибо за объяснение. Мне было интересно, как работать. Потому что мне всегда немного любопытно, как работает персонал. Вы рассмотрели мой вопрос на 100%. –

1

Это создает таблицу tasks с id как auto increment колонками, name в varchar колонки и created_at и updated_at как timestamp колонны.

Подробнее here.