【问题标题】:Laravel: Failed to send variable (Undefined Variable)Laravel:无法发送变量(未定义变量)
【发布时间】:2014-12-01 09:20:22
【问题描述】:

我是 Laravel 的新手。我的视野有点问题。

这是我的控制器

public function main_menu()
{   
    $mainmenus = DB::table('main_menus')->get();

    $subs = $mainmenus;
    foreach ($subs as $key => $value) 
    {
        $subs[$key] = DB::table('sub_menus')
                        ->where('parent_id', '=' , $value->main_id)
                        ->get();
    }

    $products = DB::table('sub_menus')->get();
    foreach ($products as $key => $value) {
        $products[$key] = DB::table('products')
                                -> where('product_parent', '=', $value->sub_id)
                                ->get();
    }

    $data = array("mainmenus" => $mainmenus,
            "submenus" => $subs,
            "productmenus" => $products);

    return View::make('layouts/nav', $data);

}

这是我的布局/nav.blade.php

 @extends('layouts_index')

 @section('nav')
 <div class="nav">
 <nav class="navbar">
    <ul id="menu">

        <li class="active"><a href="index" class="drop"><i class="icon-home icon-small">  </i>Home</a></li>

        @foreach ($mainmenus as $key=>$mainmenu) 
            <li>
                <a href="menu/{{ $mainmenu->main_id }}" class="drop">
                <i class="icon-{{ $mainmenu->main_icon }} icon-small"></i>{{ $mainmenu->main_title_id }}</a>
                @if( $mainmenu->main_desc_id != "")
                    <div class="dropdown_3columns">
                        <div class="col_4">
                            <h3><i class="icon-{{ $mainmenu->main_icon }} icon-large"></i>{{ $mainmenu->main_title_id }}</h3>
                            <h4>{{ $mainmenu->main_desc_id }}</h4>  
                        </div>
                        @foreach ($submenus[$key] as $key=>$submenu) 
                            <div class="col_1">
                                <a href="" ><h5><i class="icon-small icon-bookmark"></i>{{ $submenu->sub_title_id }}</h5></a>   

                                <ul>
                                @foreach ($productmenus[$key] as $productmenu)
                                    <li>
                                        <a href="" ><i class="icon-small icon-th-large"></i>{{ $productmenu->product_title_id }}</a>
                                    </li>   
                                @endforeach

                                </ul>
                            </div>

                        @endforeach

                    </div>
                @endif
            </li>
        @endforeach
        <li class="last"><a href="#" class="drop "><i class="icon-pencil icon-small"></i>Tentang Kami</a></li>
    </ul> 
  </nav>
 </div>

@stop

我的路线:

  Route::get('/', 'ShowsController@index');

当我尝试运行 index.blade.php 它说: 未定义变量:mainmenus(查看:C:\xampp\htdocs\mestika\app\views\layouts\nav.blade.php)(查看:C:\xampp\htdocs\mestika\app\views\layouts\nav.blade。 php) (查看: C:\xampp\htdocs\mestika\app\views\layouts\nav.blade.php)

我想做的是我想在每个视图页面上显示 main_menu。我尝试将 view::make 更改为 view::share。但没有运气。这里有什么我想念的吗?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    为菜单/导航使用view composer,因此您不必在每个视图中手动构建导航,例如,将此代码放入名为nav.php 的文件中,然后将文件放入app/start文件夹然后从app/start/global.php 文件中包含它:

    // app/start/nav.php
    View::composer('layouts_index', function($view){
    
        // Prepare the menuitems here
    
        $mainmenus = DB::table('main_menus')->get();
        $subs = 'Prepare it here...';
        $productmenus = 'Prepare it'
    
        return $view->with('mainmenus', $mainmenus)
                    ->with('submenus', $submenus)
                    ->with('products', $products);
    
    });
    

    在您的app/start/global.php 文件中(在底部)添加:

    require 'nav.php';
    

    现在,每次您扩展 layouts_index.blade.php 时,您的菜单项($mainmenus、$submenus、$productmenus)都将在主布局中可用。所以,你可以在布局中使用这样的东西:

    @if(isset($mainmenus))
        @foreach ($mainmenus as $key => $mainmenu)
            {{ 'Use it here...' }}
        @endforeach
    @endif
    

    现在,在您的 Controller 中,当您将任何数据传递给扩展 layouts_index 的任何视图时,您无需手动传递菜单项,因为这些菜单项将由 Framework 通过 view composer 传递你已经创建了。

    如果您不想传递 products 的菜单项,则只需从视图作曲家中删除 -&gt;with('products', $products),因此只有 $mainmenus and $submenus 会自动传递到主布局,您可以传递 @987654338 @从任何控制器手动。检查this article

    【讨论】:

    • 我尝试了你的建议。但是刷新时我得到了一个空白。
    • 确保你扩展了正确的布局,视图作曲家绑定到layouts_index,这是正确的主布局吗?
    • 哦,我在我的 app/nav.php 中忘记了
    • 好吧,我有问题了。在我的 layout_blade 中,我使用 include 而不是 yield。我改变了它,现在它可以加载了。但未显示导航。
    • 它解决了。实际上在 nav.php 我无法查看:composer 其他视图文件。 (nav.blade.php) 所以我试图将 nav.blade.php 移动到 layouts.blade.php。它就像魅力一样。
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多