ZF 事始 その1 「Hello World!」すら出ず

Posted by muchag | Zend Framework | 2010-06-26 (土) 23:06:05

いやぁ。 「Hello World!」に苦労した。。。

CodeZine:Zend Framework入門 にかじりつきながら
先ずは「Hello World!」を、と思って始めた。

<環境>
Windows XP SP3
XAMPP 1.7.3
PHP 5.3.1
Zend Framework 1.10.6

 

先ずは「Hello World!」

フォルダ・ファイル構成は、以下のようにしてみた。

//公開ディレクトリ
hoge //このフォルダはネーミング自由
index.php

//非公開ディレクトリ
zendapps //このフォルダはネーミング自由
┣ controllers
┃◇┗IndexController.php
┣ models
┗ views
◇◇┣ filters
◇◇┣ helpers
◇◇┗ scripts
◇◇◇◇┗ index //このフォルダを「Index」か「index」で迷ったがどちらでもOKみたい
◇◇◇◇◇◇┗ index.phtml

※◇は空白埋め。意味なし。
 
hoge/index.php

  1. require_once 'Zend/Controller/Front.php';
  2. Zend_Controller_Front::run('zendapps/controllers');

 
zendapps/controllers/IndexController.php

  1. require_once 'Zend/Controller/Action.php';
  2.  
  3. class IndexController extends Zend_Controller_Action {
  4.     public function indexAction() {
  5.         echo 'Hello World!';
  6.     }
  7. }

 
zendapps/views/scripts/index/index.phtml

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>無題ドキュメント</title>
  6. </head>
  7.  
  8. <body>
  9. </body>
  10. </html>

Dreamweaver で新規作成したPHPファイルそのまま。

上記参考サイトをほぼ丸まま真似して、さぁアクセス!
http://localhost/hoge/  ポチっ!

Fatal error: Uncaught exception ‘Zend_Controller_Dispatcher_Exception’ with message ‘Invalid controller specified (error)’ in E:\XAMPP\xampp\php\PEAR\Zend\Controller\Dispatcher\Standard.php:248 Stack trace: #0 E:\XAMPP\xampp\php\PEAR\Zend\Controller\Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 E:\XAMPP\xampp\php\PEAR\Zend\Controller\Front.php(212): Zend_Controller_Front->dispatch() #2 E:\XAMPP\xampp\htdocs\hoge\index.php(36): Zend_Controller_Front::run(‘zendapps/cont…’) #3 {main} thrown in E:\XAMPP\xampp\php\PEAR\Zend\Controller\Dispatcher\Standard.php on line 248

ぐわわわわわ~ん。
 

自動レンダリングをOFFに

おっかしいなぁ。と悩みながら、ファイルやフォルダ名の大文字小文字やら
フォルダ構成やらファイル配置やら色々と調べてみたけど異常なし。

泣きそうになりながら考えたりいじくること半日。

ふと
CodeZine:Zend Framework入門(2):Hello World!アプリケーションの作成

  1. Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);

が気になり index.php に挿入してみた。

すると無事に「Hello World!」と表示された。 😎

hoge/index.php

  1. require_once 'Zend/Controller/Front.php';
  2. Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);
  3. Zend_Controller_Front::run('zendapps/controllers');

ん~、この1行は「自動レンダリングをOFFにする」という意味のはずなのに。。。
OFFでいいの? 自動レンダリングしてくれるから便利なのかと思ってたけど。

まぁ、きっと勉強していけばこの先意味がわかるんだろうなぁ。
ということで、表示されたからひとまずこれはこれでいいことに。
 

続いて「Example!」

さて、次は新しいページを表示。

//公開ディレクトリ
hoge
.htaccess //後から追加
┗ index.php

//非公開ディレクトリ
zendapps
┣ controllers
┃◇┣ IndexController.php
┃◇┗ ExampleController.php
┣ models
┗ views
◇◇┣ filters
◇◇┣ helpers
◇◇┗ scripts
◇◇◇◇┣ index
◇◇◇◇┃◇┗ index.phtml
◇◇◇◇┗ example
◇◇◇◇◇◇┗ index.phtml

 
zendapps/controllers/ExampleController.php

  1. require_once 'Zend/Controller/Action.php';
  2.  
  3. class IndexController extends Zend_Controller_Action {
  4.     public function indexAction() {
  5.         echo 'Example!';
  6.     }
  7. }

として
http://localhost/hoge/example/  ポチっ!
「Object not found!」 orz

あ、そうか! .htaccess の設定はしてなかったんだ。

そういうわけで、index.php と同階層に
hoge/.htaccess と配置。

  1. RewriteEngine on
  2. RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

 
ポチっ!
「Example!」
おおお 大成功。 😎

