Причина, по которой «2» завершается ошибкой, а «3» - нет, заключается в том, что в варианте 2 вы пытаетесь получить доступ к контексту безопасности непосредственно из контейнера, когда он, вероятно, еще не заполнен.
Как я могу сказать, Symfony2 анализирует конфигурацию и создает службу один за другим, а затем переходит к обработке остальной части запроса.
Это означает, что вы не можете обязательно получить доступ к различным частям контейнера, поскольку он может загружать их в другом порядке.Таким образом, у вас есть указатель памяти на контейнер, и сохраните его, но затем дайте фреймворку завершить сборку полного контейнера, прежде чем пытаться получить доступ к его частям.Заметным исключением является случай, когда вы напрямую внедряете сервис в другой сервис, и в этот момент контейнер проверяет, что этот сервис загружен первым.
Вы можете увидеть эффект от этого, сделав две услуги.A и B. A передается B, а B передается A. Теперь у вас есть циклическая ссылка.Если вы вместо этого передали контейнер в A и B, вы не могли бы получить доступ к A из B и B из A без проблем.