devslane/generator

在 Laravel 中生成文件

dev-master 2020-01-06 14:23 UTC

This package is not auto-updated.

Last update: 2024-09-21 13:41:41 UTC


README

简介

此包专注于代码的可重用性,并为 Laravel 框架提供支持。该包旨在通过提供非常有用的命令和帮助设置项目结构来节省开发时间。

安装

要安装此包,您需要

  • PHP 7.2+
  • Laravel 5.8+

从终端运行以下命令以安装包

composer require devslane/generator
composer require devslane/generator --dev

通过 composer 安装 - 编辑您的 composer.json 以添加此包。

"require": {
    "devslane/generator": "dev-master"
}

然后在您的终端中运行 composer update 以将其拉入。

配置

  • 将服务提供者添加到 app.php 配置文件中的 providers 数组中,如下所示
Devslane\Generator\Providers\GeneratorServiceProvider::class,
  • 使用以下 Artisan 命令发布配置文件
php artisan vendor:publish --provider="Devslane\Generator\Providers\GeneratorServiceProvider"

辅助命令。

生成迁移

支持创建具有提供的数据类型的列的迁移,带有约束或外键列

php artisan generate:migration {table : Table name} {--columns= : Columns}
php artisan generate:migration users --columns=first_name:string,last_name:string,age:integer
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id'); 
			$table->string('first_name');
			$table->string('last_name');
			$table->integer('age');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

添加唯一和可空约束

php artisan generate:migration table1 --columns=name:string/nullable
php artisan generate:migration table2 --columns=name:string/unique

可以使用命令提供外键约束,如下所示

php artisan create:migration posts --columns=post:string,user_id:fk=users 

生成模型

该命令为命令中提供的表生成 Eloquent 模型。

php artisan generate:model {tables*}
php artisan generate:model users

生成: User.php

namespace App;
use Devslane\Generator\Models\BaseModel;

/**
 * Class User
 * 
 * @package App
 */
class User extends BaseModel
{
    
}

生成契约

此命令生成所需的契约接口,然后由请求类实现。

generate:contract {tables*}

php artisan generate:contract users

生成以下内容

  • 创建User契约
  • 列出User契约
  • 更新User契约

这些接口包含最重要的函数。未创建 删除User契约。如果需要,可以手动添加。

namespace App\Services\Contract;

interface ListUserContract
{

}
namespace App\Services\Contract;

interface CreateUserContract
{
    public function getFirstName();

    public function getLastName();

    public function getAge();

    public function getCreatedAt();

    public function getUpdatedAt();
}
namespace App\Services\Contract;

interface UpdateUserContract
{
	public function getFirstName();

	public function hasFirstName();

	public function getLastName();

	public function hasLastName();

	public function getAge();

	public function hasAge();

	public function getCreatedAt();

	public function hasCreatedAt();

	public function getUpdatedAt();

	public function hasUpdatedAt();
}

生成请求

此命令生成所有 CRUD 操作的请求类。这些类实现了由 generate:contract {tables*} 生成的相应契约。

generate:request {tables*}

php artisan generate:request users

首次运行此命令会生成 ListRequest 类,然后所有 ListRequest 类都扩展了该类。

  • ListRequest
namespace App\Api\V1\Requests;

use Devslane\Generator\Requests\BaseRequest;

/**
 * Class ListTesttableRequest
 * @package App\Api\V1\Requests
 */
class ListRequest extends BaseRequest
{
    const LIMIT        = 'limit';
    const ORDER        = 'order';
    const ORDER_BY     = 'order_by';
    const SEARCH_QUERY = 'search_query';


    public function getLimit() {
        return $this->input(self::LIMIT);
    }

    public function getOrder() {
        return $this->input(self::ORDER);
    }

    public function getOrderBy() {
        return $this->input(self::ORDER_BY);
    }

    public function getSearchQuery() {
        return $this->input(self::SEARCH_QUERY);
    }
}

生成以下内容

  • 创建User请求
  • 列出User请求
  • 更新User请求

这些类实现了由前一个命令生成的相应契约,并包含契约函数的实现。未创建 删除User请求。如果需要,可以手动添加。

namespace App\Api\V1\Requests;

use App\Services\Contract\ListUserContract as Contract;

/**
 * Class ListUserRequest
 * @package App\Api\V1\Requests
 */
