【问题标题】:Laravel base controller methodsLaravel 基本控制器方法
【发布时间】:2014-12-10 04:08:39
【问题描述】:

我正在通过编写一个小测试应用程序来学习如何使用 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() 上调用的。

【问题讨论】:

    标签: php laravel


    【解决方案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/

    【讨论】:

    • 感谢您关注我并阅读这么长的问题。我没有意识到在视图渲染之前调用了视图作曲家。在听取了您的回复并玩了一些游戏后,我已经开始工作了。谢谢!
    • 请使用该功能将答案标记为已接受和/或在有用时投票或在错误时投票,而不是感谢 cmets。所以任何人都可以看到这个问题已经解决了。以下是它的工作原理:stackoverflow.com/tour
    【解决方案2】:

    这是我最终如何让它工作的:

    路由文件(稍后会移到更合适的位置):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2020-05-15
      • 2017-09-20
      • 1970-01-01
      相关资源
      最近更新 更多