介绍 Laravel 中的视图组件,作为视图组合器的替代方案

发布日期:作者:

Introducing View Components in Laravel, an alternative to View Composers image

在软件开发中,“最佳实践”之一是创建可重用的代码,这些代码可以在需要时在应用程序的不同部分中实现。

想象一下,您有一个博客,您需要在侧边栏上显示一个“亮点”小部件。

这些“亮点”将使用 API 响应进行填充。

因此,在您的主页控制器中,您可能会有类似以下内容

<br></br><?php
 
class HomeController extends Controller {
 
protected $blog;
 
public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}
 
public function index()
{
return view('blog', [
'posts' => $blog->latest(),
'highlights' => $blog->highlights()
]);
}
}

简洁明了,但这在您需要将相同的“亮点”变量传递到您网站的每个页面(例如,联系页面)时会开始成为问题。

<?php
 
class ContactPageController extends Controller {
 
protected $blog;
 
public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}
 
public function index()
{
return view('contact', [
'highlights' => $blog->highlights()
]);
}
}

想象一下,如果您有 20 个不同的控制器会发生什么?您最终可能会遇到大量的代码重复,并且随着应用程序的增长,它将变得更难维护。

使用 Laravel 的视图组合器

视图组合器允许您将逻辑移到控制器之外,并将数据传递到指定的视图集。

<?php
 
class HighLightsComposer
{
 
protected $users;
 
public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}
 
public function compose(View $view)
{
$view->with('highlights', $this->blog->highlights());
}
}

然后,在您的服务提供者中,您将拥有类似以下内容

<?php
 
class ComposerServiceProvider extends ServiceProvider
{
public function boot()
{
View::composer(
'highlights', 'App\Http\ViewComposers\HighlighsComposer'
);
}
}

此时,您可以像这样重构您的控制器

<?php
 
class HomeController extends Controller {
 
protected $blog;
 
public function __construct(BlogRepository $blog)
{
$this->blog = $blog
}
 
public function index()
{
return view('blog', [
'posts' => $blog->latest()
]);
}
}
 
 
class ContactPageController extends Controller {
 
public function index()
{
return view('contact');
}
 
}

思考产品

乍一看,这似乎很棒,但让我们仔细想想。

当您使用“视图组合器”时,这个过程有点像魔法,并在应用程序中一个不那么明显的部分运行,特别是对于那些没有太多使用 Laravel 经验的人来说。

想象一下,您的客户要求您将“亮点”小部件的内容替换为静态内容。在当前示例中,您只需更新“highlights.blade.php”文件的内容即可。

应用程序将按预期工作,但是,API 调用将在后台(在视图组合器中)运行。

因此,无论您是否从视图中删除逻辑,您都需要更改视图的名称,或更新服务提供者以停止来自视图组合器的 API 调用。

使用视图组件

以下是我目前正在使用的一个项目中正在使用的一种方法,我编造了这个名字,您可以随意称呼它。

我们想要的是重用一个通用视图,该视图将使用动态数据(来自任何资源)构建。

创建一个新的 Highlights 组件类

这些“视图组件”类可以共享一个接口或契约来指定我们想要返回的数据类型。在这种情况下,Laravel 的 Htmlable 契约非常适合。

<?php
 
namespace App\ViewComponents;
 
use Illuminate\Support\Facades\View;
use Illuminate\Contracts\Support\Htmlable;
 
class HighlightsComponent implements Htmlable
{
protected $blog;
 
public function __construct(BlogRepository $blog)
{
$this->blog = $blog;
}
 
public function toHtml()
{
return View::make('highlights')
->with('highlights', $this->blog->highlights())
->render();
}
}

创建一个新的 blade 指令来渲染视图组件

由于我们在上面的类中使用了依赖注入,因此最好使用 IOC 为我们解析这些依赖项。

<?php
 
class AppServiceProvider extends ServiceProvider
{
public function register()
{
Blade::directive('render', function ($component) {
return "<?php echo (app($component))->toHtml(); ?>";
});
}
}

最后,您可以“渲染”视图组件,它将在任何视图上返回一个 HTML 部分。

// home.blade.php
 
@render(\App\ViewComponents\HighlightsComponent::class)

总结

使用这种方法,您可以在应用程序中的任何视图上重用使用动态数据的复杂组件。

组件逻辑只有在通过 @render() blade 指令包含时才会运行。

如果您与一个大型开发人员团队合作,您可以确保,如果任何人更改视图中小部件的实现而无需更新后端的实现,您的应用程序的性能不会受到影响。

Jeff photo

我是一名全栈 Web 开发人员,兼职作家。

您可以在 https://medium.com/@jeffochoa 上找到我的更多作品。

Cube

Laravel 时事通讯

加入 40,000 多名其他开发者,永不错过新提示、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成功能和对本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron,两位来自“绝不妥协”播客的经验丰富的开发者,现在可以为您的 Laravel 项目雇佣。 ⬧ 固定费率 7,500 美元/月。 ⬧ 无需冗长的销售流程。 ⬧ 无需签订合同。 ⬧ 100% 退款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动化的 Laravel 升级和代码现代化,以保持您的应用程序新鲜。

Shift
Bacancy logo

Bacancy

使用经验丰富的 Laravel 开发人员为您的项目提供动力,他们拥有 4-6 年的经验,每月只需 2,500 美元。获得 160 小时的专业知识和 15 天的无风险试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想之选,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的力量带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,它包含运行现代 SaaS 所需的所有功能。支付、漂亮结账、管理面板、用户仪表板、身份验证、准备好的组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,帮助企业取得成功

Rector
MongoDB logo

MongoDB

使用 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解灵活、现代的 MongoDB 数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包为您的 Laravel 应用程序添加评论

阅读文章