Шаблон лезвия, @yield() в @yield

Это моя текущая реализация тегов Open Graph с использованием Laravel 5:

app.blade.php

<title>@yield('title')</title>
<meta property="og:title" content="@yield('og-title', 'DEFAULT PAGE TITLE')">
<meta property="og:image" content="@yield('og-image', 'default.png')">
<meta property="og:url" content="@yield('og-url', '{{ Request::url() }}')">
<meta property="og:site_name" content="SITE NAME">

page.blade.php

@extends('app')
@section('title', $article->title . ' | SITE NAME')
@section('og-title', $article->title)
@section('og-image', secure_url('img/news/' . $article->image .'.png'))

Он работает по большей части, но у меня есть несколько запросов:

  • Есть ли способ использовать @yield() в @yield?

    Я пробовал <meta property="og:title" content="@yield('og-title', @yield('title'))">, но это не сработало.

  • Как я могу получить текущий SECURE URL страницы?

    {{ Request::url() }} возвращает http://example.com/page, но я хочу https://example.com/page

Как мета, пожалуйста, дайте мне знать, если у вас есть предложения по улучшению моего текущего метода OG.

Ответы

Ответ 1

Существует простой способ добиться того, чего вы хотите. Что вы можете сделать, так это переместить метатеги OG html на частичный просмотр, на который вы можете передавать параметры на каждой странице по своему усмотрению. Например, в вашем основном макете просто создайте раздел для тегов og:

app.blade.php

<title>@yield('title')</title>
@section('ogtags')

@show

Теперь создайте свой частичный вид, позвонив ему:

og_tags.blade.php

<meta property="og:title" content="{{ $title or 'DEFAULT PAGE TITLE' }}">
<meta property="og:image" content="{{ $image or 'default.png' }}">
<meta property="og:url" content="{{ isset($url) ? $url : str_replace('http://', 'https://', Request::url()) }}">

Итак, теперь в ваших представлениях вы можете легко добавить og-теги, например:

home.blade.php

@extends('app')

@section('ogtags')
    @include('og_tags', ['title' => 'my title', 'image' => 'my-image.png'])
@stop

@section('content')
     your content here
@stop

Для защищенного URL-запроса Request::url() возвращает текущий URL-адрес страницы, если он через HTTPS начинается с https://, иначе он начнется с http://. Поэтому я просто заменяю его всегда https

str_replace('http://', 'https://', Request::url())

Если вы хотите всегда иметь og_tags (в случае, если ваше представление не определяет этот раздел, и вы хотите показать его по умолчанию), вы можете просто изменить свой app.blade.php следующим образом:

<title>@yield('title')</title>
@section('ogtags')
    @include('og_tags')
@show

Это крутая часть Blade, которую вы можете разделить на более мелкие части, затем включить их с динамическими параметрами или просто создать композиторы вида для обработки данных.

Ответ 2

Я всегда использую meta.blade.php и сохраняю свой meta отдельно от основного макета, а не только meta, но также, styles и scripts, когда это возможно, и включите, используя @include(...), в любом случае, но как сделать его динамичным? В этом случае я использую подобный подход, как вы, но немного по-другому, что дает мне полную гибкость, чтобы сделать его реальной динамикой. Вот как я это делаю, вероятно, это ответит на то, что вы ищете здесь. Итак, создайте файл meta.blade.php, а my приведен ниже:

<!-- Title-->
<title>@yield('title', smart('site.title'))</title>
<!-- Meta-->
<meta name="keywords" content="@yield('keywords', getSiteMeta('keywords'))" />
<meta name="description" content="@yield('description', getSiteMeta('description'))" />
<meta name="author" content="@yield('author', getSiteMeta('author'))" />
<!-- CSRF for AJAX-->
<meta name="csrf-token" content="{{ csrf_token() }}" />

Обратите внимание на @yield('keywords', getSiteMeta('keywords')) здесь; getSiteMeta является вспомогательной функцией, которая объявлена ​​в моем файле app\Helpers\Common.php, и функция выглядит следующим образом:

/**
 * Prapare meta Tags by $name
 * 
 * @param  String $metaname Meta Name
 * @return Meta Content
 */
function getSiteMeta($name)
{
    return smart("site.meta.$name");
}

Здесь также задействована другая функция:

/**
 * Short cut to config call for smart.php file items
 * @param  String $str Config Key
 * @return String Config Value
 */
function smart($str)
{
    return config("smart.$str");
}

На самом деле, у меня есть собственный файл конфигурации в config\smart.php и smart - это мое имя сайта, поэтому я сохранил все связанные с моим сайтом конфиги в config\smart.php, который выглядит так:

// config/smart.php
return [

    'site' => [
        'name' => 'Smart',
        'title' => 'Smart Title',
        'tagline' => 'Smart Tag Line',
        'meta' => [
            'keywords' => 'Smart Keywords',
            'language' => 'english',
            'description' => '...',
            'author' => 'Sheikh Heera'
        ],
    ],

    'role' => [
        'default' => 'genaral',  # By default, a user gets this role when registers.
        'reserved' => 'superuser' # Application Admin must have this role assigned.
    ],
    // More...
];

Вероятно, у вас есть идея, я могу позвонить smart('key_name'), чтобы получить настройки моего сайта, поэтому мне не нужно использовать config('smart.key'), и по умолчанию все значения meta хранятся в моем файле config/smart.php, поэтому если я не использую такой раздел:

@section('keywords')
    Some, Keywords, Here
@stop

Тогда у меня всегда были настройки по умолчанию и с помощью вспомогательной функции getSiteMeta у меня достаточно гибкости для изменения логики моей функции, например, я могу изменить исходный текст моих тегов meta и могу построить это на лету.

Относительно https это зависит от вашего сайта, если вы использовали защищенный url (ssl/https) и Request::url() просто возвращает то, что ваш текущий url, поэтому, если он https, тогда он вернется, иначе вы 'http.