1. Go to this page and download the library: Download lucasp1337/laravel-loom 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/ */
lucasp1337 / laravel-loom example snippets
namespace App\Events;
class OrderPlaced {} // any class under app/Events/
// ...or any class dispatched statically, wherever it lives:
event(new OrderPlaced($order));
Event::dispatch(new OrderPlaced($order));
OrderPlaced::dispatch($order); // counts as an event when it resolves under app/Events/
// Auto-discovered from the typed handle() argument
class SendOrderConfirmation
{
public function handle(OrderPlaced $event): void {}
}
// $listen array on EventServiceProvider
protected $listen = [
OrderPlaced::class => [SendOrderConfirmation::class],
];
// Event::listen() anywhere under app/
Event::listen(OrderPlaced::class, SendOrderConfirmation::class);
// Subscriber
class OrderSubscriber
{
public function subscribe(Dispatcher $events): array
{
return [OrderPlaced::class => 'onOrderPlaced'];
}
}
Event::listen(OrderPlaced::class, function (OrderPlaced $event) {
// captured in closure_listeners[], not listeners[]
});
#[ObservedBy(UserObserver::class)]
class User extends Model {}
// ...or registered imperatively
User::observe(UserObserver::class);
// ...or via an eloquent.* model event
Event::listen('eloquent.created: '.User::class, $callback);
class ProcessOrder implements ShouldQueue // any class under app/Jobs/
{
public $connection = 'redis'; // queue config read from properties
public $queue = 'high';
public $tries = 3;
}
// ...or any class dispatched as a job (located via PSR-4, so DDD layouts work):
dispatch(new ProcessOrder($order));
ProcessOrder::dispatch($order);
Bus::dispatch(new ProcessOrder($order));
// chain-wrapped targets resolve through the chain, and dispatch-time
// modifiers are captured as an `overrides` object on the dispatch site:
ProcessOrder::dispatch($order)->onQueue('high')->onConnection('redis');
dispatch((new ProcessOrder($order))->delay(60))->afterCommit();
// In Kernel::schedule(), bootstrap/app.php withSchedule(), or a Schedule:: chain under app/
$schedule->command('mail:send')->dailyAt('13:00')->weekdays();
$schedule->job(new ProcessOrder)->everyFiveMinutes();
Schedule::call(fn () => cleanup())->hourly();
class OrderShipped extends Mailable implements ShouldQueue {} // any class under app/Mail/
// ...or any class sent via Mail::
Mail::to($user)->send(new OrderShipped($order));
Mail::queue(new OrderShipped($order));
class InvoicePaid extends Notification // any class under app/Notifications/
{
public function via($notifiable): array
{
return ['mail', 'database', 'slack']; // channels read from a static via() literal
}
}
// ...or any class sent via notify()/Notification::
$user->notify(new InvoicePaid($invoice));
Notification::send($users, new InvoicePaid($invoice));
// the optional 3rd argument to Notification::send()/sendNow() restricts the
// dispatch to a channel set; a literal filter is captured as `channels` on
// the dispatch site:
Notification::send($users, new InvoicePaid($invoice), ['mail', SlackChannel::class]);
class SendOrderConfirmation
{
public function handle(OrderPlaced $event): void
{
// attributed to this listener as listeners[].dispatches
event(new OrderConfirmationSent($event->order));
}
}
use Lucasp\Loom\Index\IndexLoader;
$index = (new IndexLoader())->fromFile('storage/loom/index.json');
foreach ($index->events() as $event) {
echo $event->fqcn, "\n";
}
foreach ($index->handlersOf('App\\Events\\OrderShipped') as $handler) {
echo " handled by {$handler->listener}::{$handler->method}\n";
}
bash
php artisan loom:scan # writes storage/loom/index.json
php artisan loom:show # prints the index
php artisan loom:show OrderPlaced # filters by FQCN substring
bash
php artisan loom:mcp # serves storage/loom/index.json over stdio
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.