簡單的 Front controller

基本上是參考 CodeIgniter 的方式來實作, 不過省掉很多東西, 而目錄結構大概就參照 CodeIgniter 如下。

/index.php
/application/controllers
...

寫這個的目的主要是想了解 Front Controller 是怎麼做的。 另外因為依照 CodeIgniter 慣例的 Controller 名稱, 很容易跟其他 class name 衝到, 如果要使用 ORM 的話, 很容易會發生名稱碰撞, 所以實作一下 front controller, 另外改進這個問題, 不過其實就是在 class name 加上 postfix 而已, 而其他 framework 也都這麼做。

首先來看一下 front controller 的內容: index.php `

```

那麼只要存取 http://localhost/index.php/guestbook/index 或是 http://localhost/index.php/guestbook 其中一個網址, 就可以看到以下內容:

it's guestbook index page

而存取 http://localhost/index.php/guestbook/post 這個網址就可以看到下面這個內容

it's guestbook post page

也就是說, 往後如果要新增 poll 的功能, 只要在 /application/controllers/ 新增一個 poll.php 的 class 即可透過 http://localhost/index.php/poll 這個網址來存取。

另外似乎有 PATHINFO 不存在的狀況, 所以 CodeIgniter 另外也把 ORIGPATHINFO、REQUESTURI 跟 QUERY_STRING 納進判斷的處理。

只是對這幾個我就不太清楚了, 倒是 REQUESTURI 跟 PATHINFO 是差不多的, 不過 REQUESTURI 多了 QUERYSTRING, 而目前試過 Apache 2 跟 lighttpd 都可以正常讀到 PATH_INFO

最後, apache 的 rewrite 跟 CodeIgniter 一樣, 就可以把以上所提到的網址中的 index.php 給拿掉。

RewriteEngine On RewriteBase / RewriteCond %{REQUESTFILENAME} !-f RewriteCond %{REQUESTFILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!