devtools-marvellous / 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 auto-updated.
Last update: 2024-09-12 10:44:06 UTC
README
要启动项目,您应该在本地安装:
php@^7.4|^8.0
,composer
。您可以使用以下请求进行谷歌搜索:linux php local install
,brew install php
。
第一次设置后,项目可以通过Valet或docker容器运行。
启动项目模块和扩展的主要核心代码
CoreKit微服务是什么
安装CoreKit微服务后,您将获得以下服务
- 身份验证微服务。登录、登出、验证和密码重置过程。也可以通过Core验证代理开发其他验证操作。
- 用户注册。
- 获取和更新配置文件。
- 用户的后端管理系统。
- 权限和角色管理系统。
- 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
- 包含所有 terraform模板,用于设置AWS资源。
下面您可以找到每个目录设置的完整描述。
将目录和项目名称替换为实际的项目名称。
设置项目文件
创建项目的根目录。例如,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
- [时间不衰] 在您的
.env
中配置DB_CONNECTION
以使用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, ], ];
- 在您的
./config/database.php
的redis部分中添加'read_write_timeout' => 0
[ '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
- 迁移处理完毕后,我们应该创建passport密钥和客户端
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
- 如果获得绿色状态,则Starter Kit已准备好扩展。
扩展可能性
任何核心请求、控制器、资源或库都可以通过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绑定到我们的资源类,而不是到kit的类。将以下代码行添加到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个字符。
- 名称应该是唯一的。
- 活动标志是必需的。
- 标志值应该是布尔值。