2014-06-23 100 views
0

我得到了一個情況,我有一個控制器負責返回視圖與需要顯示它的一些數據,但這些數據應該從多個視圖中顯示。重構控制器PHP/Laravel

讓我們舉個例子(不是真正的類,但只是得到的想法):

class UserMapController extends BaseController 
{ 

    public function index($username) 
    { 
     $posts = Post::all(); 
     $userInfo = User::findByUsername(username); 
     $otherData = Book::all(); 
     return View::make('user.profile',compact('posts','userInfo','otherData')); 
    } 

    public function albums($username) 
    { 
     $posts = Post::all(); 
     $userInfo = User::findByUsername(username); 
     $otherData = Book::all(); 
     $album = Album::findByUsername($username); 
     return View::make('user.albums',compact('posts','userInfo','otherData','username','album')); 
    } 

} 

在這種情況下,默認的數據是$posts$userInfo$otherData我可以在其他10種方法使用它會將它發送到視圖。

我在laravel中使用了View Composer,非常有幫助,但在這種情況下,問題是我從url獲得值,所以我無法執行乾淨動態的作曲家視圖(糾正我,如果我錯了)。

你怎麼做這種重構,當你需要新的數據發送到所有這些意見不會痛苦地插入它?

回答

1

通常將它們設置爲beforeFilter或多個是優選的,那麼您只需將變量設置爲實例變量,您可以隨意使用它們。您可以使用Route::parameter('nameOfParam')從路線中獲取參數。

beforeFilter and controller filter docs

例子:

<?php 


class MyController extends BaseController 
{ 
    public function __construct() 
    { 
     $this->beforeFilter("@posts"); 
    } 

    public function index() 
    { 
     return View::make('index', ['posts' => $this->posts]); 
    } 

    protected function posts() 
    { 
     $this->posts = Post::all(); 
    } 
+0

好的,謝謝我不知道這個技術,但是我仍然看不到很多動態因爲我仍然需要編寫變量來傳遞每個視圖的'make'方法。如我錯了請糾正我。另外一個解釋是你說使用'Route :: parameter('nameOfParam')'的地方是因爲使用'before'過濾器的參數作爲該方法的參數? – Fabrizio

+0

您對Route :: parameter()的需求斷言是正確的。至於不需要在每個操作中將它們插入到視圖層中,只需使用View :: share()或者只需在控制器中編寫一個輔助方法來準備給定的視圖,並從過濾器中加載參數,然後添加其他視圖參數。這會很好地抽象邏輯並仍然允許修改。 – machuga

+0

'Route :: parameter'和'Route :: input'有什麼區別? –

1

你可以看看景色的作曲家。基本上他們所做的就是將一些數據綁定到一個視圖,這樣無論何時調用一個視圖,該數據都會自動檢索並添加。它會將所有這些額外的邏輯放在你的控制器之外,你不用再擔心它了。

View::composer(array('user.profile','user.albums'), function($view) 
{ 
    $posts = Post::all(); 
    $userInfo = User::findByUsername(username); 
    $otherData = Book::all(); 
    $view->with(compact('posts', 'userInfo', 'otherData')); 
}); 

View::composer('user.albums', function($view) 
{ 
    $album = Album::findByUsername($username); 
    $view->with(compact('album')); 
}); 

我不相信有在哪裏把這些建議的或普遍的做法,但我更喜歡爲他們創造一個新的文件,並將它們添加到自動加載。

+0

謝謝!但是如果我需要一個來自url的參數呢?例如我有'http:// myapp.dev/username',我需要用戶名來獲得相同查詢的結果? – Fabrizio

+0

我還沒有嘗試過與視圖作曲家,但你應該能夠使用'路線::參數('用戶名');'從路線抓取用戶名參數。 – user3158900