ログ日記

作業ログと日記とメモ

Laiz

PHPの自作フレームワーク現状まとめ

https://github.com/nishimura/laiz2 基本方針 DB設計最優先 HTML構造優先 コード量を少なく 大抵の処理はPage(Action)クラスに書く。いわゆるAction肥大化。もし「この二つのテーブルは大抵joinして取得している」という状況になったらModelを作っても良い…

PHPのフレームワークを作った

ソースはここ: https://github.com/nishimura/laiz2composerの使い方を見るのも兼ねてサンプルアプリを置いたのですぐにインストールできるはず。 https://github.com/nishimura/laiz-sample-task composer.phar create-project laiz/laiz-sample-task laiz-…

BazaarからGitに移行した

少しだけ使っていたLaunchpadはやめてGithubに変更。 Launchpadってmixiみたいに段々見にくくなってるような…。 http://github.com/nishimura/laiz 取り敢えずローカルのリポジトリとLANのリポジトリとgithubとこんがらがりながら使ってみている。 もともと…

アクションのテスト

やりたいこと。 アクションを実行した戻り値のチェック テンプレート用変数のチェック DB操作のチェック(スタブ? ダミー変数でのHTML表示 ループ変数などがあると、実際に動かすまでデザインできない そのメソッドをどのように呼びたいのかということをDoc…

フレームワークのメール処理

php.iniでmbstringの設定を何もしていないときに日本語メールが正しく処理されないのを解決しなければ。 フレームワーク起動直後にmb_language()を呼ぶのが適当だろうか。 タイムゾーンの設定(date_default_timezone_set())と、日本で使う上での必須の設定…

O/Rマッパーに疑似ビュー機能を追加した

今までDBにビューを作っていたものを、やっぱりDBをいちいち変えるのが面倒なのでormで対応することにした。 myview.sql に select col1, col2 from t1 %s order by col3 limit 1 こんなselect文があるとすると get(); $where = 'where col3 > ?'; // 実際は…

O/Rマッパーにビューに機能が欲しくなってきた

DBの更新ってめんどくさいよね。 システムを動かしながらソースは更新できる。 システムを動かしながらDBは更新できる。 これを同時にやれば、DB修正ありの更新をシステム停止せずにできる。ミスらなければ。 で、新しいDBデータ一覧表示が欲しくなった場合…

複数のアクションクラスでの共通部分

アクションクラスは使い捨てだけれど、同じような処理を複数のページで使いたい場合って結構多い。 全く同じならいいんだけれど、微妙に違うような。Template Methodパターンを使えば解決するような感じの。 でもアクションクラスは見通しを良くしたいので複…

singletonの使いどころ

最初にmapleを参考にしただけあって、LaizではDIContainerでフレームワークのコアクラスが管理されている。 で、Javaみたいに万能なコンテナだったらいいんだけどもPHPだし簡単な機能のみでいいやーって思ってたからコンポーネントは全てsingletonになってい…

リファクタリング

二日前に なので取り敢えずgetColumnMeta()して型情報を設定するようにしてみた。 と書いたのに全部直せてなかった。三カ所に処理が分散していたのだ。 なので、ひとつにまとめようとリファクタリング。微妙に1,2行違っていたりしてちょっとめんどくさかっ…

設定ファイル変数を使ったメソッドインジェクションできた

これでオブジェクトのコンストラクタ引数にメソッドの実行結果を使えるようになった。 obj = $a; $this->key = $key; $this->id = $id; } こういうクラスがあるとき ; SomeComponent.ini [main] constructor = id,$id $id = Request.…

複雑なメソッドインジェクション

あるコンポーネントのメソッドの戻り値を別のコンポーネントのコンストラクタ引数にしたい。 これはiniファイルでは限界かも。 安易に思い付くのは、シェルスクリプト的なもの。 [someComponent] constructor = $arg [vars] arg = OtherComponent.someMethod…

maple式フィルタチェーンをやめた理由

なぜmapleを参考にしていたのにフィルタで全てを構成するようにしなかったのだろう・・あまり考えたことないな。 たぶん初めはguesswork的な軽いものを作ろうと思っていたからだろう。 しかし改良を重ねていくうちに設定が増える増える・・。 現在では class…

validation拡張機能追加

基本的な入力チェックはフレームワークに入ってるんだけど、もっとアプリ独自のチェックもバリデータでチェックしたい。 フレームワークの基本クラスをmaple流に拡張できるようにはしていたものの、バリデータクラスは普通にnewしていた。 設定ファイルにバ…

設定ファイル読み込み機能を追加した

あってもいい機能なのに今まで必要なかったので付けてなかった。 ディレクトリ共通設定だけではまかなえない部分が出てきたのでincludeセクションを追加。 [include] configs/config.iniとやると他の設定ファイルを読み込む。 いくつかのフォーム要素に対し…

PHP5で変数を自動設定すると予想以上に便利

