Как работает автоматическая разводка Symfony за кулисами?

Речь идет не о инструкциях (достаточно документов), а о том, как все работает.

Система электромонтажа Symfony 4 позволяет нам автоматически вводить сервисы, просто печатая

use App\Util\Rot13Transformer;

class TwitterClient
{
public function __construct(Rot13Transformer $transformer)
{
$this->transformer = $transformer;
}
}

Чтобы глубже понять PHP, я осмотрел исходный код Symfony-bundle, но не смог найти место, где происходит «волшебство».

Как Symfony может запретить PHP протестовать против того, чтобы в конструктор было передано недостаточно аргументов (или любой функции, использующей автопроводку)?

0

Решение

Они используют Refection

Как Symfony может запретить PHP протестовать против того, чтобы в конструктор было передано недостаточно аргументов

Reflection позволяет проверить определение других «вещей» в PHP. Среди них классы, их методы и аргументы для этих методов.

<?php
class bar
{
//just a placeholder class
};

$bar = new bar(); //instance of bar

//class to inspect
class foo
{
public function __construct( bar $bar)
{
//do something fancy with $bar
}
}

//get the Reflection of the constructor from foo
$Method = new ReflectionMethod('foo', '__construct');

//get the parameters ( I call them arguments)
$Args = $Method->getParameters();

//get the first argument
$Arg = reset($Args);

//export the argument definition
$export = ReflectionParameter::export(
array(
$Arg->getDeclaringClass()->name,
$Arg->getDeclaringFunction()->name
),
$Arg->name,
true
);

//parse it for the typehint
$type = preg_replace('/.*?(\w+)\s+\$'.$Arg->name.'.*/', '\\1', $export);
echo "\nType: $type\n\n";

var_dump(is_a($bar, $type));

Выходы:

Type: bar

bool(true)

Вы можете видеть это Вот

Тогда вы просто используете is_a() или что посмотреть, если объект «ввода» имеет bar как один из его предков. И как вы можете видеть в этом упрощенном примере, если бы у нас был объект $ bar, мы бы знали, что он идеально подходит в качестве входных данных для нашего конструктора, потому что он возвращает true.

Должен отметить, что SO, вероятно, не то место, где можно об этом спрашивать, но я мог бы использовать его в одном из своих многочисленных проектов, поэтому я не возражал против выяснения этого. Также я никогда не использовал симфонию …
Отдельное спасибо за этот последний вопрос о последнем разборе подсказки типа:

PHP Reflection — Получить тип параметра метода в виде строки

Тем не менее, я бы вычислил Regx примерно через 10 секунд, метод экспорта не так уж и много.

Это объем документации по нему

http://php.net/manual/en/reflectionparameter.export.php

В прямом смысле

public static string ReflectionParameter::export ( string $function , string $parameter [, bool $return ] )
2

Другие решения

Как уже упоминалось, они используют отражение. Если вы хотите увидеть, как именно Symfony делает это, начните с autowire() метод Вот

1

По вопросам рекламы [email protected]