主页/PHP笔记/PHP问答/框架Laravel/Laravel 视图组合器:实用指南

Laravel 视图组合器:实用指南

Bug编译狮

Bug编译狮

《Laravel 视图组合器:实用指南》

在 Laravel 中,视图组合器(View Composers)是一种非常强大的工具,可以帮助你在应用的不同部分共享数据。它们可以减少重复代码,并且使代码更加模块化和易于维护。

什么是视图组合器?

视图组合器是通过 AppProvidersViewComposerServiceProvider 注册的类。当请求被路由到控制器时,Laravel 会自动调用这些组合器来生成视图数据。

如何使用视图组合器?

  1. 创建视图组合器: 首先,你需要创建一个新的视图组合器类。例如,假设你有一个 UserComposer 类:

    namespace AppProviders;
    
    use IlluminateSupportFacadesView;
    use AppModelsUser;
    
    class UserComposer
    {
       public function compose(View $view)
       {
           $user = User::find(1);
           $view->with('user', $user);
       }
    }
  2. 注册视图组合器: 在 config/app.php 文件中的 providers 数组中添加 AppProvidersViewComposerServiceProvider

    'providers' => [
       // 其他服务提供者...
    
       AppProvidersViewComposerServiceProvider::class,
    ],
  3. 配置视图组合器: 在 config/view-composers.php 文件中定义要使用的组合器:

    return [
       'user' => AppProvidersUserComposer::class,
    ];
  4. 在控制器中使用组合器: 在控制器中,你可以直接访问组合器并获取数据:

    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    
    class UserController extends Controller
    {
       public function show($id)
       {
           $user = User::find($id);
    
           return view('users.show')->with([
               'user' => $user,
           ]);
       }
    }
  5. 在 Blade 模板中使用数据: 在 Blade 模板中,你可以像使用其他变量一样使用 $user 数据:

    <div>
       <h1>{{ $user->name }}</h1>
       <p>Email: {{ $user->email }}</p>
    </div>

示例代码

以下是一个完整的示例,展示了如何使用视图组合器:

1. 创建视图组合器

namespace AppProviders;

use IlluminateSupportFacadesView;
use AppModelsUser;

class UserComposer
{
    public function compose(View $view)
    {
        $user = User::find(1);
        $view->with('user', $user);
    }
}

2. 注册视图组合器

// config/app.php
return [
    // 其他服务提供者...

    AppProvidersViewComposerServiceProvider::class,
];

3. 配置视图组合器

// config/view-composers.php
return [
    'user' => AppProvidersUserComposer::class,
];

4. 在控制器中使用组合器

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    public function show($id)
    {
        $user = User::find($id);

        return view('users.show')->with([
            'user' => $user,
        ]);
    }
}

5. 在 Blade 模板中使用数据

<!-- resources/views/users/show.blade.php -->
<div>
    <h1>{{ $user->name }}</h1>
    <p>Email: {{ $user->email }}</p>
</div>

通过这种方式,你可以轻松地将数据从多个地方传递到视图中,从而提高代码的复用性和可读性。

黑板Bug讲师

黑板Bug讲师

介绍

View Composers in Laravel 提供了一种优雅且方便的方式来在整个应用的所有视图之间共享数据。这些强大的功能使得开发人员能够以紧凑和可测试的方式组织负责准备视图数据的代码。这简化了传递数据的过程,无需手动在每个控制器方法内绑定数据。在这份实用指南中,我们将探索视图组合器并了解它们如何使您的 Laravel 应用程序更整洁、更高效。

视图编排器(View Composer) 是Adobe Photoshop中的一个工具,用于创建和编辑图像的视图布局。它允许用户根据需要重新排列、调整大小或删除图像的不同部分。视图编排器可以帮助用户更有效地组织和展示他们的设计工作,提高工作效率并确保视觉效果的一致性。

视图编译器是一种回调或类方法,用于在视图渲染时调用。如果您希望将数据绑定到每个视图的每次渲染过程中应用到整个应用程序,则可以使用视图编译器来组织该逻辑到一个单一的位置。

创建视图组合器

首先,让我们创建一个简单的视图组件。假设您希望在所有视图之间共享用户数据。您可以使用闭包式组件或类式组件。我们从一个闭包式的例子开始:

// Using Closure-based composer
View::composer('layouts.app', function ($view) {
    $view->with('profile', Auth::user()->profile);
});

请提供需要翻译的代码。boot你们一家服务提供商采用的一种方法,通常AppServiceProvider已收到指令,请提供需要翻译的内容。

如果你更喜欢使用类,可以先通过 Artisan 命令生成它。

php artisan make:provider ComposersServiceProvider

