2014-11-10 3 views
13

Я пытаюсь получить текущее действие маршрута, но я не уверен, как это сделать. В Laravel 4 я использовал Route::currentRouteAction(), но теперь это немного другое.Laravel 5 как получить название действия по маршруту?

Я пытаюсь сделать Route::getActionName() в моем контроллере, но он продолжает давать мне метод не найден.

<?php namespace App\Http\Controllers; 

use Route; 

class HomeController extends Controller 
{ 
    public function getIndex() 
    { 
     echo 'getIndex'; 
     echo Route::getActionName(); 
    } 
} 
+0

Я думаю, что метод удален, потому что маршруты будут созданы с аннотациями в L5. – ArjanSchouten

+1

@arjan Значение по умолчанию в L5 - это обычные маршруты, такие же, как L4. Аннотации теперь необязательны в L5. – Laurence

ответ

18

В Laravel 5 вы должны использовать метод или конструктор инъекции. Это будет делать то, что вы хотите:

<?php namespace App\Http\Controllers; 

use Illuminate\Routing\Route; 

class HomeController extends Controller 
{ 
    public function getIndex(Route $route) 
    { 
     echo 'getIndex'; 
     echo $route->getActionName(); 
    } 
} 
+0

Это работает, здорово, еще один вопрос, как это сделать в промежуточном программном обеспечении. Например, я хочу автоматически установить «вид» в моем макете на основе маршрута. Я попытался сделать то же самое в методе 'handle' и' __construct', но он не работает. 'Разрешающая способность неразрешимой зависимости [Параметр # 0 [ $ methods]] в классе Illuminate \ Routing \ Route' – Rob

+0

Это WAAAAAAAAAAAAAAAAAAAAAY слишком удобно, чтобы вам было удобно. Мне нравится ЗНАЧИТЬ ТОЧНО, что происходит. –

+1

@ SzczepanHołyszewski - Метод инъекции является стандартным способом работы Laravel 5. Ничего автоматизированного в этом нет - просто стандартная инъекция зависимостей. – Laurence

18

Чтобы получить имя действия, вы должны использовать:

echo Route::getCurrentRoute()->getActionName(); 

и не

echo Route::getActionName(); 
+0

спасибо, что это действительно сработало для меня – Alsemany

+2

Для меня результатом является 'App \ Http \ Controllers \ AdsController @ create', поэтому это не только имя действия. Можно ли получить только это? – Gediminas

3

Вместо

use Illuminate\Routing\Route; 

Используйте этот

use Illuminate\Support\Facades\Route; 

Если вы хотите, чтобы получить псевдоним маршрута, вы можете использовать:

Route::getCurrentRoute()->getName() 
+0

это работало для меня в laravel 5.3 –

1

Для Laravel 5.1 использование:

$route = new Illuminate\Routing\Route(); 
$route->getActionName(); // Returns App\Http\Controllers\[email protected] 
$route->getAction(); // Array with full controller info 

В этом классе есть много полезных методов. Просто проверьте код для получения более подробной информации.

4

Чтобы получить имя маршрута действий на Middleware я это сделать:

<?php 
namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Routing\Router; 

class HasAccess { 

    protected $router; 

    public function __construct(User $user, Router $router) 
    { 
     $this->router = $router; 
    } 

    public function handle($request, Closure $next) 
    { 
     $action_name = $this->router->getRoutes()->match($request)->getActionName(); 
     //$action_name will have as value 'App\Http\Controllers\[email protected]' 
     //Now you can do what you want whit the action name 
     return $next($request); 
    } 
} 

EDIT: Вы не получите маршруты, которые защищены от этого промежуточного слоя :(

3

Чтобы получить только имя действия (без имени контроллера):

list(, $action) = explode('@', Route::getCurrentRoute()->getActionName()); 
3

Чтобы получить только имя метода, вы можете использовать ...

$request->route()->getActionMethod() 

или с фасада ...

Route::getActionMethod() 
1

Чтобы получить только имя действия в Laravel 5,4

explode('@', Route::getCurrentRoute()->getActionName())[1]

Не удается найти лучший способ, чтобы использовать в целях, в одном line ...

0

Вы можете использовать, чтобы получить информацию о контроллере от самого запроса

$request->route()->getAction() 
0

В Laravel 5.5, если вы просто хотите, чтобы имя метода/действия отображало, редактировалось, настраивалось и т. Д. ...сделайте это

Route::getCurrentRoute()->getActionMethod() 

Не нужно использовать взрыв или список, чтобы получить вызов фактического метода. Спасибо Ларавелю, который подумал об этом.

Смежные вопросы