使用刀片在Laravel 5的所有页面上查看导航栏

时间:2017-04-03 14:46:23

标签: php laravel laravel-5

所以,我的主页中有一个导航栏,其中列出了从数据库中列出的所有模块名称。我没有在整个页面中将整个代码重写为列表模块名称,而是决定使用blade's @yeild()功能。

这是我的主页控制器,我获取所有模块名称并将其传递到主页视图,如此

public function index()
    {
        $data = Module::get();

        return view("BaseView.home")->with('data',$data);
    }

这是我的主页视图,我在其中显示所有模块及其在导航栏中的相应名称

<ul class="navbar-nav">
        @foreach($data as $modules)
        <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                {{ $modules->module_name) }}<i class="plusMinus" aria-hidden="true"></i>
            </a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                @foreach($modules->module_categories as $category)
                   <?php
                        $getModuleNameToLowerCase = strtolower($modules->module_name);
                        $getCategoryNameToLowerCase = preg_replace('/\s+/', '_', strtolower($category->categories_name));
                    ?>
                    <a class="dropdown-item" href="#">{{ $category->categories_name }}</a>
                @endforeach
            </div>
        </li>
        @endforeach
    </ul>

<div class="container-fluid">
    @yield('mainBody')
</div>

现在当我extend在另一个视图中这样

@extends('BaseView.home')

我得到Undefined variable: data

有人可以帮助我/指导我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

在您的控制器中,您需要将模块传递到每个视图,因为视图在新请求之后不会保留值。对于每个请求,必须有模块($ data) 请记住,使用一个master blade传递给controller method的数据不适用于另一个controller method,因为每次新请求都需要在主刀片和子刀片中再次使用这些变量的所有值

控制器

//..............
//................. 
public function index()
{
    $data['modules'] = Module::get();
    //$data['other_data'] = User::get(); //To get other data and pass to your view
    return view("BaseView.home")->with('data',$data);
}

public function profilePage()
{
    $data['modules'] = Module::get();
    //$data['profile_detail'] = Profile::get(); //To get other data and pass to your view
    return view("BaseView.home")->with('data',$data);
}
//Something like this

但是为每个控制器方法编写$data['modules'] = Module::get();,您可以在控制器的构造函数中编写它。这将适用于所有方法(请求)。

public function __construct(){
    $data['modules'] = Module::get();   
}
public function index()
{
    //$data['other_data'] = User::get(); //To get other data and pass to your view
    return view("BaseView.home")->with('data',$data);
}

//................
//.................

并查看:

<ul class="navbar-nav">
        <?php 
        if(isset($data['modules'])&&count($data['modules'])>0){
        ?>
        @foreach($data['modules'] as $modules)
        .............
        ..............

        @endforeach
        <?php 
        }
        else{
            echo "Modules are not available";
        }
        ?>
    </ul>

<div class="container-fluid">
    @yield('mainBody')
</div>

以上内容适用于您的错误消息,但如果您希望这些模块可以在任何地方使用,那么您可以使用sessioncreating helper

答案 1 :(得分:0)

不是在每个视图上传递数据,而是使用在加载任何视图之前触发的Providers引导方法,并在每个视图上传递默认数据。简单。