【CakePHP入門】シェル(shell)を実行する方法

今回はCakePHPのシェル(shell)の作成、実行方法について解説します。

この記事では、

・シェル(shell)とは?
・CakePHPのコンソールの使い方
・簡単なシェル(shell)の作成方法

という基本的な内容から、

・シェルに引数を指定して実行する方法
・シェルでユーザー入力情報を取得する

などの応用的な使い方に関しても解説していきます。

CakePHPのシェル(shell)の使い方について、分かりやすく解説していますので、ぜひ参考にしてください。

目次

シェル(shell)とは?

Linuxにはファイルシステムなど、各種制御を行うプログラムが備わっています。このプログラムは「シェル」と呼ばれ、「コマンド」という形でユーザーがコンソールから入力して使えるのです。

シェルは主にUnix/LinuxなどのOSでよく使用されます。

CakePHPにもシェルのように、コンソールからプログラムを実行できる仕組みが用意されています。

CakePHPのコンソールの使い方

シェルの詳細な解説に入る前に、コンソールからコマンドが正常に実行できるか確認してみましょう。

以下のように引数を指定しないでCakePHPを実行すると、ヘルプメッセージが表示されます。

bin/cake

実行結果:

Welcome to CakePHP v3.4.7 Console
---------------------------------------------------------------
App : src
Path: /Applications/MAMP/htdocs/cake/src/
PHP : 7.1.1
---------------------------------------------------------------
Current Paths:

* app:  src
* root: /Applications/MAMP/htdocs/cake
* core: /Applications/MAMP/htdocs/cake/vendor/cakephp/cakephp

Available Shells:

[Bake] bake

[DebugKit] benchmark, whitespace

[Migrations] migrations

[CORE] cache, i18n, orm_cache, plugin, routes, server

[app] console, hello

〜省略〜

このようにCakePHPのヘルプ画面が表示されて、パスに関する情報や、「Available Shells」以下には実行できるシェル・コマンドが記述されています。

たとえば、サーバーを起動するには、以下のようにserverシェルを記述します。

bin/cake server

実行結果:

Welcome to CakePHP v3.4.7 Console
---------------------------------------------------------------
App : src
Path: /Applications/MAMP/htdocs/cake/src/
DocumentRoot: /Applications/MAMP/htdocs/cake/webroot
---------------------------------------------------------------
built-in server is running in http://localhost:8765/
You can exit with `CTRL-C`

シェル(shell)を使ってみよう

ここでは実際にCakePHPでコンソール上で動くプログラムを作成してみましょう。

シェルの作成方法

コンソール上で実行するシェルを作成するには、src/Shellディレクトリにプログラムを作成する必要があります。

以下にsrc/Shell/SampleShell.phpのサンプルプログラムを記述します。

<?php

namespace App\Shell;

use Cake\Console\Shell;

class SampleShell extends Shell
{
    public function main()
    {
        $this->out('これはサンプルです。');
    }
}

実行:

bin/cake sample

実行結果:

これはサンプルです。

シェルを実行するシェルクラスには、クラス名にShellサフィックス(接頭辞)を付けて、ファイル名と一致する必要があります。

実行時にシェルに引数を付けないと、main()メソッドが呼ばれて処理が実行されます。

main()メソッドはシェル実行時に他のコマンドや引数が無いときに、いつでも呼ばれるメソッドです。

シェルに引数を指定する

前述したmain()以外のメソッドを使用する場合は、シェル実行時にメソッド名を引数に指定して実行する必要があります。

以下にmain()メソッド以外のメソッドを実行するサンプルプログラムを紹介します。

<?php

namespace App\Shell;

use Cake\Console\Shell;

class SampleShell extends Shell
{
    public function main()
    {
        $this->out('これはサンプルです');
    }

    public function blogname($name)
    {
        $this->out('これは「'.$name.'」のブログです。');
    }
}

このプログラムを記述したら、以下のように実行します。

bin/cake sample blogname 侍エンジニア

実行結果:

これは「侍エンジニア」のブログです。

このようにシェル実行時に引数にメソッド名を指定し、今回のようにblogname($name)に$nameの引数を持っていた場合は、

「bin/cake [シェルプログラム] [メソッド名] [メソッドの引数の値]」

と指定することで、引数$nameに値を設定することができます。

シェルでユーザー入力情報を取得する

シェルを使えば、コンソールで対話的なアプリケーションを作成することもできます。

以下に簡単な対話型のプログラムを紹介します。

前節のサンプルにuserメソッドを加えてみましょう。

<?php

namespace App\Shell;

use Cake\Console\Shell;

class SampleShell extends Shell
{
    public function main()
    {
        $this->out('これはサンプルです');
    }

    public function blogname($name)
    {
        $this->out('これは「'.$name.'」のブログです。');
    }

    public function user(){
        // ユーザーの入力情報を取得
        $res = $this->in('あなたの性別を入力してください',
        ['man', 'woman'], 'input');

        if ($res == 'man'){
        $this->out('あなたは男性ですね!');
        }else{
        $this->out('あなたは女性ですね!');
        }
    }

}

このプログラムを記述したら、以下のように実行します。

bin/cake sample user

実行結果:

あなたの性別を入力してください (man/woman) 
[input] > man
あなたは男性ですね!

まとめ

ここでは、CakePHPで提供されているシェルについての、

・シェル(shell)とは?
・CakePHPのコンソールの使い方
・簡単なシェル(shell)の作成方法
・シェルに引数を指定して実行する方法
・シェルでユーザー入力情報を取得する

などについて解説しました。

ここで紹介した以外にも、シェルを使用すればさまざまな処理ができますので、気になった方は勉強してみてください。

もしシェル(shell)の基本的な使い方を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次