【问题标题】:Laravel - How to pass variable to layout partial viewLaravel - 如何将变量传递给布局部分视图
【发布时间】:2016-11-20 00:10:14
【问题描述】:

我在主布局中有一个部分视图,即导航栏。我有一个变量$userApps。此变量检查用户是否启用了应用程序(true),如果启用,那么我想在导航栏中显示指向应用程序的链接。

主页扩展了包含 partials.navbar 的 master.layout

我在 navbar.blade.php 中的代码是这样的:

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

但是我得到一个未定义的变量错误。如果我在带有控制器的普通视图中使用它,则在声明变量并将控制器路由到视图后它可以正常工作。我认为我不能将控制器放到布局中,因为我无法将控制器路由到局部视图,那么我该如何优雅地做到这一点?

【问题讨论】:

标签: php laravel model-view-controller


【解决方案1】:

你使用什么版本的 Laravel?你的情况应该是这样的:

@include('partials.navbar', ['userApps' => $userApps])

只是为了测试的目的,我在本地做了,它可以工作:

routes.php

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

资源/视图/welcome.blade.php

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

资源/视图/布局/default.blade.php

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

资源/视图/partials/navbar.blade.php

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

所以问题一定出在其他地方。检查您的路径和变量名称。

【讨论】:

  • 我用的是 5.2。我试过这个,它仍然不起作用。我是否也必须将变量添加到从视图到主视图的@extend 中?
  • 这在 laravel 8 中工作,它比 viewcomposer 方法简单得多......
【解决方案2】:

其他答案对我不起作用,或者似乎只适用于旧版本。对于 Laravel 7.x 等较新的版本,语法如下。

在父视图中:

@include('partial.sub_view', ['var1' => 'this is the value'])

在子视图中:

{{ $var1 }}

【讨论】:

    【解决方案3】:

    我已经浏览了所有答案,但以下是最好的方法,因为您也可以在 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 根据我的经验,我认为这是最好的方法。如果您有任何其他解决方案,为什么不发布自己的答案而不是批评?
    • 建议解释你的答案,特别是如果你确信你的答案更好。
    • 出色的工作!很乏味...
    【解决方案4】:

    这个方法很简单:

    父视图中:

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

    子视图中:

    {{ $var1 }}
    

    【讨论】:

    • 这对我不起作用,它只是按字面意思显示{{ $var1 }}
    • 迟到了,但是如果{{ }} 是按字面意思显示字符串,可能是因为您没有将文件命名为刀片文件,例如file.blade.php。如果您创建像file.php 这样的文件名,通常会发生这种情况,因为它是不显示的刀片语法。现在添加它以防它对其他人有帮助。
    【解决方案5】:

    您可以使用视图编辑器将变量发送到局部视图。 查看 laravel.com 上关于视图作曲家的 laravel 文档。 您还可以查看以下链接,该链接将帮助您解决此问题。 https://scotch.io/tutorials/sharing-data-between-views-using-laravel-view-composers

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      • 2021-05-07
      相关资源
      最近更新 更多