В Laravel 5 я не могу понять движение аргументов внутри и снаружи функций (анонимных функций), подобных этой
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Как перемещаются аргументы … Мне действительно нужно знать, как $ id попадает в Route :: get functions .. Мне очень сложно написать синтаксис без копирования и вставки.
Аргументы не волшебным образом «двигаются». Когда вы делаете это, Laravel берет комбинацию пути / функции и сохраняет их для дальнейшего использования. Это упрощенная версия того, что происходит:
class Route
{
private static $GET = array();
public static function get($path, $callback)
{
self::$GET[] = array($path, $callback);
}
}
Затем, после добавления всех маршрутов, он проверяет, с какого URL была вызвана веб-страница, и находит соответствующий ему путь. Существует некоторая внутренняя процедура, которая принимает $path
для каждого маршрута и преобразует его в регулярное выражение, как #user/(?P<id>.+)#
так что сопоставление только что сделано с чем-то вроде preg_match()
, После успешного попадания он останавливается и извлекает переменные:
'/user/foobar' has the username extracted: array('id' => 'foobar')
Затем он использует отражение сопоставить параметры в обратном вызове с данными из URL.
$callback_reflection = new ReflectionFunction($callback);
$arguments = $callback_reflection->getParameters();
/* some algorithm to match the data and store in $args */
$result = $callback_reflection->invokeArgs($args);
invokeArgs()
Метод — это то, что будет выполнять ваш обратный вызов с правильными аргументами. Здесь не так много магии. Увидеть Router
учебный класс Больше подробностей.
Других решений пока нет …