2014-09-20 67 views
0

我試圖學習Laravel,並且我想在調用控制器執行某些操作之前驗證用戶是否已登錄。 似乎有至少3種不同的方式來完成這一點,我想知道這些之間的區別。在Laravel中使用過濾器的方法 - 有什麼區別

Route::get('/main', '[email protected]')->before('auth'); 

Route::get('/main', array('before' => 'auth', 'uses' => '[email protected]')); 

還是在控制器的構造函數:

public function __construct() { 
    $this->beforeFilter('auth'); 
} 

回答

2

沒有區別。 Laravel是允許您以多種方式完成許多任務的框架。

我更願意加入路由過濾器對它們進行分組,例如:

// logged users paths 
Route::group(
    ['before' => 'auth'], 
    function() { 
     Route::get('/dashboard', [ 
       'as' => 'dashboard', 
       'uses' => '[email protected]' 
      ]); 
    } 
); 

// paths only for admin 
Route::group(
    ['before' => 'admin'], 
    function() { 
     Route::get('/admin', 
      ['as' => 'admin_dashboard', 
      'uses' => '[email protected]' 
      ]); 
     Route::get('/categories/{page?}', 
      ['as' => 'categories', 
      'uses' => '[email protected]' 
      ])->where('page', '[1-9]+[0-9]*'); 
    } 
); 

有這樣使用的一個好處 - 它更容易看,如果所有航線都有正確的過濾器。

假設您只想爲登錄用戶顯示一些內容,並且需要使用auth過濾器。您有許多控制器爲登錄用戶顯示內容。

如果直接在這些控制器或父控制器構造函數中使用beforeFilter下面的事情都可能發生:

  • 你可能會忘記把beforeFilter在所有的控制器構造
  • 你可以在你的控制器構造忘記運行父構造函數(你有beforeFilter的地方)
  • 你可以不擴展你想要的類(例如,你擴展BaseController,並且在AuthController中定義了beforeFilter,並且在一個或某些類中擴展了BaseController)

這些情況可能會導致您顯示未登錄用戶的內容,因爲您需要記住有關auth在每個控制器中對其進行過濾的情況,並且如果要確保自己做的都正確,則需要查看所有控制器的代碼。

使用路由分組(如上所示),您可以輕鬆查看一個文件(當然假設您使用一個文件進行路由),您將看到哪些路由使用auth過濾器,哪些不使用。

當然,我認爲很多人會對此事有自己的看法,但這是我個人偏好在路線中使用過濾器。

1

你兩種方式都沒有區別,只是不同的語法風格。

我更喜歡將驗證過濾器放入BaseController,然後從BaseController擴展我想驗證的所有控制器。只需寫一次,無處不在。順便說一句,你也可以把你的csrf過濾器在這裏。

class BaseController extends Controller { 
    public function __construct() { 
    $this->beforeFilter('auth'); 
    $this->beforeFilter('csrf', array('on' => 'post')); 
    } 
} 
相關問題