Пытаюсь заставить работать вот эту капчу: https://github.com/igoshev/laravel-captcha Если дать команду: Код (Text): artisan vendor:publish --provider="Igoshev\Captcha\Providers\CaptchaServiceProvider" --tag="views" То сгенерируется вид вот с таким содержимым: Код (Text): <img src="{{ $route }}" alt="https://github.com/igoshev/laravel-captcha" style="cursor:pointer;width:{{ $width }}px;height:{{ $height }}px;" title="{{ $title }}" onclick="this.setAttribute('src','{{ $route }}?_='+Math.random());var captcha=document.getElementById('{{ $input_id }}');if(captcha){captcha.focus()}"> Согласно документации, этот вид вставляется в основной вид с помощью директоивы: Код (Text): @captcha Эта директива, по всей видимости, разворачивается в вызов <?php echo Igoshev\Captcha\Facades\Captcha::getView() ?> Однако, при открытии страницы с основным видом появляется ошибка: То есть, в коде вида не хватает переменной $route. А куда она потерялась и почему ее нет? И должна ли она быть? Что не учли авторы этой капчи?
Отвечаю сам себе. Обошел проблему следующим образом. В контроллере делаю такой вызов вида: Код (Text): return view('enterItemId', ['route' => url()->current()]); И вывод картинки заработал. * * * Но мне не нравится как я сделал. Хотя бы из-за того, что я не получил строку роутинга. Но я читал документацию: https://laravel.com/docs/5.5/routing#accessing-the-current-route И там написано, что есть такие методы: Код (Text): $route = Route::current(); $name = Route::currentRouteName(); $action = Route::currentRouteAction(); Однако на странице документации по самому классу Route таких методов нету: https://laravel.com/api/5.5/Illuminate/Routing/Route.html И если попробовать написать такой код: Код (Text): return view('enterItemId', ['route'=>Route::currentRouteName()]); То будет ошибка: Я уже не знаю какой документации верить. Но вроде как однозначно, в документации на странице https://laravel.com/docs/5.5/routing ошибка, если они рассказывают про несуществующие методы. В связи с чем вопрос: а каким методом в Laravel 5.5 можно получить текущий роут?
У Laravel несколько классов с именем Route в разных неймспейсах. Описанные методы работают, но это методы фасада, а ты даёшь ссылку не на фасад. А в самом фасаде ты опять же не найдёшь этих методов - там магия фасадов Laravel. Но оно работает.
Прекрасный ответ для технического форума: это магия, но оно работает. > У Laravel несколько классов с именем Route в разных неймспейсах А какой нужен в нашем случае? > Описанные методы работают, но это методы фасада, а ты даёшь ссылку не на фасад Что ты подразумеваешь под ссылкой? Ссылка в коде или ссылка на страницу документации? И самое главное, вопрос был таким: а каким методом в Laravel 5.5 можно получить текущий роут? Код мы не увидели...
Illuminate\Support\Facades\Route::currentRouteName(). Ответы здесь предполагают, что увидев, видимо, незнакомое слово "Фасад", чел пойдёт в доку и посмотрит, что там за фасады. А магия - ну так действительно, фасады работают в Laravel через так называемые магические методы PHP, поэтому в классе ты не найдёшь метода currentRouteName(), до него ещё надо добраться через сервис, обслуживающий фасад. Это сделано, чтоб можно было заменить стандартный сервис на свой. --- Добавлено --- Про ссылку - действительно не совсем точно выразился, имел в виду, что ты дёргаешь у другого класса, не у фасада, но главным в ответе было слово "Фасад"
Это все понятно. Но в чем проблема была вместо написать "Магический метод PHP" - это устоявшийся технический термин. А "магия" - это вообще непонятно что. * * * В любом случае, традиционно, опытные программисты ничего не говорят про технологии в которых они разбираются, и все приходится делать самому. Поэтому я не поленился, и написал статью: Соответствие фасадов и классов в Laravel 5.5 Теперь можно ответить на вопрос, где искать метод current(), он же getCurrentRoute(), в фасаде Route, и каким образом можно получить строку перенаправления текущего роутера. Открываем статью, смотрим таблицу соответствия, находим там фасад Route. Видим, что используется класс: Illuminate\Routing\Router Открываем его, ищем там метод current() из топика. Видим, что он возвращает объект класса Route. Открываем описание этого объекта и видим там методы: string getPath() - Get the URI associated with the route. string uri() - Get the URI associated with the route. string getUri() - Get the URI that the route responds to. Из них уже можно выбрать то что нам нужно.
https://laravel.com/docs/master/contracts#contract-reference - уже есть такая таблица Но может кому-то и твоё творение пригодится. У меня вообще с момента знакомства с Laravel почти не было вопросов, на которые не было бы ответов прямо в документации
Конечно, я же так и написал: "... в документации Laravel есть таблица соответствия." Пока я про нее не знал, было очень тяжело понимать что к чему. PS: Ссылку на оригинальную таблицу добавил.