как работает магия Symfony

102
25 декабря 2021, 16:20

В официальной документации Symfony, есть такие примеры как

use Symfony\Component\HttpFoundation\Session\SessionInterface;
public function index(SessionInterface $session)
{
    // stores an attribute for reuse during a later user request
    $session->set('foo', 'bar');
    // gets the attribute set by another controller in another request
    $foobar = $session->get('foobar');
    // uses a default value if the attribute doesn't exist
    $filters = $session->get('filters', []);
}

Я хочу узнать как это работает, что если передать как аргумент функции Interface, то при ее вызове функции получит его автоматически. Хочу применить это в проекте который изначально, к сожалению, был написан без фреймворка.

Answer 1

Не так давно я сам задавал такой вопрос. В PHP есть такое понятие как Рефлексия, вот цитата из Википедии.

В информатике отражение или рефлексия (холоним интроспекции, англ. reflection) означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения. — Wikipedia.

Говоря на простом языке, программа анализирует сама себя и перед тем как вызвать метод контроллера она смотрит на входные параметры и если находит пытается зарезолвить. Откуда она их берет? Из контейнера свойств.

Все это можно написать самому но нужны хорошие знания ООП и шаблонов проектирования.

Такой подход реализован у многих фреймворках включая Symfony и Laravel

Вот вам некоторые ссылки по которым я делал нечто похожее:

Официальна документация раздела Reflection на сайте php.net

Статья на Хабре Введение в PHP Reflection API

Статья Что такое внедрение зависимостей в PHP

Это довольно обширный вопрос и вместить все в один ответ просто не получится, он тянет как минимум на целую статью с ссылками на источники для дальнейшего изучения. А это я так просто пальцем указал в каком направлении двигаться.

Answer 2

Эту магию делает Service Container и в частности autowiring. Ежели раньше нужно было зависимости брать непосредственно из контейнера, в случае с Контроллером либо описвать в services если вы описываете зависимости для сервиса, то начиная с версии 3.4 ServiceContainer умеет делать эту самую магию. Никто лучше официальной документации наврядли вам объяснит, а посмотреть это можно например тут да и вообще стоит прочитать всю эту страницу.

READ ALSO
Какие есть программы на Ubuntu для создания gif через терминал?

Какие есть программы на Ubuntu для создания gif через терминал?

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

189
Php как отправить CORS запрос?

Php как отправить CORS запрос?

PHP может отправлять запросы на подобие этого:

197
Есть input куда пользователь может ввести число больше нуля

Есть input куда пользователь может ввести число больше нуля

Есть input куда пользователь может ввести число больше нуляПо нажатию кнопки должна запускаться функция, которая выводит числа от введенного...

101