2013-08-12 14 views
6

Ich bin mehr oder weniger neu in Laravel 4. Ich habe noch nie Routen verwendet, aber normalerweise bin ich gewohnt, url/controller/action und dann das Backend-Routing für mich. Ich habe die Dokumentation für Routen und Controller ein paar Mal gelesen sowie einige Tutorials gelesen und so versuche ich herauszufinden, wie man das funktioniert, ohne eine Route für jeden Controller und jede Aktion zu schreiben.Laravel 4: Route zu localhost/controller/action

habe ich versucht, so etwas wie

Route::get('{controller}/{action}', function($controller, $action = 'index'){ 
    return $controller."@".$action; 
}); 

Nun, ich weiß, dass dies falsch ist, da es nicht funktioniert, aber was bin ich dabei? Auf den meisten Tutorials und Sachen ich sehe einen Weg für mehr oder weniger jeder Controller und Aktion wie:

Route::get('/controller/action' , '[email protected]'); 

Welche albern und wie eine Verschwendung von Zeit zu mir scheint.

Gibt es trotzdem was zu erreichen was ich will?

+1

Es ist nicht dumm ist und eine Verschwendung von Zeit. Die Routendefinition bietet zahlreiche Funktionen und Funktionen, wenn Ihre Anwendung wächst. Lesen Sie diesen Blog für weitere Informationen: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil – Laurence

Antwort

7

Wenn Sie für eine automatische Routing suchen, wäre dies die Art und Weise Laravel 4 sein:

Route:

Route::controller('users', 'UsersController'); 

Controller (in diesem Fall UsersController.php):

public function getIndex() 
{ 
    // routed from GET request to /users 
} 

public function getProfile() 
{ 
    // routed from GET request to /users/profile 
} 

public function postProfile() 
{ 
    // routed from POST request to /users/profile 
} 

public function getPosts($id) 
{ 
    // routed from GET request to: /users/posts/42 
} 

Wie der Shift Exchange erwähnt, gibt es einige Vorteile, um es ausführlich zu tun. Neben den ausgezeichneten Artikel er verbunden ist, können Sie ein name for each route, zum Beispiel erstellen:

Route::get("users", array(
    "as"=>"dashboard", 
    "uses"=>"[email protected]" 
)); 

Dann, wenn URLs in Ihrer Anwendung erstellen, verwenden Sie einen Helfer eine link to a named route zu generieren:

$url = URL::route('dashboard'); 

Verbindungen sind dann aus Änderungen an Controllern/Aktionen zukunftssicher gemacht.

Sie können auch Links direkt zu Aktionen generieren, die immer noch mit automatischem Routing arbeiten.

$url = URL::action('[email protected]'); 
6
app\ 
    controllers\ 
     Admin\ 
      AdminController.php 
     IndexController.php 
Route::get('/admin/{controller?}/{action?}', function($controller='Index', $action='index'){ 
     $controller = ucfirst($controller); 
     $action = $action . 'Action'; 
     return App::make("Admin\\{$controller}Controller")->$action(); 
    }); 

Route::get('/{controller?}/{action?}', function($controller='Index', $action='index'){ 
     $controller = ucfirst($controller); 
     $action = $action . 'Action'; 
     return App::make("{$controller}Controller")->$action(); 
    }); 
+1

Bitte erläutern Sie, warum diese Antwort hilft. –

+1

Dies ist eine universelle Methode, um Controller/Aktion für alle Controller automatisch zu leiten. Plus erlauben es, Controller in separaten Ordnern zu halten. – Alex

+1

Sie sollten wirklich eine Erklärung zu diesem Beitrag hinzufügen, anstatt nur reinen Code. –

0

Ich komme aus .NET-Welt und Routing-Regel getan wird:

/{Controller}/{action}/{id} 

das wie folgt aussieht:

/Products/Show/1 OR /Products/Show/Beverages 

In Laravel erreichen ich dieses Routing wie so:

Route::get('/{controller?}/{action?}/{id?}', function ($controller='Home', $action='index', $id = null) { 
    $controller = ucfirst($controller); 
    return APP::make("{$controller}Controller")->$action($id); 
}); 

Der Controller würde in etwa wie so aussehen:

class ProductsController extends BaseController { 
    public function Show($id) { 
     $products = array(1 => array("Price" => "$600","Item" => "iPhone 6"), 
          2 => array("Price" => "$700", "Item" => "iPhone 6 Plus")); 

     if ($id == null) { 
      echo $products[1]["Item"]; 
     } else { 
      echo $products[$id]["Item"]; 
     } 

    } 
} 
Verwandte Themen