Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<?php $form = ActiveForm::begin([
'beforeSubmit' => 'function(form) { ... }'
]); ?>
$this->registerJs(<<<JS
$('#form-id').on('beforeSubmit', function(){
var form = this;
});
JS
);
where([ 'age', '>=', 30]); where('age >= 30') и это будет работать.where('age >= 30') в реальных проектах довольно редкое явление, т.к. параметры идут в основном из внешних данных, а их необходимо подставлять в params (в изначальном варианте с тремя параметрами так и происходит). Я понимаю, что такой порядок сделали потому, что так проще и еще потому, что «так повелось», но всё же.\yii\db\Query::addSelect()$query->addSelect(['foo' => $subquery]);
SELECT
(SELECT ...) AS foo
FROM ...
Использование header(), die(), exit() до сих пор нормальная практика.
Проблемы с Response так и остались. Лично я ждал что в Yii2 объект класса 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 и т.д.
echo $formatter->asDate($value, 'MM/dd/yyyy'); // эквивалентно date('m/d/Y', $value)
beginCache и endCache были ну в совсем разных местах и отладка превращалась в ужасный ужас. Но если будут на текущий синтаксис частые жалобы, вернём.$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,
]);
$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,
]);
\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,
]);
$connection->transaction(function() {});
false? ИМХО, это удобнее чем выбрасывать исключения (в yii 1.x как раз использую подобную обертку, только там еще и исключении можно поглотить — оно далеко не всегда нужно извне callback-а).<?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;
user.user не посмотрев в контроллеры
Yii 2.0 RC