За последние 24 часа нас посетили 17627 программистов и 1594 робота. Сейчас ищут 1343 программиста ...

Laravel 5.5 и «Undefined variable: route» в виде

Тема в разделе "Laravel", создана пользователем xintrea, 26 мар 2019.

Метки:
  1. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Пытаюсь заставить работать вот эту капчу:

    https://github.com/igoshev/laravel-captcha

    Если дать команду:
    Код (Text):
    1.  
    2. artisan vendor:publish --provider="Igoshev\Captcha\Providers\CaptchaServiceProvider" --tag="views"
    То сгенерируется вид вот с таким содержимым:
    Код (Text):
    1.  
    2. <img src="{{ $route }}"
    3.      alt="https://github.com/igoshev/laravel-captcha"
    4.      style="cursor:pointer;width:{{ $width }}px;height:{{ $height }}px;"
    5.      title="{{ $title }}"
    6.      onclick="this.setAttribute('src','{{ $route }}?_='+Math.random());var captcha=document.getElementById('{{ $input_id }}');if(captcha){captcha.focus()}">
    Согласно документации, этот вид вставляется в основной вид с помощью директоивы:
    Код (Text):
    1.  
    2. @captcha
    Эта директива, по всей видимости, разворачивается в вызов <?php echo Igoshev\Captcha\Facades\Captcha::getView() ?>

    Однако, при открытии страницы с основным видом появляется ошибка:
    То есть, в коде вида не хватает переменной $route. А куда она потерялась и почему ее нет? И должна ли она быть?

    Что не учли авторы этой капчи?
     
  2. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Отвечаю сам себе.

    Обошел проблему следующим образом. В контроллере делаю такой вызов вида:
    Код (Text):
    1.  
    2. return view('enterItemId', ['route' => url()->current()]);
    И вывод картинки заработал.

    * * *​

    Но мне не нравится как я сделал. Хотя бы из-за того, что я не получил строку роутинга. Но я читал документацию:

    https://laravel.com/docs/5.5/routing#accessing-the-current-route

    И там написано, что есть такие методы:
    Код (Text):
    1.  
    2. $route = Route::current();
    3.  
    4. $name = Route::currentRouteName();
    5.  
    6. $action = Route::currentRouteAction();
    Однако на странице документации по самому классу Route таких методов нету:

    https://laravel.com/api/5.5/Illuminate/Routing/Route.html

    И если попробовать написать такой код:
    Код (Text):
    1.  
    2. return view('enterItemId', ['route'=>Route::currentRouteName()]);
    То будет ошибка:
    Я уже не знаю какой документации верить. Но вроде как однозначно, в документации на странице https://laravel.com/docs/5.5/routing ошибка, если они рассказывают про несуществующие методы.

    В связи с чем вопрос: а каким методом в Laravel 5.5 можно получить текущий роут?
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    У Laravel несколько классов с именем Route в разных неймспейсах. Описанные методы работают, но это методы фасада, а ты даёшь ссылку не на фасад. А в самом фасаде ты опять же не найдёшь этих методов - там магия фасадов Laravel. Но оно работает.
     
  4. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Прекрасный ответ для технического форума: это магия, но оно работает.

    > У Laravel несколько классов с именем Route в разных неймспейсах
    А какой нужен в нашем случае?

    > Описанные методы работают, но это методы фасада, а ты даёшь ссылку не на фасад
    Что ты подразумеваешь под ссылкой? Ссылка в коде или ссылка на страницу документации?

    И самое главное, вопрос был таким: а каким методом в Laravel 5.5 можно получить текущий роут?

    Код мы не увидели...
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Illuminate\Support\Facades\Route::currentRouteName(). Ответы здесь предполагают, что увидев, видимо, незнакомое слово "Фасад", чел пойдёт в доку и посмотрит, что там за фасады. А магия - ну так действительно, фасады работают в Laravel через так называемые магические методы PHP, поэтому в классе ты не найдёшь метода currentRouteName(), до него ещё надо добраться через сервис, обслуживающий фасад. Это сделано, чтоб можно было заменить стандартный сервис на свой.
    --- Добавлено ---
    Про ссылку - действительно не совсем точно выразился, имел в виду, что ты дёргаешь у другого класса, не у фасада, но главным в ответе было слово "Фасад" :)
     
  6. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Это все понятно. Но в чем проблема была вместо
    написать
    "Магический метод 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.
    Из них уже можно выбрать то что нам нужно.
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    https://laravel.com/docs/master/contracts#contract-reference - уже есть такая таблица :) Но может кому-то и твоё творение пригодится. У меня вообще с момента знакомства с Laravel почти не было вопросов, на которые не было бы ответов прямо в документации
     
  8. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Конечно, я же так и написал: "... в документации Laravel есть таблица соответствия."

    Пока я про нее не знал, было очень тяжело понимать что к чему.

    PS: Ссылку на оригинальную таблицу добавил.
     
    #8 xintrea, 29 мар 2019
    Последнее редактирование: 29 мар 2019