(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Приведение к типам в Yii::app()->request

Источник: habrahabr
anonimizer_me

Всем привет!

Хочу поделиться с вами небольшим решением проблемы, с которой столкнулся при переносе части данных проекта в mongodb.
Изначально у нас использовалась только Mysql и все параметры приходящие от клиента вполне себе позволяли получать данные из базы без каких-либо проблем.

<?php
   $id = Yii::app()->request->getParam('id', 0);
   $data = Data::getForId($id);
?>

А суть в том, что для mysql нет разницы [select * from data where id = 1] или [select * from data where id ='1'].
Но mongodb типы данных различает, по этому нельзя найти запись используя условие id == '1' если id в mongodb является числом.

Для того, чтобы не усложнять и не увеличивать количество кода за счет добавления (int) для приведения типа

<?php
   $id = (int)Yii::app()->request->getParam('id', 0);
?>

было выбрано седующее решение - создание собственного request менеджера на основе стандартного CHttpRequest.
Получился следующий класс

<?php

class CParseRequest extends CHttpRequest
{
    public function getParam($name,$defaultValue=null)
    {
        $data = parent::getParam($name, $defaultValue);
        $this->parseData($data);
        return $data;
    }

    public function getQuery($name,$defaultValue=null)
    {
        $data = parent::getQuery($name, $defaultValue);
        $this->parseData($data);
        return $data;
    }

    public function getPost($name,$defaultValue=null)
    {
        $data = parent::getPost($name, $defaultValue);
        $this->parseData($data);
        return $data;
    }

    /**
     * Функция для приведения типов
     */
    protected function parseData(&$data)
    {
        if (is_array($data)) {
            foreach ($data as &$prop) {
                $this->parseData($prop);
            }
        } else {
            if (preg_match("/^[\d]+$/", $data)) $data = (int)$data;
        }
    }
}

В настройках следует прописать следующий модуль

    'request' => array(
        'class' => 'CParseRequest'
    ),

Теперь полученные данные всегда будут приводиться к нужному типу. Если нам приходит массив любой вложенности, то все его элементы тоже будут приведены к нужным типам.

У нас не возникает ситуаций, когда число нужно передать в виде строки, по этому данное решение полностью покрыло потребности проекта.

Будет интересно услышать мнение других людей о том, как они решали данную проблему.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 17.08.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Nero 2018 Platinum ESD
IBM RATIONAL Quality Manager Quality Professional Authorized User Single Install License + Sw Subscription & Support 12 Months
Stimulsoft Reports Server Team 10 users
Quest Software. TOAD for SQL Server Xpert Edition
Stimulsoft Reports.Ultimate Single License Includes one year subscription, source code
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
СУБД Oracle "с нуля"
OS Linux для начинающих. Новости + статьи + обзоры + ссылки
Новые материалы
Мир OLAP и Business Intelligence: новости, статьи, обзоры
Программирование на Visual Basic/Visual Studio и ASP/ASP.NET
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100