2013-08-12 12 views
6

Jestem mniej lub bardziej nowa w Laravel 4. Nigdy wcześniej nie używałam tras, ale normalnie to, do czego jestem przyzwyczajony to URL/kontroler/akcja, a następnie routing zaplecza dla mnie. Kilka razy przeczytałem dokumentację dotyczącą tras i kontrolerów, a także przeczytałem kilka samouczków, więc staram się dowiedzieć, jak to zrobić, bez pisania trasy dla każdego kontrolera i akcji.Laravel 4: Trasa do localhost/kontroler/akcja

Próbowałem coś podobnego

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

A teraz wiem, że to jest złe, ponieważ nie działa, ale co mi brakuje? Na większości tutoriali i rzeczy Widzę trasy dla mniej lub bardziej każdego kontrolera i akcji jak:

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

Które wydaje się głupie i jak strata czasu dla mnie.

Czy mimo to można osiągnąć to, czego chcę?

+1

To nie jest głupie i strata czasu. Definicja trasy zapewnia wiele funkcji i funkcji w miarę wzrostu aplikacji. Przeczytaj ten blog, aby uzyskać więcej informacji: http://philsturgeon.co.uk/blog/2013/07/beware-the-route-to-evil – Laurence

Odpowiedz

7

Jeśli szukasz bardziej zautomatyzowany trasy, będzie to laravel 4 sposób:

Trasa:

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

Controller (w tym przypadku 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 
} 

Jak wspomniano w The Shift Exchange, istnieją pewne korzyści, aby zrobić to w pełnym zakresie. Oprócz doskonałej artykule on powiązany, można utworzyć name for each route, na przykład:

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

Następnie podczas tworzenia adresów URL w aplikacji, należy użyć pomocnika do wygenerowania link to a named route:

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

Linki są następnie przyszły dowód na zmiany w kontrolerach/działaniach.

Można również generować łącza bezpośrednio do działań, które nadal będą działały z automatycznym routingiem.

$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

Proszę wyjaśnić, dlaczego ta odpowiedź pomaga. –

+1

Jest to uniwersalna metoda automatycznego sterowania routerem/działaniem dla wszystkich kontrolerów. Dodatkowo pozwala na przechowywanie kontrolerów w oddzielnych folderach. – Alex

+1

Naprawdę powinieneś dodać trochę wyjaśnień do tego posta, a nie tylko czysty kod. –

0

pochodzę .Net świata i routingu jest zazwyczaj zrobione:

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

Która wygląda następująco:

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

W laravel to osiągnąć jak routing więc:

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

Kontroler będzie wyglądać mniej więcej tak:

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"]; 
     } 

    } 
}