kigamba / laravel-tinker-tools
Use short class names in an Artisan tinker session -> Supports php 5
Requires
- php: >=5.6.4
- illuminate/support: 5.3.*|5.4.*
Requires (Dev)
- phpunit/phpunit: ^5.7
This package is not auto-updated.
Last update: 2024-11-27 22:57:38 UTC
README
When using Artisan's Tinker command it can be quite bothersome having to type the fully qualified classname to do something simple.
This Package requires >= PHP 5.0 . The parent package only support PHP 7.0
Feel free to hit me up in case you have a problem using it
\App\Models\NewsItem::first();
This package contains a class that, when fully installed let's you use the short class names:
NewsItem::first();
Installation
First install the package via Composer:
composer require kigamba/laravel-tinker-tools
Next, create a file named .psysh.php
in the root of your Laravel app with this content:
<?php \Spatie\TinkerTools\ShortClassNames::register();
Finally, dump the optimized version of the autoloader so autoload_classmap.php
gets created:
composer dump-autoload -o
Usage
Open up a Tinker session with:
php artisan tinker
Inside that Tinker session you can now use short class names:
NewsItem::first();
A peek behind the curtains
When you use a class that hasn't been loaded in yet, PHP will call the registered autoloader functions. Such autoloader functions are responsible for loading up the requested class. In a typical project Composer will register an autoloader function that can include
the file where the class is stored in.
Composer has a few ways to locate the right files. In most cases it will convert the fully qualified class name to a path. For example, when using a class App\Models\NewsItem
Composer will load the file in app/Models/NewsItem.php
. It's a bit more complicated behind the scenes but that's the gist of it. To make the process of finding a class fast, Composer caches all the fully qualified classnames and their paths in the generated autoload_classmap.php
, which can be found in vendor/composer
.
Now, to make this package work, \Spatie\TinkerTools\ShortClassNames
will read Composer's autoload_classmap.php
and convert the fully qualified class names to short class names. The result is a collection that's being kept in the $classes
property
Our class will also register an autoloader. When you use NewsItem
in your code. PHP will first call Composer's autoloader. But of course that autoloader can't find the class. So the autoloader from this package comes next. Our autoloader will use the aforementioned $classes
collection to find to fully qualified class name. It will then use class_alias
to alias NewsItem
to App\Models\NewsItem
.
What happens if there are multiple classes with same name?
Now you might wonder what'll happen it there are more classes with the same name in different namespaces? E.g. App\Models\NewsItem
, Vendor\PackageName\NewsItem
. Well, autoload_classmap.php
is sorted alphabetically on the fully qualified namespace. So App\Models\NewsItem
will be used and not Vendor\PackageName\NewsItem
.
Because App
starts with an "A" there's a high chance that, in case of a collision, a class inside your application will get picked. Currently there are no ways to alter this. I'd accept PRs that make this behaviour customizable.
Need more Tinker magic?
There are a lot of other options that can be set in tinker.config.php
. Learn all the options by reading the official psysh configuration documentation.
Postcardware
You're free to use this package (it's MIT-licensed), but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using.
Our address is: Spatie, Samberstraat 69D, 2060 Antwerp, Belgium.
We publish all received postcards on our company website.
Changelog
Please see CHANGELOG for more information what has changed recently.
Testing
$ composer test
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security related issues, please email freek@spatie.be instead of using the issue tracker.
Credits
We got the idea for ShortClassnames
by reading the "Tailoring Tinker with custom config"`section of Caleb Porzio's excellent blogpost "Supercharge Your Laravel Tinker Workflow".
About Spatie
Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.
License
The MIT License (MIT). Please see License File for more information.