2013年10月25日金曜日

在庫管理システム『SASO1.0』POSTとGETの受け取り

POSTとGETの受け取りもクラスにします。
手順としては、まず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 件のコメント:

コメントを投稿