内部構造の解説

名前規則とグローバル変数

freoが独自に定義した関数は、先頭に freo_ が付加されています。(freo_session() など。)

freoが独自に定義した定数は、先頭に FREO_ が付加されています。(FREO_HTTP_URL など。)

グローバル変数として $freo が定義されています。プログラムを改造する際、$freo という変数を新たに定義すると誤作動の原因となる可能性があります。

大まかな処理の流れとプログラムの方針

基本的な処理の流れは、最近のフレームワーク(CakePHPなど)の影響を少し受けています。具体的には

  • フロントコントローラ式(ブラウザからアクセスするファイルは一つ)
  • 読み込まれるプログラムやテンプレートは、基本的にURLによって決定される
  • 命名規則に従えば、自分でプログラムを拡張したり、画面表示を切り替えたりできる

という仕組みです。ただし、特に以下の点が最近の一般的なフレームワークとは異なります。

  • 非オブジェクト指向(処理の流れは手続き型)
    「オブジェクト指向が解らない人でも、比較的容易に処理を追えるように」という理由からですが、一長一短ではあります。あと、開発者自身がデザインパターンとか熟知していないから…という後ろ向きな理由も少しあったり。
  • O/Rマッピングは無く、基本的に直接PDOを呼び出す
    「freoのコードを初めて読む人でも、PHPとPDOとSmartyの知識があれば理解できるように」「SQLさえ解れば、複雑なリクエストも簡単に実行できるように」という理由からですが、これも一長一短ではあります。

「プロジェクトが巨大になったときのメンテナンス性」よりも「プログラム初心者でも容易に改造できる」ことを意識したつもりです。(そもそも、汎用的なフレームワークを作りたいわけではないので。)

具体的な処理の流れ

  1. ブラウザで index.php にアクセスする
  2. index.php から libs/freo/freo.php が呼び出される(libs/freo/freo.php 内で呼び出している関数は、libs/freo/common.php で定義されています。)
  3. libs/freo/freo.php動作モードに応じて必要なプログラムを読み込み&実行(libs/freo/internals/ 内にあるファイルが読み込み&実行されます。)

動作モードについて

動作モードは modework の2つの値によって決定されます。modework は、基本的にはURLの値が利用されます。

例えば http://www.example.com/freo/index.php にfreoを設置したとして、http://www.example.com/freo/index.php/admin/entry にアクセスすれば

modeadmin
workentry

とみなされます。(mod_rewriteを使用している場合、index.php/ を省略して http://www.example.com/freo/admin/entry でアクセスできます。)

また、値が無い場合は default という値が指定されたものとして扱われます。つまり、http://www.example.com/freo/index.php/admin にアクセスすれば

modeadmin
workdefault

とみなされ、http://www.example.com/freo/index.php にアクセスすれば

modedefault
workdefault

とみなされます。つまり、
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 の場合は

modeview
work15

ということになりますが、数値だけの値は modework とみなさないので

modeview
workdefault

とみなされます。

読み込まれるプログラムについて

読み込まれるプログラムは例えば

modeadmin
workentry

の場合は libs/freo/internals/admin/entry.php が読み込まれ、

modeadmin
workdefault

の場合は libs/freo/internals/admin/default.php が読み込まれ、

modedefault
workdefault

の場合は libs/freo/internals/default/default.php が読み込まれます。ちなみに、libs/freo/internals/ 直下のファイルは各プログラムの共通関数で、libs/freo/freo.php から直接呼ばれることはありません。

また、読み込むプログラムが見つからなければ default プログラムを読み込もうとします。

具体的には、http://www.example.com/freo/index.php/page/about の場合は

modepage
workabout

となり、libs/freo/internals/page/about.php を読み込もうとしますが、about.php は存在しないので代わりに libs/freo/internals/page/default.php が読み込まれます。

このルールに従えば、自分で機能を追加することもできます。(この仕組みとは別に、プラグインで追加することもできます。)

読み込まれるテンプレートについて

読み込まれるテンプレートは

modeadmin
workentry

の場合は templates/internals/admin/entry.html が読み込まれ、

modeadmin
workdefault

の場合は templates/internals/admin/default.html が読み込まれ、

modedefault
workdefault

の場合は templates/internals/default/default.html が読み込まれます。ちなみに、templates/internals/ 直下のファイルは各テンプレートから呼び出される共通テンプレートで、プログラムから直接呼ばれることはありません。

また、読み込むテンプレートが見つからなければ default テンプレートを読み込もうとします。

具体的には、http://www.example.com/freo/index.php/page/about の場合は

modepage
workabout

となり、templates/internals/page/about.html を読み込もうとしますが、about.html は存在しないので代わりに templates/internals/page/default.html が読み込まれます。

このルールに従えば、「○○カテゴリの記事を一覧表示するときのみ、専用のデザインにする」など、専用の表示モードを追加することもできます。(この仕組みとは別に、プラグインで追加することもできます。)