2015-10-23 23 views
2

我有兩個類似的用戶配置文件,他們共享幾乎相同的視圖結構和信息。但是,「特殊用戶配置文件」會顯示一個附加的塊,並需要一個不同的URL - 例如/user/igor/special-user/igor如何將動作處理轉發到Laravel控制器中的第二個動作?

處理這個問題的最佳方法是什麼?

其他框架中我會僞代碼與此類似:

class UserController extends Controller { 

    /** @url /user/{$slug} */ 
    function actionSimpleUser($slug) { 
     if (!$this->viewHas('special')) { 
      $this->toView('special', false); 
     } 
     return $this->render('user', ['slug' => $slug]); 
    } 

    /** @url /special-user/{$slug} */ 
    function actionSpecialUser($slug) { 
     $this->toView('special', true); 
     return $this->forwardAction('user/simpleUser', [$slug]); 
    } 
} 

回答

2

有,你可以在Laravel實現此的各種方式。

你可以有兩條路線進去的2個控制器操作:

Route::get('/user/{slug}', '[email protected]'); 
Route::get('/special-user/{slug}', '[email protected]'); 

然後在這些控制器動作,可以使同樣的看法,並設置一個標誌,將其標記爲特殊或不:

public function userProfile($slug) 
{ 
    $user = User::where('slug', $slug)->first(); 
    $special = false; 
    return view('users.show', compact('user', 'special'); 
} 

public function specialUserProfile($slug) 
{ 
    $user = User::where('slug', $slug)->first(); 
    $special = true; 
    return view('users.show', compact('user', 'special'); 
} 

然後在視圖文件檢查用戶是否是特殊與否:

@if($special === true) 
    // special user code block 
@endif 
+0

我在想「forwa rding「,所以我可以分享他們之間的其他業務邏輯。在你的方法中分享代碼的最好方法是在兩個動作中調用受保護的方法,對吧? – igorsantos07

+1

是或者你可以有一個參數決定用戶是否特殊的路由。所以你可以有'Route :: get('users/{type}/{slug}','UserController @ userProfile');'並且在控制器內部動作有2個變量:'public function userProfile($ type,$ slug)',然後在動作內部,例如可以檢查類型是「常規」還是「管理員」。編輯:也是的,你可以將邏輯抽象爲一個被這兩個動作調用的受保護的方法。這對於非常相似的創建/更新方法非常有用。 –

相關問題