2017-07-15 24 views
1

我是這個新手,我需要一些幫助。如何在Laravel的路由上動態調用方法?

我正在開發某種音樂庫,並讓我們說我不想爲每個藝術家,所以我做出這一個路徑:

Route::get('/{artist_name}', '[email protected]{artist_name}'); 

我得到的{artist_name}從我的價值查看和路由工作,例如,artist_name可能是約翰和生成的url是localhost:8000/John。但是當涉及到在控制器中尋找類時,它不起作用。我有一個在我的控制器名爲John類,但我不斷收到這個錯誤,當我嘗試訪問:

BadMethodCallException 方法[{} ARTIST_NAME]不存在。

所以我猜這條路線沒有取值{artist_name}。我想要的是要處理的路線,如:

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

但正如我所說的,我不想爲藝術家創建特定路線。

我會很感激任何形式的幫助。謝謝

+0

您是否將自己的藝術家數據存儲在數據庫中? –

+1

可以理解的是,你不想爲每個藝術家創建具體的路線。但是你是否在每個藝術家的控制器中創建了一個特定的功能?我不信。 – ayip

+0

https://laracasts.com/series/laravel-from-scratch-2017/episodes/7 –

回答

0

在控制器類中不能有動態方法(控制器動作)。相反,您應該定義一個方法並將路由參數傳遞給該操作。

在你的路線(web.php)文件:

Route::get('/{artist_name}', '[email protected]');

然後在ArtistController.php

public function artist ($artist_name) { 
    // do stuff based on $artist_name 
} 

爲了獲得更多的信息讀取這些2個文檔頁面。 ControllerRouting

1

沒有必要爲每位藝術家創建動態方法。您可以在控制器中使用一種通用方法來處理從數據庫檢索適當的藝術家信息並將其傳遞給視圖。

routes文件:

Route::get('artists/{artist_id}', '[email protected]'); 

ArtistsController.php

class ArtistsController extends Controller 
{ 
    public function show($artist_id) 
    { 
     $artist = Artists::find($artist_id); 

     return view('artists.show', ['artist' => $artist]); 
    } 
} 

所以,如果用戶點擊以下網址http://localhost/artists/4的4藝術家ID將被傳遞到展示方法,它會動態地看對於具有該ID的藝術家並將藝術家的對象傳遞給您的視圖。

當然,您不僅限於您的網址中的ID。您可以使用該名稱,如果它是唯一的,您的代碼將如下所示。

routes文件:

Route::get('artists/{artist_name}', '[email protected]'); 

ArtistsController。php

class ArtistsController extends Controller 
{ 
    public function show($artist_name) 
    { 
     $artist = Artist::where('name', $artist_name); 

     return view('artists.show', ['artist' => $artist]); 
    } 
} 

我建議您閱讀this documentation以獲取有關路由的更多信息。