class ListUserRequest extends ListRequest implements Contract
{

}
namespace App\Api\V1\Requests;

use App\Services\Contract\CreateUserContract as Contract;

/**
 * Class CreateUserRequest
 * @package App\Api\V1\Requests
 */
class CreateUserRequest extends ListRequest implements Contract
{
    const FIRST_NAME = 'first_name';
    const LAST_NAME  = 'last_name';
    const AGE        = 'age';
    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';


    public function getFirstName() {
        return $this->input(self::FIRST_NAME);
    }

    public function getLastName() {
        return $this->input(self::LAST_NAME);
    }

    public function getAge() {
        return $this->input(self::AGE);
    }

    public function getCreatedAt() {
        return $this->input(self::CREATED_AT);
    }

    public function getUpdatedAt() {
        return $this->input(self::UPDATED_AT);
    }
}
namespace App\Api\V1\Requests;

use App\Services\Contract\UpdateUserContract as Contract;

/**
 * Class UpdateUserRequest
 * @package App\Api\V1\Requests
 */
class UpdateUserRequest extends ListRequest implements Contract
{
    const FIRST_NAME = 'first_name';
    const LAST_NAME  = 'last_name';
    const AGE        = 'age';
    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';


    public function getFirstName() {
        return $this->input(self::FIRST_NAME);
    }

    public function hasFirstName() {
        return $this->has(self::FIRST_NAME);
    }

    public function getLastName() {
        return $this->input(self::LAST_NAME);
    }

    public function hasLastName() {
        return $this->has(self::LAST_NAME);
    }

    public function getAge() {
        return $this->input(self::AGE);
    }

    public function hasAge() {
        return $this->has(self::AGE);
    }

    public function getCreatedAt() {
        return $this->input(self::CREATED_AT);
    }

    public function hasCreatedAt() {
        return $this->has(self::CREATED_AT);
    }

    public function getUpdatedAt() {
        return $this->input(self::UPDATED_AT);
    }

    public function hasUpdatedAt() {
        return $this->has(self::UPDATED_AT);
    }
}

生成异常

此命令生成与命令中提供的表相关的 NotFoundExceptions

generate:exception {tables*}

php artisan generate:exception users

生成: UserNotFoundException

namespace App\Api\V1\Exceptions;

/**
 * Class UserNotFoundException
 * @package App\Api\V1\Exceptions
 */
class UserNotFoundException extends \Symfony\Component\HttpKernel\Exception\HttpException
{
    const ERROR_MESSAGE = 'User not Found';
    const ERROR_CODE = 404;

    public function __construct($statusCode = 422)
    {
        parent::__construct($statusCode, self::ERROR_MESSAGE, null, array(), self::ERROR_CODE);
    }
}

生成服务

此命令为给定表生成包含 CRUD 操作的服务。这些服务由控制器用于在数据库上执行 CRUD 操作。

generate:service {tables*}

php artisan generate:service users

生成: UserService

namespace App\Services;


use App\Api\V1\Exceptions\UserNotFoundException;
use App\User;
use App\Services\Contract\CreateUserContract;
use App\Services\Contract\UpdateUserContract;

/**
 * Class UserService
 * @package App\Services
 */
class UserService
{

    /**
     * @param $userId
     * @return User
     */
    public static function find($userId) {
        $user = User::find($userId);
        if (!$user) {
            throw new UserNotFoundException();
        }
        return $user;
    }

    /**
     * @return User[]|\Illuminate\Database\Eloquent\Collection
     */
    public function index() {
        return User::all();
    }

    /**
     * @param $userId
     * @return User
     */
    public function show($userId) {
        return self::find($userId);
    }

    /**
     * @param CreateUserContract $contract
     * @return User
     */
    public function store(CreateUserContract $contract) {
        $user = new User();
                $user->first_name = $contract->getFirstName();
        $user->last_name = $contract->getLastName();
        $user->age = $contract->getAge();

        $user->save();
        return $user;
    }

    /**
     * @param $userId
     * @param UpdateUserContract $contract
     * @return User
     */
    public function update($userId, UpdateUserContract $contract) {
        $user = self::find($userId);
                if ($contract->hasFirstName()) {
            $user->first_name = $contract->getFirstName();
        }
        if ($contract->hasLastName()) {
            $user->last_name = $contract->getLastName();
        }
        if ($contract->hasAge()) {
            $user->age = $contract->getAge();
        }

        $user->save();
        return $user;
    }

