手順としては、まずPOSTはPostクラス、GETはUrlParameterクラスが受け取ります。
(リクエスト振り分けクラスDispatcherがGETはスラッシュ区切りの第3パラメータ以降としていたのでした。)
次に、RequestクラスがPostインスタンス、UrlParameterインスタンスを引数に取り、
そののちgetRequest()メソッドで使えるようにします。
ここで、Requestクラスは2種類のインスタンスを引数に取りますが、
その2種類にはsetValues()メソッドを持って欲しいのです。
そこで、RequestInterfaceを定義します。
<?php
namespace saso\classes\base;
interface RequestInterface{
function setValues();
}
それを実装したものが以下の二つです。<?php
namespace saso\classes\base;
class Post implements RequestInterface{
private $_values;
public function setValues(){
foreach($_POST as $key => $value){
$value = htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
$this->_values[$key] = $value;
}
return $this->_values;
}
}
<?php
namespace saso\classes\base;
class UrlParameter implements RequestInterface{
private $_values;
public function setValues(){
foreach($_GET as $key => $value){
$this->_values[$key] = $value;
}
return $this->_values;
}
}
Requestクラスはコンストラクタでインターフェースをタイプヒンティングしています。<?php
namespace saso\classes\base;
class Request{
private $_request;
public function __construct(RequestInterface $r){
$this->_request = $r->setValues();
}
private function _hasKey($key){
if(false == array_key_exists($key,$this->_request)){
return false;
}
return true;
}
public function getRequest($key = null){
if(null == $key){
return $this->_request;
}//キーを指定されなかったら、全部を配列で返す。
if(false == $this->_hasKey($key)){
return null;
}//言われたキーがない場合nullを返す
return $this->_request[$key];//普通は言われたキーのヴァリューを返す
}
}
使い方は以下の通りです。<?php
$post = new base\Post();
$name = new base\Request($post);
echo $name->getRequest('itemName');
参考:http://www.objective-php.net/
0 件のコメント:
コメントを投稿