自分で改造するのも面倒だし、Migration Toolがないなど現状では色々不足している機能もまだまだあるのでAkelosを使った方がよさそうだ。
でもMapleはソースコードがすっきり書けるし、デバッガーで追うのも楽で良いと思うので今後に期待したい。
以下の出典はここ
-----------------------------
Hawkです。
GlobalFilterセクションによる指定が分かり難いのは
その通りだと私も思います。
そして木内さんが今回提案されたような形も、検討されたことはありました。
ではなぜ現状のような仕様になっているかというと、
ちょっとした"歴史的な事情"があるのです。
実は、そもそもフィルタの継承機能は、
作者kunitさんも想定していなかった、全くの偶然による産物でした。
それを「これは結構便利だぞ」と気付いた一部の人(私など)が、
概念を整理して、有用性をアピールして、
ようやく3.2で公式にサポートするに至った、というのが実状です。
そのため3.2開発の段階では、
あまり設定ファイルを複雑にするような形で導入するわけにはいかず、
3.1以前との互換性を最優先する形になりました。
果たして設定ファイルを複雑化するに値する機能なのかどうか、
検証する段階にあったということです。
ということなので、議論はまさにこれからです。
今回の提案がいただけたことで、少なくとも議論・検討していく段階には
入ったかと思うのですが、いかがでしょうか?>他の開発者の皆様
……
以下、内容についての返信です。
まず確認しておきたいのですが、
>> ## Global登録
>> [Filter at global]
>> ## Local登録(ディフォルトはこれ)
>> [Filter at local]
ここでいうglobalとは、3.2で言えば
「GlobalFilterセクションに指定した場合の動作」
もしくは
「最下層のmaple.iniで指定した場合の動作」
で、ConfigUtilsのメソッドで言えば
「_mergeOrAddによる登録」
で良いでしょうか。
そしてlocalとは、3.2で言えば
「GlobalFilterセクションが存在し、かつ指定されなかった場合の動作」
で、ConfigUtilsのメソッドで言えば
「__preserveや_mergeOrPreserveによる登録」
で良いでしょうか。
というのも、Maple3.1以前には後者のような概念は無く、
global/localのような区別も存在しなかったので……。
後者をlocalと呼ぶ、というのであれば、それはそれでOKです。
それを公式の呼び名にしてしまっても良いと思います。
それを踏まえての質問点です。
・[Filter at local:merge] がデフォルトとのことですが、
そうなるとMaple 3.1とも3.2とも互換性がないことになります。
互換性を保つべきかという議論はさておき、
この認識で正しいでしょうか。
・最下層のmaple.iniについても [Filter at local:merge] が
デフォルトなのでしょうか。
最下層のmaple.iniはその性質上、localが意味を持たないと思われますが?
まあこのあたりはコードを見れば一目瞭然かも知れないので、
よろしければ添付ファイルでMLに送ってみてください。
--
Hawk : {
web site : http://blog.hawklab.jp/
}
以下の出典はここ
-------------------------------------------------------
優しく・易しく? (2006-06-22 (木) 09:40:01)
以前、Migration Toolというか「フォルダ階層の移行ツール」の話をされていたと思うのですが、次期バージョンにバンドルされるものなのでしょうか?
mapleは、クラス名[action/compoment]命名規則が、フォルダ階層名[path]に則ったものなので、フォルダ名の変更や階層移動、整理を行おうとした場合に、クラス名、maple.ini、dicon.iniに直接影響が出てしまいます。
これらを「自動化」してくれるツールがあれば、非常に有用なものになると思っております。
generatorの中に含まれるのが良いのか?別のツールとして用意された方が良いのか?は、協議が必要だと思われますが「mapleって痒い所にも手が届くフレームワークだよね」って世間に認知されることを願っております。
非常にご多忙と存じますが、引き続き応援させていただいております。頑張ってください。
技術評論社から出版される、Software Design編集部が作成された「最新LLフレームワークエクスプローラ 5大フレームワーク徹底攻略」でのmapleの項も楽しみにしております。
どんな切り口で、記事にされているか?
また「今後のトレンドとしての部分」と「各フレームワークの本来の趣旨」が巧く記事にされていることを願っております。
(セッションを使わない単純なサイトの場合は、以下の変更をする必要は必要ない。)
maple\filter\Filter_View.class.php(77L近辺)
変更前:
$response->setRedirect($url);
変更後:
if(strlen(SID) > 0){
if(strchr($url, '?') === false)
$url .= '?' . SID;
else
$url .= '&' . SID;
}
$response->setRedirect($url);
header()関数を実際にコールする所(ソースを追っていないのでリダイレクトにheader()を使っているかは不明だが)で、セッションIDを付加するなどしても良いが、別件で「Filter_View.class.php」を独自に修正していたので、上記のように変更する事にした。
[View]
success = "action:user_list"
この場合、Smartyのテンプレートファイルに以下のような記述をすると、{$message}にアサインされるエラーメッセージは、ビューを表示したアクションクラスで設定したエラーのみとなる(ようだ)。
{errorList->getMessages assign=messages}
ビューを表示するアクションクラスの前に実行したアクションクラスで設定したエラーメッセージも表示したい場合は、以下のようにすれば{$message}に前記エラーメッセージがアサインされる。
{errorList->getAllMessages assign=messages}
mapleのサンプルコードでは、「getMessages」が使用されているが、ActionChainを使用する事を考えると「getAllMessages」を最初から使用しておいた方が良さそうだ。
(1)scaffoldを使うと、DBを操作する簡単なWEBアプリケーションを生成できる。
(2)dictionaryという機構があり、多言語対応が簡単にできるようになっている。
(3)フィルターの設定などは、基本的にソースコードに記述する必要がある。
Mapleの場合は、maple.iniに適用するフィルターやそのパラメータを設定する方式であり、ソースコードとフィルター設定などの処理を分離できる。これによりソースコードをすっきりさせる事ができる。
一方で、Mapleの場合、処理の修正を行おうとした場合、ソースとmaple.ini、さらにテンプレートファイルなどあちこち修正する必要があって面倒な面もある。
(4)テンプレートファイルの構文が複雑な気がする。
AkelosはRailsをベースとしているので、仕方ないとは思うが、PHP, Rubyのタグが混在したERBライクなテンプレートファイルとなっている。
これはデザインとシステムを分離して開発する場合、デザイナーさんにとってかなりの負担となるのと思われる。
ERBライクなテンプレートファイルは、最終的にPHPファイルにコンパイルして実行しているようなので、もしかしたらSmartyなどのテンプレートエンジンと連携できるのかもしれないが調べてない。
(5)PHP4, PHP5の両方で動作する。
Mapleも同様だがこれは良い。Zend Frameworkを使用したいと思っても、Zend Frameworkは、PHP5でしか動作しない(当時は、今は調べていない)ので、正直使いづらかった。今でもPHP4を使っているレンタルサーバーは多いので。
以下のように記述すると、遷移先の「index.tpl」で「Login failed.」と表示できる。
$this->flash['notice'] = $this->t('Login failed.');
$this->redirectTo(array('action' => 'index'));
しかし例えば以下のように表示するテンプレートファイルは変えるが、URLを遷移先させない場合は「index.tpl」で「Login failed.」と表示できないので注意する必要がある。
$this->flash['notice'] = $this->t('Login failed.');
$this->render(array('action' => 'index'));
「flash」はセッションを使用しているようであるが、単にセッション変数として登録しているのであれば、URLを遷移させなくても(遷移させた場合と同様に)「Login failed.」を表示できそうなものであるが表示できなかった。
デバッガーでステップ実行すると、URLを遷移させなくても「Login failed.」が表示できてしまうので、仕組みを解明しようと思ったが、なんだか良く分からないので挫折した。
あと、
$this->render(array('action' => 'index'));
と記述した場合、(thisであるuserコントローラの)レイアウトファイルが適用されなかったので、
$this->render(array('action' => 'index', 'layout' => 'user'));
と記述しレイアウトファイルが適用されるようにした。
フィルターで、 false をリターンするとフィルターチェインを途中で終了する事ができる。
generate で作成したコントローラは、「app/application_controller.php」が派生元となっているので、認証フィルターなどは、前記「application_controller.php」で設定しておくと良いと思われる。
認証フィルターをかけたくないコントローラは、独自のフィルターを認証フィルターの前に設定しておき、falseを返すなどして対処すれば良いと思われる。(今のところ試していないが)
もしくはgenerate で作成したコントローラで「AkActionController」を直に継承して、「application_controller.php」で設定したフィルターの影響を受けないようにするなどで対処できると思う。
また、ユーザのレベルによりアクセスの可否を決める場合も、前記「application_controller.php」で共通の認証フィルターをかけておき、独自のフィルターでユーザのレベルを判定すれば良いと思う。
(1)準備
config/config.phpなどに以下の設定を記述する必要がある。
defined('AK_LOGS_DIR') ? null : define('AK_LOGS_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'log');
(2)動作ログ
以下の設定をする事によって動作ログを取る事ができる。
config/config.phpなどに以下の設定を記述する必要がある。
define('AK_LOG_EVENTS', true);
production モード時には、合わせて以下の設定も記述する必要がある。
define('AK_ERROR_REPORTING', E_ALL );
ログは「AK_LOGS_DIR」で指定したディレクトリ下に「development.log」などのファイル名で出力される。
(2)独自ログ
以下のようにログ出力関数をコントローラなどからコールする事により、独自のログを出力する事もできる。
$this->log($type, $message);
$type としては 「PEAR_LOG_NOTICE」 などを設定する。
なお、上記関数をコールする前に PEAR の「Log.php」が必要となるので、app/application_controller.php などで以下のようにインクルードしておく。
require_once('Log.php');
ログは「AK_LOGS_DIR」で指定したディレクトリ下に「main.log」というファイル名で出力される。


































