CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
2024/06/21
CakePHP4でコマンドプログラムを作成する
CakePHP4にもコマンドプログラムが用意されている
CakePHP4では、画面で見る処理だけではなく、コマンドラインからコマンドを入力して実行する処理も用意されています。
cronを使って定期的に自動処理を実行したい場合などに便利です。
CakePHP4でコマンドの処理を作成する方法を 4記事にわたって紹介します。
今回はその 1回目で、コマンドプロジェクトを作成する基本を解説します。
- CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
- CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
- CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
- Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
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」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4でコマンドを実行する際に引数(パラメータ)をコマンド内で受け取る処理について解説。複数個の引数にも対応する記述方法も解説。
-
-
CakePHP4、5のnewEmptyEntityで作成したオブジェクトは空なのか、確認してみた
CakePHPでレコードを新規登録をする際にnewEmptyEntity()を使って空のEntityを作成するが、これのempty、is_nullなどのでの判定結果がtrueかfalseか確認してみた。
-
-
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。
-
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。
-
-
CakePHP3でDocumentRootやwebroot、imgフォルダのURLやドメイン、パスを取得
URLやドメイン、フォルダへのパスの取得は、ビューではUrlHelperを使い、コントローラーではRouterクラスを使います。第2引数の指定でURLを取得することも可能。
-
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
-
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。
-
-
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。