2015-12-29 1 views
3

Я stucked довольно час сейчас, когда я пытаюсь выяснить, где же Laravel 5,2 получить ссылки() метод код показан нижеГде Laravel получил метод reference()?

Schema::create('articles', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->unsignedInteger('user_id'); 
     $table->string('title'); 
     $table->text('body'); 
     $table->text('excerpt')->nullable(); 
     $table->timestamps(); 
     $table->timestamp('published_at'); 

     $table->foreign('user_id')->references('id')->on('users'); 
}); 

Я не могу найти ссылки () в \ Illuminate \ Database \ Schema \ Blueprint или Illuminate \ Support \ Fluent.

Может ли кто-нибудь указать мне, где метод reference() в приведенном выше коде может быть найден?

любая помощь и советы бы здорово

ответ

5

Похоже обрабатывается Fluent с помощью магического метода __call.

Laravel API - Fluent @__call

Любой вызов метода, который не существует (или недоступен) получит передается __call, который будет установлен атрибут, названный методом, к значению, которое прошло.

Пример

$f = new \Illuminate\Support\Fluent; 
$f->something('value')->willBeTrue(); 

dump($f); 
// 
Illuminate\Support\Fluent { 
    #attributes: array:2 [ 
    "something" => "value" 
    "willBeTrue" => true 
    ] 
} 
+1

похоже, что вы правы, хотя это кажется сложным. – Reyn

+0

Это просто дает вам способ назначить настраиваемые атрибуты «свободно», а не устанавливать их непосредственно в объекте или передавать массив на что-то. – lagbox

+0

кто будет называть метод __call? экземпляр контейнера? – Reyn

1

Я нашел то же самое, как lagbox, когда я взломал открыть класс Blueprint и увидел, что с помощью Fluent, который реализует ряд контрактов, среди которых Arrayable и Jsonable, да и вообще любой не существующий метод будет получать передается методу __call и это создаст новый элемент в массиве атрибутов с ключом в качестве имени метода:

$this->attributes[$method] = count($parameters) > 0 ? $parameters[0] : true; 

Но я бы еще продлить этот вопрос: где же он на самом деле сделать использование этой собственности при создании ограничение внешнего ключа в записи базы данных? Я знаю, что это не будет очень полезно пройти настолько глубоко, но мне было очень любопытно, как работает строитель Schema, кроме того, чтобы поймать эти методы.

Другим хорошим упоминанием будут триггеры, такие как onDelete ('cascade'), которые обычно используются в таких ситуациях.