CakePHP

ここには私のブログ「PHP学習日記」に掲載したものをまとめて,掲載します。

CakePHPと文字化け

CakePHPを入れてこれまでいろいろやってきました。日本語の文字コードについては何も考えずにやってきていたので,これをいろんな所で推奨されているようにUTF-8にしてみようと思い立ちました。

その前に現状はどうなっていたかというと,どうもShift-jisで全部やっていたみたい。(みたいなんです)

最初に文字化けしたのは,layoutを作ってそのファイルをutf-8エンコードで保存したとき。

文字化けの原因には,CakePHPだけじゃなくPHPの設定やMySQLの設定にも関係していますので,どこが原因やらわかりません。何をやっても「また化けた・・・orz」の繰り返しでした。

MySQLのデフォルトをUTF-8にするとよいのか?

my.cnfに

default-character-set = utf8

を書きまくれという指示があったのでやってみました。

phpMyAdminで見てみると,照合順序がLatinなんやらになっているのがわかりました。そこでデータベースを削除して新たに作成,デフォルトの照合順序をutf-8にしてからデータベースを作成して

php.iniをさわる

php.iniの[mbstring]セクションに

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = Off
mbstring.detect_order = auto

かわらなかった。

database.phpにエンコードのパラメータを記述する

 var $default = array('driver' => 'mysql',
        'connect' => 'mysql_connect',
        'host' => 'localhost',
        'login' => 'root',
        'password' => '',
        'database' => 'time_card',
        'encoding' => 'utf8',
        'prefix' => '');

これは効いたみたい。

そして,default.thtmlに次の行を追加

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

これで文字化け解消しました。でも本当はここは,CakePHP的にはヘルパーを使って次のようにするべきなのですね。

<?php echo $html->charset("utf-8");?>

なんだか,いろいろなことをやり過ぎて,本当はしなくても良いことまでやったのかもしれません。またdbに記録する文字コード体系と,表示の文字コード体系が違うものではいけないのかなど,不明な点が多くあります。文字コードについては今後も研究課題にしたいと思います。

と研究課題にすることにしたのですが,今回文字化け解消の方法を再度実験してみました。MySQLの4.1以降では文字コードの自動変換機能が実装 され,逆にそのために文字化けに悩まされることが多くなったとの情報を得ました。また,PHPの文字コードの扱いについても色々と調べてみました。

参考サイト

サイトで使用するエンコードを決定する

CakePHPシステムの中でどのエンコードを使用するのかを決定します。MySQLのテーブルにどのエンコードでデータが格納され ているかは,この際あまり問題ではないようです。サイト内で利用されているエンコードと,MySQLに接続するときのクライアント文字セットが一致してい ればいいようです。今回はこのテストをするに当たり,文字セットがEUC-JP,Shift-JIS,UTF-8の3種類のフィールドを持つテーブルを 作って,そのテーブルにデータの追加,編集を行うCakePHPコントローラを作成してテストしました。

ファイルのエンコードを揃える

特にビューファイル(default.thtmlを含むthtmlファイル)に日本語を含む場合のファイルのエンコードはすべて決定したエンコードを使用します。Eclipseを使用している場合は,ワークスペースのエンコードを指定しておきます。 (Eclipseではeuc-jpとかは指定できないみたいですが)

これがばらばらですと,ビューの表示内容が部分的に(あるいは全体に)文字化けしたりします。

レイアウトでエンコードを指定する

dafault.thmlなどのLayoutファイルではhead部分に$html->chasetメソッドを使って決定したエンコードを指定します。

<?php echo $html->charset("utf-8");?>

ページのエンコードをこのようにちゃんと指定していれば,ブラウザがエンコードを間違えることもありません。

データベースのクライアント・エンコードを指定する

MySQLのSET NAMES でクライアントのエンコードをサイトのエンコードと一致させる必要があります。CakePHPではdatabase.phpに,encodingオプションを追加することでエンコードをセットすることができます。この機能を使って決定したエンコードを指定します。 

    var $default = array('driver' => 'mysql',
                                'connect' => 'mysql_connect',
                                'host' => 'localhost',
                                'login' => 'root',
                                'password' => '',
                                'database' => 'encodetest',
                                'encoding' => 'utf8',
                                'prefix' => ''); 

