2017-02-22 336 views
1

我正在部分成功重構常見的laravel路線到一個類。目前我錯誤尋找控制器。重構Laravel路線

這是我重構的基本模式。我將需要vendors相同的模式,usersterminals

Route::group(['middleware' => ['csrf','DashboardAuthenticate'], 'namespace' => 'App\Http\Controllers'], function() { 

    Route::get('vendors/', '[email protected]'); 
    Route::get('vendors/create', '[email protected]'); 
    Route::get('vendors/{id}', '[email protected]'); 
    Route::post('vendors/search', '[email protected]'); 
    Route::put('vendors/', '[email protected]'); 
    Route::delete('vendors/', '[email protected]'); 

    Route::get('roles/', '[email protected]'); 
    Route::get('roles/create', '[email protected]'); 
    Route::get('roles/{id}', '[email protected]'); 
    Route::post('roles/search', '[email protected]'); 
    Route::put('roles/', '[email protected]'); 
    Route::delete('roles/', '[email protected]'); 

    Route::get('users/', '[email protected]'); 
    Route::get('users/create', '[email protected]'); 
    Route::get('users/{id}', '[email protected]'); 
    Route::post('users/search', '[email protected]'); 
    Route::put('users/', '[email protected]'); 
    Route::delete('users/', '[email protected]'); 

    Route::get('terminals/', '[email protected]'); 
    Route::get('terminals/create', '[email protected]'); 
    Route::get('terminals/{id}', '[email protected]'); 
    Route::post('terminals/search', '[email protected]'); 
    Route::put('terminals/', '[email protected]'); 
    Route::delete('terminals/', '[email protected]'); 
}); 

重構我做了一個類,它看起來像:(該CIRoute類文件是在應用軟件\類\路線命名空間)

class CIRoutes 
{ 
    public static function addRoutes($name) 
    { 
     $n2 = ucfirst($name); 
     Route::get($name.'s/', $n2.'[email protected]'); 
     Route::get($name.'s/create', $n2.'[email protected]'); 
     Route::get($name.'s/{id}', $n2.'[email protected]'); 
     Route::post($name.'s/search', $n2.'[email protected]'); 
     Route::put($name.'s/', $n2.'[email protected]'); 
     Route::delete($name.'s/', $n2.'[email protected]'); 
    } 
} 

然後,我創建的路線:

CIRoutes::addRoutes('vendors'); 

我認爲這是工作的罰款,但我錯了。目前php artisan route:list回來了Class App\Http\Controllers\RolesController does not exist這是它 - 我的意思是它工作正常,沒有重構。

我該如何重構常用路由模式?

+0

這個代碼工作正常 - 我打電話與模型名的複數,這是不正確的路由。 'CIRoutes :: addRoutes('users');'應該是'CIRoutes :: addRoutes('user');'。 duh duh duh – Iannazzi

回答

0

我認爲將路線存儲在routes/web.php文件而不是類中是一個更好的選擇,並使用group方法來代替它們。

Route::group(['prefix' => 'vendors'], function() { 

    Route::get('/', function() { 
     // Matches The "/vendors/" URL 
    }); 
    Route::get('/create', function() { 
     // Matches The "/vendors/create" URL 
    }); 

}); 

組還允許中間件,子域和命名空間路由。

接下來,由於類是創建一個典型的CRUD路線,你可以簡單地使用:

Route::resource('vendors', 'VendorsController'); 

創建以下路線:

Verb  URI      Action  Route Name 
GET   /vendors    index   vendors.index 
GET   /vendors/create   create  vendors.create 
POST  /vendors    store   vendors.store 
GET   /vendors/{vendor}  show   vendors.show 
GET   /vendors/{vendor}/edit edit   vendors.edit 
PUT/PATCH /vendors/{vendor}  update  vendors.update 
DELETE  /vendors/{vendor}  destroy  vendors.destroy 

注意Laravel自動映射所有routes/web.php到您的'網站'中間件App \ Http \ Controllers命名空間中的App \ Providers \ RouteServiceProvider類。

/** 
* Define the "web" routes for the application. 
* 
* These routes all receive session state, CSRF protection, etc. 
* 
* @return void 
*/ 
protected function mapWebRoutes() 
{ 
    Route::group([ 
     'middleware' => 'web', 
     'namespace' => $this->namespace, 
    ], function ($router) { 
     require base_path('routes/web.php'); 
    }); 
} 

所以,如果你仍然想使用一個類來定義你的路線,你將不得不在組類的路徑,並將其分配的應用程序\ HTTP \控制器命名空間和「網絡」的中間件。

Web中間件確保這些路由提供會話狀態和CSRF保護等功能。

那麼你很可能(我沒有測試過)做這樣的事情:

public static function addRoutes($name) 
{ 

    Route::group([ 
     'middleware' => 'web', 
     'namespace' => 'App\Http\Controllers', 
    ], function() use ($name) { 

     $n2 = ucfirst($name); 
     Route::get($name.'s/', $n2.'[email protected]'); 
     Route::get($name.'s/create', $n2.'[email protected]'); 
     Route::get($name.'s/{id}', $n2.'[email protected]'); 
     Route::post($name.'s/search', $n2.'[email protected]'); 
     Route::put($name.'s/', $n2.'[email protected]'); 
     Route::delete($name.'s/', $n2.'[email protected]'); 

    }); 

} 
+0

所有好東西......我一直在使用route :: resource,我的路由只是有點不同,因爲我在/ search中添加,並且我不使用/編輯... js處理它。我試圖添加自己的「資源」功能。我的路線受中間件保護,在我的示例中,我沒有向您顯示。它們也被分組在一個命名空間下。那麼你最後的例子就是我正在嘗試的,這導致我不存在控制器。 – Iannazzi

+0

@CraigIannazzi你定義了命名空間嗎? –

+0

是的,我更新了我的問題,所以你可以看到命名空間。我也將命名空間移到了'CIRoutes'中,看看是否是這個問題。然後我深入研究laravel源代碼,以瞭解如何創建route :: resource。那裏很漂亮,它看起來像我將有一個巨大的路線文件。 – Iannazzi