Я пытаюсь понять, как вручную вводить аргументы в DefaultController (без автоматического подключения).
И я нашел два способа добиться этого.
Могу использовать arguments:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\Service\SomeService: ~
App\Controller\DefaultController:
arguments: #!
$service: '@App\Service\SomeService'
$scalar: 22
И вместе с этим я могу использовать ключ bind:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\Service\SomeService: ~
App\Controller\DefaultController:
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
Мой контроллер:
class DefaultController extends Controller
{
public function __construct($service, $scalar)
{
var_dump(get_class($service), $scalar);
}
...
Оба варианта дают одинаковый результат:
string(23) "App\Service\SomeService" int(22)
Так в чем же разница между этими двумя конфигурационными ключами arguments и bind, делают ли они одно и то же?






bind обычно используется в разделе _defaults для замены любого совпадающего имени аргумента в службах, определенных этим файлом.
Итак, взяв имена переменных из второго примера и поместив их в более обычную строфу _defaults:
_defaults:
# autowire / autoconfig, etc
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
Любые службы с такими именами переменных будут заменены (если не переопределены локально) на службу или скалярное значение (22).
Согласно примечанию в вашей ссылке привязки, связанные переменные будут переданы в любое из ваших действий, а также в конструктор. Поэтому я думаю, что использование привязки для данной службы является особым случаем, поскольку только контроллеры поддерживают внедрение действий. Я не привязывал его, но я также предполагаю, что привязка для конкретной службы позволит переопределить привязку _default. Гарри Поттер был бы так горд.
bind используется для более глобального подхода, как объяснил Алистер Булман. Но при использовании в определении класса bind и arguments более или менее одинаковы.
Единственное различие, которое я вижу, заключается в том, что arguments более гибкий и принимает массив:
App\Controller\DefaultController:
arguments:
- '@App\Service\SomeService'
- 22
arguments также имеет приоритет над bind.
Думаю, документация противоречива, потому что bind относительно новый.
еще кое-что, что нужно добавить - привязка предназначена для «привязки аргументов по имени или типу» и также может использоваться при загрузке нескольких служб одновременно - https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type.
edit: вы также можете использовать аргументы в определении нескольких служб, но он «принудительно вводит» эти аргументы во все созданные службы, т.е. все аргументы должны приниматься во всех сервисах, в то время как bind вводит по запросу.
FileLoaderLoadException: ключ конфигурации «arguments» не может использоваться для определения значения по умолчанию. Допустимые ключи: public, tags, autowire, autoconfigure, bind.
возможно, они изменили поведение в последней версии. если вам нужно определить аргументы в определении универсального сервиса, используйте bind.
Я тоже думал об этом, но не уверен. Читая документацию, иногда нахожу примеры с
bind(здесь его нет в разделе_defaults), а иногда и сarguments. Я считаю это непоследовательным. Еслиargumentsнельзя использовать в_defaults, аbindможно использовать везде, зачем тогда нам вообще нуженarguments