エス技研

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.

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

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

  関連記事

CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法

CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。

CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法

CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。

CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説
CakePHP3で静的ページの作成は webrootか pagesを使う。トップページを参考に解説

CakePHP3で静的なページを設置する場合の方法(webrootとpagesとを活用する方法)を解説。pagesの解説はデフォルトのトップページがどう表示されているかを参考に解説。ルーティングの機能も。

CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない

CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。

MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認

MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。

CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定

CakePHP3でOGPを設定する方法を解説。metaタグを編集するHTMLヘルパーを利用してOGPのタグを編集する。また、エレメントとして分割することでメンテナンス性も向上させる。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。

CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装

CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。

CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルのアップロード処理を自作・解説付き・その1

CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!

CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順

CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。