devtools-marvellous/laravel-core-kit

启动项目模块和扩展的主要核心代码

v2.4.3 2024-09-12 10:43 UTC

This package is auto-updated.

Last update: 2024-09-12 10:44:06 UTC


README

要启动项目,您应该在本地安装: php@^7.4|^8.0composer。您可以使用以下请求进行谷歌搜索:linux php local installbrew install php
第一次设置后,项目可以通过Valet或docker容器运行。

启动项目模块和扩展的主要核心代码

CoreKit微服务是什么

安装CoreKit微服务后,您将获得以下服务

  • 身份验证微服务。登录、登出、验证和密码重置过程。也可以通过Core验证代理开发其他验证操作。
  • 用户注册。
  • 获取和更新配置文件。
  • 用户的后端管理系统。
  • 权限和角色管理系统。
  • SPA应用程序假路由。CoreKit为您提供强大的功能来创建SPA端点的假路由。

如何从私有仓库安装

!!!!永远不要将auth.json文件提交到您的仓库。对于docker容器化,使用Vault或其他安全变量来存储用户的访问令牌。

  1. 运行
    composer config --global --auth http-basic.repo.packagist.com AttraactGroupUser <request token from maintainer>
    
  2. 将其添加到您的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.phpweb.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
  • 通过Docker或Laravel Valet提供服务并继续下一步
  • 更新APP_KIT_AUTH_PASSWORD_GRANT_CLIENT_IDAPP_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个字符。
  • 名称应该是唯一的。
  • 活动标志是必需的。
  • 标志值应该是布尔值。