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に設定します。
選択したテキストまたはコードエディタを使用して、新しいファイルを開きます。 Here, nano is used:
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 ヘルパーを使用して、すべてのデータが正しいことの最終確認を求めます。 ユーザーが確認すると、リンクは最終的にデータベースに挿入されます。 このシリーズの前のパートで作成したLinkEloquentモデルを使用して、データベースを操作します。
$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クラスの現在のコンテンツを次のように置き換えます。
app / Console / Commands / LinkNew.php
<?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ファイルのコンテンツを次のように置き換えます:
app / Console / Commands / 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を押してアクションを確認すると、LinkEloquentモデルからdeleteメソッドを呼び出して、指定されたリンクを削除します。データベースから。
$link->delete();
$this->info("Link deleted.");
次のコードには、list:deleteコマンドの完全な実装が含まれています。 LinkDelete.phpファイルの内容を次のように置き換えます。
app / Console / Commands / 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フレームワークを使用してアプリケーションのフロントエンドをセットアップします。