Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В этой статье я хотел бы написать о новой версии Laravel, официальный релиз которой состоится в ноябре, но скачать и попробовать которую можно уже сейчас через Composer.
$model->load($_POST);
if(!$model->save()){
...
}
public function validate($data)
{
$validator = Validator::make($data, Post::$rules);
if($validator->fails()) throw new ValidationException($validator);
return true;
}
public function store($data)
{
$this->validate($data);
return Post::create($data);
}
$model = new Post();
$model->a = 'a';
$model->b = 123;
$model->save();
date, которое хранится в бд в виде метки времени, пользователь его вводит в виде «dd.MM.yyyy HH:mm», как его нормально вывести, валидировать и сохранить? Первое что приходит на ум и что везде гуглится это повесить валидатор на `date` и потом где-то перед сохранением модели добавить конвертацию этой строки обратно в метку времени. Вот только это чрезвычайно кривое решение, потому что в одно время поле хранит строку, а в другое — число => никогда не знаешь что там окажется…date (благо сам валидатор это умеет) и написать код для синхронизации значение этих двух полей. Несколько через жопу, не правда ли?class MyModel extends CActiveRecord {
protected function afterFind () {
$this->field = 'конвертируем в строку';
parent::afterFind ();
}
protected function beforeValidate () {
$this->field = 'конвертиуем в метку времени';
return parent::beforeValidate ();
}
}
public function search(MyModel $model) {
$search = new CDbCriteria();
$search->compare('myfield', $model->field);
// .....
}
myfield это поле типа INT, тогда:MyModel созданной при поиске — получаете ошибкуMyModel, но после её сохранения, всё работает как и задумывалось.public function getCreated(){
return date("Y-m-d H:i", $this->created_at);
}
echo $model->created;
/**
* @property integer $time метка времени (то что хранится в бд)
* @property string $timeDatetime отформатированная дата (фейковое поле)
*/
class MyModel extends CActiveRecord {
/**
* @return array
*/
public function rules() {
return array_merge(parent::rules(), [
['timeDatetime', 'required'],
['timeDatetime', 'date',
'format' => 'dd.MM.yyyy HH:mm',
'timestampAttribute' => 'time'],
]);
}
/**
* @return array
*/
public function behaviors() {
return array_merge(parent::behaviors(), [
'timeAttribute' => [
'class' => 'TimeAttributeBehaviors',
'attributes' => [
'time' => null, // формат, но не обязательно
],
],
]);
}
/**
* @return array
*/
public function attributeLabels() {
return array_merge(parent::attributeLabels(), [
'time' => 'Дата и время',
'timeDatetime' => 'Дата и время',
]);
}
/**
* @return void
*/
public function refresh() {
$this->timeDatetime = null;
return parent::refresh();
}
}
Еще раз: ни единая строчка кода из метода store не будет исполнена, если форма не проходит валидацию.
Я не считаю себя гуру в php и фреймворках. До этого пару раз работал с первым и вторым зендом, бессмертным битриксом, сталкивался с Yii и Symphony, изобретал велосипеды сам, но каждый раз у меня оставалось смутное чувство неудовлетворенности.
app('auth')->user;
// вместо
Auth::user;
Поэтому в стабильных версиях всё нормально.
CGridView при включении history переставал работать .update что полностью ломало поиск. Минут через 15 был найден соответствующий баг на гитхабе (#2017, он до сих пор открыт) и импортирован в проект. Если бы не трекер, пришлось бы потратить кучу времени для решения этой проблемы…критический баг, который на следующий день уже был исправлен.
Похоже что теперь вы о нем узнаете в лучшем случае после выхода нового релиза (у того же yii это может очень много времени занимать).
Symphony
с учетом того что кишки симфони торчат отовсюду, это называется хипстеры не осилили симфони, поэтому взяли то что осилили, а в пятой похоже осилили чуть больше.
Что нового в Laravel 5?