然后,服务提供者内部可以绑定视图编译类到视图:

public function boot()
{
    View::composer(
        'layouts.app',
        'AppHttpViewComposersUserProfileComposer'
    );
}

接下来,创建一个 Composer 类,在视图 layouts.app 被渲染时调用:

namespace AppHttpViewComposers;

use IlluminateViewView;
use IlluminateSupportFacadesAuth;

class UserProfileComposer
{
    public function compose(View $view)
    {
        $view->with('profile', Auth::user()->profile);
    }
}

将作曲家与多个视图关联起来

如果需要为多个视图附加一个编曲家,可以将数组作为第一个参数传递:

View::composer([
    'dashboard',
    'profile.index',
    'layouts.app'
], UserProfileComposer::class);

创建视图创造者

视图创建者与视图组合器非常相似,但它们在视图实例创建后立即调用,而不是在视图渲染时调用。以下是一个使用视图创建者的示例:

View::creator('layouts.app', UserProfileComposer::class);

传递额外数据给作曲家

还可以通过类型提示它所需的任何依赖项,视图组合器可以接收除了视图实例之外的额外数据。compose方法:

use AppSegment;

class UserProfileComposer
{
    protected $segment;
    
    public function __construct(Segment $segment)
    {
        // Dependencies are automatically resolved by the service container...
        $this->segment = $segment;
    }

    public function compose(View $view)
    {
        $view->with('profile', Auth::user()->profile);
        $view->with('segment', $this->segment->get());
    }
}

正在测试视图组件。

使用Laravel的视图组合器进行测试非常简单。你可以在一个测试中渲染一个视图,然后对视图数据进行断言。让我们来看一个例子:


use TestsTestCase;
class ViewComposerTest extends TestCase
{
    public function testProfileDataIsBoundToView()
    {
        $user = factory(User::class)->create();

        $this->actingAs($user)
            ->get('/home')
            ->assertViewHas('profile', $user->profile);
    }
}

结论。

Laravel视图组合器提供了一种方便的方法,可以将公共数据分享给应用程序中的所有视图,从而促进更好的组织和代码清洁度。通过应用本指南提供的概念和示例,您可以增强维护和扩展您Laravel应用程序前端的能力。

长工码奴1523

长工码奴1523

Laravel 是一个非常流行的 PHP 开发框架,它提供了强大的视图功能来帮助开发者构建和管理网页。视图是 Laravel 应用程序的核心组成部分之一,用于渲染 HTML 代码,并将数据与模板相结合。

要点:

  1. 理解 Laravel 的视图基础

    • 基本概念:视图是一组 HTML 代码片段,它们负责生成特定的页面内容。
    • 视图控制器:视图控制器(通常位于 app/Http/Controllers 文件夹)负责处理视图请求并返回相应的 HTML。
  2. 使用 Laravel 视图组合器

    在 Laravel 中,你可以通过视图组合器将多个视图合并成一个完整的页面。这有助于保持代码整洁,同时简化维护。

  3. 视图组合器的基本原理

    视图组合器是一种工具,允许你在 Laravel 中创建复杂的视图结构。它将不同的视图文件组合在一起,形成一个新的视图。这可以通过以下几种方式实现:

  • 继承自父类:可以继承现有视图的某些部分到新视图中,例如使用 @extends 或者 @parent 指令。
  • 嵌套使用:可以将一个视图中的内容嵌入另一个视图中,从而达到层次化的效果。
  • 使用组合指令:在视图控制器中使用 @section@slot 指令来指定哪些区域应显示哪个视图的内容。
  1. 示例代码
// 示例视图控制器

use IlluminateHttpRequest;
use IlluminateSupportFacadesRoute;

class MyController extends Controller
{
    public function index(Request $request)
    {
        // 创建视图
        return view('my_view', [
            'title' => 'My View',
            'content' => 'Hello, World!'
        ]);
    }
}

// 示例视图

<div>
    <h1>{{ $title }}</h1>
    <p>{{ $content }}</p>
</div>

在这个例子中,我们定义了一个名为 MyController 的控制器,该控制器有一个方法 index 来展示一个名为 my_view 的视图。视图包含了两个变量 $title$content,分别表示视图标题和内容。

  1. 优化与性能考虑

    使用视图组合器时,请确保遵循最佳实践,如避免冗余代码、定期审查和更新代码等,以提高应用程序的整体性能。

  2. 总结

    使用 Laravel 视图组合器可以帮助你有效地组织和管理复杂的视图结构。通过了解视图的基础知识和如何利用视图组合器,你可以更轻松地编写和维护高质量的 Laravel 应用程序。