Laravel - 如何将变量传递给布局局部视图

16

我在主布局中有一个部分视图,即导航栏。 我有一个名为$userApps的变量。 如果该变量检查到用户已启用应用程序(true),则我想在导航栏中显示与该应用程序相关的链接。

主页扩展自包含部分视图navbar的master.layout

navbar.blade.php中的代码如下:

@if ($userApps)
    // display link
@endif

然而我遇到了一个未定义变量错误。如果我在控制器的常规视图中使用它,在声明变量并将控制器路由到视图后它可以正常工作。我认为我不能将控制器放入布局中,因为我无法将控制器路由到部分视图,那么我该如何优雅地解决这个问题呢?


1
使用视图组合器检查此示例:https://github.com/achrafkh/proj/blob/master/app/Providers/viewcomposerprovider.php - Achraf Khouadja
5个回答

29
你使用的Laravel版本是什么?对于你的情况应该是这样的:
@include('partials.navbar', ['userApps' => $userApps])

仅供测试目的,我在本地进行了操作,并且它可以正常工作:

routes.php

Route::get('/', function () {
    // passing variable to view
    return view('welcome')->with(
        ['fooVar' => 'bar']
    );
});

resources/views/welcome.blade.php

// extanding layout
@extends('layouts.default')

resources/views/layouts/default.blade.php

// including partial and passing variable
@include('partials.navbar', ['fooVar' => $fooVar])

resources/views/partials/navbar.blade.php

// working with variable
@if ($fooVar == 'bar')
  <h1>Navbar</h1>
@endif

所以问题肯定是出在其他地方。检查你的路径和变量名。


1
我使用的是5.2版本。我尝试了这个方法,但它仍然不起作用。我需要将变量添加到从视图到主模板的@extend中吗? - pleasega
1
这在 Laravel 8 中运行良好,比视图组合器方法简单得多... - DragonFire

8
其他答案对我没用,或者似乎只适用于旧版本。对于像 Laravel 7.x 这样的新版本,语法如下。
在父视图中:
@include('partial.sub_view', ['var1' => 'this is the value'])

在子视图中:
{{ $var1 }}

4

我已经查看了所有答案,但以下是最佳方法,因为您也可以在 serviceProvider 中运行查询。

您需要创建一个单独的服务或者您可以使用 AppServiceProvider

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer('layouts.admin-layout', function ($view) {
            $view->with('name', 'John Doe');
        });
    }
}

在您的布局中

{{$name}}

为什么这是最佳方式呢?最佳方式适用于哪种特定情况,在问题中我找不到提到。 - shaedrich
根据我的经验,我认为这是最好的方法。如果你有其他解决方案,为什么不发表自己的答案,而是批评呢? - Soubhagya Kumar Barik
如果你非常确信自己的答案更好,建议你解释一下。 - shaedrich
1
干得好!非常繁琐... - Bira
谢谢,@Bira。希望这个答案对你有帮助。 - Soubhagya Kumar Barik

2
这个方法非常简单:
在父视图中:

parent view:

@include('partial.sub_view1', ['This is value1' => $var1])

在子视图中:
{{ $var1 }}

1
这对我没有用,它只是字面上显示 {{ $var1 }} - Kokodoko
虽然有点晚了,但如果 {{ }} 显示的是字符串字面量,那很可能是因为您没有将文件命名为 Blade 文件,例如 file.blade.php。这通常会发生在您像 file.php 这样的文件名中,因为它是 Blade 语法而不是显示。我现在添加这个信息,以防对其他人有所帮助。 - party-ring

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接