エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説

      2024/06/21

CakePHP4でコマンドプログラムを作成する

 

CakePHP4にもコマンドプログラムが用意されている

 
CakePHP4では、画面で見る処理だけではなく、コマンドラインからコマンドを入力して実行する処理も用意されています。
cronを使って定期的に自動処理を実行したい場合などに便利です。
 
CakePHP4でコマンドの処理を作成する方法を 4記事にわたって紹介します。
今回はその 1回目で、コマンドプロジェクトを作成する基本を解説します。
 

 
 

CakePHP3.6以降はシェル(Shell)は非推奨に

 
ちなみに、この記事の最後に書いていますが、CakePHP3.6以降はシェル(Shell)は非推奨となり、コマンド(Command)を利用することとなりました。
 
そのため、この記事では「コマンド」についての内容になります。(シェルについては検証していません。)
 
 

Bakeコマンドを実行しコマンドプログラムのテンプレートを生成

 
まず初めに、下記のコマンドを実行し、コマンドプログラムのテンプレートを生成します。

$ bin/cake bake command hello

 
コマンドを実行すると下記の 2ファイルが生成されます。
/src/Command/HelloCommand.php
/tests/TestCase\Command/HelloCommandTest.php
 
このうち、コマンドプログラムである「/src/Command/HelloCommand.php」を使用していきます。
 
 

コマンドプログラム「HelloCommand.php」の中身

 
/src/Command/HelloCommand.phpの中身は下記のようになっています。
必要最低限の内容になっています。
 

<?php
declare(strict_types=1);

namespace App\Command;

use Cake\Command\Command;
use Cake\Console\Arguments;
use Cake\Console\ConsoleIo;
use Cake\Console\ConsoleOptionParser;

/**
 * Hello command.
 */
class HelloCommand extends Command
{
  /**
   * Hook method for defining this command's option parser.
   *
   * @see https://book.cakephp.org/4/en/console-commands/commands.html#defining-arguments-and-options
   * @param \Cake\Console\ConsoleOptionParser $parser The parser to be defined
   * @return \Cake\Console\ConsoleOptionParser The built parser.
   */
  public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
  {
    $parser = parent::buildOptionParser($parser);

    return $parser;
  }

  /**
   * Implement this method with your command's logic.
   *
   * @param \Cake\Console\Arguments $args The command arguments.
   * @param \Cake\Console\ConsoleIo $io The console io
   * @return null|void|int The exit code or null for success
   */
  public function execute(Arguments $args, ConsoleIo $io)
  {
  }
}

 
 

「buildOptionParser()」は引数(パラメータ)の付与時に使用

 
「buildOptionParser()」は、コマンドに引数(パラメータ)を付与して実行する際に、引数を受け取る処理に使用します。
次々回の下記の記事で紹介していますので、そちらを参照してください。
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
 
 

コマンドプログラムの本体は「execute()」メソッド内に記述

 
コマンドプログラムを実行すると「execute()」メソッドの中の処理が実行されますので、この中に処理を記述していきます。
 
 

「execute()」メソッド内に処理を記述

 
定番の「Hello world.」を表示する処理を「execute()」内に記述します。
 

  public function execute(Arguments $args, ConsoleIo $io)
  {
    $io->out('Hello world.');
  }

 
 

「HelloCommand」のプログラムを実行

 
コマンドプログラムを実行するコマンドは下記になります。
 

$ bin/cake hello

 
「Hello world.」とコンソール画面に表示されれば成功です。
 
 

「$io->out()」以外に「print_r()」「echo」も使える

 
ちなみに、規約上は「$io->out()」で画面に出力処理を行いますが、「print_r()」「echo」でも画面表示できますので、デバッグの時などはこれらを使うのもありかと思います。
 

  public function execute(Arguments $args, ConsoleIo $io)
  {
    $io->out('Hello world.');
    print_r("Hello world. \n");
    echo "Hello world. \n";
  }

 
 

