Fusion是一个Laravel软件包,用于构建网站并通过将Markdown文件与Eloquent模型中的Frontmatter集成来管理内容。
Markdown是一种轻量级标记语言,使用简单的语法格式化纯文本,使用户可以轻松创建结构化文档,用于Web内容、文档等。
Frontmatter在Markdown中指的是文档开头的元数据,提供结构化信息,如标题、作者和日期。
Fusion是一个针对Laravel的开源软件包,您可以在GitHub仓库中访问:https://github.com/Hi-Folks/fusion (opens new window)。
Fusion将Markdown与Laravel模型集成,简化网站开发。
您可以通过以下方式快速安装该软件包:
composer require hi-folks/fusion
但在介绍如何使用Fusion之前,让我分享一下为什么您应该评估使用Fusion以及何时使用它。
那么,为什么开发人员应该采用Fusion,以及何时是网站内容管理的理想选择呢?
为什么选择Fusion? #
- 简单(Markdown)遇上强大(Eloquent模型):Fusion将Markdown语法的简单性与Frontmatter的健壮性相结合,使开发人员可以轻松管理内容。Markdown的直观格式使内容创建变得容易,而Frontmatter添加的元数据可提高组织和结构;
- 避免数据库依赖:在Laravel中,通常允许传统内容管理的Web应用程序严重依赖数据库,引入了复杂性和开销。Fusion允许Laravel开发人员直接在Markdown文件中管理内容。这不仅简化了开发,还提高了可移植性和可扩展性;
- 与Laravel Eloquent的无缝集成:Fusion将Markdown文件与Laravel强大的Eloquent ORM(对象关系映射)无缝集成。通过自动将Markdown文件的Frontmatter头部解析为Eloquent模型,Fusion使开发人员能够利用熟悉的数据库范式管理Markdown格式的内容。
何时使用Fusion? #
- 基于内容的网站:构建基于内容的网站时,如博客、文档门户或新闻平台,Fusion特别理想。其使用Markdown简化了内容管理流程,使其在需要丰富、结构化内容的项目中非常适用;
- 开发人员偏好Markdown:对于习惯于使用Markdown编写文档或创建README文件的开发人员来说,Fusion是其工作流程的自然延伸。其以Markdown为中心的方法减少了上下文切换,促进了生产力和代码清晰度;
- 无数据库开发:对于优化数据库依赖性的项目,Fusion是理想选择。无论是简单性、性能还是架构考虑,Fusion通过让Laravel开发人员通过Eloquent访问内容来提供无数据库的解决方案,同时不会降低功能性。
实际示例 #
现在让我们看一个实际示例。 我们有一个Laravel项目,我们将在其中添加Fusion软件包。 因此,我们将开始创建Markdown内容。 通过Fusion提供的命令,我们将创建我们将需要查询数据的模型。
安装Fusion #
要安装Fusion,我们将使用通常的composer命令:
composer require hi-folks/fusion
创建内容 #
现在我们想创建一些文章。
在resources/content
目录中,创建一个希望的内容名称的目录,例如article
。
因此,我们将创建resources/content/article
目录:
mkdir -p resources/content/article
在resources/content/article
中,我们将创建一些带有Frontmatter头部的Markdown文件。
第一个文件是resources/content/article/article-1.md
,我们将设置内容:
---
date: 2023-01-26
title: "Example title for article 1"
excerpt: This will be a short excerpt from article number 1.
published: true
highlight: true
head:
- tag: php
content: This content is about PHP
- tag: laravel
content: This content is about Laravel
---
# Article 1
Markdown goes here
第二个文件resources/content/article/article-2.md
将包含:
---
date: 2023-01-10
title: Example title for Article 2
excerpt: This will be a short excerpt from article number 2.
published: true
highlight: false
head:
- tag: php
content: This content is about PHP
- tag: symfony
content: This content is about Symfony
---
# Article 2
**Markdown** goes here
~~~php
echo "We love PHP!";
~~~
如您所见,我们创建了两个Markdown文件,每个文件都有一个Frontmatter头部,其中包括一些字符串类型字段(如title
字段)、日期类型字段(如date
字段)和一个更结构化的字段(如head
字段),可以保存一个数组(或在Laravel上下文中,我会说是一个集合)。
识别字段类型并不是强制性的,但我建议特别是为了充分利用我们可以从模型中获得的所有好处,定义良好的类型转换。但让我们一步一步来。
现在,我们已定义了Markdown文件(您当然可以创建多于两个),让我们继续生成Laravel Eloquent模型。
创建Eloquent模型 #
我们将创建一个Eloquent模型,这里是文章的模型,我们将其称为Article
,因为我们在article
文件夹中定义Markdown(小写)。
为了让Fusion正确解析Markdown文件并通过Eloquent使其可访问,我们需要在定义新模型时遵循一些小规则,例如:
- 扩展
FusionBaseModel
类; - 使用Trait
FusionModelTrait
; - 实现
frontmatterFields
方法,其中包含我们希望通过Eloquent模型提供的字段名称列表(数组)。
我们可以手动生成模型,例如,在Laravel应用程序的app/Models
目录中创建名为Article.php
的文件以定义Article类。
或者,您可以通过在Laravel项目中通过artisan使用fusion:sync-model
命令:
php artisan fusion:sync-model --path=resources/content/article --create-model
其中:
fusion:sync-model
是artisan命令;--path=
定义Markdown文件目录的路径;--create-model
要求Fusion生成模型类。
生成的模型位于app/Models/Article.php
:
<?php
namespace App\Models;
use HiFolks\Fusion\Models\FusionBaseModel;
use HiFolks\Fusion\Traits\Fu ```php
sionModelTrait;
class Article extends FusionBaseModel
{
use FusionModelTrait;
public function frontmatterFields(): array
{
return [
"date","title","excerpt","published","highlight","head"
];
}
}
字段类型转换 #
在 Eloquent 模型中,转换指的是自动将属性转换为原生类型,例如整数、布尔值、数组或 JSON,增强数据一致性并简化操作。
转换字段有助于在需要对字段进行排序或过滤时(想想日期时间字段或数组字段)。
因此,因为我们在 Frontmatter 中有一个日期和一个集合,我们可以添加转换,通过在模型中实现 casts()
方法:
protected function casts(): array
{
return [
'head' => 'collection',
'date' => 'datetime:Y-m-d',
];
}
如果您想了解更多关于字段(或属性)转换的内容,您可以查看 Laravel 文档中的Eloquent 文档 (opens new window)。
现在,因为我们创建了一个 Eloquent 模型,我们可以在 Laravel 应用程序中开始使用它,例如在控制器中或在 blade 组件中。
查询 Markdown 内容 #
现在,由于您的 Laravel 应用程序中有了 Eloquent 模型,您可以检索数据,例如按日期排序检索文章,您可以使用典型的 Eloquent 方法:
$articles = \App\Models\Article::orderBy('date')->get();
由于我们在 Article
模型中通过 casts()
方法为日期定义了转换,我们可以确保排序会对日期时间类型起作用,而不仅仅是一个字符串。
如果我们想按日期排序检索文章,并且只想要已发布的文章,我们可以使用 orderBy()
进行排序和 where()
进行筛选:
use App\Models\Article;
$articles = Article
::where('published', true)
->orderBy('date')
->get();
如果您熟悉 Eloquent,则对您来说没有什么新的内容,但是,"新鲜之处"是,在 Fusion 的幕后,您不必担心数据库管理;您的内容通过 Markdown 文件和 Frontmatter 标头进行管理。
因为在示例中,我们使用 published
字段进行筛选,您可以决定将 published
字段的类型强制转换为 boolean
。在这种情况下,您可以编辑 app/Models/Article.php 文件并更改 casts()
方法,添加您想要转换的字段,例如published
和 highlight
:
protected function casts(): array
{
return [
'head' => 'collection',
'date' => 'datetime:Y-m-d',
'published' => 'boolean',
'highlight' => 'boolean',
];
}
关于转换的另一件事,如果您将 head
字段转换为集合,您可以循环遍历 head
属性,例如在您的 blade 模板/组件中,您可以循环遍历文章,对于每篇文章,您可以循环遍历 head 项:
@foreach ($articles as $article)
@if (! is_null($article->head))
@foreach ($article->head as $headItems)
<div class="mx-3 px-8 badge badge-neutral">{{ $headItems["tag"] }}</div>
@endforeach
@else
<div class="mx-3 px-8 badge badge-ghost">No Tag</div>
@endif
@endforeach
要点 #
Fusion 重新定义了 Laravel 开发中的内容管理,为构建内容驱动的网站提供了一个实用且有效的解决方案。利用 Markdown 和 Frontmatter,Fusion 可以让开发人员轻松创建结构化的、无数据库的内容。无论是简化内容管理工作流程还是消除数据库复杂性,Fusion 都是 Laravel Web 开发人员工具箱中的多才多艺的工具。
拥抱 Fusion,并开始通过 Markdown 以高效简化的方式开发 Laravel 网站。
谢谢! #
您的反馈对我们非常宝贵。如果您发现本文章有帮助,请考虑点赞/分享文章,或给我们的 GitHub 仓库点星。
感谢您的支持,让 Fusion 变得更加完美!```