在 PHP 开发者圈子中,提到 CMS 系统,很难不想到织梦(Dedecms)。dede:arclist
是 Dedecms 中非常强大的标签,用于在模板中动态调用文章列表内容。如果你正在用 Laravel 开发一个类似 CMS 的系统,可能会想要实现类似的标签机制来简化前端模板逻辑。
本文将通过一个完整的案例,展示如何在 Laravel 中实现类似 dede:arclist
的模板标签功能,最终实现灵活调用内容的目标。
dede:arclist
功能回顾
在 Dedecms 中,dede:arclist
的用法如下:
html 代码解读复制代码{dede:arclist row="10" titlelen="50"}
<li>[field:title/]li>
{/dede:arclist}
-
参数解释:
row
:指定显示的文章条数。titlelen
:限制标题长度。
-
模板解析后:动态生成文章列表,具体内容依赖后台数据库。
Laravel 实现思路
核心步骤:
-
设计数据库和数据模型:
- 创建文章模型
Article
。 - 定义文章表结构,存储必要字段。
- 创建文章模型
-
实现标签解析器:
- 自定义标签解析器,将类似
dede:arclist
的标签转化为 PHP 代码。
- 自定义标签解析器,将类似
-
模板引擎扩展:
- 扩展 Laravel 的模板引擎(Blade),支持自定义标签。
-
实现动态数据调用:
- 根据标签的参数动态生成文章列表。
代码实现
1. 创建数据库和模型
数据库迁移:
bash代码解读复制代码php artisan make:model Article -m
编辑 database/migrations/{timestamp}_create_articles_table.php
:
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();
});
}
运行迁移命令:
bash代码解读复制代码php artisan migrate
创建模型:
编辑 app/Models/Article.php
:
php 代码解读复制代码namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $fillable = ['title', 'content', 'category_id'];
}
2. 构建标签解析器
我们需要一个服务类,专门处理标签的解析逻辑。
创建服务类:
bash代码解读复制代码php artisan make:service TagParser
编辑 app/Services/TagParser.php
:
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
:
php 代码解读复制代码use Illuminate\Support\Facades\Blade;
use App\Services\TagParser;
public function boot()
{
// 注册 arclist 标签
Blade::directive('arclist', function ($expression) {
return " $expression])->render(); ?>";
});
}
4. 创建标签模板
新建组件视图文件 resources/views/components/arclist.blade.php
:
php 代码解读复制代码@php
$parser = app(\App\Services\TagParser::class);
$articles = $parser->parseArclist($parameters);
@endphp
@foreach($articles as $article)
{{ $article->short_title }}
@endforeach
5. 在模板中调用
现在可以像 Dedecms 一样在模板中调用:
php 代码解读复制代码@arclist(['row' => 5, 'titlelen' => 20])
测试结果
假设文章表中有以下数据:
ID | Title | Content | Category ID |
---|---|---|---|
1 | Laravel 教程 | ... | 1 |
2 | 使用 PHP 构建 CMS | ... | 1 |
3 | Swoole 与 Laravel 整合 | ... | 2 |
调用后,页面将输出:
html 代码解读复制代码<ul>
<li>Laravel 教程li>
<li>使用 PHP 构建...li>
<li>Swoole 与 Larav...li>
ul>
功能扩展
支持更多参数:
markdown 代码解读复制代码- 增加 `category` 参数,限制文章类别。
- 增加 `orderby` 参数,支持自定义排序。
修改 parseArclist
方法:
php 代码解读复制代码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;
}
模板调用:
php 代码解读复制代码@arclist(['row' => 5, 'titlelen' => 20, 'category' => 1, 'orderby' => 'id'])
总结
通过本文的实现,我们在 Laravel 中构建了类似 Dedecms 的 dede:arclist
标签功能,支持动态调用文章列表,并具有良好的扩展性。这种方式不仅提高了前后端协作效率,也增强了模板灵活性。
如果你正在用 Laravel 构建一个 CMS 系统,希望本文的内容能对你有所帮助!
评论记录:
回复评论: