エス技研

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.

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

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

  関連記事

CakePHP3のユーザ管理・認証プラグイン CakeDC/Usersの導入・機能解説・3.1.5対応
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応

CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。

CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント

CakePHP3の開発で発生する「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」のエラーには特有の原因もあるため、その説明と対処方法の解説。

CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合

ID以外のカラムでアソシエーション(連携)させるための考え方とサンプルソースを用いての説明を行っています。

CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索

CakePHPの検索プラグイン Search Pluginの検索処理の中で複数項目を入力した場合の AND検索、OR検索についての解説です。

CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法
CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法

CakePHP4のfindListでキーと値のカラムを指定してテーブルにアクセスする方法がCakePHP5では「Deprecated(非推奨)」となった。推奨の記述方法を解説。

CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説

CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。

CakePHP 2.3でファイルをアップロード・その2 ファイル名を乱数で設定

CakePHPのアップロードするファイル名を乱数で変更しセキュリティを高める方法を解説。

CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法
CakePHP3でComposerでインストールできないプラグイン、外部ライブラリを vendorに入れて手動で読み込む方法

CakePHP3にComposerからインストールできないプラグインやライブラリなどを利用する方法、vendorにファイルを設置し、composer.jsonを更新し、それを呼び出す方法を詳細に解説。

Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法

CakePHP4のコマンド(シェル)に対して、環境変数を指定して実行する方法を解説。LinuxとWindows上のXAMPPとでは記述方法が異なるため、Windowsのsetコマンドについても詳細解説。

CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法

CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。