periloso/laravel-blade-directives-extended

Laravel Blade 模板引擎的指令扩展。

1.0.2 2017-09-06 14:15 UTC

This package is not auto-updated.

Last update: 2024-09-28 00:34:05 UTC


README

Latest Stable Version License

此包为 Laravel 5 blade 引擎添加了自定义指令。

安装

使用 Composer 安装此包

composer require "periloso/laravel-blade-directives-extended"

更新 composer 后,将 ServiceProvider 添加到 config/app.php 文件中的 providers 数组

Periloso\BladeDirectivesExtended\BladeDirectivesExtendedServiceProvider::class

重要 - 扩展 Blade 时,必须清除缓存的视图!

php artisan view:clear

使用示例

@set($alpha, true)

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Laravel</title>
</head>
<body>
	<div class="panel panel-default">
		<div class="panel-body">
    		@if($alpha)
                <p>Welcome to Laravel!</p>
            @endif
    	</div>
    </div>
</body>
</html>

关于缓存指令的说明

为了让这个包正常工作,你必须使用支持标签的 Laravel 缓存驱动程序(例如 Cache::tags('foo'))。Memcached 和 Redis 等驱动程序支持此功能。

检查您的 .env 文件,并确保您的 CACHE_DRIVER 选项满足此要求

CACHE_DRIVER=memcached

如果您需要帮助,请参阅 Laravel 缓存配置文档

基础

安装此包后,您可以在视图的任何位置使用提供的 @cache Blade 指令,如下所示

@cache('my-cache-key')
    <div>
        <h1>Hello World</h1>
    </div>
@endcache

通过将此块 HTML 用 @cache@endcache 指令包围起来,我们请求包缓存给定的 HTML。现在这个例子很简单,但是您可以想象一个更复杂的视图,其中包括各种嵌套的缓存以及触发额外数据库查询的懒加载关系调用。在首次加载页面并缓存 HTML 片段之后,每次刷新都会从缓存中获取。因此,那些额外的数据库查询将永远不会执行。

请注意,在生产环境中,这将“永久”缓存 HTML 片段。另一方面,在本地开发中,我们将自动为您在刷新页面时清除相关的缓存。这样,您可以随意更新视图和模板,而无需担心手动清除缓存。

现在,由于您的生产服务器将永久缓存片段,您希望在部署过程中添加一个步骤来清除相关的缓存。

Cache::tags('views')->flush();

缓存模型

虽然您可以硬编码任何字符串作为缓存键,但当我们使用基于时间戳的方法时,俄罗斯套娃缓存的真正力量就显现出来了。

考虑以下片段

@cache($post)
    <article>
        <h2>{{ $post->title }}></h2>
        <p>Written By: {{ $post->author->username }}</p>

        <div class="body">{{ $post->body }}</div>
    </article>
@endcache

在这个例子中,我们将 $post 对象本身传递给 @cache 指令,而不是一个字符串。然后包将寻找模型上的 getCacheKey() 方法。我们已经为您做了这项工作;只需让您的 Eloquent 模型使用 Laracasts\Matryoshka\Cacheable trait,如下所示

use Laracasts\Matryoshka\Cacheable;

class Post extends Eloquent
{
    use Cacheable;
}

或者,您可以在每个 Eloquent 模型扩展的父类上使用此 trait。

那就行了!现在,此片段的缓存键将包括对象的 idupdated_at 时间戳:App\Post/1-13241235123

关键是,因为我们把 updated_at 时间戳考虑到了缓存键中,所以每次更新给定的帖子时,缓存键都会更改。这将有效地清除缓存!

接触

为了使此技术正常工作,我们必须有一种机制来提醒父级关系(以及随后清除父级缓存)每次模型更新。以下是基本工作流程

  1. 模型在数据库中更新。
  2. updated_at 时间戳被刷新,触发了实例的新缓存键。
  3. 模型“接触”或“ping”其父级。
  4. 父对象的 updated_at 时间戳也会更新,这会清除其关联的缓存。
  5. 只有受影响的片段会重新渲染。所有其他缓存项保持不变。

幸运的是,Laravel 默认提供了这种“触摸”功能。考虑一个 Note 对象,每次更新时都需要通知其父 Card 关系。

<?php

namespace App;

use Laracasts\Matryoshka\Cacheable;
use Illuminate\Database\Eloquent\Model;

class Note extends Model
{
    use Cacheable;

    protected $touches = ['card'];

    public function card()
    {
        return $this->belongsTo(Card::class);
    }
}

注意 $touches = ['card'] 部分。这告诉 Laravel 每次笔记更新时都ping card 关系的计时器。

@cache($card)
    <article class="Card">
        <h2>{{ $card->title }}</h2>

        <ul>
            @foreach ($card->notes as $note)
                @include ('cards/_note')
            @endforeach
        </ul>
    </article>
@endcache

@cache($posts)
    @foreach ($posts as $post)
        @include ('post')
    @endforeach
@endcache

注意我们缓存的俄罗斯套娃式级联;这是关键。如果任何笔记被更新,其单独的缓存将被清除 - 包括其父级 - 但任何兄弟将保持不变。

现在,只要 $posts 集合的内容不改变,@foreach 部分就不会运行。相反,我们始终从缓存中提取。

幕后,此包会检测到您已将 Laravel 集合传递给缓存指令,并随后为该集合生成一个唯一的缓存键。

常见问题解答(FAQ)

是否有任何方法可以覆盖模型实例的缓存键?

是的。假设你有

@cache($post)
    <div>view here</div>
@endcache

幕后,我们将寻找模型上的 getCacheKey 方法。如上所述,您可以使用 Laracasts\Matryoshka\Cacheable 特性立即导入此功能。或者,您可以将第二个参数传递给 @cache 指令,如下所示

@cache($post, 'my-custom-key')
    <div>view here</div>
@endcache

这指示包使用 my-custom-key 作为缓存。这对于分页和其他相关任务非常有用。

贡献

此包始终欢迎贡献

  • 主分支将始终包含最新的工作,但它可能不是总是稳定的;自行承担风险。每个新的标签版本都将来自主分支的工作。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅许可证文件