Symfony вручную подключает аргументы - 'arguments' против 'bind'

Я пытаюсь понять, как вручную вводить аргументы в 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, делают ли они одно и то же?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
1 383
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

bind обычно используется в разделе _defaults для замены любого совпадающего имени аргумента в службах, определенных этим файлом.

Итак, взяв имена переменных из второго примера и поместив их в более обычную строфу _defaults:

_defaults:
    # autowire / autoconfig, etc
    bind:                                         #!
        $service: '@App\Service\SomeService'
        $scalar: 22

Любые службы с такими именами переменных будут заменены (если не переопределены локально) на службу или скалярное значение (22).

Я тоже думал об этом, но не уверен. Читая документацию, иногда нахожу примеры с bind (здесь его нет в разделе _defaults), а иногда и с arguments. Я считаю это непоследовательным. Если arguments нельзя использовать в _defaults, а bind можно использовать везде, зачем тогда нам вообще нужен arguments

Alexey Chuhrov 17.04.2018 13:47

Согласно примечанию в вашей ссылке привязки, связанные переменные будут переданы в любое из ваших действий, а также в конструктор. Поэтому я думаю, что использование привязки для данной службы является особым случаем, поскольку только контроллеры поддерживают внедрение действий. Я не привязывал его, но я также предполагаю, что привязка для конкретной службы позволит переопределить привязку _default. Гарри Поттер был бы так горд.

Cerad 17.04.2018 14:32

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.

Maxim Mandrik 26.11.2019 09:49

возможно, они изменили поведение в последней версии. если вам нужно определить аргументы в определении универсального сервиса, используйте bind.

Smoky McPot 27.11.2019 14:00

Другие вопросы по теме