内部構造の解説
名前規則とグローバル変数
freoが独自に定義した関数は、先頭に freo_
が付加されています。(freo_session()
など。)
freoが独自に定義した定数は、先頭に FREO_
が付加されています。(FREO_HTTP_URL
など。)
グローバル変数として $freo
が定義されています。プログラムを改造する際、$freo
という変数を新たに定義すると誤作動の原因となる可能性があります。
大まかな処理の流れとプログラムの方針
基本的な処理の流れは、最近のフレームワーク(CakePHPなど)の影響を少し受けています。具体的には
- フロントコントローラ式(ブラウザからアクセスするファイルは一つ)
- 読み込まれるプログラムやテンプレートは、基本的にURLによって決定される
- 命名規則に従えば、自分でプログラムを拡張したり、画面表示を切り替えたりできる
という仕組みです。ただし、特に以下の点が最近の一般的なフレームワークとは異なります。
- 非オブジェクト指向(処理の流れは手続き型)
「オブジェクト指向が解らない人でも、比較的容易に処理を追えるように」という理由からですが、一長一短ではあります。あと、開発者自身がデザインパターンとか熟知していないから…という後ろ向きな理由も少しあったり。 - O/Rマッピングは無く、基本的に直接PDOを呼び出す
「freoのコードを初めて読む人でも、PHPとPDOとSmartyの知識があれば理解できるように」「SQLさえ解れば、複雑なリクエストも簡単に実行できるように」という理由からですが、これも一長一短ではあります。
「プロジェクトが巨大になったときのメンテナンス性」よりも「プログラム初心者でも容易に改造できる」ことを意識したつもりです。(そもそも、汎用的なフレームワークを作りたいわけではないので。)
具体的な処理の流れ
- ブラウザで
index.php
にアクセスする index.php
からlibs/freo/freo.php
が呼び出される(libs/freo/freo.php
内で呼び出している関数は、libs/freo/common.php
で定義されています。)libs/freo/freo.php
が動作モードに応じて必要なプログラムを読み込み&実行(libs/freo/internals/
内にあるファイルが読み込み&実行されます。)
動作モードについて
動作モードは mode
と work
の2つの値によって決定されます。mode
と work
は、基本的にはURLの値が利用されます。
例えば http://www.example.com/freo/index.php
にfreoを設置したとして、http://www.example.com/freo/index.php/admin/entry
にアクセスすれば
mode | admin |
---|---|
work | entry |
とみなされます。(mod_rewriteを使用している場合、index.php/
を省略して http://www.example.com/freo/admin/entry
でアクセスできます。)
また、値が無い場合は default
という値が指定されたものとして扱われます。つまり、http://www.example.com/freo/index.php/admin
にアクセスすれば
mode | admin |
---|---|
work | default |
とみなされ、http://www.example.com/freo/index.php
にアクセスすれば
mode | default |
---|---|
work | default |
とみなされます。つまり、http://www.example.com/freo/index.php/admin
とhttp://www.example.com/freo/index.php/admin/default
は同じ結果、http://www.example.com/freo/index.php
とhttp://www.example.com/freo/index.php/default
とhttp://www.example.com/freo/index.php/default/default
は同じ結果、ということです。
また、http://www.example.com/freo/index.php/view/15
の場合は
mode | view |
---|---|
work | 15 |
ということになりますが、数値だけの値は mode
や work
とみなさないので
mode | view |
---|---|
work | default |
とみなされます。
読み込まれるプログラムについて
読み込まれるプログラムは例えば
mode | admin |
---|---|
work | entry |
の場合は libs/freo/internals/admin/entry.php
が読み込まれ、
mode | admin |
---|---|
work | default |
の場合は libs/freo/internals/admin/default.php
が読み込まれ、
mode | default |
---|---|
work | default |
の場合は libs/freo/internals/default/default.php
が読み込まれます。ちなみに、libs/freo/internals/
直下のファイルは各プログラムの共通関数で、libs/freo/freo.php
から直接呼ばれることはありません。
また、読み込むプログラムが見つからなければ default
プログラムを読み込もうとします。
具体的には、http://www.example.com/freo/index.php/page/about
の場合は
mode | page |
---|---|
work | about |
となり、libs/freo/internals/page/about.php
を読み込もうとしますが、about.php
は存在しないので代わりに libs/freo/internals/page/default.php
が読み込まれます。
このルールに従えば、自分で機能を追加することもできます。(この仕組みとは別に、プラグインで追加することもできます。)
読み込まれるテンプレートについて
読み込まれるテンプレートは
mode | admin |
---|---|
work | entry |
の場合は templates/internals/admin/entry.html
が読み込まれ、
mode | admin |
---|---|
work | default |
の場合は templates/internals/admin/default.html
が読み込まれ、
mode | default |
---|---|
work | default |
の場合は templates/internals/default/default.html
が読み込まれます。ちなみに、templates/internals/
直下のファイルは各テンプレートから呼び出される共通テンプレートで、プログラムから直接呼ばれることはありません。
また、読み込むテンプレートが見つからなければ default
テンプレートを読み込もうとします。
具体的には、http://www.example.com/freo/index.php/page/about
の場合は
mode | page |
---|---|
work | about |
となり、templates/internals/page/about.html
を読み込もうとしますが、about.html
は存在しないので代わりに templates/internals/page/default.html
が読み込まれます。
このルールに従えば、「○○カテゴリの記事を一覧表示するときのみ、専用のデザインにする」など、専用の表示モードを追加することもできます。(この仕組みとは別に、プラグインで追加することもできます。)