2013-11-24 7 views
4

Я смотрю видео, объясняющее основы контейнера IoC laravel, и мне сложно понять, что делает этот код. В частности, я не понимаю параметр в функции конструктора класса UserRepository. Мне не повезло найти пример этого синтаксиса на сайте php.Laravel 4 Inversion of Control

http://vimeo.com/53009943

<?php 

class UserRepository { 

    protected $something; 

    public function __construct(Something $something) 

    { 

     $this->something = $something; 

    } 
} 

class Something {} 

?> 

ответ

8

Цитирование Laravel's documentation:

Есть два способа контейнера IoC разрешения зависимостей: через Закрытие обратного вызова или автоматического разрешения.

Но во-первых, что такое зависимость? В коде, который вы опубликовали, класс UserRepository имеет одну зависимость, которая является классом Something. Это означает, что UserRepository будет зависеть от Something где-то в его коде. Вместо того, чтобы использовать его непосредственно, делая что-то вроде этого

$something = new Something; 
$something->doSomethingElse(); 

это впрыскивается в функции конструктора. Этот метод известен как dependency injection. Таким образом, эти фрагменты кода будут делать то же самое, без и с помощью инъекции зависимостей.

// Without DI 
class UserRepository { 

    public function doSomething() 
    { 
     $something = new Something(); 
     return $something->doSomethingElse(); 
    } 


} 

Теперь, используя DI, которая была бы такой же, как вы писали:

// With DI 
class UserRepository { 

    public function __construct(Something $something) 
    { 
     $this->something = $something; 
    } 

    public function doSomething() 
    { 
     return $this->something->doSomethingElse(); 
    } 

} 

Вы говорите, что вы не понимаете, параметр передается в конструктор __constructor(Something $something). Эта строка говорит PHP, что конструктор ожидает один параметр, $something, который должен быть экземпляром класса Something. Это называется type hinting. Передача параметра, который не является экземпляром Something (или любого подкласса), выдает исключение.


Наконец, вернемся к контейнеру IoC. Ранее мы говорили, что его функция заключается в разрешении зависимостей, и он может сделать это двумя способами.

Первый, Затворы обратные вызовы:

// This is telling Laravel that whenever we do 
// App::make('user.repository'), it must return whatever 
// we are returning in this function 
App::bind('UserRepository', function($app) 
{ 
    return new UserRepository(new Something); 
}); 

Второй, автоматическое разрешение

class UserRepository { 

    protected $something; 


    public function __construct(Something $something) 

    { 

     $this->something = $something; 

    } 
} 

// Now when we do this 
// Laravel will be smart enough to create the constructor 
// parameter for you, in this case, a new Something instance 
$userRepo = App::make('UserRepository'); 

Это особенно полезно и позволяет вашим классам быть более гибкими, при использовании интерфейсов в качестве параметров для ваших конструкторов ,

+0

Отличное объяснение! Я читал об этом некоторое время, пытаясь понять, как это работает. Теперь это имеет смысл ... Я все еще новичок в PHP-фреймворках, laravel - это мой первый! –

+1

Не волнуйтесь, если все эти понятия звучат странно прямо сейчас. Они станут понятнее, когда вы получите больше опыта. Мы все там;) –

+0

+1 для хороших объяснений. :) – itachi

Смежные вопросы