Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
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);
...
Не в сети
Что это за связывание? Зачем нужно это делать? Как оно используется?
Контейнер (IoC container) используется для внедрения зависимостей (DI). Ты можешь привязать класс к интерфейсу, что, в том числе, полезно при тестировании. Также ты можешь зарегистрировать синглтон и создать сложную инициализацию класса.
Если хочешь поближе познакомиться с контейнером, почитай соответствующие главы в книгах Тэйлора Отвелла и Джеффри Уэя.
Не в сети
@igor7 , если коротко ответить на вопрос "зачем нужно так делать", то — да незачем, брат. Не нужно, а можно.
Придётся начать издалека.
Постепенно ты сам придёшь к пониманию, что жесткие зависимости это зло и управление зависимостями лучше выносить из твоих классов вовне. "Биндинг" это один из способов создать описание как будет создаваться объект нужного типа. Частный случай, применимый к конкретной реализации контейнера 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.
Не в сети
Статьи прочитал, в целом понимание сложилось о контейнерах, но буду ещё читать.
А вот что такое за синтаксис $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
Не в сети
Мне тут подсказали. https://php.ru/manual/class.arrayaccess.html Понял что за магические методы.
Не в сети