2014-12-05 44 views
0

我正在通過編寫一個小測試應用程序來學習如何使用Laravel。到目前爲止,它的發展非常好,我對該框架的所有功能感到興奮。但是,當我嘗試應用特定的設計模式時,我一直在打牆。Laravel基本控制器方法

我現在有一個設立在那裏我可以設置HTML標題,關鍵字和描述默認值主控制器,然後有選擇地改變它們在擴展它的子控制器:

基地控制器

protected function setupLayout() 
{ 
    $this->layout->title = 'Wow website'; 
    $this->layout->desc = 'Much technical'; 
    $this->layout->keys = 'so html, very javascript'; 

    $foot = View::make('mod.footerDefault'); 
    $this->layout->footer = $foot; 
} 

兒童控制器

public function getContact() 
{ 
    $this->title = 'Contact page of contactness'; 
    // Could also override the desc and keys if desired, 
    // but I'll just let them default here 

    $data = 'wow'; 
    $view = View::make('main.home', $data) 
     ->nest('vid', 'mod.video') 
     ->nest('list', 'mod.list'); 

    $this->layout->content = $view; 
} 

這是所有肉汁,但如果我有,我已經與之交互的對象,如菜單類,需要重新編譯成一串HTML? laravel中有沒有類似於自動調用setupLayout()方法的方法,但是每次調用View :: make方法時?

(更多的例子...只是爲了說明)

基地控制器

protected function setupLayout() 
{ 
    $this->menu = newMenu(); 
    $this->menu->items[0] = ['contact-us', 'Contact us']; 
    $this->menu->items[1] = ['about-us', 'About us']; 
    $this->menuString = $this->menu->getString(); 
} 

兒童控制器

public function getContact() 
{ 
    $this->menu->addItem(['log-out', 'Log out']); 
    // Now $this->menuString must be recalculated. 
    // Ideally want to avoid having to call a method from the base controller 
    // every time the child controller calls View::make 

    $view = View::make('main.home') 
    $this->layout->content = $view; 
} 

我知道有這樣的事,作爲視圖的作曲家,但我不認爲這些在View :: make()上被調用。

回答

1

我使用視圖編輯器創建了我的導航/菜單結構。

  • 創建提供數據的視圖
  • 爲您的導航部分(view/parts/navigation.blade.php)的圖的圖作曲家,只包含從由視圖作曲家提供
  • 綁定該作曲家到數據創建的導航與View::composer(your_view, your_composer)
  • 您的導航視圖包括導航視圖到任何其它視圖或主佈局@include('parts.navigation')

氏每個View::make()上都不會調用作曲家功能,但每次製作包含所包含導航部分的視圖時都不會調用。這就是你需要的。

這裏有一個如何看待作曲家是如何工作的:http://culttt.com/2014/02/10/using-view-composers-laravel-4/

+0

感謝您與我堅持通過這麼長的問題閱讀。我沒有意識到視圖作曲家在視圖呈現之前被調用。接受你的迴應後,我有一些關於我的工作。謝謝! – kohloth 2014-12-09 20:00:32

+0

而不是感謝您的意見,請使用該功能標記答案爲接受和/或upvote答案時,他們是有用的或downvote,如果他們是錯的。所以任何人都可以看到這個問題已經解決了。這是它的工作原理:http://stackoverflow.com/tour – 2014-12-10 07:00:24

0

繼承人我如何maanged得到它到底工作:

的路由文件(稍後會這一個更合適的地方):

// NB: KoBsMenu is the name of the menu class 

    App::before(function($request) { 
     $menu = [ 
      'brand' => [ 
       'left' => 'asdf', 
       'right' => ['floppy-save'] 
      ], 
      'leftItems' => [ 
       'home' => [1, 'home', 'Home'], 
       'factories' => [2, [ 
        'aboutF' => [1, 'about-factories', [''], 'About factories'], 
        'factoryL' => [2, 'factory-life', 'Factory life'], 
        'uk' => [3, [ 
         'leeds' => [1, 'leeds', 'Leeds'], 
         'reading' => [2, 'reading', 'Reading'] 
        ], 'UK'], 
        'usa' => [4, [ 
         'austin' => [1, 'austin', 'Austin'], 
         'kansas' => [2, 'kansas', 'Kansas'] 
        ], 'USA'] 
       ], 'Factories', ['tower']], 
      ... 
     ]; 

     App::singleton('mainMenu', 'KoBsMenu'); 
     $KoBsMenu = App::make('mainMenu'); 
     $KoBsMenu->buildMenu($menu); 
    }); 
    View::composer('*', function($view) 
    { 
     $KoBsMenu = App::make('mainMenu'); 
     $mainMenu = $KoBsMenu->getMenuHtml(); 
     $view->with('mainMenu', $mainMenu); 
    }); 

在基座控制器然後

$this->KoBsMenu = App::make('mainMenu'); 

然後,如果需要,我可以在主控制器中以編程方式添加/刪除菜單項。

$this->KoBsMenu->menu['leftItems']['testasfd'] = [1, 'bloh', [''], 'Bloh']; // Will be a public method ultimately 

後來終於在視圖:

{{ $mainMenu or '' }}