[CakePHP] Console/Command と Lib の違い

コンソールからcakePHPを実行するときにディレクトリ構造で混乱したのでメモ.
細かいオプションや設定は省いて,

  • 基本的な情報
  • すぐ使える情報

をまとめたい.

動作環境

  • Vagrant 1.8.7
  • Ubuntu 14.04.5
  • Apache/2.4.18 (Ubuntu)
  • CakePHP 2.6.8

参考

結論

先に結論から.

  • /app/Console/Command
    • シェルから実行したい時に使うファイルを格納
  • /app/Lib
    • 自作class置き場

以下, 各ディレクトリについて簡単にまとめる.

/app/Console/Command について

どんな時に使うディレクトリなのか

次のような時に利用するディレクトリ.

  • シェル(コマンドライン) からcakeを実行したい時
  • シェルから自分が作成したMVC classにアクセスしたい時

たとえばcronを回す時なんかに役立ちそう.

CakePHP のコンソールアプリケーションでは、コマンドライン からあなたが作成したアプリケーションクラスを再利用できます。

引用:
シェルとタスクとコンソール_CakePHP 2.0 book

シェルから実行するときは PHP CLI版 が必要なので注意.

コンソール機能を使う場合は、コマンドライン版 (CLI) としてビルドされた PHP がインストールされている必要があります。

引用:
シェルとタスクとコンソール_CakePHP 2.0 book

cakeコマンド実行

シェルからの実行にはコツが必要.

$ cd /vagrant/app/Console
$ ./cake

cake コマンドの前に ./ が必要.
注意.

Hello World と出力させるシェルを作ってみる

次のHPを参考に進める.

次のディレクトリにファイル作成.

/app/Console/Command/HelloShell.php

<?php
class HelloShell extends AppShell {
    public function main() {
        $this->out('Hello world.');
    }
}

実行

$ /vagrant/app/Console
$ ./cake hello

実行結果

Welcome to CakePHP v2.6.8 Console
---------------------------------------------------------------
App : app
Path: /vagrant/app/
---------------------------------------------------------------
Hello world.

HelloShell.php ファイル内を解説

命名規則やメソッドについて.

  • クラス名
    • ファイル名+ Shell
  • main() メソッド
    • 引数なしで ./cake hello を実行した時に呼び出される
  • $this->out()
    • ()内に指定されたものが出力される.
    • 今回は文字列を指定して標準出力した

基本的な cakeコマンドは次のような文法.

./cake ファイル名 アクション名 引数
次の例で確認してみる.

引数の取得: 自分の名前を出力させるシェル

/app/Console/Command/HelloShell.php

<?php
class HelloShell extends AppShell {
    public function main() {
        $this->out('Hello world.');
    }

    public function hey_there() {// 追加
    $this->out('Hey there ' . $this->args[0]);
    }
}

実行

$ cd /vagrant/app/Console
$ ./cake hello hey_there takimoto

実行結果

Welcome to CakePHP v2.6.8 Console
---------------------------------------------------------------
App : app
Path: /vagrant/app/
---------------------------------------------------------------
Hey there takimoto
vagrant@cakephp:/vag

シェルの中でモデルを利用する: $uses プロパティ設定

$uses プロパティを設定することで、シェルからアクセスできるモデルの 配列を定義できます。

引用:
シェルとタスクとコンソール_CakePHP 2.0 book

今回はDBにデータを入れていないのでコマンドだけ紹介.

/app/Console/Command/HelloShell.php

<?php
class UserShell extends AppShell {
    public $uses = array('User');// ここで使用するモデルを定義

    public function show() {
        $user = $this->User->findByUsername($this->args[0]);
        $this->out(print_r($user, true));
    }
}

$usesプロパティに, 配列でモデル名を指定するのがポイント.

実行

$ cd /vagrant/app/Console
$ ./cake hello user show takimoto

.usersテーブルにtakimoto という名前のレコードがあればそれを引っ張ってくる.

/app/Lib について

次は /app/Lib ディレクトについて.

Lib
サードパーティ、外部ベンダからのライブラリではなく、ファーストパーティのライブラリが入ります。 これはベンダライブラリと内部ライブラリの構成を分割することを可能にします。

引用:
Appフォルダ_CakePHP 2.x Cookbook

この文章だと分かりにくいが, CakePHP内で使う自作classは /app/Lib に置く.

class自作方法と, controllerから呼び出す方法

自作classを /app/Lib に作成して, それをcontrollerから呼び出す方法について.
/app/Libには諸用でcake用の OAuthライブラリ(cakebaker) を利用したのでその名残がある.

まず, 自作class.

/app/Lib/Jisaku/jisakuHoge.php

<?php 

App::import('Vendor', 'OAuth'.DS.'OAuthClient');

class jisakuHoge {

    private $consumer_key;
    private $consumer_secret;
    private $oauth_token;
    private $oauth_token_secret;


    public function __construct(array $credentials){
        $this->setCredentials($credentials);
    }

    private function setCredentials(array $credentials){
        $this->consumer_key       = $credentials['consumer_key'];
        $this->consumer_secret    = $credentials['consumer_secret'];
        $this->oauth_token        = $credentials['oauth_token'];
        $this->oauth_token_secret = $credentials['oauth_token_secret'];
    }

    /**
     * call OAuth library `bakebaker`
     */
    private function createClient(){
        return new OAuthClient($this->consumer_key, $this->consumer_secret);
    }
}

後述するが, composerでインストールしたライブラリの呼び出しは App::import() の使用が推奨されている.

ベンダーのローディングは通常、規則に従わないパッケージのローディングを意味します。 多くのベンダーのパッケージに対しては App::import() の使用が推奨されます。

引用:
クラスのローディング_CakePHP 2.x Cookbook

次の点はcontrollerで使うので覚えておく.

  • Jisaku というディレクトリ名
  • jisakuHoge.php というファイル名

次にcontroller.

<?php
App::uses('jisakuHoge', 'Jisaku');

class FugaController extends AppController
{
    public function fugaFuga(){
        $this->autoRender = false;// controller->view という動作を停止

        // call self-made class from /app/Lib/Jisaku/jisakuHoge
        $credentials = array('hogehogehoge', 'fugafugafuga','....');
        $wpClient    = new jisakuHoge($credentials);

        // fetch http response from requested wordPress
        $oauthCli = $wpClient->createClient();
    }
}

import() または uses() でクラスを呼び出すことが可能.

今回は app/Lib 配下のファイルを呼び出したいので App:uses()を使用する.
根拠は次の記述.

Libs
App::uses(‘PaymentProcessor’, ‘Lib’);

引用:
クラスのローディング_CakePHP 2.x Cookbook

そしてこの記述も参照.

コアクラスをロードするためには App::import(‘Lib’, ‘CoreClass’); はもはや使用不可です。

引用:
App::import() でファイルをインクルードする_CakePHP 2.x Cookbook

import()uses() だと引数の順番が異なる.
今回使用した uses() は次のような使い方をする.

App::uses('ファイル名', 'ディレクトリ名');

controller内での使用手順は次のようになる.

  1. classの上側で呼び出す自作class宣言
  2. アクション内で new で呼び出し

以上.

スポンサーリンク
336 x 280 – レクタングル(大)
336 x 280 – レクタングル(大)
  • このエントリーをはてなブックマークに追加

この記事が気に入ったら
いいね!しよう

スポンサーリンク
336 x 280 – レクタングル(大)
トップへ戻る