Skip to content

Instantly share code, notes, and snippets.

@calebporzio
Last active January 24, 2024 08:46
Show Gist options
  • Save calebporzio/cdf70bd390688646fda65490006eb0a6 to your computer and use it in GitHub Desktop.
Save calebporzio/cdf70bd390688646fda65490006eb0a6 to your computer and use it in GitHub Desktop.
<?php
/**
* Automatically alias Laravel Model's to their base classname.
* Ex: "App\Models\User" now can just be accessed by "User"
*/
if (! function_exists('aliasModels')) {
function aliasModels() {
$finder = new \Symfony\Component\Finder\Finder();
$finder->files()->name('*.php')->in(base_path().'/app');
foreach ($finder as $file) {
$namespace = 'App\\';
if ($relativePath = $file->getRelativePath()) {
$namespace .= strtr($relativePath, '/', '\\') . '\\';
}
$class = $namespace . $file->getBasename('.php');
try {
$r = new \ReflectionClass($class);
if ($r->isSubclassOf('Illuminate\\Database\\Eloquent\\Model')) {
class_alias($class, $file->getBasename('.php'));
}
} catch (Exception $e) {
//
}
}
}
}
aliasModels();
return [
'startupMessage' => '<info>Using local config file (tinker.config.php)</info>',
'commands' => [
// new \App\Tinker\TestCommand,
],
];
@freekmurze
Copy link

Thanks for sharing this 👍

What does that \App\Tinker\TestCommand do?

@calebporzio
Copy link
Author

Ya, good call - that does nothing, I wanted to show that you can register custom commands from this config. I will comment it out so it doesn't break for others.

@unnikked
Copy link

Great share! Thank you 👍

@freekmurze
Copy link

freekmurze commented May 20, 2017

Cleaned up version:

class ShortClassNames
{
    /** @var \Illuminate\Support\Collection */
    public $classes = [];

    public static function register()
    {
        (new static)->registerAutoloader();
    }

    public function __construct()
    {
        $classFiles = include(base_path('vendor/composer/autoload_classmap.php'));

        $this->classes = collect($classFiles)
            ->map(function (string $path, string $fqcn) {
                $name = last(explode('\\', $fqcn));

                return compact('fqcn', 'name');
            })
            ->filter()
            ->values();
    }

    public function registerAutoloader()
    {
        spl_autoload_register([$this, 'aliasClass']);
    }

    public function aliasClass($findClass)
    {
        $class = $this->classes->first(function ($class) use ($findClass) {
            return $class['name'] === $findClass;
        });

        if (! $class) {
            return;
        }

        class_alias($class['fqcn'], $class['name']);
    }
}

Usage: put this in config.tinker.php.

ShortClassNames::register();

Might add some options and package it soon.

@tristanbailey
Copy link

Just read your post and this is a nice addition.

@mojtabaahn
Copy link

Thanks man, great article and great gist.

@calebporzio
Copy link
Author

My pleasure!

@carcinocron
Copy link

what about defining custom functions for use in tinker?

@calebporzio
Copy link
Author

Should be as simple as defining a function in the config, but I don't remember off hand. Shouldn't be too difficult though with a little research into tinker config files. (looking particularly at the underlying package: PsySh)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment