2017-07-17 35 views
-1

我在Symfony 3中有以下代碼,其中一些用戶有錯誤的鏈接,而Symfony正在爲它顯示一個空白頁面。該代碼是這樣的:如何在Symfony 3中缺少參數時重定向到登錄頁面

/** 
    * @Route(
    * "/account/reset-password/{user_id}/{hash}", 
    * name="reset_password" 
    *) 
    */ 
    public function accountResetPasswordAction(Request $request, $user_id, $hash) {} 

/帳號/重置密碼/ 1/ABCD - 這將是正確的URL

/帳號/重置密碼// ABCD - 有無論如何,我可以重定向到登錄頁面?

+1

你應該把要求的'{USER_ID}'參數,迫使像'\ d +'正則表達式。然後它會在你描述的第二個鏈接404上 –

+0

@jasonRoman對不起夥伴沒有讓你指點 –

+0

請看這裏:http://symfony.com/doc/current/routing.html#adding-wildcard-requirements –

回答

1

根據您的需求,這裏有兩種方法。

首先,完全控制在哪裏發送用戶。

/** 
    * @Route(
    * "/account/reset-password/{user_id}/{hash}", 
    * name="reset_password" 
    *) 
    */ 
    public function accountResetPasswordAction(Request $request, $user_id = null, $hash = null) { 
    if (!$user_id || !$hash) { 
     return $this->redirectToRoute('your_login_route'); 
    } 
    } 

如果你是一個404 page而不是OK,你可以把那些兩個參數的要求。

/** 
    * @Route(
    * "/account/reset-password/{user_id}/{hash}", 
    * name="reset_password", 
    * requirements={"user_id":"\d+", "hash":"[a-zA-Z0-9]+"} 
    *) 
    */ 
+0

我已經嘗試了第一種方法,但如果參數丟失,控件不在函數本身中,它不起作用。 –

+0

如果您還想覆蓋缺少的參數,則需要缺省值。我補充說。 – colburton

+0

第二部分爲我感謝:) –

0

如果你真的需要的403,而不是404,那麼你應該這樣做

if (null === $user_id) { 
    throw $this->createAccessDeniedException(); 
} 

那麼你的防火牆應該捕獲該異常,並自動重定向到您的登錄表單。

此快捷方式可以是Symfony的控制器,因爲2.5(見這裏)