Lokale Laravel package ontwikkelen met artisan commando

In dit artikel leg ik stap voor stap uit hoe je de basis voor een Laravel package kan maken.
Als voorbeeld maken we een artisan command die terug geeft hoeveel users we hebben voor dit project.

Lokale Laravel installatie

Zorg dat je een Lokale Laravel versie hebt draaien. Mocht je niet weten hoe dit moet, ik heb ook een artikel hoe je dit kan doen in combinatie met Docker op Windows 10.
Laravel installeren op Docker Windows 10

Development package aanmaken

Omdat we nog geen code / package hebben gaan we eerst aangeven dat we een lokale repository gebruiken.
Maak een folder in je project en geeft deze folder de naam van je package, bijvoorbeeld in app/dev-packages/laravel-artisan-user-count. Ga met de CLI naar deze folder.
Maak daar een compose.json bestand aan en zet het volgende daarin :

{
    "name": "acme/laravel-artisan-user-count",
    "description": "Artisan command to show the total users in this Laravel application",
    "keywords": ["Laravel", "Laravel artisan"],
    "authors": [
        {
            "name": "Marcel van Doornen",
            "email": "mail@webbouwplus.nl"
        }
    ],
    "require": {
        "laravel/framework": "~8"
    },
    "autoload": {
        "psr-4": {
            "Acme\\laravelArtisanUserCount\\": "src/"
        }
    },
    "extra": {
        "laravel": {
            "providers": [
                "Acme\\laravelArtisanUserCount\\LaravelArtisanUserCountServiceProvider"
            ]
        }
    }

src folder

Maak in de aangemaakte folder ‘laravel-artisan-user-count’ ook een src folder, hierin komen je package bestanden.

Laravel service provider toevoegen

Om ons Artisan command te kunnen gebruiken moeten we dat eerst in Laravel aangeven, dit kan met een Serviceprovider.
Zoals in de bovenstaande composer.json is deze verwijzing al gedaan:

 "extra": {
        "laravel": {
            "providers": [
                "Acme\\laravelArtisanUserCount\\LaravelArtisanUserCountServiceProvider"
            ]
        }
    }

Maak nu in het mapje src een bestand aan ‘LaravelArtisanUserCountServiceProvider.php’ met de volgende code:

<?php

namespace Acme\laravelArtisanUserCount;

use Illuminate\Support\ServiceProvider;

class laravelArtisanUserCountServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot() {

    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register() {

        // Register the artisan command.
        $commands = [
            'Acme\laravelArtisanUserCount\Commands\userCount'
        ];

        $this->commands($commands);
    }
}

In the method registeren we het artisan command. In de $commands array geven we aan waar dit command bestand staat ‘commands/userCount.php)

Artisan command

  • Maak in de src folder een folder ‘commands’ aan
  • Maak in deze folder weer een bestand aan ‘userCount.php

In de dit bestand maken we het artisan command aan:

<?php

namespace Acme\laravelArtisanUserCount\Commands;

use App\Models\User;
use Illuminate\Console\Command;

class UserCount extends Command{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:user-count';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Count the total users for this project';

     /**
     * Create a new command instance.
     *
     */
    public function __construct() {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle() {

        $userCount = User::count();

        if (!$userCount) {
            $this->line('There are no users for this project');
        }
        elseif ($userCount == 1) {
            $this->line('There is 1 user for this project');
        }
        else {
            $this->line('There are ' . $userCount . ' users for this project');
        }
    }
}

Package toevoegen aan Laravel

We gaan nu aangeven dat we deze package willen gebruiken in ons Project. Omdat deze package nog niet op Github/packagist staat moeten we eerst aan composer aangeven waar deze lokale package staat.
Dit kunnen we doen in het bestand composer.json (root van je Laravel installatie). Voeg het volgende toe (bijvoorbeeld na “scripts”:{},)

"repositories": [
        {
            "type": "path",
            "url": "app/dev-packages/laravel-artisan-user-count"
        }
    ]

Composer herladen

We moeten de composer.json herladen zodat deze de ‘repositories’ opneemt.

composer dump-autoload

Package installeren

Nu kunnen we de package installeren, voer het volgende in:

composer require acme/laravel-artisan-user-count

Als het goed is je package nu klaar voor gebruik.

Migratie

Mocht je het nog niet gedaan hebben, draai de migraties van Laravel om de database tabellen aan te maken.

php artisan migrate

Artisan commando gebruiken

Je kan het artisan commando gebruiken door het volgende in te typen:

php artisan command:user-count

Als uitkomt zou je moeten zien ‘There are no users for this project’ als je nog geen gebruikers hebt uiteraard 😉

Testen met seeds

Om te testen met users kunnen we automatisch users aanmaken met de al bestaande user seed functie in Laravel.
In bestand ‘database/seedersDatabaseSeeder’ zet de user functie aan:

 \App\Models\User::factory(10)->create();

Refresh de database en importeer de dummy gebruikers:

php artisan migrate:fresh --seed

Als je weer het artisan commando draait:

php artisan command:user-count

Nu zou je als het goed is moeten zien ”There are 10 users for this project’