Laravel如何按当前URL匹配输出对应Header头配置数据
实现方案
完全可以直接在BaseController中实现,只需要调整原有查询逻辑,匹配当前访问路径即可,具体操作如下:
步骤1:修改BaseController构造方法逻辑
原来的全量查询HeaderData改为按当前路径过滤,代码如下:
protected $header_data; public function __construct() { // 获取当前访问路径(不带查询参数,格式为 /xxx/xxx) $current_path = '/' . request()->path(); // 按url字段精确匹配查询对应数据,没有匹配结果时返回null $this->header_data = HeaderData::where('url', $current_path)->first(); View::share('header_data', $this->header_data); }
如果需要配置默认头部数据(无匹配路径时显示),可以改用firstOr方法:
$this->header_data = HeaderData::where('url', $current_path)->firstOr(function () { // 自定义默认返回数据 return (object)[ 'data' => '<title>站点默认标题</title><meta name="description" content="站点默认描述">' ]; });
步骤2:修改视图输出逻辑
不需要再循环遍历集合,直接判断存在后输出即可:
@if (!empty($header_data)) {!! $header_data->data !!} @endif
可选扩展:支持通配符匹配
如果需要实现类似/blog/*匹配所有博客子路径的需求,可以调整查询语句为模糊匹配:
$current_path = '/' . request()->path(); $this->header_data = HeaderData::whereRaw('? LIKE REPLACE(url, "*", "%")', [$current_path])->first();
配置HeaderData时url字段填/blog/*即可匹配所有/blog开头的路径。
内容的提问来源于stack exchange,提问作者chu
相关产品推荐
相关产品推荐

