用 Laravel 开发 CMS,如何实现类似 dede:arclist 的模板标签

214 阅读2分钟

在 PHP 开发者圈子中,提到 CMS 系统,很难不想到织梦(Dedecms)。dede:arclist 是 Dedecms 中非常强大的标签,用于在模板中动态调用文章列表内容。如果你正在用 Laravel 开发一个类似 CMS 的系统,可能会想要实现类似的标签机制来简化前端模板逻辑。

本文将通过一个完整的案例,展示如何在 Laravel 中实现类似 dede:arclist 的模板标签功能,最终实现灵活调用内容的目标。


dede:arclist 功能回顾

在 Dedecms 中,dede:arclist 的用法如下:

{dede:arclist row="10" titlelen="50"}
    <li>[field:title/]</li>
{/dede:arclist}
  • 参数解释

    • row:指定显示的文章条数。
    • titlelen:限制标题长度。
  • 模板解析后:动态生成文章列表,具体内容依赖后台数据库。


Laravel 实现思路

核心步骤:

  1. 设计数据库和数据模型

    • 创建文章模型 Article
    • 定义文章表结构,存储必要字段。
  2. 实现标签解析器

    • 自定义标签解析器,将类似 dede:arclist 的标签转化为 PHP 代码。
  3. 模板引擎扩展

    • 扩展 Laravel 的模板引擎(Blade),支持自定义标签。
  4. 实现动态数据调用

    • 根据标签的参数动态生成文章列表。

代码实现

1. 创建数据库和模型

数据库迁移:

php artisan make:model Article -m

编辑 database/migrations/{timestamp}_create_articles_table.php

public function up()
{
    Schema::create('articles', function (Blueprint $table) {
        $table->id();
        $table->string('title', 255);
        $table->text('content');
        $table->integer('category_id')->unsigned()->index();
        $table->timestamps();
    });
}

运行迁移命令:

php artisan migrate

创建模型:

编辑 app/Models/Article.php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    protected $fillable = ['title', 'content', 'category_id'];
}

2. 构建标签解析器

我们需要一个服务类,专门处理标签的解析逻辑。

创建服务类:

php artisan make:service TagParser

编辑 app/Services/TagParser.php

namespace App\Services;

use App\Models\Article;

class TagParser
{
    public function parseArclist($parameters)
    {
        // 解析参数
        $row = $parameters['row'] ?? 10;
        $titlelen = $parameters['titlelen'] ?? 50;

        // 查询文章
        $articles = Article::latest()->take($row)->get();

        // 处理标题长度
        $articles->transform(function ($article) use ($titlelen) {
            $article->short_title = mb_substr($article->title, 0, $titlelen);
            return $article;
        });

        return $articles;
    }
}

3. 扩展 Blade 模板引擎

创建自定义 Blade 指令:

编辑 AppServiceProvider.php

use Illuminate\Support\Facades\Blade;
use App\Services\TagParser;

public function boot()
{
    // 注册 arclist 标签
    Blade::directive('arclist', function ($expression) {
        return "<?php echo view('components.arclist', ['parameters' => $expression])->render(); ?>";
    });
}

4. 创建标签模板

新建组件视图文件 resources/views/components/arclist.blade.php

@php
    $parser = app(\App\Services\TagParser::class);
    $articles = $parser->parseArclist($parameters);
@endphp

<ul>
    @foreach($articles as $article)
        <li>{{ $article->short_title }}</li>
    @endforeach
</ul>

5. 在模板中调用

现在可以像 Dedecms 一样在模板中调用:

@arclist(['row' => 5, 'titlelen' => 20])

测试结果

假设文章表中有以下数据:

IDTitleContentCategory ID
1Laravel 教程...1
2使用 PHP 构建 CMS...1
3Swoole 与 Laravel 整合...2

调用后,页面将输出:

<ul>
    <li>Laravel 教程</li>
    <li>使用 PHP 构建...</li>
    <li>Swoole 与 Larav...</li>
</ul>

功能扩展

支持更多参数

-   增加 `category` 参数,限制文章类别。
-   增加 `orderby` 参数,支持自定义排序。

修改 parseArclist 方法:

public function parseArclist($parameters)
{
    $row = $parameters['row'] ?? 10;
    $titlelen = $parameters['titlelen'] ?? 50;
    $category = $parameters['category'] ?? null;
    $orderby = $parameters['orderby'] ?? 'created_at';

    $query = Article::latest($orderby);

    if ($category) {
        $query->where('category_id', $category);
    }

    $articles = $query->take($row)->get();

    $articles->transform(function ($article) use ($titlelen) {
        $article->short_title = mb_substr($article->title, 0, $titlelen);
        return $article;
    });

    return $articles;
}

模板调用:

@arclist(['row' => 5, 'titlelen' => 20, 'category' => 1, 'orderby' => 'id'])

总结

通过本文的实现,我们在 Laravel 中构建了类似 Dedecms 的 dede:arclist 标签功能,支持动态调用文章列表,并具有良好的扩展性。这种方式不仅提高了前后端协作效率,也增强了模板灵活性。

如果你正在用 Laravel 构建一个 CMS 系统,希望本文的内容能对你有所帮助!