2014-11-10 11 views
13

Ich versuche, die aktuelle Route Aktion zu bekommen, aber ich bin mir nicht sicher, wie es geht. In Laravel 4 benutzte ich Route::currentRouteAction(), aber jetzt ist es ein bisschen anders.Laravel 5 Wie bekomme ich einen Aktionsnamen?

Ich versuche Route::getActionName() in meinem Controller zu tun, aber es hält mich Methode nicht gefunden.

<?php namespace App\Http\Controllers; 

use Route; 

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

Ich denke, die Methode wird entfernt, da Routen mit Anmerkungen in L5 erstellt werden. – ArjanSchouten

+1

@arjan Der Standard in L5 ist jetzt die normale Route, die gleiche wie L4. Anmerkungen sind jetzt in L5 optional. – Laurence

Antwort

18

In Laravel 5 Sie Methode oder Konstruktor Injektion sollte verwenden. Dies wird tun, was Sie wollen:

<?php namespace App\Http\Controllers; 

use Illuminate\Routing\Route; 

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

Das funktioniert, super, noch eine Frage, wie man das in Middleware macht. Zum Beispiel möchte ich die "Ansicht" in meinem Layout basierend auf der Route automatisch einstellen. Ich habe versucht, dort das gleiche zu tun, in der "Handle" und "__construct" -Methode, aber es funktioniert nicht. 'Unresolvable Abhängigkeit löst [Parameter # 0 [ $ Methoden]] in der Klasse Illuminate \ Routing \ Route' – Rob

+0

Dies ist WAAAAAAAAAAAAAAAAAAAAAY auch automagical mit sich wohl fühlen. Ich mag es genau zu wissen was passiert. –

+1

@ SzczepanHołyszewski - Methode Injektion ist eine Standardmethode Laravel 5 funktioniert. Nichts automatisches darüber - nur Standard-Abhängigkeits-Injektion. – Laurence

18

Aktionsnamen zu erhalten, müssen Sie verwenden:

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

und nicht

echo Route::getActionName(); 
+0

danke das ist wirklich für mich gearbeitet – Alsemany

+2

Für mich ist das Ergebnis 'App \ Http \ Controller \ AdsController @ create', so ist es nicht nur Aktion Name. Ist es möglich, nur es zu bekommen? – Gediminas

3

Statt

use Illuminate\Routing\Route; 

verwenden

use Illuminate\Support\Facades\Route; 

Wenn Sie den Aliasnamen der Route erhalten möchten, können Sie:

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

das hat bei mir in laravel 5.3 funktioniert –

1

Für Laravel 5.1 verwenden:

Es gibt viele nützliche Methoden in dieser Klasse. Überprüfen Sie den Code für weitere Details.

4

Um die Route Aktionsname auf Middleware bekommen ich das tun:

<?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: Sie tun, um die Strecken, die nicht bekommen, die durch diese Middleware geschützt sind :(

3

Aktionsnamen, um nur zu erhalten (ohne Controller Name):

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

Um nur den Namen der Methode erhalten Sie verwenden können ...

oder mit einer Fassade ...

Route::getActionMethod() 
1

Um nur Aktionsname in Laravel 5,4

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

zu bekommen kann keine bessere Möglichkeit finden, in Hinblick auf die Verwendung in einem Linie ...

0

Sie können verwenden, um die Controllerdetails aus der Anfrage selbst

zu erhalten
0

In Laravel 5.5 wenn Sie nur den Namen der Methode/Aktion wollen, d. H. Show, edit, custom-method etc ...Tun Sie dies

Keine Notwendigkeit zu explodieren oder Liste, um die tatsächliche Methode aufgerufen werden. Danke an Laravel, der daran gedacht hat.