【问题标题】:Accessing view data inside top level component in Laravel (v8)在 Laravel (v8) 中访问顶级组件内的视图数据
【发布时间】:2021-10-07 23:20:22
【问题描述】:

是否有一种实用的方法可以访问更高级别组件上的视图数据?让我解释一下:

我有一个只有核心 HTML 标记的 基本布局
views/layouts/base.blade.php

<!DOCTYPE html>
<html >
    <head>
        <title>Page Title</title>
    </head>
    <body>
        {{ $slot }}
    </body>
</html>

一个主布局布局组件扩展了这个
views/layouts/main.blade.php

<x-base-layout>
    <x-header-main />
    {{ $slot }}
    <x-footer-main />
</x-base-layout>

两者都有组件类,可以在默认的views/components 文件夹之外工作。

然后,我的主页视图设置为这样
views/home.blade.php

<x-main-layout>
    <h1>{{ $data['my_heading'] }}</h1>
</x-main-layout>

来自 HomeController
app/Http/Controllers/HomeController.php

<?php

namespace App\Http\Controllers;

class HomeController extends Controller
{
    public function index()
    {
        $data = { "my_heading" : "My Heading", "my_email" : "my@email.com" };

        return view('home')->with(compact('data'));
    }
}

最后,真正的问题。我的Footer Main组件是这样的
views/components/footer-main.blade.php

<footer>
    <p>{{ $data['my_email'] }}</p>
</footer>

但是,正如你想象的那样,它不起作用。我收到一个错误:

错误异常 未定义变量:数据(查看: C:\my-project\resources\views\components\footer-main.blade.php)

完成这项工作的正确方法是什么?我知道我可能在这里遗漏了一些 Laravel 继承概念,但我还不知道。

【问题讨论】:

    标签: php laravel view components


    【解决方案1】:

    所以,经过一番努力,我找到了使用View Composers 的解决方案。我将描述我最终得到的结果,以防它对某人有所帮助。

    注意:层次结构中较高的组件,例如&lt;x-footer-main /&gt; 在我的例子中,它是一个视图,与你调用的最后一个视图一样多 通过您的路线/控制器。

    app\Providers中创建了一个ViewServiceProvider

    <?php
    
    namespace App\Providers;
    
    use App\Http\View\Composers\DataComposer;
    use Illuminate\Support\Facades\View;
    use Illuminate\Support\ServiceProvider;
    
    class ViewServiceProvider extends ServiceProvider
    {
        /**
         * Register services.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    
        /**
         * Bootstrap services.
         *
         * @return void
         */
        public function boot()
        {
            View::composer('*', DataComposer::class);
        }
    }
    

    将提供程序添加到 config 文件中。 config/app.php

    'providers' => [
        /*
                     * Application Service Providers...
        */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\ViewServiceProvider::class,
    
    ],
    

    创建了 DataComposer 类和文件夹结构,如app/Http/View/Composers/DataComposer.php

    <?php
    
    namespace App\Http\View\Composers;
    
    use Illuminate\View\View;
    use App\Models\Data;
    
    class DataComposer
    {
        protected $data;
    
        public function __construct()
        {
            // Dependencies are automatically resolved by the service container...
            $this->data = Data::all();
        }
    
        public function compose(View $view)
        {
            $view->with('data', $this->data);
        }
    }
    

    成功了!!!

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 2018-03-17
      • 2019-05-08
      • 2017-05-07
      • 2016-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多