DEV Community

loading...
Cover image for Create Laravel artisan commands and test database

Create Laravel artisan commands and test database

Md. Morshadun Nur
Hi I'm a full stack developer from Dhaka, Bangladesh. I am passionate PHP developer. I am expert in Laravel Vue js.
・1 min read

I'm going to use Artisan command line interface to create custom command. For this you can can run

php artisan make:test CreateTestDatabase

Now, you go to this directory app/console/commands and open the CreateDatabase.php file.

  1. Initialise the $fileSystem variable and define the command name.
protected $signature = 'testdb:create';

protected $description = 'Create test database sqlite';

private $fileSystem;
Enter fullscreen mode Exit fullscreen mode
  1. Set the Storage factory in constructor Illuminate\Contracts\Filesystem\Factory
parent::__construct();
$this->fileSystem = $storage->disk('public'); 
Enter fullscreen mode Exit fullscreen mode
  1. Now create the database.sqlite file in the database directory and run the migration command.
public function handle()
    {
        if (!file_exists(base_path('database/database.sqlite'))){
            $handle = fopen(base_path('database/database.sqlite'), 'c');
            fclose($handle);
        }

        $this->fileSystem->put('database.sqlite', '');
        $this->call('migrate', [
            '--database' => 'sqlite'
        ]);
    }
Enter fullscreen mode Exit fullscreen mode

So, now I can run the command php artisan testdb:create in the terminal and it will create the sqlite file and run the database migrations automatically.

Full code is given bellow -

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\Factory;

class CreateTestDatabase extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'testdb:create';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create test database sqlite';

    private $fileSystem;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(Factory $storage)
    {
        parent::__construct();
        $this->fileSystem = $storage->disk('public');
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        if (!file_exists(base_path('database/database.sqlite'))){
            $handle = fopen(base_path('database/database.sqlite'), 'c');
            fclose($handle);
        }

        $this->fileSystem->put('database.sqlite', '');
        $this->call('migrate', [
            '--database' => 'sqlite'
        ]);
    }
}
Enter fullscreen mode Exit fullscreen mode

Thank you so much for the reading. <3

Discussion (0)