需求
平時在開發過程中,一般都是把標題、描述等標籤直接寫在模板中,如
# articles/show.blade.php
@section('title', "{$article->title} - {$article->category->name} - {$sitename}") `
在模板少的情況下問題還不大,一旦專案中有多套模板共用相同的標題和描述(比如pc
和mobile
模板,多套不同風格主題的模板),管理起來就很繁瑣了,每次修改都要先找到對應的模板,再一個一個地改。
如果能將這些標籤內容抽取出來放在配置檔案供複用,那就再方便不過了。
優點
- 再也不用人工一個一個去找對應的模板了。
- 用配置而不是硬編碼的方式,達到一處修改,處處修改的目的。
- 模板中的
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 協議》,轉載必須註明作者和本文連結