Laravel 4 – Класс контейнера: функция распределения и закрытия

У меня есть следующий вопрос к обсуждаемому здесь: путаница основного метода Laravel

Я в той же ситуации, что и driechel (автор вопроса выше), был до этого, в настоящее время привык к Laravel 4 FW и изучает ядро. Хотя дается точный ответ, я до сих пор не понимаю логики и того, что происходит под капотом. Поэтому я буду очень признателен за дальнейшее объяснение. Я знаю, что это может быть дубликат, но поскольку я не могу оставлять комментарии, я дам ему шанс с новым вопросом. Надеюсь, это так.

Я рассматривал это под другим углом, начиная с этой статьи: http://blog.joynag.net/2013/05/facades-in-laravel-4-and-static-methods-resolution/

При рассмотрении вызова File:get() я, наконец, заканчиваю функцию share share класса Container, которая вызывается с этим фактическим общим ресурсом параметра share(function() { return new Filesystem; } .

То, что я просто не могу понять, это использование $container . Особенно при втором появлении в закрытии:

$object = $closure($container);

Не могли бы вы прояснить это еще раз? Почему $container передается как параметр здесь и что на самом деле содержится в нем? Насколько я понимаю, $closure в этой точке выполняется и выполняет function() { return new Filesystem; } function() { return new Filesystem; } который не имеет входного параметра.

Я потерян. Изучил это и анонимные функции PHP / закрытия сейчас в течение двух дней подряд и до сих пор не может понять это. Я не понимаю синтаксиса $closure($container) здесь и логики.

Solutions Collecting From Web of "Laravel 4 – Класс контейнера: функция распределения и закрытия"

Для справки это метод share @ v4.0.5 .

Итак, что здесь происходит. Я объясню это несколькими шагами.

Вызов метода Share

Как вы указали, этот метод вызывается у поставщиков услуг. Таким образом, FilesystemServiceProvider вызывает этот метод, который выглядит примерно так:

 $this->app['files'] = $this->app->share(function() { return new Filesystem; }); 

Он присваивает возвращаемое значение этого метода share доступа привязке в контейнере. Вкратце, это возвращаемое значение будет новым экземпляром Filesystem который возвращается в закрытии.

Итак, что делает доля?

Метод share – это еще один способ определения singleton в контейнере IoC. Все это может быть немного пугающим вначале. В принципе, Laravel сам является контейнером IoC. Все классы связаны как экземпляры контейнера. Иногда эти экземпляры должны быть одинаковыми для каждого вызова.

Если вы посмотрите на метод ссылок выше на GitHub, вы заметите, что внутри закрытия задана статическая переменная. Затем он проверяет, является ли эта переменная нулевой, и если она разрешает закрытие (это замыкание, которое возвращает наш новый экземпляр Filesystem ). Затем он просто возвращает переменную.

Теперь, в следующий раз, когда вы используете File::get() ему не нужно снова создавать экземпляр класса Filesystem , потому что он уже создан и хранится в переменной static $object . Поэтому он просто возвращает вам тот же объект.

Так! Действительно, вы могли бы заменить строку $this->app['files'] этим, и она все равно будет работать.

 $this->app->instance('files', new Filesystem); 

99% сервисов фактически используют метод share хотя, поскольку работа внутри закрытия позволяет создавать объекты с более сложными зависимостями.

Надеюсь это поможет.