ajthinking/archetype

通过编程方式编辑PHP和Laravel文件。

安装次数: 1,732,343

依赖项: 9

建议者: 0

安全: 0

星标: 254

关注者: 4

分支: 20

公开问题: 1

类型:

v2.0.0 2024-05-11 08:05 UTC

README

image

启用快速应用程序开发工具、PR机器人、代码分析器和其他功能

tests version Total Downloads

  • 使用直观的顶级读写API编程修改PHP文件
  • 使用 FileQueryBuildersAbstractSyntaxTreeQueryBuilders 在类、框架和语言构造上读写

入门指南

composer require ajthinking/archetype

就这些!查看以下概念介绍或查看API示例

PHPFile 读写API

use Archetype\Facades\PHPFile;

// Create new files
PHPFile::make()->class(\Acme\Product::class)
    ->use('Shippable')
    ->public()->property('stock', -1)
    ->save();
// Modify existing files  
PHPFile::load(\App\Models\User::class)
    ->className('NewClassName')
    ->save();

LaravelFile 读写API

use Archetype\Facades\LaravelFile; // extends PHPFile

// Expanding on our User model
LaravelFile::user()
    ->add()->use(['App\Traits\Dumpable', 'App\Contracts\PlayerInterface'])
    ->add()->implements('PlayerInterface')
    ->table('gdpr_users')
    ->add()->fillable('nickname')
    ->remove()->hidden()
    ->empty()->casts()
    ->hasMany('App\Game')
    ->belongsTo('App\Guild')
    ->save()
    ->render();
显示输出
<?php

namespace App\Models;

use App\Contracts\PlayerInterface;
use App\Traits\Dumpable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable implements PlayerInterface
{
    use HasApiTokens, HasFactory, Notifiable;
    protected $table = 'gdpr_users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'nickname',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [];
    
    /**
     * Get the associated Guild
     */
    public function guild()
    {
        return $this->belongsTo(Guild::class);
    }
    
    /**
     * Get the associated Games
     */
    public function games()
    {
        return $this->hasMany(Game::class);
    }
}

文件查询构建器

过滤和检索一组文件进行交互。

// find files with the query builder
PHPFile::in('database/migrations')
    ->where('extends', 'Migration')
    ->andWhere('className', 'like', 'Create')
    ->get() // returns Collection of PHPFiles

// Quickly find the Laravel User file
$file = LaravelFile::user();

// Quickly find Laravel specific files
LaravelFile::models()->get();
LaravelFile::controllers()->get();
LaravelFile::serviceProviders()->get();
// ...

抽象语法树查询构建器

如前所述示例,我们可以使用简单的或原始值(如 字符串数组)查询和操作节点。但是,如果我们想执行自定义或更深入的查询,我们必须使用 ASTQueryBuilder

示例:我们如何在迁移文件中获取显式列名?

LaravelFile::load('database/migrations/2014_10_12_000000_create_users_table.php')
    ->astQuery() // get a ASTQueryBuilder
    ->classMethod()
    ->where('name->name', 'up')
    ->staticCall()
    ->where('class', 'Schema')
    ->where('name->name', 'create')
    ->args
    ->closure()
    ->stmts
    ->methodCall()
    ->where('var->name', 'table')
    ->args
    ->value
    ->value
    ->get();

ASTQueryBuilder检查所有可能的路径,并自动终止无法完成查询的路径

ASTQueryBuilder完全依赖于 nikic/php-parser。可用的查询方法与 PhpParser 类型属性相对应。为了更好地理解此语法,您可能需要在构建查询时尝试使用 dd($file->ast())。以下列出了一些基本约定。

  • 使用方法(method()staticCall() ...)遍历到 节点
  • 通过访问属性(argsstmts ...)遍历到 节点属性
  • 使用 where(...) 过滤结果
  • 使用 get() 解决匹配路径

ASTQueryBuilder 还支持 删除替换注入 节点 🔧

// Replace a node property
$file->astQuery()
    ->class()
    ->name
    ->replaceProperty('name', $newClassName)
    ->commit() // updates the file's AST
    ->end() // exit query
    ->save() 

错误 😵

如果无法解析文件,将抛出 FileParseError。这可能会发生如果您尝试显式加载一个损坏的文件 但也会 当执行匹配一个或多个问题文件的查询时。

要查看所有 有问题 的文件,请运行 php artisan archetype:errors。要忽略有问题的文件,请将它们放入 config/archetype.php -> ignored_paths

配置

php artisan vendor:publish --provider="Archetype\ServiceProvider"

要求

  • UNIX 文件系统
  • PHP >= 7.4
  • Laravel >= 7

贡献

欢迎提交PR和问题 🙏 随意尝试一个 不完整的测试

开发安装

git clone [email protected]:ajthinking/archetype.git
cd archetype
composer install
./vendor/bin/pest

许可

MIT

鸣谢

喜欢这个包吗?

给它加星标 ⭐

打招呼:@ajthinking 💎

Github Sponsors :octocat:❤️