ここで指定するエンコードの表記方法は,MySQLの文字セット名です。EUC-JPはujis,shift-jisはsjis,utf-8はutf8となります。僕は,ここで間違ってutf-8と指定して文字化けが解消せずにハマりました。(´・ω・`) バカですた。

しかし,SET NAMESは禁止というような話も聞くのですが,CakePHPではこれを使っているような気がするのですが,いいのかな。

とりあえず結論

これら3つのエンコードを揃えておけば文字化けはしないようです。EUC-JPとUTF-8で確認しました。Shift-JISではチェックしてい ませんが,いけるんと違いますやろか。ただし僕はEclipseを使っている関係で,サイトのエンコードはUTF-8がお勧めだと思っています。 php.iniやmy.cnfはインストールしたときのまま何もさわっていませんが,文字化けせずに使用できています。

 

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

MS-SQLへの接続

mssql_connect関数にてエラーが発生していました。そこでCakePHPの問題と切り分けるために,単独でmssql_connect 関数による接続を実験してみました。するとサーバ名を変えても何をしてもエラーになって繋がりませんでした。これはCakePHPの問題ではないと思いま したので,いろいろとググった結果,ntwdblib.dllというDLLのバージョンが古い場合にうまく繋がらないとの記述を見つけました。この件につ いては,次のサイトが非常に詳しく解説してくださっています。

PHP5 with SQLServer2005Express

自分のPCの中のこのDLLを検索してみると,c:\xampp\phpやc:\xampp\apache\binにあるntwdblib.dll のバージョンは,2000.2.8.0で「古い」ものでした。最新版のxamppなのに・・・・。そこで,c:\windows\system32にある DLLのバージョンを調べてみると2000.80.194.0で,これはOKなんだそうです。(面白いことに古いバージョンのファイルの方がタイムスタン プが最近のものになっていました)

そこで古いやつ二つの上に新しいのをコピーしました。(本当は古いDLLを削除するだけでよかったみたいですが)

するとちゃんとMS-SQLに接続できるようになりました。CakePHPに戻ってdatabase.phpにMS-SQLの設定をして見てもちゃんと接続できることがわかりました。

その後,次の記事を見つけました。

cakephpとsql server 2005(日本語)

この記事によると,単に上記の対応をしただけではいけないようです。今後調査を進めます。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

LDAP認証とActive Directory

Webアプリを作る上では避けられないのがユーザー認証です。アプリケーションを利用できる人を制限したり,人によって利用できる機能を制限したりするためにはユーザー認証は必須になります。

CakePHP(1.1)のリファレンスガイドの付録Bには

現在のところ私たちは,ユーザ認証システムはアプリケーションごとに仕様が異なると考えて います。あるものはハッシュでパスワードを暗号化,別のものは LDAP 認証などという具合,そしてほぼすべてのアプリケーションの User モデルについて,少しずつ違いがある,といったことがあります。それで今のところは,あなた次第,ということにしておきます。

とあります。そういろいろな仕様があると思います。僕の開発するアプリケーションで必要となる認証方法は,DBにユーザー情報を持っておいて,それ でログインするというものと,LDAPサーバー(Windows Server 2003 のActive Directory)の認証とを組み合わせたものです。

  1. ユーザー情報はMySQLのテーブルに持つ
  2. DB認証のパスワードはハッシュで暗号化して保存する
  3. DB認証のパスワードが空の場合はLDAPで認証する
  4. DBにユーザー情報がない場合LDAPで認証できたらDBにユーザー情報を自動作成できる

このような仕様のユーザー認証を作成するのを目標にしたいと思います。

XAMPPでLDAPを利用できるようにする

最初に開発環境でLDAPが利用できるようにする必要があります。xamppでLDAPを利用できるようにするためには,php.iniの変更が必 要です。コマンドラインのためには,c:\xampp\php\php.iniを,Apacheのためにはc:\xampp\apache\bin \php.iniを編集します。

;extension=php_ldap.dll

エディタで上記の行を検索して,この行のコメントを外して保存します。Apacheを再起動します。

LDAP Models in CakePHP

http://bakery.cakephp.org/articles/view/ldap-models-in-cakephp にpsychicことJohn David Anderson氏が書いている記事が大変参考になりましたのでその概要を日本語で書いてみます。

多くの組織では今日クライアントや従業員の情報を保存するのにLDAPを利用しています。このチュートリアルは,アプリケーションからCakePHPのModelとしてそのデータを利用する方法を紹介します。

L is for Lightweight

それほどLDAPに詳しくない場合でも,LDAPへの接続・問い合わせ・データの取得にはどうしたらようかを理解する助けになるいくつかのポイントがあります。LDAPは本当にかなり軽量です,そしてその動作の基本を理解することは,大いにためになるでしょう。
LDAPはツリー状の構造に保存されます。ツリーの中でノードを特定するには親ノードを特定する構文を使います。LDAPツリーのルートは,通常,,「cn=cakephp,cn=org」のように収容されるドメイン名にちなんで名付けられてます。次のような表現は

ou=People,cn=example,cn=com 

LDAPツリーのルートにある,"People"というOU(organizatinal unit)をあらわします。

LDAPには多くのタイプのエントリーがありますが,LDAPツリーの最も一般的な用途の一つは個人情報を保存することです。個人レコードをLDAPサーバに問い合わせたとき,そのレコードはツリー形式で返ります。PHPでは,ネストした配列で返ります。

D is for Down and Dirty

はじめにテーブルを使用しないCakePHPモデルを作成します。そのためにはModelクラスの$useTableプロパティを使います。また,LDAPの接続設定を定義するいくつかのクラス変数を宣言します。

<?php  
class LdapUser extends AppModel 
{ 
    var $name = 'LdapUser'; 
    var $useTable = false; 
 
    var $host       = 'ldap.example.com'; 
    var $port       = 389; 
    var $baseDn = 'dc=example,dc=com'; 
    var $user       = 'cn=admin,dc=example,dc=com'; 
    var $pass       = 'password'; 
 
    var $ds; 
} 
?>

LDAPに詳しくない人のために,これらのセッティングについて説明させてください。hostとportは,そのまんまです。baseDn は,LDAPツリーのルートがどこにあるかを指定します。baseDNを一般公開していないサーバーの場合は,管理者に確かめる必要があります。
$userと$passは,ログインに必要な認証情報です。$ds変数は,接続したLDAPサーバーへのリンクを保存します。

次に,ModelがCakePHPによってロードされるときにLDAPサーバーに接続するようにコンストラクタを修正する必要があります。

 

<?php  
//ldap_user.php (partial) 
 
function __construct() 
{ 
    parent::__construct(); 
    $this->ds = ldap_connect($this->host, $this->port); 
    ldap_set_option($this->ds, LDAP_OPT_PROTOCOL_VERSION, 3); 
    ldap_bind($this->ds, $this->user, $this->pass); 
} 
 
function __destruct() 
{ 
    ldap_close($this->ds); 
} 
?>

A is for Application

セットアップが完了した今,Modelに2,3のアプリケーションに役立つ関数を作成することができます。最初の業務予定は,多分,一定の条件に よってデータを取ってくる関数を作成することでしょう。私が作成した最初のものは,ある属性の値に基づくレコードのセットを返すfindAll()関数で した。

 

<?php  
function findAll($attribute = 'uid', $value = '*', $baseDn = 'ou=People,dc=example,dc=com') 
{ 
    $r = ldap_search($this->ds, $baseDn, $attribute . '=' . $value); 
 
    if ($r) 
    { 
        //if the result contains entries with surnames, 
        //sort by surname: 
        ldap_sort($this->ds, $r, "sn"); 
 
        return ldap_get_entries($this->ds, $r); 
    } 
} 
?>

この関数はデフォルトでは与えられたユーザ名と値に基づくレコードセット("People"というOU下のLDAPツリー上にあるものすべて)をとって来ます。またレコードの姓(sn)によってソートされて返されます。
コントローラでは,多くのやり方で利用できます,:

 

<?php  
//Get all users: 
$this->LdapUser->findAll('uid', '*'); 
 
//Get users from a specific group inside the 'People' group: 
$this->LdapUser->findAll('uid', '*', 'ou=Client Company,ou=People,cn=example,cn=com'); 
 
//Get a specific user: 
$this->LdapUser->findAll('uid', 'jsmith'); 
?>

もう一つの使い勝手の良い関数は auth()関数です。
これは特にイントラネットアプリケーションで便利です。ユーザーはたぶん既にLDAPをメールなどのサービスの認証に使用しています。新しいCakePHPによるイントラネットアプリケーションを使うのにそれらと同じユーザ名とパスワードとを使わない手はありません。
この関数はコンポーネントかコントローラにあるべきかもしれませんが,ModelにはLDAP接続情報が既にありますので,私は認証関数をこのModelクラスに置くことにしました。

注:認証をする際には,セキュアな(SSL)LDAP接続をするために異なるポートで接続させたいかもしれません。

 

<?php  
function auth($uid, $password) 
{ 
    $result = $this->findAll('uid', $uid); 
 
    if($result[0]) 
    { 
        if (ldap_bind($this->ds, $result[0]['dn'], $password)) 
            { 
                return true; 
            } 
            else 
            { 
                return false; 
            } 
    } 
    else 
    { 
        return false; 
    } 
} 
?>

簡単ですね。ユーザーを見つけるのにfindAll()関数を使います。このユーザ情報はLDAPサーバがユーザを特定するのに使用するDN(また はdistinguished name)を含んでいます。このステップを取る理由は,Bobのログイン情報を'dn=Bob Smith,ou=MyCompany,dc=example,dc=com'と持つより'bobsmith'と持った方が簡単だからです。

コントローラでこれを利用するのは次のように簡単です。

$this->LdapUser->auth($u, $p);

Active Directoryの利用

psychicが提供してくれた情報で,CakePHPの中にうまくLDAPを取り込めそうだと言うことがわかりました。しかし僕のように Active DirectoryをLDAPサーバーとして利用する場合には,このままではうまく動かない部分があります。

Active Directory(以降AD)サーバにldap関数を使って接続するときには,いくつか注意すべき点があります。

uidではなくsAMAccountNameを使う

認証(authentication)の研究(1)で 紹介したpsychicの記事にあるfindAll関数では$attribute引数の初期値に'uid'という値が使われています。。 Linux+OpenLDAPで運用されているLDAPサーバーの場合は,アカウント名を示す属性はuidなのですが,ADのLDAPディレクトリの場合 にはこの属性はありません。ADで同様な意味を持つ属性は,sAMAccountNameです。cnが使えそうに思うかもしれませんが,これは使えませ ん。ADのサーバー上でウィザードを使ってユーザーを新規作成した場合には,cnには姓名がセットされてしまうからです。相手がADサーバーの場合は sAMAccountNameを使います。

パスワードが空だとldap_bindはtrueを返す

次に,これはちょっとハマったのですが,ldap_bind関数でADに接続するとき,パスワードが空欄の場合はldap_bindは一応成功して しまうという点に注意が必要です。そんな場合はldap_bindの戻り値にtrueが返ってきますが,それ以降のldapに対する処理 ldap_searchなどは失敗します。ldap_bindを使ってユーザー名とパスワードの組み合わせが正しいかどうか認証をする場合に は,ldap_bindで認証する前に空のパスワードの場合をはじいておかなければいけません。

AD認証の手順

ADは匿名bindを許しませんので,認証手順としては次のようになります。

  1. ユーザー名とパスワードをチェックしていずれかが空欄の場合は認証失敗とします。
  2. bind用のユーザー名とパスワードでADにbindします。ldap_bind
  3. ADのsAMAccount属性を検索して与えられたユーザー名があるかどうか調べます。ldap_search
  4. あった場合は,そのアカウントのdnを調べます。ldap_search, ldap_first_entry, ldap_getdn
  5. dnとパスワードでldapにバインドしてみます。ldap_bind

これらの処理が通れば,ADにより認証されたということになります。

基本的な疑問

ここまでの実験をいろいろやっていまして,一つ疑問に思うことがあります。CakePHPではcore.phpで定義されているDEBUG定数の 値,画面へのデバッグ情報の表示を制御していますが,ldap_bindで認証処理を行うと,認証できなかった場合にかならずエラーが表示されてしまうの で,うまく認証できなかった場合の動作確認がちゃんとできないんですよね。DEBUG定数に優先するようなエラー処理を書くことってできないのでしょう か。これって基本的なことで,とても恥ずかしい諮問かもしれません。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

Eclipse PDTでのCakePHP開発時のコード補完に関する情報

EclipseとPDTで開発をしていると便利なのがコード補完です。この機能がないと開発の効率がすごく落ちますね。ここではCakePHPの開発において,コード補完をちゃんと行えるようにする設定について書きます。

基本,cakeフォルダをIncludeする

cakeフォルダをプロジェクトとして,appフォルダのプロジェクトのインクルードパスにcakeプロジェクトを追加します。これでCakePHPのオブジェクトに関するコード補完が実現します。

Viewの.ctp編集時にコード補完を使う

この件に関する参考サイト:Code completion in views with Eclipse PDT

Eclipseのコード補完はめっちゃ便利です。ですがビューのctpファイルを編集中にヘルパーのコード補完ができません。どこかのファイル で$htmlとかの変数を宣言してやればコード補完できるのじゃないかと思いましたが,やはりそうでした。上記参考サイトに書いてありました。プロジェク トの中の適当な場所(場所はどこでも良い)に適当なphpファイルを作り,次のコードを流し込んで,保存します。

<?php 
// stop page loading 
exit; 
 
// reference helpers so Eclipse provides code completion 
$ajax = new AjaxHelper(); 
$cache = new CacheHelper(); 
$form = new FormHelper(); 
$html = new HtmlHelper(); 
$javascript = new JavascriptHelper(); 
$number = new NumberHelper(); 
$session = new SessionHelper(); 
$text = new TextHelper(); 
$time = new TimeHelper(); 
?>

これだけで,Viewの.thtmlでもコード補完が使えるようになります。

コントローラからモデルのメンバを補完する

コントローラでコードを書いているときに,モデルを使うことがありますね。

$this->Employee->save($this->data)

こんな風に。ところが,モデルのメンバは補完されません。これを補完するのは至難の業かと思われましたが,次の方法を取るとなんとかできるようになります。もっと簡単な方法があれば,コメントやトラバでツッコミお願いします。

モデルを使用するメソッドの中で(先頭あたり?)次のように記述します。

function record(){
  $model =& $this->Employee;
  /* @var $model Employee */
    :
 
 
  $model->save($this->data);
}

このようにモデルメンバを変数に代入して使用します。変数の型をPDTに教えるために3行目のコメントを書きます。すると,$modelはEmployeeクラスであるとPDTが判断して,メンバをリストしてくれるようになります。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

A5:SQLのER図にCakePHP仕様のテーブルを追加するスクリプト

書籍「CakePHP徹底入門」でもおすすめになっていますが,ER図やSQL文がかけるデータベースツールのA5:SQLと いうのがあります。これはすごい優れものでして,本当に便利に使っています。作者の松さんには毎日感謝しています。このA5:SQLは,Donkeyを 使ってスクリプトを書くことができます。そのスクリプトを使って,A5:SQLのER図にCakePHP仕様のテーブルを追加するスクリプトを書いてみました。

CakePHP仕様のテーブルとは,IDがオートインクリメントのINTで,createdとmodifiedというDATETIMEのフィールド があるテーブルです。リスト用のnameフィールドもつけた単純なテーブルのエンティティをER図に追加します。

対象バージョン:A5:SQL Mk-2 Version 2.4.0 beta 20

//CakePHPCakePHP仕様のテーブルを追加する
var frmER = application.getActiveWindow();
if (frmER.formType != "A5EREditor") {
	alert("アクティブウィンドウをERエディタにしてから実行してください。(1)");
	exit();
}
var sources = new Strings;
 
sources.add("");
sources.add("[Entity]");
sources.add("PName=cakes");
sources.add("LName=新しいCakePHPテーブル");
sources.add("Comment=");
sources.add("TableOption=");
sources.add("Left=250");
sources.add("Top=250");
sources.add('Field="ID","id","INT AUTO_INCREMENT","NOT NULL",0,"","",$FFFFFFFF');
sources.add('Field="名前","name","@VARCHAR(100)",,,"","",$FFFFFFFF');
sources.add('Field="作成日","created","@DATETIME",,,"","",$FFFFFFFF');
sources.add('Field="更新日","modified","@DATETIME",,,"","",$FFFFFFFF');
sources.add("EffectMode=None");
sources.add("Color=$000000");
sources.add("BkColor=$FFFFFF");
sources.add('Position="Main",300,300');
frmER.source.addStrings(sources);

A5:SQLのスクリプトエディタで上記のスクリプトを作成し,A5:SQLのscripts/Toolフォルダに保存します。 

A5:SQLを再起動すると,ツールメニューに「CakePHP仕様のテーブルを追加する」が追加されます。

メニューを実行するとER図にエンティティが追加されます。

今度は,A5:SQLのER図からモデルのソースコードを出力するようなスクリプトが書けるといいかも。dbdesigner2cake.phpみたいな感じだし。と思っていますがいつかできるでしょうか。

変更履歴

2009/10/30 A5:SQLの仕様が変更されたので一部スクリプトを修正しました。2.4.0 beta20に対応

 

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

CSVファイルをDBにインポート

サーバのテーブルに,CakePHP経由でアップロードしたCSVファイルをインポートする必要がありましたので,その処理を作ってみました。CSVファイルをサーバにアップロードし,そのファイルをDBにインポートするという手順になろうかと思います。

ビュー

<div class="options form">
<div class="actions">
    <ul>
        <li><?php echo $html->link('メニューに戻る', array('action'=>'index'));?></li>
    </ul>
</div>
<?php echo $form->create('Options', array('action'=>'upload', 'type' => 'file'));?>
    <fieldset>
        <legend>データのアップロード</legend>
    <?php
        echo $form->file('result');
    ?>
    </fieldset>
<?php echo $form->end('アップロード');?>
</div>

 コントローラ

function upload(){
        if (!empty($this->data)) {
            $model =& $this->Result;
            /* @var $model result */
            $up_file = $this->data['Options']['result']['tmp_name'];
            $fileName = CSV_FILE_PATH."result.csv";
            if (is_uploaded_file($up_file)){
                move_uploaded_file($up_file, $fileName);
                $model->loadFromCSV($fileName);         
                $this->Session->setFlash('データをアップロードしました。');
                $this->redirect(array('action'=>'index'));
            }
        }
    }

コントローラでは,返された$this->dataの'tmp_name'の中にアップロードされたファイル名が入っています。上記のコード では,それのファイルをmove_uploaded_file関数で,特定の場所に保存しています。その後,モデルに定義したloadFromCSVメ ソッドでDBに読み込んでいます。

モデル

function loadFromCSV($fileName) {
        $this->begin();
        try{
            $this->deleteAll('1 = 1', false);
            $csvData = file($fileName, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
            foreach($csvData as $line){
                $record = split(",", $line);
                $data = array(
                    "field1" => $record[0],
                    "field2" => $record[1]
                );
                $this->create($data);
                $this->save();
            }
            $this->commit();
        } catch(Exception $e) {
            $this->rollback();
        }
    }

モデルに定義したloadFromCSVメソッドは上記の通りです。ファイルをfile関数で読み込み,各行をsplitで分割してフィールドに セットしています。MySQLにはファイルからデータをインポートするSQL文もあるので,それを使おうかとも思ったのですが,CakePHPの機能で実 装しました。

大変な処理かと思ったのですが,わりと簡単に実現できました。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。

cake1.2でbakeを使う

xampp環境にCakePHP 1.2(以後cake1.2)をインストールする際には,xamppのドキュメントルート(xampp\htdocs)に入れるというのが一般的で,いろんなとこの解説にもそう書いてあります。僕の場合はそれをxamppのルート(xampp\cake)に入れるようにしました。ドキュメントルートに入れると,/cake/app/にアクセスしたらすぐに動作確認できるのでいいのですが,ドキュメントルートからは外した位置に入れたかったのです。bake でプロジェクトを作成する方法をとれば,それでも全然問題なく利用できます。

Bakeでプロジェクトを作る

アプリケーションを開発する際には,cake1.2の場合は,cake.phpでもってプロジェクトを作成します。

cake.phpをWindows環境で使用する場合は,cake.batを使うのがいいようです。php.exeにはパスが通っていなければなりません。コマンドプロンプトを立ち上げてcake.phpがあるフォルダ,<Cakeのインストールフォルダ>\cake \consoleをカレントフォルダにします。cake.batのあるフォルダにパスを通さなければならないという記述がいくつかのサイトにありますが,それは不要です。

D:\>cd C:\xampp\cake\cake\console

プロジェクトを作成するためにbake projectオプションを指定し,appフォルダの作成先を-appオプションで指定します。書籍「徹底入門」ではbakeオプションのみで実行するようになっていますが,そうするとプロジェクトの作成後,そのままデータベース設定になだれ込みます。「徹底入門」にあるようにプロジェクトの作成だけを行いたい場合は,bake projectを指定します。

D:\xampp\cake\cake\console>cake bake project -app D:\xampp\htdocs\new_project

次のような画面が表示されます。

Welcome to CakePHP v1.2.0.7692 RC3 Console
---------------------------------------------------------------
App : new_project
Path: D:\xampp\htdocs\new_project
---------------------------------------------------------------
What is the full path for this app including the app directory name?
Example: D:\xampp\htdocs\new_project\myapp
[D:\xampp\htdocs\new_project\myapp] > D:\xampp\htdocs\new_project

最後に不要なmyappという設定がついていますので,それを省いたパスを指定し直します。

Bake Project
Skel Directory: D:\xampp\cake\cake\console\libs\templates\skel
Will be copied to: D:\xampp\htdocs\new_project
---------------------------------------------------------------
Look okay? (y/n/q)
[y] > y
Do you want verbose output? (y/n)
[n] > y

「くどくどと出力してもよろしいでっか?」と聞いてきます。yとすると作業内容を出力してくれます。

---------------------------------------------------------------
Created: new_project in D:\xampp\htdocs\new_project
---------------------------------------------------------------
D:\xampp\htdocs\new_project created
D:\xampp\cake\cake\console\libs\templates\skel\.htaccess copied to D:\xampp\htdo
cs\new_project\.htaccess

(くどくど・・・・)

Random hash key created for 'Security.salt'
CAKE_CORE_INCLUDE_PATH set to D:\xampp\cake in webroot/index.php
CAKE_CORE_INCLUDE_PATH set to D:\xampp\cake in webroot/test.php
Remember to check these value after moving to production server

これで指定したパスにプロジェクトが作られます。ブラウザでアクセスしたら,「甘いケーキが焼けたよ!」てなページが表示されます。この後,

D:\xampp\cake\cake\console>cake bake -app D:\xampp\htdocs\test_project

とprojectをつけずに実行します。まだデータベース設定が行われていないので,データベース設定の画面が現れます。データベースの設定を完了するといったん終了しますので,もう一度同じコマンドを実行すると,やっとメニューが表示されます。

D:\xampp\cake\cake\console>cake bake -app D:\xampp\htdocs\test_project

Welcome to CakePHP v1.2.0.7692 RC3 Console

---------------------------------------------------------------
App : new_project
Path: D:\xampp\htdocs\new_project
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)

これで必要な部品をbakeして開発の元とします。

Eclipseにプロジェクトを追加

開発にはEclipse+PDTを使用していますが,ワークスペースはドキュメントルートに指定しています。CakeのCoreディレクトリを PHPプロジェクトとして追加しておきます。bakeでロジェクトを作ったならば,そのフォルダもPHPプロジェクトとして追加します。PHPインクルードパスにCakeのCoreプロジェクトを追加しておきます。

Eclipse PDTでのCakePHP開発時のコード補完に関する情報にあるようにctpファイルの中からヘルパーのコード補完をするためのファイルは,appフォルダのvendorフォルダに,viw_link.phpという名前で保存しています。

トラックバック


URL から "-MoIyadayo" を削除してトラックバックを送信してください。
トラックバックは承認後に表示されます。