Zend Framework 1.12 では、メソッド getParam() だけでこれが可能です。getParam() の結果は、使用可能な key がない場合は NULL 、1 つの keyの場合は文字列、複数の keys の場合は配列であることに注意してください。
「id」値がありません
http://domain.com/module/controller/action/
$id = $this->getRequest()->getParam('id');
// NULL
単一の「id」値
http://domain.com/module/controller/action/id/122
$id = $this->getRequest()->getParam('id');
// string(3) "122"
複数の「id」値:
http://domain.com/module/controller/action/id/122/id/2584
$id = $this->getRequest()->getParam('id');
// array(2) { [0]=> string(3) "122" [1]=> string(4) "2584" }
これは、コードに常に文字列が必要で、何らかの理由でより多くの値が URL に設定されている場合に問題になる可能性があります。たとえば、「配列から文字列への変換」というエラーが発生する場合があります。getParam() から必要なタイプの結果を常に取得できるように、このようなエラーを回避するためのいくつかのトリックを次に示します。
$id を配列にしたい場合(param が設定されていない場合は NULL)
$id = $this->getRequest()->getParam('id');
if($id !== null && !is_array($id)) {
$id = array($id);
}
http://domain.com/module/controller/action/
// NULL
http://domain.com/module/controller/action/id/122
// array(1) { [0]=> string(3) "122" }
$id を常に配列にしたい場合(設定されていない場合は NULL 値はなく、空の配列のみ):
$id = $this->getRequest()->getParam('id');
if(!is_array($id)) {
if($id === null) {
$id = array();
} else {
$id = array($id);
}
}
http://domain.com/module/controller/action/
// array(0) { }
http://domain.com/module/controller/action/id/122
// array(1) { [0]=> string(3) "122" }
上記と同じ 1 行 (NULL なし、常に配列):
$id = (array)$this->getRequest()->getParam('id');
$id を文字列にしたい場合(最初に利用可能な値、NULL をそのまま保持)
$id = $this->getRequest()->getParam('id');
if(is_array($id)) {
$id = array_shift(array_values($id));
}
http://domain.com/module/controller/action/
// NULL
http://domain.com/module/controller/action/122/id/2584
// string(3) "122"
$id を文字列にしたい場合(最後の利用可能な値、NULL をそのまま保持します)
$id = $this->getRequest()->getParam('id');
if(is_array($id)) {
$id = array_pop(array_values($id));
}
http://domain.com/module/controller/action/
// NULL
http://domain.com/module/controller/action/122/id/2584/id/52863
// string(5) "52863"
getParam のこれらの「応答タイプ」を修正するためのより短い/より良い方法があるかもしれませんが、上記のスクリプトを使用する場合は、別のメソッド (拡張ヘルパーなど) を作成する方がクリーンになる可能性があります。