Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте Заранее спасибо за ответ
Необходимо перейти на экшн контроллера который и будет указан вторым параметром в маршруте
Так не получилось Хотя переменную $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)
Не в сети
Вот по такой аналогии можно делать универсальные роуты. Нужно ли - вопрос. Вариант нужно допиливать, чтобы он отдавать 404 ошибку если ввели неверный метод. Ничего сложного, но говнокодить try-catch или как-то по иному в роутах я не берусь
Но как по мне, это вообще не очень хорошая практика. Возможно есть более грамотный способ.
Route::get('/seeds/{var}', function ($var) {
return redirect()->action('GamesController@' . $var);
});
Насчет вашего примера - проверьте еще раз контроллер и метод.
Изменено Gorman (15.01.2018 01:09:41)
Не в сети
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)
Не в сети
Какой url забиваете? Простой роут (внизу) экшн видит или такую же ошибку возвращает?
Route::get('make','MakeSeedingController@index');
Не в сети
простой видит
Не в сети
Понял в чем ошибка - он пытается редиректить на экшн, для которого не прописан роут. Для теста пропишите например простой роут на индекс и снизу наш с замыканием - замыкание должно работать Или механизмы другие - но суть ошибки в этом.
Поэтому вариант, предложенный мной выше, не годится, сейчас придумаю новое что-нибудь.
Изменено Gorman (15.01.2018 01:53:01)
Не в сети
Имхо - это занятие чисто для саморазвития, делать так на реальных проектах все-таки не надо ))
Но как эксперимент - опробуйте это решение, должно работать
Route::get('/seeds/{var}', function ($var) {
return App::call('App\Http\Controllers\MakeSeedingController@' . $var);
});
Изменено Gorman (15.01.2018 02:08:07)
Не в сети
Действительно работает, поясни пожалуйста что это значит чего ему не хватало?
Не в сети
Я не разбирался досконально, но происходит примерно следующее.
Когда мы вызываем хелпер 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(). Я до сих пор до конца не разобрался Из того, что находил в коде - хелпер\фасад создает контейнер с объектом 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)
Не в сети
Страницы 1