Laravel基本控制器方法

时间:2014-12-05 16:48:38

标签: php 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()上调用的。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

以下我是如何让它最终运作的:

路线文件(稍后会将其移至更合适的位置):

    // 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 '' }}