2014-12-05 75 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 '' }}