あまりのショボさにめげていたけど、これで何とか前へ進めそうだ。

Zend Framework | 2010-06-26 (土) 23:06:05 |

Zend Framework のコーディング規約

Posted by muchag | Zend Framework | 2010-06-26 (土) 20:41:49

今まで様々な言語を独学でやってきたけど
スクリプトの書式がバラバラだった。

なぜかっていうと、参考にする本やらサイトがそれぞれの書式だから
言語による特性もあるんだろうけど、どれがいいか決めかねていた。

今回 Zend Framework に触れてみて
「Zend Framework のコーディング規約」なるものを見つけた。

PEARにもコーディング規約なるものがあるようで
しかも両者は似ているようなので、これを機にPHPは
「Zend Framework のコーディング規約」に沿ってみようと思う。

<参考元>
Zend Framework Manual:Zend Framework PHP 標準コーディング規約
PHPSPOT 開発日誌:Zend Framework標準コーディング規約
 
上記参考サイトに目を通してみたが

PHPのコードしか書いていないファイルでは
最後の ?> は省略する。

あ~ そういえば昔 header関数でこれによくはまったなぁ。

あちこちでこの記述を目にするけど、最後を閉じないっていうのはちょっと気持ちが悪い。。。
しかも Dreamweaver でこれをやると、全面 真っ黄っ黄 になっちゃうんだよねぇ。

やっぱり Eclipse を使わないとだめなのかな。
 

字下げは空白4文字。タブ文字は禁止。

ええええ! タブだめなの?TT
あ! 今 Dreamweaver の設定を見たら、タブとスペースが選択できる♪ これで解決かな?
あああん・・・これは違う・・・タブなしはちょっと辛いなぁ。
 

行末は「ラインフィード(LF)」とすること。コードで表すと「0x0A」

これはUnix系の行末指定で、Macは「キャリッジリターン(CR:0x0D)」
Windowsは「キャリッジリターンラインフィード(CRLF:0x0D, 0x0A)」

ふむふむ。これも Dreamweaver の設定にあるね~ 最近は便利だなぁ。
 
とまぁ 悲喜交々。た、タブのところは目をつぶって使いそう・・・。

Zend Framework | 2010-06-26 (土) 20:41:49 |

Zend Framework の XAMPP への導入及びさくらでの活用

Posted by muchag | Zend Framework | 2010-06-25 (金) 0:25:19

長らく導入を躊躇していたフレームワーク。

あちこちで Cake PHP を見るため
そして Zend Framework はプロ用という記事をいくつも見るため
今日までためらってきた。

しか~し! 本日は意を決して Zend Framework(ZF) の導入に踏み切ってみた。

というのも、先日XAMPPを入れ直したとき
XAMPPにZFが同梱されていたからだ。

そういうわけで、ちっくと挑戦してみるぜよ。 🙂

環境

ローカル:Windows XP SP3 + XAMPP 1.7.3 + PHP 5.3.1
さくら:プレミアム + PHP 5.2.13

1.DL

Zend Framework 公式の Latest Release of ZF よりDL。
2010-06-24現在、最新版は1.10.6。 その Minimal ZIP版をDLした。

ZendFramework-1.10.6-minimal
┣ bin
┗ Zend

というフォルダ構成だった。

2.XAMPPへ導入

先日導入した XAMPP 1.7.3 では

xampp/php/PEAR/

の中に Zend というフォルダが配置してあったので、それを差し替え。

また、binフォルダの中にあった

zf.php と zf.bat

xampp/php/

にあったので、これも差し替え。

3.テスト

ZFのインストール記事を徘徊しているうちに見つけたテストスクリプトをそのまま拝借してテスト。

  1. require_once 'Zend/Date.php';
  2.  
  3. $date  = new Zend_Date();
  4. echo $date->get(Zend_Date::RFC_2822);

引用元:ナナワライネット さくらインターネットでZendFrameworkを利用する手順
 
zendtest.php にアクセスしてみると

Thu, 24 Jun 2010 23:16:56 +0900

おー! どうやら成功したようだ。 楽ち~ん♪

4.さくらへUL

XAMPPに合わせて以前通しておいたPEARディレクトリへ
Zendフォルダを丸ごとUL。

そして zendtest.php をULしてアクセスすると

Thu, 24 Jun 2010 23:16:56 +0900

おー! またまた大成功。 😆

お? 何気にこれで終わりかな?
まぁ 後は使ってみてかねぇ。
 
 
 
ちなみに。
実はここまでの間に色々と設定しないといけないことがある。

Apache
ローカル
xampp/apache/conf/httpd.conf

122行目辺り

  1. #LoadModule rewrite_module modules/mod_rewrite.so
  2. LoadModule rewrite_module modules/mod_rewrite.so

 

