Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 14.01.2018 22:52:04

redirect в роутах на пока еще неизвестный экшн

Здравствуйте Заранее спасибо за ответ
Необходимо перейти на экшн контроллера который и будет указан вторым параметром в маршруте
Так не получилось Хотя переменную $var вижу

Route::get('/seeds/{var}', function($var){
dump($var);
    return redirect()->action('MakeSeedingController@index');
});

Получаю ошибку
http://prntscr.com/i0ebrf
Хотя и контроллер и экшн существуют
Да и простите за повтор темы случайно получилось не вижу как удалить

Изменено imediasun (14.01.2018 23:09:19)

Не в сети

#2 15.01.2018 00:50:05

Re: redirect в роутах на пока еще неизвестный экшн

Вот по такой аналогии можно делать универсальные роуты. Нужно ли - вопрос. Вариант нужно допиливать, чтобы он отдавать 404 ошибку если ввели неверный метод. Ничего сложного, но говнокодить try-catch или как-то по иному в роутах я не берусь smile
Но как по мне, это вообще не очень хорошая практика. Возможно есть более грамотный способ.

Route::get('/seeds/{var}', function ($var) {
	return redirect()->action('GamesController@' . $var);
});

Насчет вашего примера - проверьте еще раз контроллер и метод.

Изменено Gorman (15.01.2018 01:09:41)

Не в сети

#3 15.01.2018 01:25:09

Re: redirect в роутах на пока еще неизвестный экшн

http://prntscr.com/i0gdui
Не работает
http://prntscr.com/i0ge6h
http://prntscr.com/i0gejv

Route::get('/seeds/index', 'MakeSeedingController@index')->name('seeds');
А вот так без проблем перенаправляет

Изменено imediasun (15.01.2018 01:36:32)

Не в сети

#4 15.01.2018 01:33:47

Re: redirect в роутах на пока еще неизвестный экшн

Какой url забиваете? Простой роут (внизу) экшн видит или такую же ошибку возвращает?

Route::get('make','MakeSeedingController@index');

Не в сети

#5 15.01.2018 01:38:52

Re: redirect в роутах на пока еще неизвестный экшн

простой видит

Не в сети

#6 15.01.2018 01:52:03

Re: redirect в роутах на пока еще неизвестный экшн

Понял в чем ошибка - он пытается редиректить на экшн, для которого не прописан роут. Для теста пропишите например простой роут на индекс и снизу наш с замыканием - замыкание должно работать smile Или механизмы другие - но суть ошибки в этом.
Поэтому вариант, предложенный мной выше, не годится, сейчас придумаю новое что-нибудь.

Изменено Gorman (15.01.2018 01:53:01)

Не в сети

#7 15.01.2018 02:07:53

Re: redirect в роутах на пока еще неизвестный экшн

Имхо - это занятие чисто для саморазвития, делать так на реальных проектах все-таки не надо ))

Но как эксперимент - опробуйте это решение, должно работать

Route::get('/seeds/{var}', function ($var) {
	return App::call('App\Http\Controllers\MakeSeedingController@' . $var);
});

Изменено Gorman (15.01.2018 02:08:07)

Не в сети

#8 15.01.2018 06:55:25

Re: redirect в роутах на пока еще неизвестный экшн

Действительно работает, поясни пожалуйста что это значит чего ему не хватало?

Не в сети

#9 15.01.2018 14:13:31

Re: redirect в роутах на пока еще неизвестный экшн

Я не разбирался досконально, но происходит примерно следующее.
Когда мы вызываем хелпер action(Controller@Method), он (хелпер) создает объект Illuminate\Routing\UrlGenerator (через хелпер app) с вызовом метода action()

    // это хелпер action
    function action($name, $parameters = [], $absolute = true)
    {
        return app('url')->action($name, $parameters, $absolute);
    }

Метод action() UrlGenerator-а лезет к внедренному в routes объекту Illuminate\Routing\RouteCollection и вызывает метод getByAction ().

    // это класс UrlGenerator
    public function action($action, $parameters = [], $absolute = true)
    {
        if (is_null($route = $this->routes->getByAction($action = $this->formatAction($action)))) {
            throw new InvalidArgumentException("Action {$action} not defined.");
        }
        return $this->toRoute($route, $parameters, $absolute);
    }

Уже становится понятно, почему не работает) Но продолжая - метод getByAction() RouteCollection-а проверяет запрошенный роут по списку роутов, если находит - возвращает его в UrlGenerator для дальшейшего перехода, если нет - возвращает null, и мы ловим нашу ошибку из UrlGenerator-а.

    // это класс RouteCollection
    public function getByAction($action)
    {
    return isset($this->actionList[$action]) ? $this->actionList[$action] : null;
    }

Если говорить проще, то хелпер action() попадает в экшен контроллера через роут. А так как конкретно этого роута у нас нет (только "универсальный") - он и выдает ошибку.

Наш рабочий вариант App::call() чуть сложнее и более запутан. Кстати, вместо фасада использовать хелпер app()->call(). Я до сих пор до конца не разобрался smile Из того, что находил в коде - хелпер\фасад создает контейнер с объектом Application, вызывается метод родительского класса Container - сall()

    public function call($callback, array $parameters = [], $defaultMethod = null)
    {   
        return BoundMethod::call($this, $callback, $parameters, $defaultMethod);
    }

После чего в Illuminate\Container\BoundMethod методом Call() (21 строка) уже и вызывается наш запрошенный контроллер с методом. Как конкретно вызывается - до этого как раз не докопал, там начинается какой-то хард c коллбеками)

Изменено Gorman (15.01.2018 15:07:37)

Не в сети

Подвал раздела