biliboobrian / microservice-crud
为 Lumen 构建的微服务 CRUD 便利层。
Requires
- biliboobrian/microservice-core: ~1.0
- biliboobrian/microservice-model-utils: ~1.0
- laravel/lumen-framework: ^5.3 || 6.* || 7.* || 8.*
Requires (Dev)
- phpunit/phpunit: ~5.0
README
为 Lumen 构建的微服务 CRUD 便利层。
描述
此包旨在在 Lumen 之上提供一个便利层,以简化开发 RESTful CRUD 微服务的流程。它减少了编写控制器、模型和 CRUD 逻辑的重复性。
包内容
- 一个可以扩展以快速实现 RESTful CRUD 逻辑的抽象控制器。
- 缓存清理观察者,以确保您的数据始终尽可能最新。
安装
正常安装包
$ composer require lushdigital/microservice-crud
该包需要在 bootstrap/app.php
中的 Lumen 配置中进行以下更改
<?php // Uncomment the line below to enable Facade support. $app->withFacades(); // Uncomment the line below to enable Eloquent ORM support. $app->withEloquent(); // Add the line below to load database config. This is required for caching to work. $app->configure('database');
用法
要创建一个新的 CRUD 资源,首先将模型从 \LushDigital\MicroServiceModelUtils\Models\MicroServiceBaseModel
扩展。该模型还必须实现 LushDigital\MicroServiceCrud\Models\CrudModelInterface
接口。
<?php namespace App\Models; use LushDigital\MicroServiceModelUtils\Models\MicroServiceBaseModel; use LushDigital\MicroServiceCrud\Models\CrudModelInterface; class Example extends MicroServiceBaseModel implements CrudModelInterface { /** * {@inheritdoc} */ public function getValidationRules($mode = 'create', $primaryKeyValue = null) { // TODO: Implement getValidationRules() method. } }
接下来,您需要创建一个扩展自 \LushDigital\MicroServiceCrud\Http\Controllers\CrudController
的控制器
<?php namespace App\Http\Controllers; use LushDigital\MicroServiceCrud\Http\Controllers\CrudController; class ExamplesController extends CrudController {}
最后,如果您正在使用缓存,需要将 Crud 观察者注册到您的模型上。通过编辑现有的 app/Providers/AppServiceProvider.php
类(或添加一个新的服务提供者)来完成此操作
<?php namespace App\Providers; use App\Models\Example; use Illuminate\Support\ServiceProvider; use LushDigital\MicroServiceCrud\Observers\CrudObserver; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // Add an observer to the example model. Example::observe(CrudObserver::class); } }
请确保您的服务提供者已添加(或取消注释)在 bootstrap/app.php
$app->register(App\Providers\AppServiceProvider::class);
模型
注意,上述模型称为 Example
,控制器称为 ExamplesController
。这遵循您熟悉的 Laravel 的复数模式。基本上,控制器名称需要是模型复数形式加上 'Controller'。
这可以通过覆盖控制器中的 $modelBaseClass
属性来更改
<?php namespace App\Http\Controllers; use LushDigital\MicroServiceCrud\Http\Controllers\CrudController; class ExamplesController extends CrudController { /** * The model associated with the CRUD controller. * * @var string */ protected $modelBaseClass = 'NotAnExample'; }
模型命名空间
CRUD 控制器假定模型位于 App\Models
命名空间中(例如 App\Controllers\ExamplesController > App\Models\Example
)。
这可以通过覆盖 $modelNamespace
属性来更改
<?php namespace App\Http\Controllers; use LushDigital\MicroServiceCrud\Http\Controllers\CrudController; class ExamplesController extends CrudController { /** * The model associated with the CRUD controller. * * @var string */ protected $modelNamespace = 'My\\Awesome\\Namespace'; }
缓存属性
此包提供了根据模型任何属性缓存数据的支持。默认情况下,此包将仅使用 id 属性缓存数据。这使用缓存键来实现,因此对于 id 为 1 的 Example
模型实例,以下缓存键将在读取时设置并在更新/删除时清除
examples:index examples:1
请注意,
:index
缓存键始终用于索引端点列表所有模型实例。
要基于其他属性进行缓存,只需覆盖模型中的 $attributeCacheKeys
属性
<?php namespace App\Models; use LushDigital\MicroServiceModelUtils\Models\MicroServiceBaseModel; class Example extends MicroServiceBaseModel { /** * A list of the model attributes that can be used as cache keys. * * @var array */ protected $attributeCacheKeys = ['name']; }
因此,在此缓存中,ID 为 1、名称为 'test' 的 Example(ID: 1)将具有缓存键
examples:name:test
路由
一旦设置好控制器和模型,您需要配置路由。该包提供了标准 REST 端点(GET、POST、PUT、DELETE)的逻辑。您可以使用任意多或任意少的端点,所有端点的示例如下
<?php // routes/web.php $app->get('/examples', 'ExamplesController@index'); $app->post('/examples', 'ExamplesController@store'); $app->get('/examples/{id}', 'ExamplesController@show'); $app->put('/examples/{id}', 'ExamplesController@update'); $app->delete('/examples/{id}', 'ExamplesController@destroy');