mayankjanidev/laravel-store

在 Laravel 中创建可重用的数据库查询和数据对象

v1.0.0 2024-08-01 16:42 UTC

This package is auto-updated.

Last update: 2024-09-03 13:52:47 UTC


README

在 Laravel 中创建可重用的数据库查询和数据对象。

要求

  • PHP >= 8.1
  • Laravel >= 9.0

安装

通过 Composer 安装此包

composer require mayankjanidev/laravel-store

目的

通常,我们有一些业务关键数据需要在项目中管理。我们可能会在控制器、服务、控制台命令、管理界面和其他代码片段中使用它们。Laravel Store 帮助您集中管理这些关键数据,使其易于管理和更新。这有助于更快地调试问题,并避免代码库中查询重复。

基本用法

通过命令行创建存储

php artisan make:store TopRatedMovies

存储文件将在 App\Stores\TopRatedMovies 中创建。

您还可以指定自己的位置,例如在 App\Data 中

php artisan make:store TopRatedMovies --namespace=Data

存储示例

namespace App\Stores;

use Illuminate\Database\Eloquent\Builder;

use Mayank\Store\QueryStore;
use App\Models\Movie;

class TopRatedMovies extends QueryStore
{
    public function query(): Builder
    {
        return Movie::orderByDesc('rating');
    }
}

您现在可以在代码库的任何地方使用此类来获取数据。例如,在一个控制器中

class TopRatedMoviesController extends Controller
{
    public function index(TopRatedMovies $topRatedMovies)
    {
        $movies = $topRatedMovies->get();
        ...
    }
}

此示例使用依赖注入,但您也可以手动实例化这些类。

$movies = (new TopRatedMovies)->get();

恭喜!现在您有一个可以自定义数据库查询的中心位置,您不必再在控制器中查找它。但这只是开始,Laravel Store 提供了更多强大的功能来管理应用程序中的数据。

缓存

每个存储都有自己的方法来管理缓存。

获取缓存数据

(new TopRatedMovies)->getCachedData();

构建缓存

(new TopRatedMovies)->cache();

清除缓存

(new TopRatedMovies)->clearCache();

自定义缓存设置

默认情况下,缓存时长为永久,缓存键由类名计算得出(在本例中为 'top-rated-movies')。但您可以自定义它。

class TopRatedMovies extends QueryStore
{
    public function cacheKey(): string
    {
        return 'best-movies';
    }

    public function cacheDuration(): DateTime
    {
        return now()->addHours(2);
    }
}

手动指定缓存数据

默认情况下,所有在 query() 方法中指定的数据都将通过在查询上执行 ->get() 来缓存。但您可以缓存部分数据。

class TopRatedMovies extends QueryStore
{
    public function cacheData(): Collection
    {
        return $this->query()->limit(250)->get();
    }
}

分页

您可以获取数据库查询的分页数据。

(new TopRatedMovies)->paginate();
(new TopRatedMovies)->simplePaginate();

这只是在 query() 上调用 ->paginate() 方法,所以它与 Laravel 分页 的工作方式相同。

自定义存储

您可能有一些数据以不同的格式存储在应用程序中,例如数组,并且不返回数据库查询。在这些情况下,您可以使用 CustomStore,其中您可以以自己的格式返回数据,而不是依赖于 Laravel 模型和查询构建器。

use Mayank\Store\CustomStore;

class Languages extends CustomStore
{
    public function data(): array
    {
        return ['English', 'Spanish', 'French'];
    }
}

通过命令行创建自定义存储

php artisan make:store Languages --custom

所有缓存方法都与 QueryStore 中的方法完全相同。

缓存命令

如果您通过命令行或通过 任务调度 管理数据,Laravel Store 提供了特定的缓存命令

缓存数据

php artisan store:cache TopRatedMovies

清除缓存

php artisan store:clear TopRatedMovies

用于任务调度

Schedule::command('store:cache TopRatedMovies')->daily();

高级用法

当数据更改时无效化缓存

您可能希望在底层数据更改时无效化缓存或重建它。将此包与 Laravel 观察者 结合使用以实现此目的。

class MovieObserver
{
    public function updated(Movie $movie): void
    {
        (new TopRatedMovies)->clearCache();
    }
}

相同数据的不同变体

在某些情况下,您可能希望显示相同数据的不同变体。例如,在您的 API 中,您可能希望显示数据的一个非常小的子集。由于 Laravel Store 只是一个类,您可以添加自己的方法到它。

class TopRatedMovies extends QueryStore
{
    public function query(): Builder
    {
        return Movie::orderByDesc('rating');
    }

    public function getDataForApi(): Collection
    {
        return $this->query()->limit(10)->get();
    }
}

对其他类的依赖

在某些情况下,您的数据可能依赖于其他数据。在这些情况下,您可以使用构造函数简单地注入它。

class TopRatedMovies extends QueryStore
{
    public function __construct(protected Country $country)
    {
    }

    public function query(): Builder
    {
        return Movie::orderByDesc('rating')->where('country', $this->country->name);
    }
}

Laravel 的 服务容器 可以自动解析您的依赖关系。

许可证

此软件包遵循 MIT 许可协议 发布。