yu-renery / laravel-core-kit
用于启动项目模块和扩展的主要核心代码
Requires
- php: >=8.0
- devtools-marvellous/laravel-core-auth: ^2.1.8
- devtools-marvellous/postman-documentation: ^1.2.12
- laravel/framework: ^10.0
This package is not auto-updated.
Last update: 2024-10-01 03:37:50 UTC
README
要开始项目,您需要在本地安装:
php@^7.4|^8.0
,composer
。您可以使用Google搜索请求:linux php local install
,brew install php
。
首次设置项目后,可以通过Valet或Docker容器运行项目。
用于启动项目模块和扩展的主要核心代码
什么是CoreKit微服务
安装CoreKit微服务后,您将获得以下服务:
- 授权微服务。登录、注销、验证和密码重置过程。还可以通过Core Verification Broker开发其他验证操作。
- 用户注册。
- 获取和更新配置文件。
- 用户的后端管理系统。
- 权限和角色管理系统。
- SPA应用程序的虚拟路由。CoreKit为您提供强大的功能来创建SPA端点的虚拟路由。
如何从私有仓库安装
!!!!永远不要将auth.json文件提交到您的仓库。对于Docker容器化,使用Vault或其他安全变量来存储用户的访问令牌。
- 运行
composer config --global --auth http-basic.repo.packagist.com AttraactGroupUser <request token from maintainer>
- 将以下内容添加到您的composer.json中
{ "repositories": [ {"type": "composer", "url": "https://repo.packagist.com/attractgroup/"} ] }
安装指南
逐步说明,帮助您启动新项目并构建一些令人惊叹的东西。
目录和项目环境
未来项目的根目录列表
project-files
- 包含所有代码文件。docker
- 包含Docker容器化过程的全部脚本。docs
- 包含所有 readme.md 文档文件。terraform
- 包含用于设置AWS资源的 terraform模板。
下面将详细介绍每个目录的设置。
将目录和项目名称替换为实际项目名称。
设置项目文件
创建项目的根目录。例如,attract-starter-kit
mkdir -m 777 attract-starter-kit && cd attract-starter-kit
之后,您就可以为project-files
进行安装了
laravel new project-files && cd project-files
设置attract启动套件
永久的 - 在多个步骤之后将更改的操作。
按照以下TODO列表设置启动项目
- 将composer.json中的默认PHP要求更改为
^7.4|^8.0
- 授权您的composer进入私有packagist
- [永久的] 将
DB_CONNECTION
配置为在.env
中使用sqlite驱动程序DB_CONNECTION=sqlite DB_DATABASE=project_files # remove this row
cd ./database && touch database.sqlite && cd ..
- 禁用mysql配置严格模式,以防止在sextant操作中的交叉关系排序错误
[ 'mysql' => [ //..., 'strict' => false, //..., ] ];
- 运行
composer require attract-cores/laravel-core-kit attract-cores/laravel-core-test-bench
- 删除所有默认的laravel迁移
- 运行
vendor:publish
操作以创建新项目的配置环境php artisan vendor:publish --tag=laravel-mail && php artisan vendor:publish --tag=attract-core-kit-core-modules --force && php artisan vendor:publish --tag=attract-core-kit-auth-migrations --force && php artisan vendor:publish --tag=attract-core-verification-broker-migrations --force && php artisan vendor:publish --tag=attract-core-kit-auth-seeders --force && php artisan vendor:publish --tag=attract-core-kit-auth-tests && php artisan vendor:publish --tag=attract-core-kit-tests && composer dump-autoload
- 进入terraform目录并运行
cd ../terraform/tf-s3 && ln -s ../vars/variables.tf variables.tf && cd ../../project-files && cd ../terraform/s3 && ln -s ../vars/variables.tf variables.tf && cd ../../project-files
- 将
./config/auth.php
中的api驱动程序从token更改为passport[ 'api' => [ //'driver' => 'token', you can remove this row. 'driver' => 'passport', 'provider' => 'users', 'hash' => false, ], ];
- 将
'read_write_timeout' => 0
添加到./config/database.php
中的redis部分[ 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', NULL), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), 'read_write_timeout' => 0, // Add this into each settings block to prevent errors - "error while reading line from the server." ], ];
- 删除
api.php
和web.php
路由文件。 - 将
Kernel.php
中的验证中间件更改为Core版本AttractCores\LaravelCoreKit\Http\Middleware\EnsureEmailIsVerified
/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ //..., 'verified' => \AttractCores\LaravelCoreKit\Http\Middleware\EnsureEmailIsVerified::class, //..., ];
- 从
.env
复制新应用程序密钥(APP_KEY
)到.env.example
和.env.dev
- 复制
.env.example
->.env
。如果您使用Docker,则跳过此行。如果您使用Laravel Valet,则设置本地环境的变量。 - 通过以下方式更新DatabaseSeeder
$this->call([ DefaultAdminSeeder::class, DefaultRolesAndPermissionsSeeder::class ]);
- 如果您将添加新的权限/角色,那么您应该扩展
AttractCores\LaravelCoreAuth\Database\Seeders\DefaultRolesAndPermissionsSeeder
类,并添加新的模型,就像父类一样。例如namespace Database\Seeders; use App\Models\Permission; use App\Models\Role; use AttractCores\LaravelCoreAuth\Database\Seeders\DefaultRolesAndPermissionsSeeder as CoreDefaultRolesAndPermissionsSeeder; use AttractCores\LaravelCoreAuth\Resolvers\CorePermission; use AttractCores\LaravelCoreAuth\Resolvers\CoreRole; /** * Class DefaultRolesAndPermissionsSeeder * * @package AttractCores\LaravelCoreAuth\Database\Seeders\Publishes * Date: 16.12.2020 * Version: 1.0 * Author: Yure Nery <yurenery@gmail.com> */ class DefaultRolesAndPermissionsSeeder extends CoreDefaultRolesAndPermissionsSeeder { /** * Seed the application's database. * * @return void */ public function run() { parent::run(); $permissions = CorePermission::all(); $permissionSlugFieldName = CorePermission::getSlugField(); if ( ! $permissions->contains($permissionSlugFieldName, Permission::CAN_ORGANIZATION_ACCESS) ) { CorePermission::factory() ->createOne([ 'name_en' => 'Can have Organisation access', 'slug' => Permission::CAN_ORGANIZATION_ACCESS ]); CoreRole::factory() ->createOne([ 'name_en' => 'Organisation Access', 'slug' => Role::CAN_ORGANIZATION ]) ->permissions() ->sync([ 6 ]); } } }
- 您需要遵循Docker环境文档或使用Laravel Valet进行本地服务。
- 如果您使用Laravel Valet,请按照以下步骤操作
- 如有需要,请更新迁移并运行以下命令(如果您使用Laravel Valet)
php artisan migrate --seed
- 迁移处理完成后,我们应该创建护照密钥和客户端
php artisan passport:keys --force && php artisan passport:client --client --no-interaction && php artisan passport:client --password --no-interaction
- 如有需要,请更新迁移并运行以下命令(如果您使用Laravel Valet)
- 通过Docker或Laravel Valet提供服务并继续操作。
- 更新
APP_KIT_AUTH_PASSWORD_GRANT_CLIENT_ID
和APP_KIT_AUTH_PASSWORD_GRANT_CLIENT_SECRET
变量值在.env
文件中。如果您使用Docker,请更新./docker/local/envs/{YOUR_ENV}
中的这些值。 - 如果在异常处理程序和验证消息结构中进行了更改,我们需要在测试中添加一些更新,以防止失败
- 通过添加此函数更新
OauthTest.php
类
/** * Return status for handler catchers. * * @return int */ protected function getCantLoginStatus() { return 401; }
- 更新
RegisterTest.php
并添加对testApiRegistrationValidation
函数的替换
/** * Test api registration validation. * * @return void * @throws \Throwable */ public function testApiRegistrationValidation() { $notUnique = $this->getTestRegisterData(false, 5); $response = $this->withHeaders([ 'Authorization' => $this->getBearerClientToken() ]) ->json('POST', $this->getRegisterRoute(), $notUnique); $response->assertStatus(422); $errors = collect($response->decodeResponseJson()->json('errors')); $this->assertEquals(2, count($errors)); $this->assertTrue($errors->contains('field', 'password')); $this->assertTrue($errors->contains('field', 'email')); }
- 通过添加此函数更新
- 删除
./tests/Feature/ExampleTest.php
文件。 - 对于DEV/STAGE环境设置,请使用这些文档。
- 在所有操作完成后,请在Docker容器内或
project-files
根目录下(如果您使用Valet)运行以下命令./vendor/bin/phpunit --stop-on-failur
- 如果获得绿色状态,则入门套件准备扩展。
扩展可能性
任何核心请求、控制器、资源或库都可以通过Laravel服务提供者绑定功能轻松扩展。
在
vendor:publish
过程之后,您的AppServiceProvider
已包括所有必要的扩展函数。
用户资源扩展
安装CoreKit后,项目将增长,因此我们需要通过新的关系扩展来扩展默认用户资源。让我们这样做。
例如:我们需要分离first_name和last_name字段。别忘了更新迁移。
namespace App\Http\Resources; use AttractCores\LaravelCoreKit\Http\Resources\UserResource as CoreUserResource; use Illuminate\Support\Arr; /** * Class UserResource * * @property \App\Models\User $resource * * @package App\Http\Resources\PublicResources * Date: 17.12.2020 * Version: 1.0 * Author: Yure Nery <yurenery@gmail.com> */ class UserResource extends CoreUserResource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request $request * * @return array */ public function toArray($request) { $parentData = Arr::except(parent::toArray($request), [ 'name' ]); return array_merge( $parentData, [ 'first_name' => $this->resource->first_name, 'last_name' => $this->resource->last_name, 'relations' => array_merge($parentData[ 'relations' ], [ 'avatar' => $this->whenLoaded('avatar', function () { return new MediaResource($this->resource->avatar); }), ]), ]); } }
此外,我们应更新App\Models\User
类以适应我们的情况
/** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'email', 'first_name', 'last_name', 'firebase_token', ];
在创建新资源后,我们应该告诉Laravel绑定到我们的资源类而不是套件的一个。将以下代码行添加到AppServiceProvider
中的extendsCoreKitBinds
函数
// Replace Core User Resource $this->app->bind(\AttractCores\LaravelCoreKit\Http\Resources\UserResource::class, \App\Http\Resources\UserResource::class);
在此之后进行操作,CoreKit操作中的任何UserResource
响应都将使用您的类而不是核心类。
翻译文本
- 您的电子邮件地址尚未验证。
- 您至少应指定一个角色。
- 该角色不存在,或者您正在尝试使用已弃用的角色进行访问。
- 需要slug字段。
- slug应该是唯一的。
- 角色名称是必需的。
- 您不能在没有权限的情况下创建角色。
- 给定的权限在我们的数据库中不存在。
- 名称字段是必需的。
- 名称长度应小于255个字符。
- 名称应该是唯一的。
- 需要激活标志。
- 标志值应该是布尔值。