Не так давно разработчик jheathco опубликовал коммит со множеством важных изменений в механизме ORM. Одно из самых главных — отказ от свойств $has_and_belongs_to_many и $has_many_through. И если $has_many_through может быть использован через $has_many (с указанием имени промежуточной модели в качестве дополнительного параметра), то HABTM в чистом виде нам недоступен. Честно говоря, не самое однозначное решение — минусы очевидны.
Кроме того, практически завязанный на ORM модуль Auth также «подвисает». Включенная в RC3 версия как таковая непригодна к использованию (интересно, зачем Shadowhand вообще добавил его, зная об этом?). Сейчас имеется более-менее работоспособная версия на гитхабе, однако для вместе с ней придется подключать альтернативную версию ORM (это форк от оригинальной, однако сделаны некоторые необходимые изменения, убирающие известные баги). Основные методы (login/logout, «запоминание» пользователя при логине) должны работать.
В ожидании релиза 3.0 не самые радужные перспективы… Будем ждать стабильности в двух популярных модулях.
PS. Кстати, чем радует версия jheathco — наличие описания на вики-странице проекта.
Как то сыровато ko3, хотя уже релиз кандидат 3 . Захотелось попробовать на мелком сайте ko3. Так как проект мелкий и собственный, то сырость и отсутствие документации не пугает. В конфиге к бд обнаружил alternate с примером для PDO, настроил — получил exception от Kohana_PDO_mysql о неподдерживаемости list_tables. Не беда вернул mysql. Дальше нашел что теперь есть новый ORM Valiadation c _rules, _filters и тп. Правда ссылку на вики страницу нашел уже позже у Вас на сайте, но порассматривав код написал
class Model_Order extends ORM
{
protected $_rules = array(
‘person’ => array(‘not_empty’ => NULL),
‘content’ => array(‘not_empty’ => NULL)
);
}
Дальше
$order = ORM::factory(‘order’);
$order->values($_POST);
$order->check();
И тут сюрприз, Validate внутри ОРМа, а ошибки у него попросить забыли, пока все что есть это валидно/ валидно. Тоже не беда. Переписал на
$validation = Validate::factory($_POST)
->rule(‘person’, ‘not_empty’)
->rule(‘content’, ‘not_empty’)
->filter(TRUE, ‘trim’);
if ($validation->check())
{
$order = ORM::factory(‘order’);
$order->person = $validation->person;
$order->content = $validation->content;
$order->save();
}
else
{
var_dump($validation->errors(‘form’));exit;
}
(Дальше не про ОРМ, но все же.. )
Перед этим долго искал куда засунули $this->input->post()
Оказалось что его просто заменили на проход циклом по всем входным переменным с применением к ним Kohana::sanitize(), xss нашел в Kohana_security, и применять ее к приехавшим входным значениям получается нужно самостоятельно.
Захотелось ошибки русифицировать, ну и локаль для приличия включить русскую. Тоже тут все поменялось. locale.php отсутствует. поиск по проекту на тему setlocale ничего не дал. опять пришлось смотреть на код — судя по всему предполагается в бутстрап добавлять
I18n::$lang = ‘ru-ru’;
setlocale(LC_ALL, ‘ru_UK.UTF-8′);
плюс ко всему добавив файлик /i18n/ru/ru.php или /i18n/ru.php со строками
return array (
‘:field must not be empty’ => ‘Поле «:field» не должно быть пустым’,
);
Получил таки локализацию сообщений. Смысла в // Add the non-specific language strings и // Add the locale-specific language strings особого не увидел
Роуты тоже стали загадочные, не похожи ни на старые, ни на ЗФ, ни на симфони. минут 20 пытался сделать из /index/about => /about
Все оказалось банально совсем
Route::set(‘about’, ‘(about)’ )
->defaults(array(
‘controller’ => ‘index’,
‘action’ => ‘about’));
Работает, хотя кажется мне что какой то роут не правильный идеологически.
Осталось еще попробовать работу связей в ORM…
Пока процесс разработки на ко3 довольно мучительный получается и тянет много времени..
Рыться у них на форуме, читать их редмайн, а также вики и коментарии на гитхабе в поисках описания работы (или не работы ) тех или иных частей не очень радужно
Вывод пока для меня следующий — на работе сидим на 2.3.4 и не рыпаемся. Хотя хочется именованый биндинг параметров, подзапросы в билдере, лейзи лоад в ОРМ ну и еще что то. уже не помню чего должно быть, но вроде еще много всего
сорри, какой то длинный коментарий получился, увлекся что-то
1. Для получения ошибок в orm есть метод errors(). А руссификацию валидации лучше через messages делать, а не через i18n.
’ )
2. Маршрут не такой уж неправильный, если его немного изменить:
Route::set(’short’, ‘
->defaults(array(
‘controller’ => ‘index’,
‘action’ => ‘(about|contact|copyright)’));
т.е. создавать отдельный роут для каждого экшена не надо, а вот выделить методы одного (дефолтного) контроллера в специальный роут и вызывать их без указания контроллера — запросто.
3. XSS можно применять в правилах валидации для модели.
Тоже попробовал ko3. Прикрутил уже Doctrine, ko3orm не самый удачныйб ИМХО.
С роутами проблемы, просифонил тему на форуме о них и не нашел адекватной документации. Говорят, что дока уже готова к релизу, а вот ссылку на нее у никого нет.
Input — костыль, имхо, так что правильно с ним поступили.
По поводу Doctrine — было бы интересно почитать…
А что за проблемы с роутами? Сильно глубоко не копал, но выглядит все пока логично.
С Doctrine довольно просто. в init.php модуля doctrine конфигурируем приблизительно так:
require Kohana::find_file('classes', 'doctrine/Doctrine');
spl_autoload_register(array('Doctrine', 'autoload'));
$db = Kohana::config('database')->doctrine;
$manager = Doctrine_Manager::getInstance();
$manager->connection('mysql://'.$db['user'].':'.$db['password'].'@'.$db['host'].'/'.$db['database'], 'default_connection');
$manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE);
$manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL);
$manager->setAttribute(Doctrine::ATTR_DEFAULT_IDENTIFIER_OPTIONS, array('name' => '%s_id', 'type' => 'int', 'length' => 11));
$manager->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL);
$manager->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true);
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);
$manager->setAttribute(Doctrine::ATTR_TBLNAME_FORMAT, $db['prefix'].'_%s');
$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);
Doctrine::loadModels(APPPATH.'models');
Вот и все. Обратите внимание, что doctrine модели будут не в application/classes/model/ а в application/models/. Так же появляются папки для схем yaml, дампов, diff и т.д. базы даных. Тема стоит отдельного поста.
Я собственно на это и намекал, т.к. в личном блоге ничего подобного не увидел
Исправился. Всего ничего делать. Может на хабр вместе переведем, у меня русский хромает?
Если есть вариант перевода, присылай на почту, поправлю если что.
@BIakaVeron:
> Для получения ошибок в orm есть метод errors()
Похоже, что в финальном релизе KO3 данного метода в ORM нет. Kohana выдает ошибку: Kohana_Exception [ 0 ]: Invalid method errors called in Model_Category.
Так как же получить ошибки валидации из модели?
Да, к сожалению наши предложения о добавлении данного метода не были поддержаны. Добраться до объекта Validate можно с помощью метода validate(), стало быть ошибки получим в результате $user->validate()->errors().
Тоесть получается, что в данной версии присутствуют два способа валидации, в модели и так сказать как было раньше?
Допустим я получаю данные из формы, нужно их проверить:
$data = Validate::factory($_POST);
$data->filters( … , … );
$data->rules( … , … );
$data->check();
$errors = array();
$errors = $data->validate()->errors(); // ???
получаю ошибку «Call to undefined method Validate::validate()»
——
$data->errors(); вроде выдает нечто похожее судя по, однако при попытке передать его в view:
$this->template->content = View::factory(‘page_add’)
->set(‘errors’, $data->errors())
->set(‘form’, $form);
Получаю ErrorException [ Warning ]: htmlspecialchars() expects parameter 1 to be string, array given…
Метод validate() относится только к ORM — это способ получить вложенный объект Validate модели. В случае ручного формирования валидатора просто последовательно вызываются методы check() и errors().
В Ko3 метод errors() работает нормально, подобных ошибок не видел. Напишите мне на почту, какие вызовы используете (код контроллера, модели), что возвращается и т.д.