PHP code example of caue-santos / auto-class-discovery

1. Go to this page and download the library: Download caue-santos/auto-class-discovery library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

caue-santos / auto-class-discovery example snippets


use CaueSantos\AutoClassDiscovery\Facades\AutoClassDiscovery;

$discovered = AutoClassDiscovery::discover(app_path('Domain'));

// $discovered = ['class' => [...], 'interface' => [...], 'trait' => [...], 'enum' => [...]]
foreach ($discovered['class'] as $fqcn => $definition) {
    // $definition is a CaueSantos\AutoClassDiscovery\Support\ClassDefinition
}

AutoClassDiscovery::discover(app_path('Domain'));

AutoClassDiscovery::classes();                          // every discovered class
AutoClassDiscovery::implementing(ShouldQueue::class);    // classes implementing an interface
AutoClassDiscovery::extending(Model::class);             // classes extending a base class
AutoClassDiscovery::using(HasFactory::class);             // classes using a trait
AutoClassDiscovery::withAttribute(AsCommand::class);      // classes carrying a PHP attribute

$definition->class;       // "App\Models\User"
$definition->type;        // "class" | "interface" | "trait" | "enum"
$definition->interfaces;  // ["Illuminate\Contracts\Auth\Authenticatable", ...]
$definition->parents;     // every ancestor class, most-derived first
$definition->traits;      // traits used directly by the class
$definition->attributes;  // fully qualified names of PHP attributes declared on it
$definition->abstract;    // bool
$definition->final;       // bool
$definition->enum;        // bool
$definition->file;        // absolute path it was found in, or null for manualDiscover()

$definition->isClass();
$definition->isInterface();
$definition->isTrait();
$definition->isEnum();
$definition->isAbstract();
$definition->isFinal();
$definition->isInstantiable();               // a non-abstract class

$definition->implements(Authenticatable::class);
$definition->extends(Model::class);
$definition->uses(HasFactory::class);
$definition->hasAttribute(AsCommand::class);
$definition->attributeInstances(AsCommand::class); // instantiated attribute objects, args and all

$definition->shortName();                    // "User"
$definition->namespace();                    // "App\Models"
$definition->newInstance(...$args);          // throws if not instantiable
$definition->reflection();                   // a fresh ReflectionClass
$definition->toArray();                      // plain array, also used by json_encode()

AutoClassDiscovery::discover([
    'repositories' => app_path('Repositories'),
    'policies' => app_path('Policies'),
]);

AutoClassDiscovery::classes('repositories');
AutoClassDiscovery::implementing(RepositoryContract::class, 'policies'); // scoped to one group

AutoClassDiscovery::manualDiscover(SomeVendorRepository::class, group: 'repositories');

'paths' => [
    'repositories' => app_path('Repositories'),
    'policies' => app_path('Policies'),
],

AutoClassDiscovery::discoverOrCache(
    config('auto-class-discovery.paths'),
    config('auto-class-discovery.cache_path'),
);

// AppServiceProvider::register()
AutoClassDiscovery::discover(app_path('Repositories'));

foreach (AutoClassDiscovery::implementing(RepositoryContract::class) as $definition) {
    foreach ($definition->interfaces as $interface) {
        if ($interface !== RepositoryContract::class && is_subclass_of($interface, RepositoryContract::class)) {
            $this->app->bind($interface, $definition->class);
        }
    }
}

#[Attribute(Attribute::TARGET_CLASS)]
class ListensTo
{
    public function __construct(public string $event) {}
}

#[ListensTo(OrderShipped::class)]
class SendShipmentNotification
{
    public function handle(OrderShipped $event): void { /* ... */ }
}

// AppServiceProvider::boot()
AutoClassDiscovery::discover(app_path('Listeners'));

foreach (AutoClassDiscovery::withAttribute(ListensTo::class) as $definition) {
    foreach ($definition->attributeInstances(ListensTo::class) as $attribute) {
        Event::listen($attribute->event, $definition->class);
    }
}

it('every model extends Eloquent', function () {
    $discovery = new AutoClassDiscovery();
    $discovery->discover(app_path('Models'));

    expect($discovery->classes()->every(fn ($definition) => $definition->extends(Model::class)))->toBeTrue();
});
bash
php artisan vendor:publish --tag=auto-class-discovery-config
bash
php artisan auto-class-discovery:cache
php artisan auto-class-discovery:clear