    /**
     * @param $userId
     */
    public function delete($userId) {
        $user = $this->find($userId);
        try {
            $user->delete();
        } catch (\Exception $e) {
        }
    }
}

生成转换器

生成任何 CRUD 操作后生成的响应的转换器,控制器利用这些转换器将响应转换为所需格式。

默认情况下,转换器包含表的所有列。

generate:transformer {tables*}

php artisan generate:transformer users

生成: UserTransformer

namespace App\Transformers;


use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{

    public function transform(User $user){
        return [
			'id' => $user->id,
			'first_name' => $user->first_name,
			'last_name' => $user->last_name,
			'age' => (int)$user->age,
			'created_at' => $user->created_at,
			'updated_at' => $user->updated_at,
		];
    }
}

生成控制器

生成具有基本 CRUD 函数的控制器,路由指向这些函数。这些控制器类使用生成的服务进行数据库操作。

生成的变压器在发送响应之前由控制器使用。

generate:controller {tables*}

php artisan generate:controller users videos posts

生成:用户控制器

namespace App\Api\V1\Controllers;


use App\Transformers\UserTransformer;
use App\Api\V1\Requests\CreateUserRequest;
use App\Api\V1\Requests\UpdateUserRequest;
use App\Services\UserService;
use Devslane\Generator\Controllers\BaseController;

/**
 * Class UserController
 * @package App\Api\V1\Controllers
 *
 * @property-read UserService $userService
 */
class UserController extends BaseController
{
    protected $userService;

    public function __construct() {
        $this->userService = new UserService();
    }
    
    
    /**
     * @param UserService $service
     * @return \Dingo\Api\Http\Response
     */
    public function index(UserService $service) {
        $users = $service->index();
        return $this->response->collection($users, new UserTransformer());
    }

    /**
     * @param $id
     * @param UserService $service
     * @return \Dingo\Api\Http\Response
     */
    public function show($id, UserService $service) {
        $user = $service->show($id);
        return $this->response->item($user, new UserTransformer());
    }

    /**
     * @param CreateUserRequest $request
     * @param UserService $service
     * @return \Dingo\Api\Http\Response
     */
    public function store(CreateUserRequest $request, UserService $service) {
        $user = $service->store($request);
        return $this->response->item($user, new UserTransformer());
    }

    /**
     * @param UpdateUserRequest $request
     * @param $id
     * @param UserService $service
     * @return \Dingo\Api\Http\Response
     */
    public function update(UpdateUserRequest $request, $id, UserService $service) {
        $user = $service->update($id, $request);
        return $this->response->item($user, new UserTransformer());
    }
    
    /**
     * @param $id
     * @param UserService $service
     */
    public function destroy($id, UserService $service) {
        $service->delete($id);
    }
}

生成工厂

为提供的表生成工厂。

generate:factory {tables*}

php artisan generate:facotory users posts videos

生成:用户工厂

use App\User;
use Faker\Generator as Faker;

$factory->define(User::class, function (Faker $faker) {
    return [
		'first_name'=>$faker->firstName,
		'last_name'=>$faker->lastName,
		'age'=>$faker->numberBetween(0,100),
		'created_at'=>$faker->dateTime,
		'updated_at'=>$faker->dateTime,
	];
});

生成 Seeder

为表生成数据库 Seeder。这些 Seeder 使用由 generate:factory {tables*} 生成的对应工厂。默认情况下,Seeder 的行数为 10,可以通过在配置中的 mcs-helper.php 中修改来更改。

return [
.
.
    'seeder'      => [
        'row_count'     => 10,
        'path'          => 'database/seeds',
        'overwrite'     => true,
        'exclude_table' => [
            'password_resets', 'migrations',
        ],
    ]
.
.
]

generate:seeder {tables*}

php artisan generate:seeder users videos posts

生成:用户Seeder

use App\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Config;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */

    public function run() {
        $size = (integer)Config::get('mcs-helper.seeder.row_count');
        factory(User::class, $size)->create();
    }
}

生成全部

generate:all {tables*}

php artisan generate:all users videos posts