用Fusion简化网站开发:Markdown内容管理

Fusion: Markdown内容管理

Fusion是一个Laravel包,用于构建网站并通过将Markdown文件与Eloquent模型中的Frontmatter集成来管理内容。

Markdown是一种轻量级标记语言,使用简单的语法来格式化纯文本,让用户能够轻松创建结构化文档,用于网站内容、文档等。

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 Models)相结合: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: "Article 1的示例标题"
excerpt: 这将是来自文章1的简短摘要。
published: true
highlight: true
head:
  - tag: php
    content: 这个内容是关于PHP的
  - tag: laravel
    content: 这个内容是关于Laravel的
---

# 文章1

Markdown在这里

如您所见,我们有一些字段,如date(日期),title(标题),excerpt(摘要),published(已发布),highlight(高亮),还有一个包含结构化数据数组的head字段。

第二个文件resources/content/article/article-2.md将包含:

---
date: 2023-01-10
title: Article 2的示例标题
excerpt: 这将是来自文章2的简短摘要。
published: true
highlight: false
head:
  - tag: php
    content: 这个内容是关于PHP的
  - tag: symfony
    content: 这个内容是关于Symfony的
---

# 文章2

**Markdown**在这里

~~~php
echo "我们热爱PHP!";
~~~

正如您所见,我们创建了两个Markdown文件,每个文件都有一个Frontmatter头,其中包含一些字符串类型字段,例如title字段,日期类型字段,例如date字段,以及一个更结构化的字段,如head字段,它可以保存数组(在Laravel上下文中,我会说是集合)。 识别字段类型并不是强制的,但我建议这样做,特别是为了充分利用我们可以从模型中得到的所有优势。 但让我们一步一步来。

现在我们已经定义了Markdown文件(当然,您可以创建更多文件),让我们继续生成Laravel Eloquent模型。

创建Eloquent模型 #

我们将创建一个Eloquent模型,此处是用于文章的模型,我们将其命名为Article,因为我们正在定义article文件夹(小写)中的Markdowns。

为了使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模型中,"casting"指的是自动将属性转换为原生类型,例如整数、布尔值、数组或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()方法中添加要转换的字段,例如publishedhighlight

protected function casts(): array
{
    return [
        'head' => 'collection',
        'date' => 'datetime:Y-m-d',
        'published' => 'boolean',
        'highlight' => 'boolean',
    ];
}

关于转换还有一点要提及,如果您将head字段转换为集合,可以循环遍历head属性,例如在您的blade模板/组件中,可以循环遍历文章,对于每篇文章,可以循环遍历头部项目:

@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变得更加完美!```