基于laravel-modules实现WordPress式SEO模块跨模块调用方案咨询
Laravel Modules 下SEO模块与文章/页面模块的集成思路
1. 数据库层面关联
- 给SEO模块创建
seo_meta表,字段包含id,module_type(存储posts或pages),module_id(对应文章/页面的ID),title,description,keywords,canonical_url等SEO核心字段。 - 在Posts和Pages模块的模型中,添加多态关联:
// Posts模块的Post模型 public function seoMeta() { return $this->morphOne(SeoMeta::class, 'module'); } // Pages模块的Page模型同理 - SEO模块的
SeoMeta模型定义反向多态关联:public function module() { return $this->morphTo(); }
2. 表单集成:在文章/页面编辑页嵌入SEO字段
- SEO模块提供可复用的Blade组件
seo-fields.blade.php,封装所有SEO输入项:<div class="seo-section"> <h3>SEO设置</h3> <div class="form-group"> <label>SEO标题</label> <input type="text" name="seo[title]" value="{{ old('seo.title', $model->seoMeta?->title) }}"> </div> <div class="form-group"> <label>SEO描述</label> <textarea name="seo[description]" rows="3">{{ old('seo.description', $model->seoMeta?->description) }}</textarea> </div> <!-- 其他如关键词、规范URL等字段 --> </div> - 在Posts和Pages模块的编辑视图中,通过模块命名空间引入该组件:
@include('seo::components.seo-fields', ['model' => $post])
3. 数据保存:同步处理文章/页面与SEO数据
- 在Posts和Pages模块的控制器中,处理表单提交时同步保存SEO信息:
// Posts模块的PostController@update public function update(Request $request, Post $post) { // 验证并更新文章主体数据 $post->update($request->validated()); // 同步SEO数据 if ($request->filled('seo')) { $post->seoMeta()->updateOrCreate([], $request->input('seo')); } return redirect()->route('posts.index'); } - 可封装Trait简化逻辑,在SEO模块创建
Traits/HasSeoMeta.php:
之后在Post、Page模型中trait HasSeoMeta { public function seoMeta() { return $this->morphOne(SeoMeta::class, 'module'); } public function syncSeoMeta(array $data) { return $this->seoMeta()->updateOrCreate([], $data); } }use HasSeoMeta;,控制器里直接调用$post->syncSeoMeta($request->input('seo'));即可。
4. 前端渲染:在页面头部输出SEO标签
- SEO模块提供
seo-tags.blade.php组件负责渲染meta标签:@if($seoMeta) <title>{{ $seoMeta->title ?? config('app.name') }}</title> <meta name="description" content="{{ $seoMeta->description }}"> @if($seoMeta->keywords) <meta name="keywords" content="{{ $seoMeta->keywords }}"> @endif @if($seoMeta->canonical_url) <link rel="canonical" href="{{ $seoMeta->canonical_url }}"> @endif @endif - 在Posts和Pages模块的展示视图头部引入该组件:
@include('seo::components.seo-tags', ['seoMeta' => $post->seoMeta])
5. 可选扩展:全局配置与统一管理
- 在SEO模块添加配置文件,支持开启/关闭特定模块的SEO功能,或设置默认SEO模板。
- 利用Laravel Modules的路由体系,给SEO模块添加后台管理页面,统一查看、编辑所有模块的SEO数据。
内容的提问来源于stack exchange,提问作者Muhammed M.
相关产品推荐
相关产品推荐

