mayankjanidev / laravel-store
在 Laravel 中创建可重用的数据库查询和数据对象
Requires
- php: ^8.1
Requires (Dev)
- orchestra/testbench: ^8.23
- phpunit/phpunit: ^10.5
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 许可协议 发布。