複数の単語からなるコマンドプログラムの場合の記述方法

 
今回は「HelloCommand.php」ですが、複数の単語からなるコマンドの場合は下記のようになります。
 
 
先ほどと同じように bakeコマンドを利用して、コマンドプログラムのテンプレートファイルを生成します。
 

$ bin/cake bake command SayHello

 
「SayHelloCommand.php」と言うコマンドファイルが作成されます。
 
このファイルを実行する際のコマンドは、下記の記述(キャメルケース・camelCase)が、規約上の正解なのだろうと思います。
 

$ bin/cake sayHello

 
Cookbookの記事内では、「HelloCommand.php」の時に「bin/cake hello」となっていましたので、コマンドで実行する際の記述は 1単語目の 1文字目は小文字が規約上の正解なのだろうと思います。
 
ただ、下記でも動作します。
 

$ bin/cake SayHello

 
コマンドのファイル名も Class名も「SayHello」と「S」は大文字(パスカルケース・PascalCase)となっていますので、こちらの方が正しいのではないか、とすら思います。
 
 

キャメルケース、パスカルケース、スネークケース、ケバブケースのコマンドでの動作確認

 
ということで、規約上はキャメルケースで記述することが正しいであろうと思われますが、パスカルケースやスネークケース、ケバブケースなどの記述方法でコマンドとして認識されるのか、実験をしてみました。
 
ちょっと意外な感じがする結果もありますが、以下の通りの結果となりました。
 
コマンドとして実行される記述方法
 

$ bin/cake sayHello   OK
$ bin/cake SayHello   OK

$ bin/cake Say-hello  OK
$ bin/cake Say_hello  OK

$ bin/cake say-hello  OK
$ bin/cake say_hello  OK

 
 
コマンドとして認識されない記述方法
 

$ bin/cake sayhello   NG

$ bin/cake Say-Hello  NG
$ bin/cake Say_Hello  NG

$ bin/cake say-Hello  NG
$ bin/cake say_Hello  NG

 
 
参考サイトとしては、下記の Cookbookとなります。
https://book.cakephp.org/4/ja/console-commands/commands.html
 
 

CakePHP3.6 以降、シェルは非推奨になった

 
CakePHP3.6 以降、シェルは非推奨となりました。
 
https://book.cakephp.org/2/ja/console-and-shells.html
https://book.cakephp.org/3/ja/console-and-shells.html
https://book.cakephp.org/4/ja/console-commands/shells.html
 
CakePHP2のころは「/app/Console/Command」フォルダ内に「HelloShell.php」と言うファイル名でシェルと言うプログラムを作成していました。
 
CakePHP3では、「src/Shell」にはシェル「HelloShell.php」を作成し、「src/Command」にはコマンド「HelloCommand.php」を作成する仕様になりました。
そして、CakePHP3.6で「シェル」の方が非推奨となりました。
 
 
シェルは、非推奨ながら CakePHP5までは削除されないようですが、CakePHP4、CakePHP5で作成するならば、コマンドで実装するべきものでしょう。
 
諸行無常と言うか、栄枯盛衰と言うか、フレームワークの機能も改廃が進んでいきますね。
 
 

CakePHP4の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP 2.3 主キー(ID)以外のキーで更新方法 updateAll

主キー(ID)以外のカラムをキーとして更新する方法、updateAllの使い方をサンプルを用いて解説します。

CakePHP3のバージョンを指定してインストールする詳細な手順を解説
CakePHP3、CakePHP4、CakePHP5のバージョンを指定してインストールする詳細な手順を解説

CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。

CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介

CakePHP4、5系の認証処理でログイン認証が通らない場合の確認方法、確認箇所を解説。ログ出力し、ステータスを確認するが、ステータスの内容も紹介。それはそのままusernameを変更する際のポイントでもある。

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。

CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP3のForm Helperの使い方のまとめ

CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。

CakePHP3でテーブルにカラムを追加したときに変更するポイントのまとめ
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ

CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。

CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説

入力された値によってバリデーション(入力チェック)の内容を切り替える。その処理をCakePHPで実装する方法を解説。条件ごとに unset関数を使ってバリデーションを削除する、という方法を採る。

CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する

CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。