Picora - еще один мелкий фреймворк, который стоит посмотреть. В стиле RoR, но на php.
Жаль что я его вовремя не увидел :)
Навел меня на него Alex, за что ему огромное спасибо :)
Работая с PDO обнаружил такую фишку - все объекты *LOB в оракле он не выбирает при fetch, а вместо этого выдает ссылку на объект типа (stream). Это PHP stream, чтобы его получить нужно выполнить stream_get_contents(). Понятно зачем это сделано, все к оптимизации и удобству, но я бы опционально разрешил вернуть все назад, и выбирать LOB’ы сразу в значения, как это делал например PEAR:DB.
В итоге чтобы выбрать текст новости из поля типа CLOB в Oracle мне пришлось делать так:
function getNewsContent($id) {
$newsq = $this->DBO->prepare("select id,subject,news_body,create_date from news where id=:id");
$newsq->execute(array(":id" => $id));
$newsq->bindColumn(3, $news_body, PDO::PARAM_LOB);
$data = ($newsq->fetch(PDO::FETCH_OBJ));
$data->NEWS_BODY = stream_get_contents($news_body);
return $data;
}
Немного не удобно, но привыкнуть можно.
Кроме того, бился сегодня головой об стену, по поводу того что выбирая фреймворк не наткнулся на Kohana
Она еще конечно сильно бета, но этот фреймворк по заявкам разработчиков - именно то что мне нужно. Там и PDO, там и memcached… Эх, вот всегда так…
Вы все еще полагаете что в мануале CodeIgniter’а не врут о том что метод $this->db->escape(); спасет вас от Sql Injection?
Учитывая что содержание этого метода в драйвере для Oracle
function escape_str($str)
{
return $str;
}
Доверяй, но проверяй :))
Решился таки делать большой проект с использованием готового фреймворка, чтобы не возиться с написанием с нуля, т.к. сроки сильно жмут, а своё хочется идеально спроектировать, на что конечно нужно кучу времени.
Первые впечатления такие:
- Я не знаю как работают другие фреймворки, CodeIgniter я выбрал из соображений легкости, и большого комьюнити. Тормозит. По сравнению с самописным тормозит просто дико. Вобщем-то понятно почему тормозит - куча ненужной “авто-логики”, которая выполняется при каждом запросе. Например поиск подмены для системных библотек CI, пользовательскими. При каждой загрузке страницы он бегает по диску и ищет переписали ли вы какой-то его класс, и какой класс ему использовать. Удобно в разработке, спору нет, но в продакшен не пойдет совсем.
- Пол вечера возился в проблеме с драйвером oracle - при использовании последовательных запросов, например в цикле (знаю что плохая практика, но поставил бы пива тому кто вытащит одним запросом параметры для запросов к ораклу по разным id, и потом данные по этим id с учетом что у каждого id параметры в запросе будут разные). Так вот,
выполняете два select’а, а результаты в обоих случаях получаете от первого запроса. Оказалось глюк - решение здесь. Пока разбирался решил что мне вобщем-то database класс из CI и не нужен - ActiveRecord’ом я все равно пользоваться не буду - т.к. запросы к ораклу в этом проекте на пол-страницы A4 каждый. Вобщем написал простенький враппер к PDO, сразу с поддержкой кеширования и т.п.
- Кому нужен scaffolding во фреймворке? Нет реально, есть такие люди? Понимаю может быть удобно, но НУЖЕН? Почему бы не сделать эту фичу опциональной? Просто, зачем пихать это во фреймворк? Это же не CMS, чтобы запихивать всего и побольше, чтобы юзер был рад.
- Сделали скафолдинг, зато не сделали нормальную авторизацию, и возможность сделать back-end по-легкому. Пока решил юзать библиотеку Userlib от пользователей комьюнити, вроде легкая и довольно логично написана.
- Соответственно родные классы для работы с database-сессиями я пользовать не могу - database то у меня свой :) Вот сижу и переписываю класс session. Если дойдут руки сделать нормально, выложу сюда :)
Пока вроде все впечатления, будут еще - обязательно напишу :) Две мысли пока в голове - надо пока не поздно написать своё попроще, потому что и так большую часть переписываю и думаю надо было всетаки сравнить CI с ZendFramework - что-то мне подсказывает что Zend хоть и еще более монстрообразный, но сделан во многом логичнее.