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

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() 方法,添加您想要转换的字段,例如publishedhighlight

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