2013-06-01 37 views
2

我想知道在Laravel 4中是否有可能根據給定的參數實際調用控制器的功能。例如,如果我有一樣的路線:Laravel 4參數作爲控制器動作

'auth/{action} 

那麼有沒有一種方法來調用基於「行動」 PARAM控制器動作?在Kohana中我可以寫這樣的:

'auth/<action>' -> defaults (controller=>'UserController',action=>'<action>' 

嘛不exacly這樣的,但你知道我的意思:)無論如何,如果沒有機會去這樣做,那麼我有我的路線分成單路線?

回答

5

聽起來像你只需要路由到控制器與auth是基本的URI。

Route::controller('auth', 'AuthController'); 

該控制器(AuthController)目前預計你的方法與他們應該做出響應的HTTP動詞前綴。您也可以使用getIndex方法來響應基本URI,在本例中爲auth

一個例子控制器可能是這個樣子:

class AuthController extends Controller { 

    public function getIndex() 
    { 
     return 'Index page'; // Responds to localhost/auth 
    } 

    public function getLogin() 
    { 
     return 'Login page'; // Responds to localhost/auth/login 
    } 

} 

有一件事你應該知道的。如果你做Route::controller('/', 'HomeController');那麼它應該是最後的。由於Laravel自動添加一個「缺失方法」路由,它將捕獲任何與控制器上的可路由方法不匹配的任何路由。

更多關於RESTful controllers的官方文檔。

+0

確定,工作得很好,除了我不能在網址中使用參數。你的建議是什麼?據我所知,這在REST API中至關重要,有可能調用類似/ api/item/1或東西的東西。好吧,我想我必須在這種情況下使用Route ::資源。我是對的還是應該使用Route :: controller並以某種方式傳遞參數? –

0

我沒有測試過這個確切的代碼,但我用類似的東西,它的工作:

Route::any('auth/{action}', function($action){ 
    $controller = new UserController(); 
    $controller->$action(); 
}); 

你可能會發現你還需要處理的參數,如:

Route::any('auth/{action}/{param}', function($action, $param){ 
    $controller = new UserController(); 
    $controller->$action($param); 
}); 

你甚至可以調整它覆蓋所有的控制器:

Route::any('{controller}/{action?}/{param?}', function($controller,$action='index',$param=null) 
{ 
    $controller = str_replace(' ', '', ucwords(str_replace('-', ' ', $controller))).'Controller'; 
    $controller = new $controller; 
    $action = lcfirst(str_replace(' ', '', ucwords(str_replace('-', ' ', $action)))); 
    return $controller->$action($param); 
}); 

如果你想有一個指數acti上一個參數,這是行不通的,但否則,它似乎工作得很好。如果你想這樣做,它也不會處理第二個參數。

很多方法可以擴展這個想法。

Jason的回答更爲正確(匹配文檔,更簡潔的代碼等),但如果您不想考慮HTTP方法,或者您想要一種主路由來處理幾乎所有的請求,這是一個選項。