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

こんにちは!フリーエンジニアのヤマシタです。

CakePHPでは、UnixやLinuxなどのOSでよく使われるシェルスクリプトと似たような機能が提供されています。

この記事では、

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

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

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

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

ここではそんなCakePHPのシェル(shell)の使い方について、分かりやすく解説します!

シェル(shell)とは?

シェル(shell)とはコマンドが記述されたプログラムで、シェルスクリプトとも呼ばれます。

シェルの実行はコンソールから「sh ./hello.sh」「bash hello.sh」のように記述して実行します。

主にUnix/LinuxなどのOSではよく使用され、複数のコマンドを実行したり、条件分岐やループ処理なども可能です。

CakePHPにもそんなシェルのように、実行できる仕組みが用意されています。

シェルを記述するための構文はPHPの文法を使用しますが、シェル同様コンソールから簡単にプログラムを実行することができます。

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)の基本的な使い方を忘れてしまったら、この記事を思い出してくださいね!

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

ヤマシタ

システムエンジニアとして10年勤務→フリーランスへ。現在は侍ブログ編集部としてこれまでに200記事以上の記事を執筆。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。