2014-02-14 6 views
1

Laravel способен автоматически вводить зависимости в конструкциях контроллера и т.д. Например: конструкторLaravel разрешения зависимостей для закрытия

class Test { 
    public function __construct(Request $request) {} 
} 

App::make('Test'); 

контроллера получит соответствующий запрос фасад.

Есть ли способ сделать это с закрытием?

Например:

$closure = function(Request $input) {}; 
App::make($closure); // resolving the closure dependencies 

ответ

3

Нет, это невозможно, вы можете прочитать через контейнер кода IoC здесь:

laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php на линии 466

Как вы видите, он пытается решить и parse parents Класс __constructor метод с помощью отражений.

Я думаю, что было бы интересно реализовать, так как это вполне возможно, расширив класс Container, чтобы также поддерживать затворы.

Я сделал несколько тестов, чтобы убедиться, что это возможно, так вот они:

class t4 { 
     public $x = "inject me"; 
    } 

    interface t5 {} 

    $t3 = function(t4 $test) { 
     return print($test); 
    }; 
    $r = new ReflectionFunction($t3); 
    $params = $r->getParameters(); 
    $injection = $params[0]->getClass(); 
    if (!$injection->isInstantiable()) { 
     throw new Exception('Provided type hint is not instantiable'); 
    } 
    $typehinted = $injection->newInstance(); 
    print($typehinted->x); // prints "inject me" 

Тип намекая t5 будет бросать исключение.

Это отвечает на вопрос

Есть ли способ сделать это с закрытием?

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

+0

Большое спасибо за такой подробный ответ! Я надеялся, что так или иначе. Я собираюсь реализовать его сам, так, как вы его показали. Мой вариант использования: мне нравятся замыкания, и они хорошо используются в PHP, в определенных сценариях. Использование автоматизированной инъекции зависимостей было бы неплохо. –

+0

Отлично, вам понравилось, можете ли вы предоставить варианты использования в Laravel? Мне просто интересно :) –

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