ajthinking/archetype

Programmatically edit PHP and Laravel files.

Maintainers

πŸ‘ ajthinking

Package info

github.com/ajthinking/archetype

Type:package

pkg:composer/ajthinking/archetype

Statistics

Installs: 3 783 840

Dependents: 10

Suggesters: 1

Stars: 272

Open Issues: 2

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

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT d2c5cd0f072ebde50dfa8a47a5a672023f561bdb

  • Anders JΓΌrisoo <jurisoo.woop@hotmail.com>

phplaravelastabstract syntax treephp-parser

This package is auto-updated.

Last update: 2026-06-11 12:48:08 UTC


README

πŸ‘ image

Enabling Rapid-Application-Development-tools, PR-bots, code analyzers and other things

πŸ‘ tests
πŸ‘ version
πŸ‘ Total Downloads

  • Programatically modify php files with an intuitive top level read/write API
  • Read/write on classes, framework- and language constructs using FileQueryBuilders and AbstractSyntaxTreeQueryBuilders

Getting started

composer require ajthinking/archetype

That's it! Check out introduction of concepts below or review the API examples

PHPFile read/write 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 read/write 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();

File QueryBuilders

Filter and retrieve a set of files to interact with.

// 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();
// ...

Abstract Syntax Tree QueryBuilder

As seen in the previous examples we can query and manipulate nodes with simple or primitive values, such as strings and arrays. However, if we want to perform custom or more in dept queries we must use the ASTQueryBuilder.

Example: how can we fetch explicit column names in a migration file?

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();

The ASTQueryBuilder examines all possible paths and automatically terminates those that cant complete the query:

πŸ‘ Image

The ASTQueryBuilder relies entirely on nikic/php-parser. Available query methods mirror the PhpParser types and properties. To understand this syntax better you may want to tinker with dd($file->ast()) while building your queries. Basic conventions are listed below.

  • Traverse into nodes by using methods (method(),staticCall() ...)
  • Traverse into node properties by accessing properties (args,stmts ...)
  • Filter results with where(...)
  • Resolving matching paths with get()

ASTQueryBuilder also supports removing, replacing and injecting nodes πŸ”§

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

Errors 😡

If a file can't be parsed, a FileParseError will be thrown. This can happen if you try to explicitly load a broken file but also when performing queries matching one or more problematic files.

To see all offending files run php artisan archetype:errors. To ignore files with problems, put them in config/archetype.php -> ignored_paths.

Configuration

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

Requirmenst

  • UNIX filesystem
  • PHP >= 7.4
  • Laravel >= 7

Contributing

PRs and issues are welcome πŸ™ Feel free to take a stab at an incomplete test.

Development installation

git clone git@github.com:ajthinking/archetype.git
cd archetype
composer install
./vendor/bin/pest

License

MIT

Acknowledgements

Like this package?

Star it ⭐

Say hi: @ajthinking πŸ’Ž

Github Sponsors πŸ‘ :octocat:
❀️