コンソールから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 のコンソールアプリケーションでは、コマンドライン からあなたが作成したアプリケーションクラスを再利用できます。
シェルから実行するときは PHP CLI版 が必要なので注意.
コンソール機能を使う場合は、コマンドライン版 (CLI) としてビルドされた PHP がインストールされている必要があります。
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 プロパティを設定することで、シェルからアクセスできるモデルの 配列を定義できます。
今回は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
サードパーティ、外部ベンダからのライブラリではなく、ファーストパーティのライブラリが入ります。 これはベンダライブラリと内部ライブラリの構成を分割することを可能にします。
この文章だと分かりにくいが, 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() の使用が推奨されます。
次の点は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’);
そしてこの記述も参照.
コアクラスをロードするためには App::import(‘Lib’, ‘CoreClass’); はもはや使用不可です。
import()
と uses()
だと引数の順番が異なる.
今回使用した uses()
は次のような使い方をする.
App::uses('ファイル名', 'ディレクトリ名');
controller内での使用手順は次のようになる.
class
の上側で呼び出す自作class宣言- アクション内で
new
で呼び出し
以上.