Комментарии 78
Спасибо за проделанную работу! Очень ждал этот день
Прекрасная новость, порадовали в конце недели. Молодцы, так держать. Особенно порадовал bower без nodejs.
bowerphp работает отвратно. Гитхаб репозитории не поддерживает, соединение часто вылетает. Оно и немудрено, проект в альфа-версии. В общем, мы покрутили-повертели его и вернулись обратно на bower.
Почему не поддерживает github репозитории? Поддерживает он. Хотя я не вижу в этом ровным счетом никакого смысла. Можно поставить node.js на билд-сервере или собирать на локальной машине а потом уже деплоить.
>> Почему не поддерживает github репозитории? Поддерживает он.
Я ему скармливал ровно тот же самый bower.json, который на bower отрабатывает без проблем, и он отваливался с ошибкой not found на тех пакетах, которых нет на bower.io/search, из чего был сделан вывод, что гитхаб он не умеет.
>>… собирать на локальной машине а потом уже деплоить.
Сейчас мы так и делаем, храним пакеты под vcs. bowerphp ставился как раз для того, чтобы при деплое подтягивать зависимости, не устанавливая nodejs на прод машину. Но работал он ну очень нестабильно, то и дело отваливаясь на всяких «jquery not found», хотя рядом composer вообще не вякает даже (вообще мне композер очень нравится стабильностью работы, даже рубиевский бандлер не такой). А еще странно, что капистрано не отваливался с ошибкой, когда bowerphp отваливался. Т.е. приложение по факту успешно проходило деплой, но без пакетов.
Я ему скармливал ровно тот же самый bower.json, который на bower отрабатывает без проблем, и он отваливался с ошибкой not found на тех пакетах, которых нет на bower.io/search, из чего был сделан вывод, что гитхаб он не умеет.
>>… собирать на локальной машине а потом уже деплоить.
Сейчас мы так и делаем, храним пакеты под vcs. bowerphp ставился как раз для того, чтобы при деплое подтягивать зависимости, не устанавливая nodejs на прод машину. Но работал он ну очень нестабильно, то и дело отваливаясь на всяких «jquery not found», хотя рядом composer вообще не вякает даже (вообще мне композер очень нравится стабильностью работы, даже рубиевский бандлер не такой). А еще странно, что капистрано не отваливался с ошибкой, когда bowerphp отваливался. Т.е. приложение по факту успешно проходило деплой, но без пакетов.
А как использовать beforeSubmit в ActiveForm? Я имею в виду как описать событие в самом виджете. Ранее я делал так
<?php $form = ActiveForm::begin([
'beforeSubmit' => 'function(form) { ... }'
]); ?>
Можно так:
Свойства ActiveForm::$beforeSubmit больше нет.
$this->registerJs(<<<JS
$('#form-id').on('beforeSubmit', function(){
var form = this;
});
JS
);
Свойства ActiveForm::$beforeSubmit больше нет.
Другой порядок параметров в условии
был бы более человекочитаемым
where([ 'age', '>=', 30]);
был бы более человекочитаемым
Можно сразу сделать
Если условие оформляется как массив, первым элементом идет оператор (and, or, not, between, in и т.д). Если добавили еще и элементарные операторы, то вполне логично то, что этот самый оператор идет первым элементом массива.
where('age >= 30')
и это будет работать.Если условие оформляется как массив, первым элементом идет оператор (and, or, not, between, in и т.д). Если добавили еще и элементарные операторы, то вполне логично то, что этот самый оператор идет первым элементом массива.
текстовые кондишны вида
where('age >= 30')
в реальных проектах довольно редкое явление, т.к. параметры идут в основном из внешних данных, а их необходимо подставлять в params (в изначальном варианте с тремя параметрами так и происходит). Я понимаю, что такой порядок сделали потому, что так проще и еще потому, что «так повелось», но всё же.Было бы здорово если бы подзапросы можно было использовать в
Чтобы код:
строил запрос типа:
\yii\db\Query::addSelect()
Чтобы код:
$query->addSelect(['foo' => $subquery]);
строил запрос типа:
SELECT
(SELECT ...) AS foo
FROM ...
Это легко сделать, но в cakephp 3.
Напишите issue, посмотрим, что можно сделать.
Насколько я поковырял ormку, я склонен считать что её проще переписать целиком, отказавшись от поддержки части баз, нежели пытаться проапдейтить для полноценной поддержки мультизапросов :(
По-моему следует вообще отказаться от своей ORM в пользу Doctrine/Propel/whatever. Если ребята из Symfony не стали свой велосипед городить, то это что-то да значит.
Авторы Yii свои велосипеды на тему БД писали ещё когда Doctrine и Symfony не было.
Велосипеды это конечно хорошо, но давайте прикинем. Propel хоть в каком-то виде появился за год до Prado. Doctrine начали пилить в 2006-ом, через год после первого релиза Symfony. Yii 1.0 вышел где-то в 2008-ом… на дворе 2014-ый год… хм… велосипеды… их все писали. Проблема Yii в том что (по крайнемере в первых версиях) продолжают писаться велосипеды. Я больше не о компонентах фреймворка, их можно воспринимать как полноценные решения, а больше о том духе который царит в Yii сообществе. Велосипеды. Просто забавная статистика на основе тех проектов которые я видел.
Я сам в начале 2008-ого пилил свой велосипед, и если бы друг не показал мне Yii, вышел бы его клон.
Так это хорошо попробовать пописать своё. Появляется понятие о том, что можно сделать, а что нет. Изучается устройство фреймворков и идеи, которые потом можно в своём коде применить. Ну а конечному пользователю, в общем-то, всё равно, кто был первый. Ему главное стабильно, удобно и быстро. У нас оно по сочетанию этих качеств как минимум не хуже остальных.
Да, вполне может быть. Незнаю, правда, будет ли проще интегрировать что-то готовое в юи, нежели покрыть велосипедом свои потребности.
Пробовал я как-то интегрировать Symfony/Forms и Doctrine в Yii1,1. Жить можно. Только тяжко это и делалось только в рамках рефакторинга одного легаси проекта. Затем был PHP-DI, HttpKernel и полная смена фреймворка.
НЛО прилетело и опубликовало эту надпись здесь
Какие?
Очень нравится в Laravel функция withPivot() для работы с Pivot Tables. Позволяет к результатам выборки добавить доп. поля (которые в YII2 добавляются в $extraColumns функции link()). Таким образом можно не создавать промежуточную модель по pivot таблице. Насколько понял, в YII2, так пока нельзя?
НЛО прилетело и опубликовало эту надпись здесь
Жёстко привязанные к чему?
Нет.
Какие именно проблемы? Руками каждый раз собирать Response объектом, как по мне, излишне.
Это не список, а строка. Форматтеры настраиваются и добавляются из конфига приложения, секция
Можно сделать, например, в
Использование header(), die(), exit() до сих пор нормальная практика.
Нет.
Проблемы с Response так и остались. Лично я ждал что в Yii2 объект класса Response будет создаваться внутри контроллера.
Какие именно проблемы? Руками каждый раз собирать Response объектом, как по мне, излишне.
Как контролировать список Yii::$app->response->format?
Это не список, а строка. Форматтеры настраиваются и добавляются из конфига приложения, секция
components
, компонент response
, свойство formatters
: github.com/yiisoft/yii2/blob/master/framework/web/Response.php#L121создавать из него колбасу из хелперов
Можно сделать, например, в
beforeAction
. Будет наглядней и короче.НЛО прилетело и опубликовало эту надпись здесь
class MyController extends \yii\web\Controller
{
public function beforeAction($action)
{
\Yii::$app->response->getHeaders()->set('Access-Control-Allow-Origin', '*');
switch ($action->id) {
case 'json1':
case 'json2':
\Yii::$app->response->format = yii\web\Response::FORMAT_JSON;
break;
case 'xml':
\Yii::$app->response->format = yii\web\Response::FORMAT_XML;
break;
}
return parent::beforeAction($action);
}
public function actionIndex()
{
return $this->render('help');
}
public function actionJson1()
{
return ['name' => 'Alex'];
}
public function actionJson2()
{
return ['name' => 'Qiang'];
}
public function actionXml()
{
return ['name' => 'Carsten'];
}
}
НЛО прилетело и опубликовало эту надпись здесь
Так и остались жёстко привязанные компоненты типа Session, User и т.д.
Компоненты можно переопределить и создать свои классы. А в них уже хотите — наследуйтесь от базовых, хотите — нет.
поддерживаю какие недочеты вы заметили. Также хотелось бы услышать впечатления про симфони после yii
А я не ждал «middle of 2014» :-)
Стал использовать в проектах, как только вышла альфа-версия, и не стыжусь.
Стал использовать в проектах, как только вышла альфа-версия, и не стыжусь.
У нас недавно, 13 сентября, был год, как мы девелопим на Yii2. Абсолютно довольны выбором. Специфика проекта такова, что практически не используем фронтенд-компоненты фреймворка, про них мало что могу сказать. Но ActiveRecord и QueryBuilder сделаны очень хорошо и удобно, особенно если сравнивать с Yii1.
Для тех, кто ещё не пробовал Yii2 могу в его поддержку выделить такие моменты как:
Из последних нововведений особая благодарность за bower-assets. Стало гораздо удобнее подключать frontend-зависимости.
Для тех, кто ещё не пробовал Yii2 могу в его поддержку выделить такие моменты как:
- Очень хорошо документированный код, в котором всегда легко разобраться и который удобно расширять
- Быстрая скорость исправления багов
- Хорошая реакция на рациональные предложения от коммьюнити
- Ну и само коммьюнити — очень отзывчивое и доброжелательное, а главное — квалифицированное
- Хорошая стабильность — даже на пре-альфе у нас всё работало. Да, бывали падения, ломалась совместимость, но это было ожидаемо, так как шла активная разработка
Из последних нововведений особая благодарность за bower-assets. Стало гораздо удобнее подключать frontend-зависимости.
Отдельный респект за Gii из консоли.
Стартанули два проекта на Yii2 еще с alpha версии. Очень рады) В ноябре надеюсь новый проект начну уже на stable.
echo $formatter->asDate($value, 'MM/dd/yyyy'); // эквивалентно date('m/d/Y', $value)
В чем преимущество использования форматтера вместо нативной php функции?
Подразумевал http://php.net/manual/en/function.date.php
Отличная новость. Пощупали двойку в бете — осталось очень приятное впечатление. Будем обязательно использовать.
Большое спасибо за работу! Пользуюсь второй версией еще с августа 2013.
Очень расстроила функция cache в db\Connection, предыдущие варианты c beginCache и endCache были тоже не фонтан, но использовать было удобнее.
Сейчас же в нужно оборачивать все в анонимные функции, через use() передавать зачастую по несколько штук переменных, а если запросов много идет подряд — то вовсе кучу переменных, как по мне — совсем не по «феншую».
Почему бы не сделать как было в старом добром Yii1 — к query добавляем функцию cache($duration, $dependency = null) — и получается гораздо удобнее и красивее.
Очень расстроила функция cache в db\Connection, предыдущие варианты c beginCache и endCache были тоже не фонтан, но использовать было удобнее.
Сейчас же в нужно оборачивать все в анонимные функции, через use() передавать зачастую по несколько штук переменных, а если запросов много идет подряд — то вовсе кучу переменных, как по мне — совсем не по «феншую».
Почему бы не сделать как было в старом добром Yii1 — к query добавляем функцию cache($duration, $dependency = null) — и получается гораздо удобнее и красивее.
В 1.1 частенько
beginCache
и endCache
были ну в совсем разных местах и отладка превращалась в ужасный ужас. Но если будут на текущий синтаксис частые жалобы, вернём.beginCache и endCache — согласен, совсем не ахти.
а как на счет метода cache в query — чтобы избавиться от анонимных функций?
а как на счет метода cache в query — чтобы избавиться от анонимных функций?
Query — это как старый добрый CDbCriteria. То есть условия для запроса. Кеш туда не очень вписывается логически.
Анонимные функции выглядят совсем неплохо.
согласен, выглядят они прикольно, по js'ному
НО возьмем пример, в виджете, фукнция run:
задача — как это все закешировать:
вариант 1:
чет дофига анонимок, давайте по другому
вариант 2:
сразу встает проблема — одинаковое время кеширования, и переменные в use, и это мы туда еще параметров запросов никаких не передавали.
другая проблема — у нас модели (или просто Query) могут обращаться к разным базам, одним махом уже не покешируешь.
резюмируя: на мой взгляд:
1. текущая реализация подходит для примеров из документации, в реальном проекте обычно код сложнее.
2. появляется реально лапша коллбеков, за что я всегда любил yii — что код получается логичным, читабельным и минимум обвеса. Сейчас же в угоду паттернам клиенский код не удобный. Осталось добавить еще вызов пары фабрик, сервис локаторов и получим симфони или зенд.
3. отладка — иногда удобно пройтись по построению запроса дебаггером и посмотреть потом в самом конце в queryInternal что туда пришло и что оно вернуло, с анонимками — сразу не попадешь в фукнцию, надо идти до call_user_func — эт такое, придираюсь
4. возможно добавление метода cache в Query и не отвечает канонам, паттернам и всего всего такого умного, но по факту оно удобнее и фукнциональнее
разумеется, ИМХО
НО возьмем пример, в виджете, фукнция run:
$articlesCount = Article::find()
->published()
->count();
$videosCount = Video::find()
->published()
->count();
$pollsCount = Poll::find()
->published()
->count();
return $this->render('widget-view', [
'articlesCount' => $articlesCount,
'videosCount' => $videosCount,
'pollsCount' => $pollsCount,
]);
задача — как это все закешировать:
вариант 1:
$articlesCount = Article::getDb()->cache(function(){
return Article::find()
->published()
->count();
}, 3600);
$videosCount = Video::getDb()->cache(function(){
return Video::find()
->published()
->count();
}, 1800);
$pollsCount = Poll::getDb()->cache(function(){
return Poll::find()
->published()
->count();
}, 43200);
return $this->render('widget-view', [
'articlesCount' => $articlesCount,
'videosCount' => $videosCount,
'pollsCount' => $pollsCount,
]);
чет дофига анонимок, давайте по другому
вариант 2:
\Yii::$app->db->cache(function() use(&$articlesCount, &$videosCount, &$pollsCount) {
$articlesCount = Article::find()
->published()
->count();
$videosCount = Video::find()
->published()
->count();
$pollsCount = Poll::find()
->published()
->count();
}, 3600);
return $this->render('widget-view', [
'articlesCount' => $articlesCount,
'videosCount' => $videosCount,
'pollsCount' => $pollsCount,
]);
сразу встает проблема — одинаковое время кеширования, и переменные в use, и это мы туда еще параметров запросов никаких не передавали.
другая проблема — у нас модели (или просто Query) могут обращаться к разным базам, одним махом уже не покешируешь.
резюмируя: на мой взгляд:
1. текущая реализация подходит для примеров из документации, в реальном проекте обычно код сложнее.
2. появляется реально лапша коллбеков, за что я всегда любил yii — что код получается логичным, читабельным и минимум обвеса. Сейчас же в угоду паттернам клиенский код не удобный. Осталось добавить еще вызов пары фабрик, сервис локаторов и получим симфони или зенд.
3. отладка — иногда удобно пройтись по построению запроса дебаггером и посмотреть потом в самом конце в queryInternal что туда пришло и что оно вернуло, с анонимками — сразу не попадешь в фукнцию, надо идти до call_user_func — эт такое, придираюсь
4. возможно добавление метода cache в Query и не отвечает канонам, паттернам и всего всего такого умного, но по факту оно удобнее и фукнциональнее
разумеется, ИМХО
Мне с «дофига анонимок» нравится больше. Анонимки сами по себе часть PHP с 5.3, желание избавляться от них довольно странно.
1. Если код кеширования становится сложнее, что-то надо менять. Кеш — одна из сложнейших задач вообще, так что надо стараться кешировать как можно проще.
2. В 1.1 не особо много анонимок потому как они в PHP 5.1 и 5.2, которые для него были основными, не поддерживаются. Анонимка — не паттерн, а часть языка.
3. Почему? Поставил breakpoint в анонимку, нажал run и попал…
4. Добавление метода cache в Query не отвечает логике. Паттерны тут не при чём.
1. Если код кеширования становится сложнее, что-то надо менять. Кеш — одна из сложнейших задач вообще, так что надо стараться кешировать как можно проще.
2. В 1.1 не особо много анонимок потому как они в PHP 5.1 и 5.2, которые для него были основными, не поддерживаются. Анонимка — не паттерн, а часть языка.
3. Почему? Поставил breakpoint в анонимку, нажал run и попал…
4. Добавление метода cache в Query не отвечает логике. Паттерны тут не при чём.
Опередил. «дофига анонимок» нормально выглядят и читаются.
$connection->transaction(function() {});
А почему не сделали откат если callback возвращает
false
? ИМХО, это удобнее чем выбрасывать исключения (в yii 1.x как раз использую подобную обертку, только там еще и исключении можно поглотить — оно далеко не всегда нужно извне callback-а).SamDark, подскажите пожалуйста, а почему user теперь обязательный компонент? Т.е. если в конфиге, в компонентах нет 'user', то выбрасывается исключение Invalid Configuration – yii\base\InvalidConfigException User::identityClass must be set.
Как-то это не правильно я считаю. А если у меня в приложению просто не нужно работать с пользователями? Все равно надо определять компонент?
Как-то это не правильно я считаю. А если у меня в приложению просто не нужно работать с пользователями? Все равно надо определять компонент?
Он не обязательный, а просто прописан по умолчанию для веб-приложения.
Вот конфиг yii2-app-basic откуда я удалил компонент user
а вот скриншот ошибки awesomescreenshot.com/0fc3ku55d3
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => 'HcXm7J9dgjen_UNZovotOiShvs1vJ--V',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'errorHandler' => [
'errorAction' => 'site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module';
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
}
return $config;
а вот скриншот ошибки awesomescreenshot.com/0fc3ku55d3
Гм. Так вы сессии используете и проверку на аутентификацию. Для них нужен
user
.Ой, ой. Извините, я затупил. Тестировал у себя на разрабатываемом проекте (структура как на app-advanced) и случайно открыл не ту «часть» приложения, которая и вызвала ошибку (как раз после обновления на RCv поэтому и связал с этим). А когда на basic ошибку проверял, то просто убрал
user
не посмотрев в контроллерыБагтрекер в комментариях.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Yii 2.0 RC