さくら

何もしていない・・・どうやらデフォルトでmod_rewriteが使えるようだ。
 

PHP
ローカル
xampp/php/php.ini

797行目辺りの include_path の追加
 

さくら

[サーバコントロールパネル]-[PHP設定の編集] から include_path の追加
 

.htaccess

ZFの場合は、index.php で全て処理するために .htaccess の設定が必要。
(OpenPNEやPukiwikiがそうだったそうだった)
 

例1)
  1. RewriteEngine on
  2. RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

これは、.js、.ico、.gif、.jpg、.png、.css「以外」で終わるすべてのアクセスを
/index.php に書き換えてねっていう意味。(.htaccess はドキュメントルートに設置)
PHP と関係のない Javascript、CSS、画像ファイルなどは、そのままアクセスさせるわけですね。

<引用元(含コード)>
カタコト日記:ZF#04 .htaccess の設定例あれこれ

 

例2)
  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteRule .* index.php

サーバー上のその位置に実在するファイルへのアクセス「以外」は、すべて /index.php に。
設定例1 だと、例えばサーバに置いた .pdf をダウンロードさせたくなったときに、
いちいち条件を加える必要があるんだけど、こっちだとその心配なしってわけね。

<引用元(含コード)>
カタコト日記:ZF#04 .htaccess の設定例あれこれ

 

例3)
  1. RewriteEngine on
  2. RewriteCond %{REQUEST_FILENAME} !-f
  3. RewriteCond %{REQUEST_URI} !^/(directory1|directory2|directory3)/
  4. RewriteRule .* index.php
  5. RewriteBase /koto2

特定のディレクトリ(directory1~3)を書き換え対象からはずしたいときは、3行目のように。
実在するディレクトリすべてへのアクセスを除外するには、次のようにすれば OK です。
RewriteCond %{REQUEST_FILENAME} !-d
5行目は、レンサバなんかで、例えば /koto2 ディレクトリ以下を使いたいときに。

<引用元(含コード)>
カタコト日記:ZF#04 .htaccess の設定例あれこれ

と、様々設定しないといけないそうだが
私の場合は、今までの運用で設定したものか、または今は必要がないものなので、今回は省略した。
特に .htaccess については、設定していないので完全に後日用。

Zend Framework | 2010-06-25 (金) 0:25:19 |

文字化け対策

Posted by muchag | PHP,Zend Framework | 2010-05-24 (月) 17:14:32

PHP でプログラミングしていて
文字化け被害に遭うこと散々・・・。

というわけで、文字化け対策のまとめ。

  1. // 文字エンコーディングを設定する
  2. ini_set('default_charset', 'UTF-8');
  3. mb_internal_encoding('UTF-8');

これらの設定は php.ini からも行えるが
一般にソースを公開するスクリプトであれば
記述しておくべき設定・・・だそうな。

今まで何度も文字化けを経験し
その都度対応してきた結果
最新の対策状況は

  1. mb_language("uni");
  2. mb_http_input("auto");
  3. mb_http_output("utf-8");
  4.  
  5. ini_set('mbstring.script_encoding', 'UTF-8');
  6. ini_set('default_charset', 'UTF-8');
  7. mb_internal_encoding('UTF-8');
  8. mb_language( 'Japanese' );

こんな感じである。

mb_language(“uni”);
mb_language( ‘Japanese’ );

あれれ・・・その都度対応してきたら
こんなことに・・・orz

むむむ・・・まだまだ研究が必要だ。
また時間があるときにチャレンジ!

ZF を利用している場合

こんなコードも記述した方がよいみたい。

  1. $this->view->setEncoding('UTF-8');
  2. $this->view->setEscape('htmlentities');
SET NAMES

文字化け回避策として、あちこちのサイトで SET NAMES が
紹介されているが、こんな記事もあった。

SET NAMES, SET CLIENT ENCODINGを利用しないで、
mysql_set_charset, pg_set_client_encodingを利用すれば、
このような不整合が発生しないので問題も発生しなくなります。
引用元:yohgaki’s blog のコメント欄 2008-05-10 12:09のもの

大垣靖男さん(上記ブログのオーナー)お勧め設定

  1. default_charset="UTF-8"
  2. magic_quotes_gpc=off
  3. mbstring.input_encoding="pass"
  4. mbstring.internal_encoding="UTF-8"
  5. mbstring.output_encoding="pass"
  6. mbstring.language="japanese"
  7. mbstring.substitute_charactor=""

参考元:yohgaki’s wiki PHP/tips/日本語環境php.ini設定

PHP,Zend Framework | 2010-05-24 (月) 17:14:32 |