2013年8月7日水曜日

CakePHP2.x 自作クラス(関数)を使用する

CakePHPは一応MVCとなっているのでフォルダ構成もそれに合わせてある。

    app
    -model
    -view
    -controller

というふうになってる。もちろん他にも色々あるけど必要なのだけ抜粋。
で、自分が作ったMVCのどれにも含まれないクラスを作ったとき、
どこに置けばいいんでしょう、と疑問に思った。

appの直下にvendorというフォルダがあるのでそこにやるといいそうな。
phpファイルにまとめて置く。
あとは使用時にインポートするだけ。

    App::import( "Vendor", "Hoge" );
    $hogeClass = new Hoge();        // クラス
    hoge();                         // 関数呼び出し

読み込んだファイルの中身はあとは気にせず使えます。

2013年8月6日火曜日

CakePHP2.x viewを指定する

$this->render('hoge_view');

CakePHP2.x SplFileInfo::openFileエラー

Warning:
SplFileInfo::openFile
(/www/app/tmp/cache/persistent/myapp_cake_core_cake_console_):
failed to open stream:
Permission denied in /www/lib/Cake/Cache/Engine/FileEngine.php on line 314

とかいうエラーが出るようになった。
ファイルの所有者とアクセスユーザーが違うことで起きるエラーらしい。
umaskを設定すればいいですよ、とのことだが、まずumaskってなんですか?

調べた。
ファイル作成時に、利用できるパーミッションを指定するものだそうな。

アクセスユーザーからもファイルを取得できるようにcore.phpを編集する。

    Cache::config('_cake_core_', array(
        'engine' => $engine,
        'prefix' => $prefix . 'cake_core_',
        'path' => CACHE . 'persistent' . DS,
        'serialize' => ($engine === 'File'),
        'duration' => $duration,
        'mask' => 0666,
    ));
    Cache::config('_cake_model_', array(
        'engine' => $engine,
        'prefix' => $prefix . 'cake_model_',
        'path' => CACHE . 'models' . DS,
        'serialize' => ($engine === 'File'),
        'duration' => $duration,
        'mask' => 0666,
    ));

警告文が出なくなった。

2013年8月5日月曜日

php jsonデータ

PHPではjsonと呼ばれるデータ型を扱えるらしい。
JavaScript Object Notation の略だそうな。

    [[2,1],[33,4]]
    {"2":1,"6":1,"9":1}

こんなん。
{} がオブジェクト形式で : で隣接したデータが対になる。
[] が配列形式だとか。
こいつを文字列データから PHP で使えるデータにデコードする。

    $json = json_decode( '[[2,1],[33,4]]' );
    $json = json_decode( '{"2":1,"6":1,"9":1}', true );

第二引数にtrueを指定すると連想配列になって返ってきます。
ちょいと複雑なごちゃごちゃしたデータをデータベースに保存したりとかに
便利そう。

CakePHP2.x findの戻り値

しょっちゅう忘れるのでメモ。

SQL文にエラーがあれば例外を投げてくれるからそのときは気にしなくても
いいんだけど、SQL文がエラーを起こさない場合は配列が返ってくる。
結果が空だろうと何だろうと配列が返ってくる。

findでデータが取得できなければエラーという処理を作りたければ、

    $data = $this->Model->find( "all" );
    if( count( $data ) === 0 ) {}

という風にカウントで配列の個数を取るようにしよう。
findByを使ったときも同じ。

2013年8月1日木曜日

CakePHP2.x Shellを使う(実行編)

せっかくShellを使ってもテストをしないのはよくないということで(当たり前)
コマンドプロンプトなんてほとんど使ったことないけどネットとお友達になりつつ
やってみる。

まずはコマンドプロンプトを開き環境変数のパスを通す。
(xamppはc直下)

    c:\xampp\php>SET PATH=%PATH%;%CD%
    c:\xampp\htcdocs\hoge\app\Console>SET PATH=%PATH%;%CD%

多分現在のディレクトリにパスを通しているんでしょう。きっと。
CDってあるし。
そしてディレクトリをappまで移動して、Shellを実行。

    C:\xampp\htdocs\hoge\app>cake Test

怒られた。細かいメッセージ文は忘れたけど、PHPUnitとかいうのがないとか。
再びネットの海に潜り検索検索。

xamppにPHPUnitをインストールするためにはpearとかいうのを使うらしい。
PEAR(PHP Extension and Application Repository)の略でPHPで利用できる
ライブラリを提供しているサービス。

xampp(というよりもPHP5?)には最初からインストールされているらしいので
アップデートしてからPHPUnitをインストール!

    pear update
    pear install phpunit/PHPUnit

はい怒られましたよ。php_compatがないらしい。これは普通にインストールできそう。

    pear install php_compat

そして再びのインストール!

またしても怒られた。こんどはPHP_Invokerとやらが問題を起こしているらしい。
ご丁寧に警告文に-alldepsオプションを指定しておくれと書いてあったので
オプションを指定してインストール!

    pear install --alldeps phpunit/PHPUnit

今度は成功メッセージが表示されたぞ。ということで早速ちゃんとインストール
されているかの確認もかねてバージョンチェック

    phpunit --version
    Warning: require_once(PHPUnit/Framework/MockObject/Autoload.php)
    fatal error

ほ? PHPUnit/Framework/MockObjectがないとな?
モニターの前で試行錯誤するも答えが見つからず知ってそうな人に泣きつく。
んで、

    pear install --alldeps --force phpunit/phpunit
    pear install --force phpunit/PHPUnit_MockObject

この二つのコマンドを順番に実行したらちゃんとインストールされた。
やったー。ようやくテスト環境が整ったぞ。
 
    C:\xampp\htdocs\hoge\app>cake Test

    Welcome to CakePHP v2.3.5 Console
    ---------------------------------------------------------------
    App : app
    Path: C:\xampp\htdocs\hoge\app\
    ---------------------------------------------------------------
    test message

でけたー!

php 警告文とはいえ放置はよくない

xamppを色々いじってから

    Warning: Module 'pdo_sqlite' already loaded in Unknown on line 0

という警告が出るようになって
何なんだろうと思っていたら、どうやらインストール時に自動的に
読み込んでいるのを再読み込みしていたせいらしい。

PHP Warning: Module '*' already loaded in Unknown on line 0
http://www.omnioo.com/omnioolab/2011/11/php-warning-module-already-loaded-in-unknown-on-line-0.php