刀片模板,@ yield中的@yield()

时间:2015-05-24 06:18:44

标签: php laravel opengraph blade

这是我目前使用Laravel 5实现的Open Graph标记:

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'))

它大部分都有效,但我有几个问题:

  1. 有没有办法在@yield()中使用@yield

    我尝试了<meta property="og:title" content="@yield('og-title', @yield('title'))">,但它没有用。

  2. 如何获取页面的当前SECURE网址?

    {{ Request::url() }}返回http://example.com/page,但我想要https://example.com/page

  3. 作为元数据,如果您有任何建议可以改进我目前的OG方法,请告诉我。

2 个答案:

答案 0 :(得分: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-tags:

<强> home.blade.php

@extends('app')

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

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

对于安全网址问题,Request::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的一个很酷的部分,您可以将所有内容拆分成较小的部分,然后使用动态参数包含它们,或者只创建视图编辑器来处理数据。

答案 1 :(得分:0)

我总是使用meta.blade.php并将meta与主要布局分开,不仅meta而且stylesscripts在可能的情况下然后包括使用@include(...),但是如何让它变得动态?在这种情况下,我使用类似于你的方法,但有点不同,这让我充分灵活地使它真正动态。我是这样做的,可能它会回答你在这里寻求的东西。所以,让我们创建一个meta.blade.php&#39;文件和我的文件如下:

<!-- 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.phpsmart的配置文件是我的网站名称,所以我在{{1}保留了所有与网站相关的配置看起来像这样:

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's Admin must have this role assigned. ], // More... ]; 来获取我的网站的配置因此我不需要使用smart('key_name'),默认情况下所有config('smart.key')值都是存储在我的meta文件中,如果我不使用这样的部分:

config/smart.php

然后我总是使用默认设置并使用辅助函数@section('keywords') Some, Keywords, Here @stop 我有足够的灵活性来更改函数的逻辑,例如,我可以更改{{1}的默认源标签,可以在运行中构建它。

关于getSiteMeta,它取决于您的网站,如果您使用了安全网址(meta),https只返回您当前网址的内容,那么它是否会ssl/https { {1}}然后它会返回,否则您将获得Request::url()