Re:

のあんのブログ

カテゴリ:開発 > DooPHP

慣れてるテンプレートエンジンが一番!

もちろん、ごくごくネイティブに近く?コーディングされているDooPHPの速度は落としてしまうかもしれないが…やっつけてみた。

利便性優位。(なら、DooPHPなんて本末転倒?)

何故か急にDooPHPw

ドキュメントが少なくてイマイチ理解してない。

でも見た感じ、ハードコーディングされてるっぽいし…継承してユーザクラスでオーバーライドしたりっていうのは準備されてないと思う。
# autoloadを利用すれば可能そうでした。フックは用意されてない…かなぁ、beforeRun, afterRunあたりでなんとか…。

  1. Smartyを拾ってきて解凍した後、libsフォルダをsmartyへリネームして /app/protected/library 配下に置く(libraryは作成した。別にリネームしなくてもいいし、置き場所も適宜。どこに置くべ…と思ってとりあえず。)
  2. /dooframework/view にDooViewSmarty.phpを作成する(ファイル名も適宜)
  3. /app/protected/config/common.conf.phpにテンプレートエンジン設定を追加
  4. (゚д゚)ウマー (/app/protected/viewc に書き込み権限を忘れずにー)

common.conf.php
$config['TEMPLATE_ENGINE'] = 'DooViewSmarty';

DooViewSmarty.php
include_once 'DooView.php';

class DooViewSmarty extends DooView {

    private $smarty;

    public function __construct() {
        include_once Doo::conf()->SITE_PATH.'protected/library/smarty/Smarty.class.php';

        $this->smarty = new Smarty();

        $this->smarty->compile_dir = Doo::conf()->SITE_PATH.'protected/viewc';
        $this->smarty->template_dir = Doo::conf()->SITE_PATH.'protected/view';
        $this->smarty->assign('SITE_PATH', Doo::conf()->SITE_PATH);
        $this->smarty->assign('BASE_PATH', Doo::conf()->BASE_PATH);
    }

    public function render($file, $data = NULL) {
        foreach($data as $key => $val){
            $this->smarty->assign($key, $val);
        }
        echo $this->smarty->fetch($file.'.html');
    }
}

DooPHPのレンダリングは $this->render() なので、そのメソッドをやっつけた。

DooView.phpに手を加えないよーに継承して別ファイルにしたけど、DooView.phpにコンストラクタ追記(コンストラクタじゃなくても)して、render()じゃなくview()メソッドでも良いと思うし、好きな方法で(´・ω・`)

てか、DooPHPを使うことが稀だと思うけどね。


あとはいつものとおりSmartyでテンプレートを書く。



プログラム的なこととかおろそかになってるので、ちまちまと触れているDooPHPについて書きます!

カイハツの上で欠かせないのがデバッグ。

DooPHPには強力なログツールが組み込まれているんデス。


Using DooPHP Logging Tools
http://learn.doophp.com/2009/12/using-doophp-logging-tools/


ということで、基本的な説明はオフィシャルにお任せ。


掻い摘みながら何点か。


まず、エラーレベルに応じたメソッドが定義されているので、ログのすみ分けが容易です。

さらに、カテゴリ分けができるのでアプリケーション別、コントローラ別、モデル別など、出力箇所を明確に示すことも可能。

ファイルへのログの出力においても、指定したファイル名で、全出力もできればエラーレベルを指定した出力、カテゴリ指定の出力など、非常にロギングしやすくなっています。


また、logviewerが付いていてweb上からログを参照できる点も簡単便利。


PHPフレームワークとしてのDooPHP、オススメです。

DooPHPのデフォルトでは、URLのルーティングを/app/protected/config/routes.config.phpに記述します。


http://hogehoge.com/regist

ページの場合

コントローラを作成
RegistController
/app/protected/controller/RegistController.php
class RegistController extends DooController {
	public function index(){
		echo 'this page is regist.';
	}
}

ルーティングを追加
/app/protected/routes.config.php
$route['*']['/regist'] = array('RegistController','index');


これで http://hogehoge.com/regist としてアクセスするとページが表示されます。

次に

http://hogehoge.com/regist/confirm

RegistControllerにconfirmメソッドを追加します。
class RegistController extends DooController {
	public function index(){
		echo 'this page is regist.';
	}

	public function confirm(){
		echo 'this page is confirm.';
	}
}


同様にルーティングを追加します。
$route['*']['/regist/confirm'] = array('RegistController','confirm');


といった具合に、メソッドに対するルーティングを個々に記述する必要があって、場合によっては手間だ!と感じる場合があると思います。

そんなときは以下を追加します。

/app/protected/config/common.config.php
$config['AUTOROUTE'] = true;

自動的にルーティングされるので、先のルーティング追加は不要になります。

しかしながらセキュリティが下がるので、メソッドへのアクセスを制限するコーディングは必要になると思います。

まぁ個々の判断だと思いますし、とりあえず自動的にルーティングするにはこう設定するよっていう例でした。

$route['*']

DooPHPはRESTful APIに対応しており、*をGET、PUT、POST、DELETEを指定したリクエスト制限でのルーティングが可能です。

CodeIgniterを使い始めて数ヶ月たったころ、DooPHPを知りました。

英語のドキュメントしかありませんが、CodeIgniterより良さそう。


DBを拡張したいときレプリケーション設定ができたり、データキャッシュの手段もいくつか用意されたり、REST API構築もサポート。

小規模開発から大規模開発まで十分担ってくれそうなフレームワークですね。


フレキシブルでも取っ付きにくい感じは少なく、DooPHPの利点として挙げられているとおり、わかり易いかもしれない。


ついでに、Eclipse PDTからNetBeansにシフトしようかなぁと思ってインストールしました。

nb1

とりあえず、DooPHPにしてもNetBeansにしても、使い慣れが必要。



DooPHPですが、/app/protected/viewの.htmlテンプレートを表示しようとしたときに、/app/protected/viewcに.phpとして書き出すみたいで、viewcディレクトリに書き込み権限がないとページが表示されませんでした。

そんなことドキュメントに見なかったので、render()メソッドを読んでわかりました…。

viewのドキュメントに書き添えてあって欲しかったな。


htmlテンプレートをレンダリングするときはrender()メソッドを、phpテンプレートをレンダリングするときはrenderc()メソッドを使 います。



ついでに、file_get_contents()関数を使っているので、レンタルサーバなんかでallow_url_fopenが無効になってるPHPバージョン5?だと、ini_set()、.htaccessでは設定不可のため設置できなそうです。

/dooframework/view/DooView.php
compile()メソッド

$str = file_get_contents($vfilename);



ob_start();
include_once($vfilename);
$str = ob_get_contents();
ob_end_clean();


とか書き換えたら使える?

↑このページのトップヘ