要求處理元件

第一節

引言

RequestHandler component在Cake中被用來判定傳回的HTTP reqeust。 你可以用它通知controller有Ajax request,取得遠端client的IP位置和request種類,或去除不要的資料。 要使用RequestHandler component,得確認controller的$components陣列是否包含了這個component。

class ThingsController extends AppController
{
    var $components = array('RequestHandler');

    // ...
}

第二節

取得client/Request訊息

就讓我們開門見山,直接看函式說明:

  • accepts
  • string $type

依$type值傳回client接受的content-type。 如果$type等於null或沒有傳值,會傳回內含client能接受的所有content-type的陣列。 如果傳了一個字串過去,則會將$type拿去和content-type表(參考setContent())比對,若client可以接受這個種類時傳回true。 如果$type是一個陣列,每個字串會分別比對,如果其中一個能接受就傳回true。例如:

class PostsController extends AppController
{
    var $components = array('RequestHandler');

    function beforeFilter ()
    {
        if ($this->RequestHandler->accepts('html'))
        {
            // 當client接受HTML(text/html)時才執行這裡的程式
        }
        elseif ($this->RequestHandler->accepts('rss'))
        {
            // 當client接受RSS(application/rss+xml)時才執行這裡的程式
        }
        elseif ($this->RequestHandler->accepts('atom'))
        {
            // 當client接受atom(application/atom+xml)時才執行這裡的程式
        }
        elseif ($this->RequestHandler->accepts('xml'))
        {
            // 當client接受XML(application/xml 或 text/xml)時才執行這裡的程式
        }

        if ($this->RequestHandler->accepts(array('xml', 'rss', 'atom')))
        {
            // 當client接受XML,RSS,ATOM其中之一時才執行這裡的程式
        }
    }
}
  • getAjaxVersion

若使用Prototype JS 函式庫,它會在Ajax request上放置一段特殊表頭資料。 此函式可以傳回檔頭內記錄的Protytype版本資訊。

  • getClientIP

傳回client的IP位置。

  • getReferrer

傳回最出發出這個request的server名稱。

  • isAjax

如果目前的request是XMLHttpRequest就傳回true。

  • isAtom

如果client能接受Atom格式的內容則傳回true。

  • isDelete

若目前的request的'REQUEST_METHOD'等於DELETE則傳回true。

  • isGet

若目前的request的'REQUEST_METHOD'等於Get則傳回true

  • isMobile

如果HTTP_USER_AGENT說明了這是個手機的web流覽器則傳回true。

  • isPost

若目前的request的'REQUEST_METHOD'等於POST則傳回true

  • isPut

若目前的request的'REQUEST_METHOD'等於PUT則傳回true

  • isRss

若client能接受RSS格式的內容(application/rss+xml),則傳回true。

  • isXml

若client能接受XML格式的內容(application/xml 或 text/xml),則傳回true。

  • setContent
  • string $name
  • string $type

在content-type的別名表中加入一個選項,與accepts()和prefers()配合使用。 $name是別名名稱,$type則是MIME型別。 內建的幾種格式為:

// Name     => Type
  'js'      => 'text/javascript',
  'css'     => 'text/css',
  'html'    => 'text/html',
  'form'    => 'application/x-www-form-urlencoded',
  'file'    => 'multipart/form-data',
  'xhtml'   => array('application/xhtml+xml', 'application/xhtml', 'text/xhtml'),
  'xml'     => array('application/xml', 'text/xml'),
  'rss'     => 'application/rss+xml',
  'atom'    => 'application/atom+xml'

第三節

精簡資料

有時候我們會想刪除request或輸入的資料內部分內容。 下列的RequestHandler函式可以做這類的事。

  • stripAll
  • string $str

刪除$str內所有的空白,影像和script(就等於同時呼叫stripWhitespace(),stripImages()和stripScripts())。

  • stripImages
  • string $str

刪除$str裡的影像。

  • stripScripts
  • string $str

移除$str裡所有<script> 和<style> 相關的標籤。

  • stripTags
  • string $str
  • string $tag1
  • string $tag2...

移除$str裡$tag1,$tag2等參數指定的標籤。

$someString = '<font color="#FF0000"><bold>Foo</bold></font> <em>Bar</em>';

echo $this->RequestHandler->stripTags($someString, 'font', 'bold');

// 輸出: Foo <em>Bar</em>
  • stripWhiteSpace
  • string $str

移除$str內的空白字元。

第四節

其他好用的函式

當應用程式使用到AJAX技術時,RequestHandler component更會顯得特別好用。 setAjax()函式可以自動偵測AJAX的request,然後將controller的layout轉換成AJAX layout。 這樣的好處在於你可以做一個小視窗,在收到AJAX request時變大二倍。

// list.thtml
<ul>
<? foreach ($things as $thing):?>
<li><?php echo $thing;?></li>
<?endforeach;?>
</ul>

//-------------------------------------------------------------

//The list action of my ThingsController:
function list()
{
    $this->RequestHandler->setAjax($this);
    $this->set('things', $this->Thing->findAll());
}
 

當一般的流覽器呼叫/things/list時,沒排序的列表會被畫在應用程式預設的layout上。 但如果這是一個AJAX的rquest,列表就會自動被畫在AJAX layout上。


附錄:讀者筆記