統一集中式管理你的 meta title 和 description

Vanry發表於2017-08-21

需求

平時在開發過程中,一般都是把標題、描述等標籤直接寫在模板中,如

# articles/show.blade.php

@section('title', "{$article->title} - {$article->category->name} - {$sitename}") `

在模板少的情況下問題還不大,一旦專案中有多套模板共用相同的標題和描述(比如pcmobile模板,多套不同風格主題的模板),管理起來就很繁瑣了,每次修改都要先找到對應的模板,再一個一個地改。

如果能將這些標籤內容抽取出來放在配置檔案供複用,那就再方便不過了。

優點

  1. 再也不用人工一個一個去找對應的模板了。
  2. 用配置而不是硬編碼的方式,達到一處修改,處處修改的目的。
  3. 模板中的meta標籤更簡潔了,再也不用字串和變數混合在一起了。

配置檔案

config目錄下面新建meta.php檔案

# config/meta.php
# 我習慣用路由命名作為 key

return [
    'title' => [
        'home' => '首頁標題',
        'articles.show' => '{title} - {category}',
    ],

    'description' => [
        'home' => '{sitename}為您提供...',
        'articles.show' => '{description}',
    ],
];

幫助函式

# app/helpers.php

if (! function_exists('meta')) {
    /**
     * Get meta tag from configuration.
     *
     * @param  string  $tag
     * @param  string  $name
     * @return string
     */
    function meta($tag, $name, array $parameters = [])
    {
        $tag = config("meta.{$tag}")[$name];

        $search = array_map(function ($key) {
            return '{'.$key.'}';
        }, array_keys($parameters));

        $replace = array_values($parameters);

        return str_replace($search, $replace, $tag);
    }
}

if (! function_exists('meta_title')) {
    /**
     * Get meta title from configuration.
     *
     * @param  string  $name
     * @return string
     */
    function meta_title($name, array $parameters = [])
    {
        return meta('title', $name, $parameters);
    }
}

if (! function_exists('meta_description')) {
    /**
     * Get meta description from configuration.
     *
     * @param  string  $name
     * @return string
     */
    function meta_description($name, array $parameters = [])
    {
        return meta('description', $name, $parameters);
    }
}

用法

用法比較像route函式,由於是基於字串替換,所以不能直接傳物件。

# layouts/app.blade.php

<title>@yield('title') - {{ config('app.name') }}</title>

# articles/show.blade.php

@section('title', meta_title('articles.show', [
    'title' => $article->title,
    'category' => $article->category->name,
]))

OR

// 命名的好處
@section('title', meta_title(Route::currentRouteName(), [
    'title' => $article->title,
    'category' => $article->category->name,
]))

說明:當然了,除了標題描述標籤之外,其他的標籤也可以採用這種方式來統一管理。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章