Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 03.12.2017 14:17:51

Объясните, пожалуйста, https://laravel.com/docs/5.5/container#binding

https://laravel.com/docs/5.5/container#binding -- что это такое?
Гуглил binding php, там все ссылки на Late static binding. Тут что-то другое.

Что это за связывание? Зачем нужно это делать? Как оно используется?

$this->app->bind('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

$this->app->singleton('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

$api = new HelpSpot\API(new HttpClient);
$this->app->instance('HelpSpot\API', $api);

$this->app->when('App\Http\Controllers\UserController')
          ->needs('$variableName')
          ->give($value);

...

Не в сети

#2 03.12.2017 14:29:09

Re: Объясните, пожалуйста, https://laravel.com/docs/5.5/container#binding

Что это за связывание? Зачем нужно это делать? Как оно используется?

Контейнер (IoC container) используется для внедрения зависимостей (DI). Ты можешь привязать класс к интерфейсу, что, в том числе, полезно при тестировании. Также ты можешь зарегистрировать синглтон и создать сложную инициализацию класса.

Если хочешь поближе познакомиться с контейнером, почитай соответствующие главы в книгах Тэйлора Отвелла и Джеффри Уэя.

Не в сети

#3 03.12.2017 16:57:47

Re: Объясните, пожалуйста, https://laravel.com/docs/5.5/container#binding

@igor7 , если коротко ответить на вопрос "зачем нужно так делать", то — да незачем, брат. smile Не нужно, а можно.

Придётся начать издалека.

Постепенно ты сам придёшь к пониманию, что жесткие зависимости это зло и управление зависимостями лучше выносить из твоих классов вовне. "Биндинг" это один из способов создать описание как будет создаваться объект нужного типа. Частный случай, применимый к конкретной реализации контейнера DI. 

«Контейнер Внедрения Зависимостей - это объект, который знает, как создавать и настраивать объекты. И чтобы иметь возможность выполнять свою работу, он должен знать о аргументах конструктора и отношениях между объектами.»
Fabien Potencier. Do you need a Dependency Injection Container?

( Советую прочитать все шесть частей упомянутой стати, чтобы понимать что такое вообще внедрение зависимостей и зачем нужны контейнеры. Фабьен автор фреймворка Symfony, на плечах которого стоит Laravel. Тейлор признавался, что он фанат Фабьена. )

Так вот, биндинг (связывание, привязка) это процесс настройки контейнера. Ты указываешь, что когда где-то в твоём коде понадобится объект указанного класса (или интерфейса), то нужный объект надо создавать вот таким способом. В будущем ты можешь заменить класс на другой, с тем же интерфейсом и/или давать ему другие аргументы при создании. Сегодня ты шлёшь почту через системный вызов mail(), а завтра через сервис SendGrid, ну или что-то в этом роде. И при этом тебе не придётся менять ничего в коде, который компонент-почтовик будет использовать!

Изменено artoodetoo (03.12.2017 17:01:58)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 06.12.2017 01:12:11

Re: Объясните, пожалуйста, https://laravel.com/docs/5.5/container#binding

Статьи прочитал, в целом понимание сложилось о контейнерах, но буду ещё читать.

А вот что такое за синтаксис $this['mailer.class'];? http://fabien.potencier.org/introductio … ainer.html
Как устанавливается значение $this['mailer.class']?
У меня на $this['mailer.class']=1; Fatal error: Uncaught Error: Cannot use object of type A as array

Не в сети

#5 06.12.2017 01:17:52

Re: Объясните, пожалуйста, https://laravel.com/docs/5.5/container#binding

Мне тут подсказали. https://php.ru/manual/class.arrayaccess.html Понял что за магические методы.

Не в сети

Подвал раздела