Laravelでデータベースレコードを管理するための職人コマンドを作成する方法
これまでこのシリーズを続けていれば、データベーステーブルはすべて設定されているはずです。 ただし、ユーザーがlinks
テーブルに新しいエントリを挿入できるようにする方法を実装する必要があります。
このシリーズの範囲を制限すると同時に、アプリケーションを完全に機能させるには、データベース内のリンクを作成および削除するArtisanコマンドを設定します。 Artisanは、Laravelに付属するコマンドラインツールであり、ボイラープレートコードの生成からアプリケーションのデータベースの削除と再作成まで、開発プロセスを高速化するための多数のユーティリティを提供します。
コマンドラインインターフェイスを使用してアプリケーションを管理することは、ブラウザから認証される代わりに、ユーザーがそのようなコマンドを実行するためにサーバーにログオンする必要があるため、Webフォームやセキュリティで保護された領域の代わりになります。 後でアプリケーション用のセキュリティで保護された領域を作成することにした場合は、Webフォームを作成して、登録ユーザーがデータベースへの新しいリンクを送信できるようにすることができます。
Artisanコマンドは、Crontabなどのスケジューリングメカニズムを介して手動または自動でバックグラウンドで実行する必要があるアプリケーションタスクを実行するためによく使用されます。 また、許可されたユーザーからの入力に応じて、動的に構成する必要がある新しいアプリケーション機能のプロトタイピングを容易にするために使用することもできます。
開始するには、make:command
ヘルパーを使用して新しいArtisanコマンドを作成します。
- docker-compose exec app php artisan make:command LinkNew
OutputConsole command created successfully.
これにより、app/Console/Commands
ディレクトリにLinkNew.php
という名前のファイルが作成されます。 Illuminate\Console\Command
親クラスから拡張されたこのクラスでは、このコマンドが呼び出されたときに実行されるhandle
メソッドを実装する必要があります。 コマンドの署名を定義するには、$signature
保護プロパティをlink:new
に設定します。
選択したテキストまたはコードエディタを使用して、新しいファイルを開きます。 ここでは、nano
を使用します。
- nano app/Console/Commands/LinkNew.php
handle
メソッドでは、データベースへの新しいリンクを保存できるようにするために、いくつかの異なることが必要になります。 まず、リンクURLを取得するために、ユーザーの入力を要求します。
$url = $this->ask('Link URL:');
次に、filter_var
関数を使用して、ユーザーから取得した入力が有効なURLであることを検証します。 リンクが無効な場合は、エラーが表示され、ステータスコード1
でアプリケーションが終了します。これは、アプリケーションがエラーで終了したことを意味します。
if (!filter_var($url, FILTER_VALIDATE_URL)) {
$this->error("Invalid URL. Exiting...");
return 1;
}
リンクが有効な場合は、続行して、前と同じ方法でリンクの説明を求めます。
$description = $this->ask('Link Description:');
次に、 confirm ヘルパーを使用して、すべてのデータが正しいことの最終確認を求めます。 ユーザーが確認すると、リンクは最終的にデータベースに挿入されます。 このシリーズの前のパートで作成したLink
Eloquentモデルを使用して、データベースを操作します。
$this->info("New Link:");
$this->info($url . ' - ' . $description);
if ($this->confirm('Is this information correct?')) {
$link = new Link();
$link->url = $url;
$link->description = $description;
$link->save();
$this->info("Saved.");
}
アプリケーションは0
で終了し、成功ステータス(0エラー)を表します。
return 0;
次のコードには、これらの手順の完全な実装が含まれています。 LinkNew
クラスの現在のコンテンツを次のように置き換えます。
<?php
namespace App\Console\Commands;
use App\Models\Link;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class LinkNew extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'link:new';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Create a New Link';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$url = $this->ask('Link URL:');
if (!filter_var($url, FILTER_VALIDATE_URL)) {
$this->error("Invalid URL. Exiting...");
return 1;
}
$description = $this->ask('Link Description:');
$this->info("New Link:");
$this->info($url . ' - ' . $description);
if ($this->confirm('Is this information correct?')) {
$link = new Link();
$link->url = $url;
$link->description = $description;
$link->save();
$this->info("Saved.");
}
return 0;
}
}
完了したら、ファイルを保存して閉じます。
コマンドを実行してデータベースに新しいリンクを挿入するには、次のコマンドを実行します。
- docker-compose exec app php artisan link:new
Output Link URL::
> https://digitalocean.com/community
Link Description::
> DigitalOcean Community
New Link:
https://digitalocean.com/community - DigitalOcean Community
Is this information correct? (yes/no) [no]:
> yes
Saved.
必要に応じて、さらにいくつかのリンクを追加してください。
リンクの一覧表示
次に、すべてのリンクのリストを表示する新しいArtisanコマンドを作成する必要があります。これをlink:list
と呼ぶことができます。 次のコマンドを使用して新しいコマンドを作成します。
- docker-compose exec app php artisan make:command LinkList
選択したテキストまたはコードエディタを使用してコマンドクラスを開きます。
- nano app/Console/Commands/LinkList.php
このコマンドのhandle
メソッド内で、links
テーブルのすべての行をクエリします。 Link
モデルを使用して、Eloquentが提供する基盤となるデータベースクエリメソッドにアクセスできます。 コマンドラインで結果をうまく表示するには、table出力ヘルパーを使用できます。
$headers = [ 'id', 'url', 'description' ];
$links = Link::all(['id', 'url', 'description'])->toArray();
$this->table($headers, $links);
return 0;
次のコードには、link:list
コマンドの完全な実装が含まれています。 LinkList.php
ファイルのコンテンツを次のように置き換えます:
<?php
namespace App\Console\Commands;
use App\Models\Link;
use Illuminate\Console\Command;
class LinkList extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'link:list';
/**
* The console command description.
*
* @var string
*/
protected $description = 'List links saved in the database';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$headers = [ 'id', 'url', 'description' ];
$links = Link::all(['id', 'url', 'description'])->toArray();
$this->table($headers, $links);
return 0;
}
}
完了したら、ファイルを保存して閉じます。
このコマンドを実行して、links
テーブルにすでに挿入されているすべてのリンクのリストを表示するには、次のコマンドを実行します。
- docker-compose exec app php artisan link:list
Output+----+------------------------------------+--------------+
| id | url | description |
+----+------------------------------------+--------------+
| 1 | https://digitalocean.com/community | DO Community |
| 2 | https://laravel.com | Laravel |
+----+------------------------------------+--------------+
リンクの削除
最後に、削除リンクへのコマンドを作成します。
- docker-compose exec app php artisan make:command LinkDelete
OutputConsole command created successfully.
選択したテキストまたはコードエディタを使用して、新しいファイルを開きます。
- nano app/Console/Commands/LinkDelete.php
このコマンドにはlink:delete
という名前を付けることができます。 どのリンクを削除する必要があるかを知るには、コマンドを呼び出すときにユーザーが追加の引数(リンクのID)を提供するように要求する必要があります。 これは$signature
変数内でも設定され、はコマンドの呼び出し方法を定義し、必須かどうかに関係なく、どの引数を指定する必要がありますか。
protected $signature = 'link:delete {link_id}';
このコマンドのhandle
メソッドは、いくつかの異なる命令を実装します。 まず、コマンド呼び出し内で提供されているはずのリンクIDを取得します。
$link_id = $this->argument('link_id');
次に、Link
モデルで使用できるEloquentメソッドfind
を使用して、データベースから参照リンクを取得します。
$link = Link::find($link_id);
find
メソッドがそのIDのデータベースレコードを見つけられない場合、null
を返します。 それが$link
変数に含まれている現在の値であるかどうかを確認し、その場合はエラーを返します。 プログラムはエラーで終了します(コード1)。
if ($link === null) {
$this->error("Invalid or non-existent link ID.");
return 1;
}
$link
がnullでない場合、コマンドは実行を継続します。 次に、confirm
ヘルパーを使用して、ユーザーの確認を求めます。
if ($this->confirm('Are you sure you want to delete this link? ' . $link->url)) {
// deletes link
}
ユーザーがyes
と入力し、ENTER
を押してアクションを確認すると、Link
Eloquentモデルからdelete
メソッドを呼び出して、指定されたリンクを削除します。データベースから。
$link->delete();
$this->info("Link deleted.");
次のコードには、list:delete
コマンドの完全な実装が含まれています。 LinkDelete.php
ファイルの内容を次のように置き換えます。
<?php
namespace App\Console\Commands;
use App\Models\Link;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
class LinkDelete extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'link:delete {link_id}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Deletes a link from the database.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$link_id = $this->argument('link_id');
$link = Link::find($link_id);
if ($link === null) {
$this->error("Invalid or non-existent link ID.");
return 1;
}
if ($this->confirm('Are you sure you want to delete this link? ' . $link->url)) {
$link->delete();
$this->info("Link deleted.");
}
return 0;
}
}
完了したら、ファイルを保存して閉じます。
リンクテーブルからリンクを削除する場合は、前に示したように、最初にartisan link:list
でリンクのIDを取得する必要があります。 リンクのIDがわかれば、次のコマンドでartisan link:delete
コマンドを実行できます。
- docker-compose exec app php artisan link:delete LINK_ID
Output
Are you sure you want to delete this link? https://laravel.com (yes/no) [no]:
> yes
Link deleted.
コマンドラインインターフェイスから実行されるArtisanコマンドを使用して、アプリケーションのデータベースにリンクを挿入、一覧表示、および削除できるようになりました。 このシリーズの次のパートでは、BladeテンプレートとBulmaCSSフレームワークを使用してアプリケーションのフロントエンドをセットアップします。