オブジェクトをforeachできるようになったので items = $dao->getVos(); // Itemテーブルから行をオブジェクトとして全取得 } } と書く。 HTMLの方は <table> {loop:items} <tr> <td>{itemId}</td> <td>{itemName}</td> <td>{price:n}</td> </tr> {endloop:} </table> などと列挙したい列名…

変数設定の簡略化

オブジェクトからテンプレート変数を設定できるようにした。 何らかの商品データを表示するページを作る場合、アクションクラスは factory('item'); $this->_laizVoItem = $itemDao->getVo($this->itemId); } } このようになる。例えばDBにitem_nameというカ…

ループ中のフォーム操作

せっかくフォームを操作できるflexyを使っているのに、ループ中だと使えないのが困る。 foreach中で {loop:forms} <tr> <td><input type="text" name="foo" value="{foo}"></td> <td> <select name="bar"> {loop:bar} <option value="{valueKey}">{valueText}</option> {endloop:} </select> </td> </tr> {endloop:} とかやらなくちゃいけない。 # {loop:var}は独自拡張なので{foreach:key…

アクション設定ファイルによるビューの変更

思ったより難しい。 アクションは自由にチェーンがかけられるわけで・・複数のアクションのうち一つでもビュークラス書き換え設定が存在すれば、その時点でビューが書き換わってしまう。その後アクションチェーンによって普通のアクションが指定されることも…

タイプヒンティングからのインジェクションとインターフェース

すごく根本的な問題に。 タイプヒンティングからコンポーネントを自動設定する場合、タイプヒンティングにインターフェースや親クラスが使えなくなる。 どこかにコンポーネント生成に関する情報があるはずで、それをタイプヒンティングに持ってきたらこうな…

タイプヒンティングからのインジェクションとインターフェースの続き

コメントが長くなるとみにくい・・。 レスの続き。 最近はタイプヒンティング自体ほとんど利用価値がないような気がして仕方がありません……。 私はアクションクラスでよく使ってるんですよね。 例えば isManager()){ $this->MEMBERS = $iterator; return 'su…

アクションマッピング機能

Some_Action = OtherActionと書けば Some_Action に対するアクセスをOtherActionに切り替えられるようになった。 たったこれだけの機能なのにかなり時間がかかった・・。色んなクラスのあちこちでアクション名からクラス名の自動設定を前提としたコードがか…

Laizのサイト

http://www.n314.com/Laiz/pukiwiki/ しばらく活動してないわけですが・・・今見たらGoogleRankが3になってた。リンクされてないのになぁ。 たぶん誰も使おうとはしてないだろうけど(?)LaizはPHPのフレームワークがどういうものかを分かっていないと使い…

アクションマッピング設定とエラー制御

アクションマッピングで Some_Action = OtherActionの設定があるとき、OtherActionに直接アクセスするとエラーを表示させるようにした。 このエラーはパス探索中に発生するわけだけれども、これをどうやってビューまで持って行こうか悩んだ。 ErrorStackとか…

define()の削除

フレームワーク設定をdefine()からiniファイルに移した。 かなり時間がかかった・・・。テストケースも修正しなきゃならなかったし。 時間をかけて修正して、何が便利になったわけでもなく。リファクタリングって大変だ。 あとクラス名をPEAR方式にしたいけ…

モノリシックコアとマイクロコア

現在はパス名解決のために、全てPathUtilsクラスを通している。 このクラスに処理を追加するだけで、理想の動作(URLとディレクトリ構造の分離)を実現できるのではないだろうか。 しかし今は単純なユーティリティクラスなのでスタティック呼び出しで使って…

O/RマッパーとビューをトリガにしたイテレータでDB接続

$map = array('voPropertyName' => 'tableColumnName', ... ); という配列があるとき $bind = array(); // $stmt = PDOStatement foreach ($map as $key => $value){ $binds[$key] = $$key = null; $stmt->bindColumn($value, $binds[$key]); } このようにbi…

クラス図

http://f.hatena.ne.jp/n314/20061206161331前よりも詳しく書いてみた。 ただコンテナ周りの書き方がよく分からない。 PHPで function execMethod($class, $method, $args = array()){ // 何らかの初期化処理 return call_user_func_array(array($class, $me…

基本から作り直そう

今のフレームワークはちょっとやりすぎた。 柔軟にしすぎた。 class A{ var $_Component;って書くだけでコンポーネントが代入されるのはやっぱり良くない。 PHP4ならこれで良かったんだけど、PHP5にするとprivateで宣言するので使う機会がなくなる。 あと設…

フレームワークの書き直し

依存関係を減らそうと思ってクラス図を書いてみたら、非常にまずいことになってた。 最初にコンテナにクラスを全部登録して必要になれば使えばいいやって思ってたから、依存関係がありすぎる。 複数のクラスにまたがる処理をまとめる場合って難しいな。 設定…