【问题标题】:blade template, @yield() in @yield刀片模板,@yield 中的 @yield()
【发布时间】:2015-08-05 21:24:31
【问题描述】:

这是我目前使用 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()?

    我试过&lt;meta property="og:title" content="@yield('og-title', @yield('title'))"&gt;,但没用。

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

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

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

【问题讨论】:

    标签: php laravel facebook-opengraph blade


    【解决方案1】:

    我总是使用meta.blade.php 并将我的meta 与主布局分开,不仅是meta,而且还包括styles 和scripts(如果可能),然后包括然后使用@include(...),无论如何,但是如何让它动态?在这种情况下,我使用与您类似的方法,但略有不同,这让我可以充分灵活地使其真正动态化。这就是我的做法,可能它会回答你在这里寻找的东西。所以,让我们创建一个“meta.blade.php”文件,我的文件如下:

    <!-- 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's 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,这取决于您的网站,如果您使用了安全网址 (ssl/https),Request::url() 只会返回您当前的网址,所以如果它是 https,那么它将返回,否则您会得到http。

    【讨论】:

    • 嘿,我喜欢你所遵循的动态结构,但我对你作为@yield() 的默认值参数调用的函数表示怀疑,例如@yield('title', smart('site.title')) 中的函数smart(),我的意思是,您能详细说明一下,我们如何按照您展示的方式使用,另外,我们可以在那里调用控制器方法吗?
    • 你不应该在这里调用控制器方法。
    • 好的,我明白了,但是你怎么能在@yield()中使用来自app\Helpers\Common.php的函数,你能详细说明一下吗?
    • app\Helpers\Common.php 可作为全局使用,因此您可以从任何地方调用任何全局函数。
    【解决方案2】:

    有一种简单的方法可以实现您想要的。您可以做的是将 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
    

    对于安全 url 问题,Request::url() 返回页面的当前 url,如果是通过 HTTPS,它将以 https:// 开头,否则它将以 http:// 开头。所以这就是为什么我只是将其替换为始终为 https

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

    如果您希望始终拥有 og_tags(以防您的视图未定义此部分并且您想显示默认部分),您可以像这样修改您的 app.blade.php: p>

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

    这是Blade 很酷的部分,您可以将所有内容拆分为更小的部分,然后将它们包含在动态参数中,或者只是创建视图合成器来处理数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 2012-12-05
      • 2018-11-07
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多