とあるセクシーなデータ分析官

を目指す渋谷で働くソーシャルゲーム分析者の卵

symfony日記21

getRequest()->getParameterHolder()とfromArray()を使って、
postされたパラメーターをDBに登録する


というのはこんな感じにできてしまうが・・・

(action.actionClass.php)
$data = array();
$data['name']  = $this->getRequestParameter('name');
$data['title'] = $this->getRequestParameter('title');
$data['age']   = $this->getRequestParameter('age');
HogePeer::addData($data);

(HogePeer.php)
public static function addHoge($data)
{ 
    $hoge = new Hoge();
    $hoge->setName($data['name']);
    $hoge->setName($data['title']);
    $hoge->setName($data['age']);
    $hoge->save();
}


これではパラメータが大量にあったときにコードが長くなる傾向がある。
そこでパラメータをまとめて配列として扱うことでコードを短くします

(action.actionClass.php)
$data = $this->getRequest()->getParameterHolder(); //この中にpostされたパラメータの配列が入ってる
HogePeer::addData($data);

(HogePeer.php)
public static function addHoge($data)
{ 
    $hoge = new Hoge();
    $hoge->fromArray($data->getAll(), BasePeer::TYPE_FIELDNAME); //パラメータの配列を渡す
    $hoge->save();
}


こんなに短くなりました!



ちなみにfromArrayではまったのですが、第二引数が指定されてなかったためでした。
om/BaseHoge.phpのfromArrayメソッドを見るとこのように記載されており、

public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME)

$hogeをvar_dumpして引数有りとなしを比べたら意味がわかりました。


まず$data->getAll()の中の配列は

Array
(
    [name] => koyukin
    [title] => huga
    [age] => 25
)


これに対して
引数なし(TYPE_PHPNAME)でfromArrayすると

Array
(
    [1] => Name
    [2] => Title
    [3] => Age
)


引数あり(TYPE_FIELDNAME)でfromArrayすると

Array
(
    [1] => name
    [2] => title
    [3] => age


なーんだ、大文字か小文字かだけの違いだったんですね。
なのでこの場合はTYPE_FIELDNAMEが正解でした。