Browse Source

Merge branch 'master' into usemaster-improve

tags/2.0.12
Vovan-VE 8 years ago
parent
commit
308abdc8a5
  1. 8
      .gitattributes
  2. 8
      .travis.yml
  3. 28
      build/controllers/ReleaseController.php
  4. 2
      composer.json
  5. 2
      docs/guide-es/concept-autoloading.md
  6. 16
      docs/guide-ja/README.md
  7. 7
      docs/guide-ja/caching-data.md
  8. 2
      docs/guide-ja/concept-autoloading.md
  9. 2
      docs/guide-ja/concept-components.md
  10. 2
      docs/guide-ja/db-active-record.md
  11. 25
      docs/guide-ja/db-dao.md
  12. 110
      docs/guide-ja/db-migrations.md
  13. 8
      docs/guide-ja/db-query-builder.md
  14. 6
      docs/guide-ja/helper-array.md
  15. 2
      docs/guide-ja/helper-html.md
  16. 73
      docs/guide-ja/input-forms.md
  17. 149
      docs/guide-ja/input-validation.md
  18. 2
      docs/guide-ja/intro-upgrade-from-v1.md
  19. 2
      docs/guide-ja/intro-yii.md
  20. 220
      docs/guide-ja/output-client-scripts.md
  21. 2
      docs/guide-ja/output-data-providers.md
  22. 40
      docs/guide-ja/output-data-widgets.md
  23. 2
      docs/guide-ja/output-formatting.md
  24. 2
      docs/guide-ja/rest-authentication.md
  25. 7
      docs/guide-ja/rest-quick-start.md
  26. 2
      docs/guide-ja/rest-rate-limiting.md
  27. 37
      docs/guide-ja/rest-resources.md
  28. 2
      docs/guide-ja/rest-routing.md
  29. 8
      docs/guide-ja/runtime-handling-errors.md
  30. 5
      docs/guide-ja/runtime-responses.md
  31. 177
      docs/guide-ja/runtime-routing.md
  32. 4
      docs/guide-ja/runtime-sessions-cookies.md
  33. 4
      docs/guide-ja/security-authorization.md
  34. 43
      docs/guide-ja/security-best-practices.md
  35. 2
      docs/guide-ja/start-forms.md
  36. 2
      docs/guide-ja/start-gii.md
  37. 4
      docs/guide-ja/start-installation.md
  38. 107
      docs/guide-ja/structure-assets.md
  39. 2
      docs/guide-ja/structure-controllers.md
  40. 2
      docs/guide-ja/structure-filters.md
  41. 4
      docs/guide-ja/structure-models.md
  42. 2
      docs/guide-ja/structure-modules.md
  43. 2
      docs/guide-ja/structure-views.md
  44. 4
      docs/guide-ja/test-overview.md
  45. 97
      docs/guide-ja/tutorial-core-validators.md
  46. 73
      docs/guide-ja/tutorial-i18n.md
  47. 19
      docs/guide-ja/tutorial-mailing.md
  48. 4
      docs/guide-ja/tutorial-performance-tuning.md
  49. 2
      docs/guide-ru/README.md
  50. 2
      docs/guide-ru/concept-autoloading.md
  51. 2
      docs/guide-ru/concept-components.md
  52. 2
      docs/guide-ru/concept-di-container.md
  53. 2
      docs/guide-ru/db-active-record.md
  54. 37
      docs/guide-ru/db-migrations.md
  55. 4
      docs/guide-ru/intro-upgrade-from-v1.md
  56. 6
      docs/guide-ru/start-gii.md
  57. 2
      docs/guide-ru/structure-applications.md
  58. 2
      docs/guide-ru/structure-widgets.md
  59. 2
      docs/guide-uk/concept-autoloading.md
  60. 2
      docs/guide-zh-CN/concept-autoloading.md
  61. 4
      docs/guide/caching-data.md
  62. 2
      docs/guide/concept-components.md
  63. 2
      docs/guide/db-active-record.md
  64. 57
      docs/guide/db-migrations.md
  65. 261
      docs/guide/input-validation.md
  66. 2
      docs/guide/intro-upgrade-from-v1.md
  67. 4
      docs/guide/intro-yii.md
  68. 8
      docs/guide/output-client-scripts.md
  69. 10
      docs/guide/output-data-widgets.md
  70. 5
      docs/guide/runtime-routing.md
  71. 2
      docs/guide/runtime-sessions-cookies.md
  72. 2
      docs/guide/start-installation.md
  73. 10
      docs/guide/structure-assets.md
  74. 4
      docs/guide/tutorial-core-validators.md
  75. 4
      docs/guide/tutorial-performance-tuning.md
  76. 9
      docs/internals-ja/automation.md
  77. 28
      docs/internals-ja/core-code-style.md
  78. 4
      docs/internals-ja/design-decisions.md
  79. 39
      docs/internals-ja/git-workflow.md
  80. 4
      docs/internals-ja/versions.md
  81. 2
      docs/internals/core-code-style.md
  82. 11
      docs/internals/git-workflow.md
  83. 14
      framework/BaseYii.php
  84. 79
      framework/CHANGELOG.md
  85. 10
      framework/UPGRADE.md
  86. 404
      framework/assets/yii.js
  87. 1
      framework/base/Application.php
  88. 14
      framework/base/Component.php
  89. 2
      framework/base/Controller.php
  90. 3
      framework/base/Module.php
  91. 101
      framework/base/Widget.php
  92. 30
      framework/base/WidgetEvent.php
  93. 8
      framework/caching/ArrayCache.php
  94. 1
      framework/caching/DbDependency.php
  95. 109
      framework/caching/DbQueryDependency.php
  96. 2
      framework/caching/migrations/schema-mssql.sql
  97. 4
      framework/classes.php
  98. 10
      framework/console/Controller.php
  99. 1
      framework/console/UnknownCommandException.php
  100. 5
      framework/console/controllers/BaseMigrateController.php
  101. Some files were not shown because too many files have changed in this diff Show More

8
.gitattributes vendored

@ -22,17 +22,15 @@
*.gif binary
*.ttf binary
# Ignore all test and documentation for archive
# Ignore some meta files when creating an archive of this repository
# We do not ignore any content, because this repo represents the
# `yiisoft/yii2-dev` package, which is expected to ship all tests and docs.
/.github export-ignore
/.editorconfig export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/.scrutinizer.yml export-ignore
/.travis.yml export-ignore
/phpunit.xml.dist export-ignore
/tests export-ignore
/docs export-ignore
/build export-ignore
# Avoid merge conflicts in CHANGELOG
# https://about.gitlab.com/2015/02/10/gitlab-reduced-merge-conflicts-by-90-percent-with-changelog-placeholders/

8
.travis.yml

@ -8,6 +8,12 @@ dist: trusty
# faster builds on new travis setup not using sudo
sudo: false
# build only on master branches
branches:
only:
- master
- 2.1
#
# Test Matrix
@ -128,7 +134,7 @@ before_script:
- psql --version
# initialize databases
- mysql -e 'CREATE DATABASE `yiitest`;';
- travis_retry mysql -e 'CREATE DATABASE `yiitest`;';
- mysql -e "CREATE USER 'travis'@'localhost' IDENTIFIED WITH mysql_native_password;";
- mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'travis'@'localhost' WITH GRANT OPTION;";
- psql -U postgres -c 'CREATE DATABASE yiitest;';

28
build/controllers/ReleaseController.php

@ -212,13 +212,15 @@ class ReleaseController extends Controller
$this->stdout("\n");
$this->stdout("Before you make a release briefly go over the changes and check if you spot obvious mistakes:\n\n", Console::BOLD);
$gitDir = reset($what) === 'framework' ? 'framework/' : '';
$gitVersion = $versions[reset($what)];
if (strncmp('app-', reset($what), 4) !== 0) {
$this->stdout("- no accidentally added CHANGELOG lines for other versions than this one?\n");
$this->stdout("- no accidentally added CHANGELOG lines for other versions than this one?\n\n git diff $gitVersion.. ${gitDir}CHANGELOG.md\n\n");
$this->stdout("- are all new `@since` tags for this relase version?\n");
}
$this->stdout("- other issues with code changes?\n\n git diff -w $gitVersion.. ${gitDir}\n\n");
$travisUrl = reset($what) === 'framework' ? '' : '-'.reset($what);
$this->stdout("- are unit tests passing on travis? https://travis-ci.org/yiisoft/yii2$travisUrl/builds\n");
$this->stdout("- other issues with code changes?\n");
$this->stdout("- also make sure the milestone on github is complete and no issues or PRs are left open.\n\n");
$this->printWhatUrls($what, $versions);
$this->stdout("\n");
@ -527,6 +529,12 @@ class ReleaseController extends Controller
$this->stdout("\n\nThe following steps are left for you to do manually:\n\n");
$nextVersion2 = $this->getNextVersions($nextVersion, self::PATCH); // TODO support other versions
$this->stdout("- wait for your changes to be propagated to the repo and create a tag $version on https://github.com/yiisoft/yii2-framework\n\n");
$this->stdout(" git clone git@github.com:yiisoft/yii2-framework.git\n");
$this->stdout(" cd yii2-framework/\n");
$this->stdout(" export RELEASECOMMIT=$(git log --oneline |grep $version |grep -Po \"^[0-9a-f]+\")\n");
$this->stdout(" git tag -s $version -m \"version $version\" \$RELEASECOMMIT\n");
$this->stdout(" git tag --verify $version\n");
$this->stdout(" git push --tags\n\n");
$this->stdout("- close the $version milestone on github and open new ones for {$nextVersion['framework']} and {$nextVersion2['framework']}: https://github.com/yiisoft/yii2/milestones\n");
$this->stdout("- create a release on github.\n");
$this->stdout("- release news and announcement.\n");
@ -861,7 +869,13 @@ class ReleaseController extends Controller
if ($state === 'changelog' && isset($lines[$l+1]) && strncmp($lines[$l+1], '---', 3) === 0) {
$state = 'end';
}
${$state}[] = $line;
// add continued lines to the last item to keep them together
if (!empty(${$state}) && trim($line !== '') && strpos($line, '- ') !== 0) {
end(${$state});
${$state}[key(${$state})] .= "\n" . $line;
} else {
${$state}[] = $line;
}
}
return [$start, $changelog, $end];
}
@ -879,7 +893,7 @@ class ReleaseController extends Controller
$i = 0;
ArrayHelper::multisort($changelog, function($line) use (&$i) {
if (preg_match('/^- (Chg|Enh|Bug|New)( #\d+(, #\d+)*)?: .+$/', $line, $m)) {
if (preg_match('/^- (Chg|Enh|Bug|New)( #\d+(, #\d+)*)?: .+/', $line, $m)) {
$o = ['Bug' => 'C', 'Enh' => 'D', 'Chg' => 'E', 'New' => 'F'];
return $o[$m[1]] . ' ' . (!empty($m[2]) ? $m[2] : 'AAAA' . $i++);
}
@ -1007,9 +1021,15 @@ class ReleaseController extends Controller
case self::MINOR:
$parts[1]++;
$parts[2] = 0;
if (isset($parts[3])) {
unset($parts[3]);
}
break;
case self::PATCH:
$parts[2]++;
if (isset($parts[3])) {
unset($parts[3]);
}
break;
default:
throw new Exception('Unknown version type.');

2
composer.json

@ -76,7 +76,7 @@
"ezyang/htmlpurifier": "~4.6",
"cebe/markdown": "~1.0.0 | ~1.1.0",
"bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
"bower-asset/jquery.inputmask": "~3.2.2",
"bower-asset/jquery.inputmask": "~3.2.2 | ~3.3.3",
"bower-asset/punycode": "1.3.*",
"bower-asset/yii2-pjax": "~2.0.1"
},

2
docs/guide-es/concept-autoloading.md

@ -3,7 +3,7 @@ Autocarga de clases
Yii depende del [mecanismo de autocarga de clases](http://www.php.net/manual/es/language.oop5.autoload.php) para localizar
e incluir los archivos de las clases requiridas. Proporciona un cargador de clases de alto rendimiento que cumple con el
[estandard PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md).
[estandard PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md).
El cargador se instala cuando incluyes el archivo `Yii.php`.
> Note: Para simplificar la descripción, en esta sección sólo hablaremos de la carga automática de clases. Sin embargo,

16
docs/guide-ja/README.md

@ -178,14 +178,14 @@ RESTful ウェブサービス
ウィジェット
------------
* GridView: **未定** デモページへリンク
* ListView: **未定** デモページへリンク
* DetailView: **未定** デモページへリンク
* ActiveForm: **未定** デモページへリンク
* Pjax: **未定** デモページへリンク
* Menu: **未定** デモページへリンク
* LinkPager: **未定** デモページへリンク
* LinkSorter: **未定** デモページへリンク
* [GridView](http://www.yiiframework.com/doc-2.0/yii-grid-gridview.html)
* [ListView](http://www.yiiframework.com/doc-2.0/yii-widgets-listview.html)
* [DetailView](http://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html)
* [ActiveForm](http://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform)
* [Pjax](http://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html)
* [Menu](http://www.yiiframework.com/doc-2.0/yii-widgets-menu.html)
* [LinkPager](http://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html)
* [LinkSorter](http://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html)
* [Bootstrap ウィジェット](https://github.com/yiisoft/yii2-bootstrap/blob/master/docs/guide-ja/README.md)
* [jQuery UI ウィジェット](https://github.com/yiisoft/yii2-jui/blob/master/docs/guide-ja/README.md)

7
docs/guide-ja/caching-data.md

@ -161,7 +161,7 @@ $value2 = $cache['var2']; // $value2 = $cache->get('var2'); と同等
```php
[
__CLASS__, // クラス名
__CLASS__, // スキーマクラス名
$this->db->dsn, // データベース接続のデータソース名
$this->db->username, // データベース接続のログインユーザ
$name, // テーブル名
@ -170,6 +170,11 @@ $value2 = $cache['var2']; // $value2 = $cache->get('var2'); と同等
見ての通り、キーは一意にデータベースのテーブルを指定するために必要なすべての情報を含んでいます。
> Note: [[yii\caching\Cache::multiSet()|multiSet()]] または [[yii\caching\Cache::multiAdd()|multiAdd()]] によってキャッシュに保存される値が持つことが出来るのは、
文字列または整数のキーだけです。それらより複雑なキーを設定する必要がある場合は、
[[yii\caching\Cache::set()|set()]] または [[yii\caching\Cache::add()|add()]] によって、値を個別に保存してください。
同じキャッシュストレージが異なるアプリケーションによって使用されているときは、キャッシュのキーの競合を避けるために、各アプリケーションではユニークなキーの接頭辞を指定する必要があります。これは [[yii\caching\Cache::keyPrefix]] プロパティを設定することでできます。例えば、アプリケーションのコンフィギュレーションで以下のように書くことができます:
```php

2
docs/guide-ja/concept-autoloading.md

@ -2,7 +2,7 @@
=================
Yiiは、必要となるすべてのクラスファイルを特定してインクルードするにあたり、 [クラスのオートローディングメカニズム](http://www.php.net/manual/ja/language.oop5.autoload.php)
を頼りにします。Yii は、[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md) に準拠した、高性能なクラスのオートローダーを提供しています。
を頼りにします。Yii は、[PSR-4 標準](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) に準拠した、高性能なクラスのオートローダーを提供しています。
このオートローダーは、あなたが `Yii.php` ファイルをインクルードするときにインストールされます。
> Note: 説明を簡単にするため、このセクションではクラスのオートローディングについてのみお話しします。しかし、

2
docs/guide-ja/concept-components.md

@ -9,7 +9,7 @@
* [ビヘイビア](concept-behaviors.md)
個々にでも、組み合わせでも、これらの機能は Yii のクラスのカスタマイズ性と使いやすさをとても高めてくれます。たとえば、[[yii\jui\DatePicker|日付選択]] を行うユーザインターフェース·コンポーネントは、
対話型の日付選択UIを生成するとき、[ビュー](structure-view.md) で次のように使用することができます:
対話型の日付選択UIを生成するとき、[ビュー](structure-views.md) で次のように使用することができます:
```php
use yii\jui\DatePicker;

2
docs/guide-ja/db-active-record.md

@ -1545,7 +1545,7 @@ class Customer extends \yii\db\ActiveRecord
return null; // プライマリキーが null の場合のリレーショナルクエリを防止
}
return $this->ordersAggregation[0]['counted'];
return empty($this->ordersAggregation) ? 0 : $this->ordersAggregation[0]['counted'];
}
/**

25
docs/guide-ja/db-dao.md

@ -18,6 +18,8 @@ Yii は下記の DBMS のサポートを内蔵しています。
- [Oracle](http://www.oracle.com/us/products/database/overview/index.html)
- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): バージョン 2008 以上。
> Note: PHP 7 用の pdo_oci の新しいバージョンは、現在、ソースコードとしてのみ存在します。
[コミュニティによる説明](https://github.com/yiisoft/yii2/issues/10975#issuecomment-248479268) に従って、コンパイルしてください。
## DB 接続を作成する <span id="creating-db-connections"></span>
@ -320,11 +322,11 @@ try {
// ... その他の SQL 文を実行 ...
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}
```
@ -337,6 +339,12 @@ try {
が呼ばれて、トランザクションの中で失敗したクエリに先行するクエリによって行なわれた変更が、ロールバックされます。
そして、`throw $e` が、まるでそれをキャッチしなかったかのように、例外を再スローしますので、通常のエラー処理プロセスがその例外の面倒を見ることになります。
> Note: 上記のコードでは、PHP 5.x と PHP 7.x との互換性のために、二つの
> catch ブロックを持っています。`\Exception` は PHP 7.0 以降では、
> [`\Throwable` インターフェイス](http://php.net/manual/ja/class.throwable.php) を実装しています。
> 従って、あなたのアプリケーションが PHP 7.0 以上しか使わない場合は、`\Exception` の部分を省略することが出来ます。
### 分離レベルを指定する <span id="specifying-isolation-levels"></span>
Yii は、トランザクションの [分離レベル] の設定もサポートしています。
@ -408,12 +416,18 @@ try {
} catch (\Exception $e) {
$innerTransaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}
$outerTransaction->commit();
} catch (\Exception $e) {
$outerTransaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}
```
@ -549,6 +563,9 @@ try {
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
} catch(\Throwable $e) {
$transaction->rollBack();
throw $e;
}
```
@ -567,7 +584,7 @@ $rows = Yii::$app->db->useMaster(function ($db) {
});
```
直接に `Yii::$app->db->enableSlaves` を false に設定して、全てのクエリをマスタ接続に向けることも出来ます。
直接に `Yii::$app->db->enableSlaves``false` に設定して、全てのクエリをマスタ接続に向けることも出来ます。
## データベーススキーマを扱う <span id="database-schema"></span>

110
docs/guide-ja/db-migrations.md

@ -183,7 +183,7 @@ class m150101_185401_create_news_table extends Migration
### テーブルの作成
```php
```
yii migrate/create create_post_table
```
@ -217,7 +217,7 @@ class m150811_220037_create_post_table extends Migration
テーブルのフィールドも直接に生成したい場合は、`--fields` オプションでフィールドを指定します。
```php
```
yii migrate/create create_post_table --fields="title:string,body:text"
```
@ -254,7 +254,7 @@ class m150811_220037_create_post_table extends Migration
さらに多くのフィールド・パラメータを指定することも出来ます。
```php
```
yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text"
```
@ -296,7 +296,7 @@ class m150811_220037_create_post_table extends Migration
バージョン 2.0.8 からは、`foreignKey` キーワードを使って外部キーを生成することができます。
```php
```
yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text"
```
@ -409,10 +409,15 @@ class m160328_040430_create_post_table extends Migration
上記の例で `author_id:integer:notNull:foreignKey(user)` は、`user` テーブルへの外部キーを持つ `author_id` という名前のカラムを生成します。
一方、`category_id:integer:defaultValue(1):foreignKey` は、`category` テーブルへの外部キーを持つ `category_id` というカラムを生成します。
2.0.11 以降では、`foreignKey` キーワードは空白で区切られた第二のパラメータを取ることが出来ます。
これは、生成される外部キーに関連づけられるカラム名を表します。
第二のパラメータが渡されなかった場合は、カラム名はテーブルスキーマから取得されます。
スキーマが存在しない場合や、プライマリキーが設定されていなかったり、複合キーであったりする場合は、デフォルト名として `id` が使用されます。
### テーブルを削除する
```php
```
yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text"
```
@ -443,7 +448,7 @@ class m150811_220037_drop_post_table extends Migration
カラムを追加するためには、次のようにします。
```php
```
yii migrate/create add_position_column_to_post_table --fields="position:integer"
```
@ -464,11 +469,17 @@ class m150811_220037_add_position_column_to_post_table extends Migration
}
```
次のようにして複数のカラムを指定することも出来ます。
```
yii migrate/create add_xxx_column_yyy_column_to_zzz_table --fields="xxx:integer,yyy:text"
```
### カラムを削除する
マイグレーションの名前が `drop_xxx_column_from_yyy_table` の形式である場合、ファイルの内容は、必要となる `addColumn``dropColumn` を含むことになります。
```php
```
yii migrate/create drop_position_column_from_post_table --fields="position:integer"
```
@ -493,7 +504,7 @@ class m150811_220037_drop_position_column_from_post_table extends Migration
マイグレーションの名前が `create_junction_table_for_xxx_and_yyy_tables` の形式である場合は、中間テーブルを作成するのに必要となるコードが生成されます。
```php
```
yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime"
```
@ -590,6 +601,9 @@ class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migra
}
```
2.0.11 以降では、中間テーブルの外部キーのカラム名はテーブルスキーマから取得されます。
スキーマでテーブルが定義されていない場合や、プライマリキーが設定されていなかったり複合キーであったりする場合は、デフォルト名 `id` が使われます。
### トランザクションを使うマイグレーション <span id="transactional-migrations"></span>
@ -861,6 +875,86 @@ return [
もう、`migrationTable` のコマンドラインオプションを使ってテーブルを指定する必要はなくなります。
### 名前空間を持つマイグレーション <span id="namespaced-migrations"></span>
2.0.10 以降では、マイグレーションのクラスに名前空間を適用することが出来ます。
マイグレーションの名前空間のリストをを [[yii\console\controllers\MigrateController::migrationNamespaces|migrationNamespaces]] によって指定することが出来ます。
マイグレーションのクラスに名前空間を使うと、マイグレーションのソースについて、複数の配置場所を使用することが出来ます。
例えば、
```php
return [
'controllerMap' => [
'migrate' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => [
'app\migrations', // アプリケーション全体のための共通のマイグレーション
'module\migrations', // プロジェクトの特定のモジュールのためのマイグレーション
               'some\extension\migrations', // 特定のエクステンションのためのマイグレーション
],
],
],
];
```
> Note: 異なる名前空間に属するマイグレーションを適用しても、**単一の** マイグレーション履歴が生成されます。
> つまり、特定の名前空間に属するマイグレーションだけを適用したり元に戻したりすることは出来ません。
名前空間を持つマイグレーションを操作するときは、新規作成時も、元に戻すときも、マイグレーション名の前にフルパスの名前空間を指定しなければなりません。
バックスラッシュ (`\`) のシンボルは、通常、シェルでは特殊文字として扱われますので、シェルのエラーや誤った動作を防止するために、適切にエスケープしなければならないことに注意して下さい。
例えば、
```
yii migrate/create 'app\\migrations\\createUserTable'
```
> Note: [[yii\console\controllers\MigrateController::migrationPath|migrationPath]] によって指定されたマイグレーションは、名前空間を持つことが出来ません。
名前空間を持つマイグレーションは [[yii\console\controllers\MigrateController::migrationNamespaces]] プロパティを通じてのみ適用可能です。
### 分離されたマイグレーション <span id="separated-migrations"></span>
プロジェクトのマイグレーション全体に単一のマイグレーション履歴を使用することが望ましくない場合もあります。
例えば、完全に独立した機能性とそれ自身のためのマイグレーションを持つような 'blog' エクステンションをインストールする場合には、
メインのプロジェクトの機能専用のマイグレーションに影響を与えたくないでしょう。
これらをお互いに完全に分離して適用かつ追跡したい場合は、別々の名前空間とマイグレーション履歴テーブルを使う
複数のマイグレーションコマンドを構成することが出来ます。
```php
return [
'controllerMap' => [
// アプリケーション全体のための共通のマイグレーション
'migrate-app' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => ['app\migrations'],
'migrationTable' => 'migration_app',
],
// 特定のモジュールのためのマイグレーション
'migrate-module' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => ['module\migrations'],
'migrationTable' => 'migration_module',
],
// 特定のエクステンションのためのマイグレーション
'migrate-rbac' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationPath' => '@yii/rbac/migrations',
'migrationTable' => 'migration_rbac',
],
],
];
```
データベースを同期するためには、一つではなく複数のコマンドを実行しなければならなくなることに注意してください。
```
yii migrate-app
yii migrate-module
yii migrate-rbac
```
## 複数のデータベースにマイグレーションを適用する <span id="migrating-multiple-databases"></span>
デフォルトでは、マイグレーションは `db` [アプリケーションコンポーネント](structure-application-components.md) によって指定された同じデータベースに対して適用されます。

8
docs/guide-ja/db-query-builder.md

@ -328,7 +328,7 @@ $query->filterWhere([
[[yii\db\Query::filterWhere()|filterWhere()]] と [[yii\db\Query::where()|where()]] の唯一の違いは、前者は [ハッシュ形式](#hash-format) の条件において提供された空の値を無視する、という点です。
従って、`$email` が空で `$sername` がそうではない場合は、上記のコードは、結果として `WHERE username=:username` という SQL 条件になります。
> Info: 値が空であると見なされるのは、null、空の配列、空の文字列、または空白のみを含む文字列である場合です。
> Info: 値が空であると見なされるのは、`null`、空の配列、空の文字列、または空白のみを含む文字列である場合です。
[[yii\db\Query::andWhere()|andWhere()]] または [[yii\db\Query::orWhere()|orWhere()]] と同じように、[[yii\db\Query::andFilterWhere()|andFilterWhere()]] または [[yii\db\Query::orFilterWhere()|orFilterWhere()]] を使って、既存の条件に別のフィルタ条件を追加することも出来ます。
@ -346,6 +346,12 @@ $query->andFilterCompare('value', '<=100');
$query->andFilterCompare('name', 'Doe', 'like');
```
Yii 2.0.11 以降には、`HAVING` の条件のためにも、同様のメソッドがあります。
- [[yii\db\Query::filterHaving()|filterHaving()]]
- [[yii\db\Query::andFilterHaving()|andFilterHaving()]]
- [[yii\db\Query::orFilterHaving()|orFilterHaving()]]
### [[yii\db\Query::orderBy()|orderBy()]] <span id="order-by"></span>
[[yii\db\Query::orderBy()|orderBy()]] メソッドは SQL クエリの `ORDER BY` 句を指定します。例えば、

6
docs/guide-ja/helper-array.md

@ -88,7 +88,7 @@ if (!ArrayHelper::keyExists('username', $data1, false) || !ArrayHelper::keyExist
良くある例は、ID のリストの取得です。
```php
$data = [
$array = [
['id' => '123', 'data' => 'abc'],
['id' => '345', 'data' => 'def'],
];
@ -114,7 +114,7 @@ $result = ArrayHelper::getColumn($array, function ($element) {
`$groups` 属性はキーの配列であり、入力値の配列を一つまたは複数のサブ配列にグループ化するために使用されます。
特定の要素の `$key` 属性またはその値が null であるとき、`$groups` が定義されていない場合は、その要素は破棄されて、結果には入りません。
特定の要素の `$key` 属性またはその値が `null` であるとき、`$groups` が定義されていない場合は、その要素は破棄されて、結果には入りません。
そうではなく、`$groups` が指定されている場合は、配列の要素はキー無しで結果の配列に追加されます。
例えば、
@ -398,7 +398,7 @@ $data = ArrayHelper::toArray($posts, [
- キー/値 のペア - 配列のキー名にしたい文字列と、値を取得すべきモデルのカラムの名前。
- キー/値 のペア - 配列のキー名にしたい文字列と、値を返すコールバック。
変換の結果は以下のようになります。
単一のモデルに対する上記の変換の結果は以下のようになります。
```php

2
docs/guide-ja/helper-html.md

@ -42,7 +42,7 @@ Yii はそのような手助けを Html ヘルパの形式で提供します。
オプションは多くの Html ヘルパのメソッドとさまざまなウィジェットで使用されます。
その全ての場合において、いくつか追加の処理がなされることを知っておいてください。
- 値が null である場合は、対応する属性はレンダリングされません。
- 値が `null` である場合は、対応する属性はレンダリングされません。
- 値が真偽値である属性は、[真偽値属性 (boolean attributes)](http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes) として扱われます。
- 属性の値は [[yii\helpers\Html::encode()|Html::encode()]] を使って HTML エンコードされます。
- 属性の値が配列である場合は、次のように処理されます。

73
docs/guide-ja/input-forms.md

@ -1,6 +1,8 @@
フォームを作成する
==================
アクティブレコードに基づくフォーム : ActiveForm
-----------------------------------------------
Yii においてフォームを使用するときは、主として [[yii\widgets\ActiveForm]] による方法を使います。
フォームがモデルに基づくものである場合はこの方法を選ぶべきです。
これに加えて、[[yii\helpers\Html]] にはいくつかの有用なメソッドがあり、どんなフォームでも、ボタンやヘルプテキストを追加するのには、通常、それらのメソッドを使います。
@ -50,12 +52,14 @@ $form = ActiveForm::begin([
<?php ActiveForm::end() ?>
```
### `begin()``end()` で囲む <span id="wrapping-with-begin-and-end"></span>
上記のコードでは、[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] がフォームのインスタンスを作成するとともに、フォームの開始をマークしています。
[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] と [[yii\widgets\ActiveForm::end()|ActiveForm::end()]] の間に置かれた全てのコンテントが HTML の `<form>` タグによって囲まれます。
どのウィジェットでも同じですが、ウィジェットをどのように構成すべきかに関するオプションを指定するために、`begin` メソッドに配列を渡すことが出来ます。
この例では、追加の CSS クラスと要素を特定するための ID が渡されて、`<form>` の開始タグに適用されています。
利用できるオプションの全ては [[yii\widgets\ActiveForm]] の API ドキュメントに記されていますので参照してください。
### ActiveField <span id="activefield"></span>.
フォームの中では、フォームの要素を作成するために、ActiveForm ウィジェットの [[yii\widgets\ActiveForm::field()|ActiveForm::field()]] メソッドが呼ばれています。
このメソッドは、フォームの要素だけでなく、そのラベルも作成し、適用できる JavaScript の検証メソッドがあれば、それも追加します。
[[yii\widgets\ActiveForm::field()|ActiveForm::field()]] メソッドは、[[yii\widgets\ActiveField]] のインスタンスを返します。
@ -112,26 +116,75 @@ echo $form->field($model, 'items[]')->checkboxList(['a' => 'Item A', 'b' => 'Ite
> }
> ```
ドロップダウンリストを作る <span id="creating-activeform-dropdownlist"></span>
リストを作る <span id="creating-activeform-lists"></span>
--------------------------
ActiveForm の [dropDownList()](http://www.yiiframework.com/doc-2.0/yii-widgets-activefield.html#dropDownList()-detail)
メソッドを使ってドロップダウンリストを作ることが出来ます。
三種類のリストがあります:
* ドロップダウンリスト
* ラジオリスト
* チェックボックスリスト
リストを作るためには、項目の配列を準備しなければなりません。これは、手作業でやることも出来ます。
```php
use app\models\ProductCategory;
$items = [
1 => '項目 1',
2 => '項目 2'
]
```
または、DB から取得することも出来ます。
```php
$items = Category::find()
->select(['id', 'label'])
->indexBy('id')
->column();
```
このような `$items` が、いろんなリストウィジェットによって処理されるべきものとなります。
フォームのフィールドの値(および現在アクティブな項目)は、`$model` の属性の現在の値に従って自動的に設定されます。
/* @var $this yii\web\View */
#### ドロップダウンリストを作る <span id="creating-activeform-dropdownlist"></span>
ActiveField の [[\yii\widgets\ActiveField::dropDownList()]] メソッドを使って、ドロップダウンリストを作ることが出来ます。
```php
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\Product */
echo $form->field($model, 'product_category')->dropdownList(
ProductCategory::find()->select(['category_name', 'id'])->indexBy('id')->column(),
['prompt'=>'カテゴリを選択してください']
echo $form->field($model, 'category')->dropdownList([
1 => '項目 1',
2 => '項目 2'
],
['prompt'=>'カテゴリーを選択してください']
);
```
モデルのフィールドの値は、前もって自動的に選択されます。
#### ラジオリストを作る <span id="creating-activeform-radioList"></span>
ActiveField の [[\yii\widgets\ActiveField::radioList()]] メソッドを使ってラジオリストを作ることが出来ます。
```php
/* @var $form yii\widgets\ActiveForm */
echo $form->field($model, 'category')->radioList([
1 => 'ラジオ 1',
2 => 'ラジオ 2'
]);
```
#### チェックボックスリストを作る <span id="creating-activeform-checkboxList"></span>
ActiveField の [[\yii\widgets\ActiveField::checkboxList()]] メソッドを使ってチェックボックスリストを作ることが出来ます。
```php
/* @var $form yii\widgets\ActiveForm */
echo $form->field($model, 'category')->checkboxList([
1 => 'チェックボックス 1',
2 => 'チェックボックス 2'
]);
```
Pjax を使う <span id="working-with-pjax"></span>

149
docs/guide-ja/input-validation.md

@ -311,8 +311,10 @@ Yii のリリースに含まれている [コアバリデータ](tutorial-core-v
/**
* @param string $attribute 現在検証されている属性
* @param mixed $params 規則に与えられる "params" の値
* @param \yii\validators\InlineValidator 関係する InlineValidator のインスタンス。
* このパラメータは、バージョン 2.0.11 以降で利用可能。
*/
function ($attribute, $params)
function ($attribute, $params, $validator)
```
属性が検証に失敗した場合は、メソッド/関数 は [[yii\base\Model::addError()]] を呼んでエラーメッセージをモデルに保存し、後で読み出してエンドユーザに表示することが出来るようにしなければなりません。
@ -334,7 +336,7 @@ class MyForm extends Model
['country', 'validateCountry'],
// 無名関数として定義されるインラインバリデータ
['token', function ($attribute, $params) {
['token', function ($attribute, $params, $validator) {
if (!ctype_alnum($this->$attribute)) {
$this->addError($attribute, 'トークンは英数字で構成しなければなりません。');
}
@ -342,7 +344,7 @@ class MyForm extends Model
];
}
public function validateCountry($attribute, $params)
public function validateCountry($attribute, $params, $validator)
{
if (!in_array($this->$attribute, ['USA', 'Web'])) {
$this->addError($attribute, '国は "USA" または "Web" でなければなりません。');
@ -351,6 +353,14 @@ class MyForm extends Model
}
```
> Note: バージョン 2.0.11 以降では、代わりに、[[yii\validators\InlineValidator::addError()]] を使ってエラーメッセージを追加することが出来ます。
> そうすれば、エラーメッセージはそのまま [[yii\i18n\I18N::format()]] を使ってフォーマットされます。
> 属性のラベルと値を参照するためには、それぞれ、`{attribute}` と `{value}` を使ってください(手作業で取得する必要はありません)。
>
> ```php
> $validator->addError($this, $attribute, 'The value "{value}" is not acceptable for {attribute}.');
> ```
> Note: デフォルトでは、インラインバリデータは、関連付けられている属性が空の入力値を受け取ったり、既に何らかの検証規則に失敗したりしている場合には、適用されません。
> 規則が常に適用されることを保証したい場合は、規則の宣言において [[yii\validators\Validator::skipOnEmpty|skipOnEmpty]] および/または [[yii\validators\Validator::skipOnError|skipOnError]] のプロパティを false に設定することが出来ます。
> 例えば、
@ -418,6 +428,121 @@ class EntryForm extends Model
}
```
## 複数の属性の検証 <span id="multiple-attributes-validation"></span>
時として、バリデータが複数の属性に関係する場合があります。次のようなフォームを考えてみてください。
```php
class MigrationForm extends \yii\base\Model
{
/**
* 成人一人のための最低限の生活費
*/
const MIN_ADULT_FUNDS = 3000;
/**
* こども一人のための最低限の生活費
*/
const MIN_CHILD_FUNDS = 1500;
public $personalSalary; // 給与
public $spouseSalary; // 配偶者の給与
public $childrenCount; // こどもの数
public $description;
public function rules()
{
return [
[['personalSalary', 'description'], 'required'],
[['personalSalary', 'spouseSalary'], 'integer', 'min' => self::MIN_ADULT_FUNDS],
['childrenCount', 'integer', 'min' => 0, 'max' => 5],
[['spouseSalary', 'childrenCount'], 'default', 'value' => 0],
['description', 'string'],
];
}
}
```
### バリデータを作成する <span id="multiple-attributes-validator"></span>
家族の収入が子ども達のために十分であるかどうかをチェックする必要があるとしましょう。
そのためには、`childrenCount` が 1 以上である場合にのみ実行される `validateChildrenFunds` というインラインバリデータを作れば良いわけです。
検証されるすべての属性 (`['personalSalary', 'spouseSalary', 'childrenCount']`) にこのバリデータをアタッチすることは出来ない、ということに注意してください。
そのようにすると、同じバリデータが属性ごとに (合計で三回) 走ることになりますが、
属性のセット全体に対してこのバリデータを一度だけ走らせれば十分なのです。
これらの属性のどれを使っても構いません (あるいは、もっとも関係が深いと思うものを使ってください)。
```php
['childrenCount', 'validateChildrenFunds', 'when' => function ($model) {
return $model->childrenCount > 0;
}],
```
`validateChildrenFunds` の実装は次のようにすることが出来ます。
```php
public function validateChildrenFunds($attribute, $params)
{
$totalSalary = $this->personalSalary + $this->spouseSalary;
// 配偶者の給与が指定されているときは、成人の最低生活費を倍にする
$minAdultFunds = $this->spouseSalary ? self::MIN_ADULT_FUNDS * 2 : self::MIN_ADULT_FUNDS;
$childFunds = $totalSalary - $minAdultFunds;
if ($childFunds / $this->childrenCount < self::MIN_CHILD_FUNDS) {
$this->addError('childrenCount', '子どもの数に対して給与が不足しています。');
}
}
```
この検証は属性一つだけに関係するものではないので、`$attribute` のパラメータは無視することが出来ます。
### エラーメッセージを追加する <span id="multiple-attributes-errors"></span>
複数の属性の場合のエラーメッセージの追加は、フォームをどのように設計するかによって異なってきます。
- もっとも関係が深いとあなたが思うフィールドを選んで、その属性にエラーメッセージを追加する。
```php
$this->addError('childrenCount', '子どもの数に対して給与が不足しています。');
```
- 重要な複数の属性、または、すべての属性を選んで、同じエラーメッセージを追加する。
メッセージを独立した変数に格納してから `addError` に渡せば、コードを DRY に保つことが出来ます。
```php
$message = '子どもの数に対して給与が不足しています。';
$this->addError('personalSalary', $message);
$this->addError('wifeSalary', $message);
$this->addError('childrenCount', $message);
```
あるいは、ループを使います。
```php
$attributes = ['personalSalary, 'wifeSalary', 'childrenCount'];
foreach ($attributes as $attribute) {
$this->addError($attribute, '子どもの数に対して給与が不足しています。');
}
```
- (特定の属性に結び付かない) 共通のエラーメッセージを追加する。
その時点では属性の存在はチェックされませんので、存在しない属性の名前、例えば `*` を使ってエラーメッセージを追加することが出来ます。
```php
$this->addError('*', '子どもの数に対して給与が不足しています。');
```
結果として、フォームのフィールドの近くにはこのエラーメッセージは表示されません。
これを表示するためには、ビューにエラーサマリーを含めます。
```php
<?= $form->errorSummary($model) ?>
```
> Note: 複数の属性を一度に検証するバリデータを作成する方法が [community cookbook](https://github.com/samdark/yii2-cookbook/blob/master/book/forms-validator-multiple-attributes.md) で分り易く解説されています。.
## クライアント側での検証 <span id="client-side-validation"></span>
エンドユーザが HTML フォームで値を入力する際には、JavaScript に基づくクライアント側での検証を提供することが望まれます。
@ -485,10 +610,26 @@ class LoginForm extends Model
舞台裏では、[[yii\widgets\ActiveForm]] がモデルで宣言されている検証規則を読んで、クライアント側の検証をサポートするバリデータのために、適切な JavaScript コードを生成します。
ユーザが入力フィールドの値を変更したりフォームを送信したりすると、クライアント側の検証の JavaScript が起動されます。
クライアント側の検証を完全に無効にしたい場合は、[[yii\widgets\ActiveForm::enableClientValidation]] プロパティを false に設定することが出来ます。
クライアント側の検証を完全に無効にしたい場合は、[[yii\widgets\ActiveForm::enableClientValidation]] プロパティを `false` に設定することが出来ます。
また、個々の入力フィールドごとにクライアント側の検証を無効にしたい場合には、入力フィールドの [[yii\widgets\ActiveField::enableClientValidation]] プロパティを false に設定することが出来ます。
`eanbleClientValidation` が入力フィールドのレベルとフォームのレベルの両方で構成されている場合は前者が優先されます。
> Info: バージョン 2.0.11 以降、[[yii\validators\Validator]] を拡張する全てのバリデータは、
> クライアント側のオプションを独立したメソッド - [[yii\validators\Validator::getClientOptions()]] から受け取るようになりました。
> これを使うと、次のことが可能になります。
>
> - 独自のクライアント側検証を実装しながら、サーバ側検証のオプションとの同期はそのまま残す
> - 特殊な要求に合うように拡張またはカスタマイズする
>
> ```php
> public function getClientOptions($model, $attribute)
> {
> $options = parent::getClientOptions($model, $attribute);
> // ここで $options を修正
>
> return $options;
> }
> ```
### クライアント側の検証を実装する <span id="implementing-client-side-validation"></span>

2
docs/guide-ja/intro-upgrade-from-v1.md

@ -535,5 +535,5 @@ Yii 1.1 と 2.x を一緒に使う
---------------------------
Yii 2.0 と一緒に使いたい Yii 1.1 のレガシーコードを持っている場合は、
[サードパーティのコードを扱](tutorial-yii-integration.md) の節を参照してください。
[Yii 1.1 と 2.0 を一緒に使](tutorial-yii-integration.md#using-both-yii2-yii) の節を参照してください。

2
docs/guide-ja/intro-yii.md

@ -46,7 +46,7 @@ Yii は現在、利用可能な二つのメジャーバージョン、すなわ
必要条件と前提条件
------------------
Yii 2.0 は PHP 5.4.0 以上を必要とします。
Yii 2.0 は PHP 5.4.0 以上を必要とし、PHP 7 の最新バージョンで最高の力を発揮します。
個々の機能に対する詳細な必要条件は、全ての Yii リリースに含まれている必要条件チェッカを走らせることによって知ることが出来ます。
Yii を使うためには、オブジェクト指向プログラミング (OOP) の基本的な知識が必要です。

220
docs/guide-ja/output-client-scripts.md

@ -1,98 +1,216 @@
クライアントスクリプトを扱う
============================
> Note: この節はまだ執筆中です。
今日のウェブアプリケーションでは、静的な HTML ページがレンダリングされてブラウザに送信されるだけでなく、
JavaScript によって、既存の要素を操作したり、新しいコンテントを AJAX でロードしたりして、ブラウザに表示されるページを修正します。
この節では、JavaScript と CSS をウェブサイトに追加したり、それらを動的に調整するために Yii によって提供されているメソッドを説明します。
### スクリプトを登録する
## スクリプトを登録する <span id="register-scripts"></span>
[[yii\web\View]] オブジェクトに対してスクリプトを登録することが出来ます。
[[yii\web\View]] オブジェクトを扱う際には、フロントエンドスクリプトを動的に登録することが出来ます。
このための専用のメソッドが二つあります。
すなわち、インラインスクリプトのための [[yii\web\View::registerJs()|registerJs()]] と、外部スクリプトのための [[yii\web\View::registerJsFile()|registerJsFile()]] です。
インラインスクリプトは、設定のためや、動的に生成されるコードのために有用なものです。
次のようにして、これらを追加するメソッドを使うことが出来ます。
- インラインスクリプトのための [[yii\web\View::registerJs()|registerJs()]]
- 外部スクリプトのための [[yii\web\View::registerJsFile()|registerJsFile()]]
### インラインスクリプトを登録する <span id="inline-scripts"></span>
インラインスクリプトは、設定や、動的に生成されるコードのために有用なものです。
また、[ウィジェット](structure-widgets.md) に含まれる再利用可能なフロントエンドコードによって生成されるコード断片もインラインスクリプトです。
インラインスクリプトを追加するためのメソッド [[yii\web\View::registerJs()|registerJs()]] は、次のようにして使うことが出来ます。
```php
$this->registerJs("var options = ".json_encode($options).";", View::POS_END, 'my-options');
$this->registerJs(
"$('#myButton').on('click', function() { alert('ボタンがクリックされました'); });",
View::POS_READY,
'my-button-handler'
);
```
最初の引数は、ページに挿入したい実際の JS コードです。
二番目の引数は、スクリプトがページのどの場所に挿入されるべきかを決定します。
最初の引数は、ページに挿入したい実際の JS コードです。これが `<script>` タグに包まれて挿入されます。
二番目の引数は、スクリプトがページのどの位置に挿入されるべきかを決定します。
取りうる値は以下のとおりです。
- [[yii\web\View::POS_HEAD|View::POS_HEAD]] - head セクション。
- [[yii\web\View::POS_BEGIN|View::POS_BEGIN]] - 開始の `<body>` の直後。
- [[yii\web\View::POS_END|View::POS_END]] - 終了の `</body>` の直前。
- [[yii\web\View::POS_READY|View::POS_READY]] - ドキュメントの `ready` イベントで実行するコード。これを指定すると、[[yii\web\JqueryAsset|jQuery]] が自動的に登録されます。
- [[yii\web\View::POS_LOAD|View::POS_LOAD]] - ドキュメントの `load` イベントで実行するコード。これを指定すると、[[yii\web\JqueryAsset|jQuery]] が自動的に登録されます。
最後の引数は、スクリプトのユニークな ID です。これによってコードブロックを一意に特定し、同じ ID のスクリプトが既にある場合は、新しいものを追加するのでなく、それを置き換えます。
- [[yii\web\View::POS_READY|View::POS_READY]] - [ドキュメントの `ready` イベント](http://learn.jquery.com/using-jquery-core/document-ready/) でコードを実行するための指定。
これを指定すると、[[yii\web\JqueryAsset|jQuery]] が自動的に登録され、コードは適切な jQuery コードの中に包まれます。
これがデフォルトの位置指定です。
- [[yii\web\View::POS_LOAD|View::POS_LOAD]] - [ドキュメントの `load` イベント](http://learn.jquery.com/using-jquery-core/document-ready/) でコードを実行するための指定。
上記と同じく、これを指定すると、[[yii\web\JqueryAsset|jQuery]] が自動的に登録されます。
最後の引数は、スクリプトのコードブロックを一意に特定するために使われるスクリプトのユニークな ID です。
同じ ID のスクリプトが既にある場合は、新しいものを追加するのでなく、それを置き換えます。
ID を指定しない場合は、JS コードそれ自身が ID として扱われます。
この ID によって、同じコードが複数回登録されるのを防止します。
### スクリプトファイルを登録する <span id="script-files"></span>
[[yii\web\View::registerJsFile()|registerJsFile()]] の引数は、[[yii\web\View::registerCssFile()|registerCssFile()]] の引数と同様なものです。
以下に示す例では、`main.js` ファイルを、[[yii\web\JqueryAsset]] への依存関係とともに、登録します。
これは、`main.js` ファイルは `jquery.js` の後に追加される、ということを意味します。
このような依存関係の仕様が無ければ、`main.js` と `jquery.js` の間の相対的な順序は未定義となり、コードは動作しなくなるでしょう。
外部スクリプトは次のようにして追加することが出来ます。
```php
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile(
'@web/js/main.js',
['depends' => [\yii\web\JqueryAsset::className()]]
);
```
これによって、アプリケーションの [base URL](concept-aliases.md#predefined-aliases) の下に配置されている `/js/main.js` スクリプトを読み込むタグが追加されます。
ただし、外部 JS ファイルを登録するのには、 [[yii\web\View::registerJsFile()|registerJsFile()]] を使わずに、[アセットバンドル](structure-assets.md) を使うことが強く推奨されます。
なぜなら、そうする方が、柔軟性も高く、依存関係の構成も粒度を細かく出来るからです。
また、アセットバンドルを使えば、複数の JS ファイルを結合して圧縮すること
(アクセスの多いウェブサイトではそうすることが望まれます) が可能になります。
## CSS を登録する <span id="register-css"></span>
Javascript と同様に、[[yii\web\View::registerCss()|registerCss()]]
または [[yii\web\View::registerCssFile()|registerCssFile()]] を使って CSS を登録することが出来ます。
前者は CSS のコードブロックを登録し、後者は外部 CSS ファイルを登録するものです。
### インライン CSS を登録する <span id="inline-css"></span>
```php
$this->registerCss("body { background: #f00; }");
```
[[yii\web\View::registerJsFile()|registerJsFile()]] の引数は [[yii\web\View::registerCssFile()|registerCssFile()]] のそれと同じです。
上記の例では、`main.js` ファイルを `JqueryAsset` に依存するものとして登録しています。
これは、`main.js` ファイルが `jquery.js` の後に追加されるようになることを意味します。
この依存関係を指定しない場合は、`main.js` と `jquery.js` の相対的な順序は未定義となります。
上記のコードによって、結果として、下記の出力がページの `<head>` セクションに追加されます。
[[yii\web\View::registerCssFile()|registerCssFile()]] と同じように、外部 JS ファイルを登録するのに [[yii\web\View::registerJsFile()|registerJsFile()]] を使わずに、[アセットバンドル](structure-assets.md) を使うことが強く推奨されます。
```html
<style>
body { background: #f00; }
</style>
```
`style` タグに追加の属性を指定したい場合は、名前-値 の配列を二番目の引数として渡します。
最後の引数は、スタイルのブロックを一意に特定するために使われるユニークな ID です。
同じスタイルがコードの別の箇所で重複して登録されたとしても、このスタイルのブロックが一度だけ追加されることを保証するものです。
### アセットバンドルを登録する
### CSS ファイルを登録する <span id="css-files"></span>
既に述べたように、CSS と JavaScript を直接に使う代りにアセットバンドルを使うことが望まれます。
アセットバンドルを定義する方法の詳細は、ガイドの [アセットマネージャ](structure-assets.md) の節で知ることが出来ます。
既に定義されているアセットバンドルを使うことについては、次のように非常に簡明です。
CSS ファイルは次のようにして登録することが出来ます。
```php
$this->registerCssFile("@web/css/themes/black-and-white.css", [
'depends' => [\yii\bootstrap\BootstrapAsset::className()],
'media' => 'print',
], 'css-print-theme');
```
上記のコードは `/css/themes/black-and-white.css` という CSS ファイルに対するリンクをページの `<head>` セクションに追加します。
* 最初の引数が、登録される CSS ファイルを指定します。
この例における `@web` in this example is an [アプリケーションのベース URL に対するエイリアス](concept-aliases.md#predefined-aliases) です。
* 二番目の引数は、結果として出力される `<link>` タグの HTML 属性を指定するものです。
ただし、`depends` というオプションは特別な処理を受けます。
これは、この CSS ファイルが依存するアセットバンドルを指定するものです。
この例の場合は、[[yii\bootstrap\BootstrapAsset|BootstrapAsset]] が依存するアセットバンドルです。
これは、この CSS ファイルが [[yii\bootstrap\BootstrapAsset|BootstrapAsset]] に属する CSS ファイルの*後に*追加されることを意味します。
* 最後の引数はこの CSS ファイルを特定する ID を指定するものです。
省略された場合は、CSS ファイルの URL が代りに ID として使用されます。
外部 CSS ファイルを登録するのには、 [[yii\web\View::registerCssFile()|registerCssFile()]] を使わずに、[アセットバンドル](structure-assets.md) を使うことが強く推奨されます。
アセットバンドルを使えば、複数の CSS ファイルを結合して圧縮すること
(アクセスの多いウェブサイトではそうすることが望まれます) が可能になります。
また、アプリケーションの全てのアセットの依存関係を一ヶ所で構成することが出来るため、
より大きな柔軟性を得ることが出来ます。
## アセットバンドルを登録する <span id="asset-bundles"></span>
既に述べたように、CSS ファイルと JavaScript ファイルを直接に登録する代りにアセットバンドルを使うことが推奨されます。
アセットバンドルを定義する方法の詳細は、ガイドの [アセット](structure-assets.md) の節で知ることが出来ます。
既に定義されているアセットバンドルの使い方は、次のように非常に単純明快です。
```php
\frontend\assets\AppAsset::register($this);
```
上記のコードでは、ビューファイルのコンテキストにおいて、`AppAsset` バンドルが (`$this` で表される) 現在のビューに対して登録されています。
ウィジェットの中からアセットバンドルを登録するときは、ウィジェットの [[yii\base\Widget::$view|$view]]
を代りに渡します (`$this->view`)。
## 動的な Javascript を生成する <span id="dynamic-js"></span>
### CSS を登録する
ビューファイルでは、HTML コードが直接に書き出されのではなく、ビューの変数に依存して、PHP のコードによって生成されることがよくあります。
生成された HTML を Javascript によって操作するためには、JS コードも同様に動的な部分を含まなければなりません。
例えば、jQuery セレクタの ID などがそうです。
、ビューの変数にIn view files often the HTML code is not written out directl
PHP の変数を JS コードに挿入するためには、変数の値を適切にエスケープする必要があります。
JS コードを専用の JS ファイルの中に置くのではなく、HTML に挿入する場合は特にそうです。
Yii は、この目的のために、[[yii\helpers\Json|Json]] ヘルパの [[yii\helpers\Json::htmlEncode()|htmlEncode()]] メソッドを提供しています。
その使用方法は、以下の例の中で示されています。
[[yii\web\View::registerCss()|registerCss()]] または [[yii\web\View::registerCssFile()|registerCssFile()]] を使って CSS を登録することが出来ます。
前者は CSS のコードブロックを登録し、後者は外部 CSS ファイルを登録します。
例えば、
### グローバルな JavaScript の構成情報を登録する <span id="js-configuration"></span>
この例では、配列を使って、グローバルな構成情報のパラメータをアプリケーションの
PHP のパートから JS のフロントエンドコードに渡します。
```php
$this->registerCss("body { background: #f00; }");
$options = [
'appName' => Yii::$app->name,
'baseUrl' => Yii::$app->request->baseUrl,
'language' => Yii::$app->language,
// ...
];
$this->registerJs(
"var yiiOptions = ".\yii\helpers\Json::htmlEncode($options).";",
View::POS_HEAD,
'yiiOptions'
);
```
上記のコードは、以下の内容をページの head セクションに追加する結果となります。
上記のコードは、次のような JavaScript の変数定義を含む `<script>` タグを登録します。
```html
<style>
body { background: #f00; }
</style>
```javascript
var yiiOptions = {"appName":"My Yii Application","baseUrl":"/basic/web","language":"en"};
```
`style` タグに追加のプロパティを指定したい場合は、三番目の引数として「名前-値」のペアの配列を渡します。
`style` タグが一つだけになることを保証する必要がある場合は、メタタグの説明で言及したように、4番目の引数を使います。
このようにすれば、あなたの Javascript コードで、これらの構成情報に `yiiOptions.baseUrl``yiiOptions.language`
のようにしてアクセスすることが出来るようになります。.
### 翻訳されたメッセージを渡す <span id="translated-messages"></span>
あなたの JavaScript が何らかのイベントに反応してメッセージを表示する必要がある、という状況に遭遇するかも知れません。
複数の言語で動作するアプリケーションでは、この文字列は、現在のアプリケーシの言語に翻訳されなければなりません。
これを達成する一つの方法は、Yii によって提供されている [メッセージ翻訳機能] (tutorial-i18n.md#message-translation)
を使って、その結果を JavaScript コードに渡すことです。
```php
$this->registerCssFile("http://example.com/css/themes/black-and-white.css", [
'depends' => [BootstrapAsset::className()],
'media' => 'print',
], 'css-print-theme');
$message = \yii\helpers\Json::htmlEncode(
\Yii::t('app', 'Button clicked!')
);
$this->registerJs(<<<JS
$('#myButton').on('click', function() { alert( $message ); });",
JS
);
```
上記のコードは、ページの head セクションに CSS ファイルへのリンクを追加します。
上記のサンプルコードは、可読性を高めるために、PHP の [ヒアドキュメント構文](http://php.net/manual/ja/language.types.string.php#language.types.string.syntax.heredoc) を使っています。
また、ヒアドキュメントは、たいていの IDE で、より良い構文ハイライトが可能にしてくれるので、
インライン JavaScript、特に一行に収まらないものを書くときに推奨される方法です。
変数 `$message` は PHP で生成され、[[yii\helpers\Json::htmlEncode|Json::htmlEncode]] のおかげで、適切な JS 構文の文字列を含むものになります。
それを JavaScript コードに挿入して、`alert()` の関数呼び出しに動的な文字列を渡すことが出来ます。
> Note: ヒアドキュメントを使う場合は、JS コード中の変数名に注意してください。
> `$` で始まる変数は、PHP の変数として解釈され、その値によって置き換えられる可能性があります。
> ただし、`$(` または `$.` という形式の jQuery 関数は PHP 変数として解釈される心配は無く、安全に使うことが出来ます。
## `yii.js` スクリプト <span id="yii.js"></span>
* 最初の引数が登録されるべき CSS ファイルを指定します。
* 二番目の引数は、結果として生成される `<link>` タグの HTML 属性を指定するものです。
ただし、`depends` オプションは特別な処理を受けます。
このオプションは、この CSS ファイルが依存するアセットバンドルを指定するものです。
この例では、依存するアセットバンドルは [[yii\bootstrap\BootstrapAsset|BootstrapAsset]] です。
これは、この CSS ファイルが、[[yii\bootstrap\BootstrapAsset|BootstrapAsset]] に含まれる CSS ファイルの *後* に追加されることを意味します。
* 最後の引数は、この CSS ファイルを特定するための ID を指定するものです。
指定されていない場合は、CSS ファイルの URL が代りに ID として使用されます。
> Note: このセクションはまだ書かれていません。
> このセクションは、`yii.js` によって提供される以下の機能についての説明を含むはずのものです。
>
> - Yii JavaScript モジュール
> - CSRF パラメータの処理
> - `data-confirm` ハンドラ
> - `data-method` ハンドラ
> - スクリプトのフィルタリング
> - リダイレクトの処理
外部 CSS ファイルを登録するためには、[[yii\web\View::registerCssFile()|registerCssFile()]] を使うのではなく、[アセットバンドル](structure-assets.md) を使うことが強く推奨されます。
アセットバンドルを使うと、複数の CSS ファイルを結合して圧縮することが可能になります。
トラフィックの多いウェブサイトではそうすることが望まれます。

2
docs/guide-ja/output-data-providers.md

@ -34,7 +34,7 @@ $totalCount = $provider->getTotalCount();
データプロバイダのページネーションと並べ替えの振る舞いを指定するためには、その [[yii\data\BaseDataProvider::pagination|pagination]] と [[yii\data\BaseDataProvider::sort|sort]] のプロパティを構成します。
二つのプロパティは、それぞれ、[[yii\data\Pagination]] と [[yii\data\Sort]] の構成情報に対応します。
これらを false に設定して、ページネーションや並べ替えの機能を無効にすることも出来ます。
これらを `false` に設定して、ページネーションや並べ替えの機能を無効にすることも出来ます。
[データウィジェット](output-data-widgets.md)、例えば [[yii\grid\GridView]] は、`dataProvider` という名前のプロパティを持っており、これにデータプロバイダのインスタンスを受け取らせて、それが提供するデータを表示させることが出来ます。
例えば、

40
docs/guide-ja/output-data-widgets.md

@ -6,7 +6,7 @@ Yii はデータを表示するために使うことが出来る一連の [ウ
それに対して、[ListView](#list-view) と [GridView](#grid-view) は、複数のデータレコードをリストまたはテーブルで表示することが出来るもので、ページネーション、並べ替え、フィルタリングなどの機能を提供するものです。
DetailView
DetailView <a name="detail-view"></a>
----------
DetailView は単一のデータ [[yii\widgets\DetailView::$model|モデル]] の詳細を表示します。
@ -23,19 +23,42 @@ DetailView は [[yii\widgets\DetailView::$attributes]] プロパティを使っ
echo DetailView::widget([
'model' => $model,
'attributes' => [
'title', // title 属性 (平文テキストで)
'description:html', // description 属性は HTML としてフォーマットされる
[ // モデルの所有者の名前
'title', // title 属性 (平文テキストで)
'description:html', // description 属性は HTML としてフォーマットされる
[ // モデルの所有者の名前
'label' => '所有者',
'value' => $model->owner->name,
'contentOptions' => ['class' => 'bg-red'], // 値のタグをカスタマイズする HTML 属性
'captionOptions' => ['tooltip' => 'Tooltip'], // ラベルのタグをカスタマイズする HTML 属性
],
'created_at:datetime', // 作成日は datetime としてフォーマットされる
'created_at:datetime', // 作成日は datetime としてフォーマットされる
],
]);
```
[[yii\widgets\GridView|GridView]] が一組のモデルを処理するのとは異なって、
[[yii\widgets\DetailView|DetailView]] は一つのモデルしか処理しないということを覚えておいてください。
表示すべきモデルはビューの変数としてアクセスできる `$model` 一つだけですから、たいていの場合、クロージャを使用する必要はありません。
ListView
しかし、クロージャが役に立つ場合もあります。例えば、`visible` が指定されており、それが `false` と評価される場合には
`value` の計算を避けたい場合です。
```php
echo DetailView::widget([
'model' => $model,
'attributes' => [
[
'attribute' => 'owner',
'value' => function ($model) {
return $model->owner->name;
},
'visible' => \Yii::$app->user->can('posts.owner.view'),
],
],
]);
```
ListView <a name="list-view"></a>
--------
[[yii\widgets\ListView|ListView]] ウィジェットは、[データプロバイダ](output-data-providers.md) からのデータを表示するのに使用されます。
@ -267,7 +290,7 @@ echo GridView::widget([
コールバックのシグニチャは [[yii\grid\ActionColumn::createUrl()]] のそれと同じでなければなりません。
このプロパティが設定されていないときは、ボタンの URL は [[yii\grid\ActionColumn::createUrl()]] を使って生成されます。
- [[yii\grid\ActionColumn::visibleButtons|visibleButtons]] は、各ボタンの可視性の条件を定義する配列です。
配列のキーはボタンの名前 (波括弧を除く) であり、値は真偽値 true/false または無名関数です。
配列のキーはボタンの名前 (波括弧を除く) であり、値は真偽値 `true`/`false` または無名関数です。
ボタンの名前がこの配列の中で指定されていない場合は、デフォルトで、ボタンが表示されます。
コールバックは次のシグニチャを使わなければなりません。
@ -338,7 +361,8 @@ echo GridView::widget([
データをフィルタリングするためには、GridView は検索基準を表す [モデル](structure-models.md) を必要とします。
検索基準は、通常は、グリッドビューのテーブルのフィルタのフィールドから取得されます。
[アクティブレコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデルクラスを作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。
このクラスは、検索のためのバリデーション規則を定義し、検索基準に従って修正されたクエリを持つデータプロバイダを返す `search()` メソッドを提供するものです。
このクラスが、グリッドビューのテーブルに表示されるフィルタコントロールのための検証規則を定義し、
検索基準に従って修正されたクエリを持つデータプロバイダを返す `search()` メソッドを提供します。
`Post` モデルに対して検索機能を追加するために、次の例のようにして、`PostSearch` モデルを作成することが出来ます。

2
docs/guide-ja/output-formatting.md

@ -21,7 +21,7 @@ echo $formatter->asEmail('cebe@example.com');
echo $formatter->asBoolean(true);
// it also handles display of null values:
// 出力: (Not set)
// 出力: (not set)
echo $formatter->asDate(null);
```

2
docs/guide-ja/rest-authentication.md

@ -26,7 +26,7 @@ Yii は上記の全ての認証方法をサポートしています。新しい
3. [[yii\web\User::identityClass|ユーザアイデンティティクラス]] において [[yii\web\IdentityInterface::findIdentityByAccessToken()]] を実装します。
ステップ 1 は必須ではありませんが、ステートレスであるべき RESTful API のために推奨されます。
[[yii\web\User::enableSession|enableSession]] が false である場合、ユーザの認証ステータスがセッションを使ってリクエストをまたいで存続することはありません。
[[yii\web\User::enableSession|enableSession]] が `false` である場合、ユーザの認証ステータスがセッションを使ってリクエストをまたいで存続することはありません。
その代りに、すべてのリクエストに対して認証が実行されます。このことは、ステップ 2 と 3 によって達成されます。
> Tip: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーションコンポーネント(structure-application-components.md) の [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。

7
docs/guide-ja/rest-quick-start.md

@ -62,6 +62,10 @@ as `app\models\User`, the controller knows which model can be used for fetching
上記の構成情報は、主として、`user` コントローラの URL 規則を追加して、ユーザのデータが綺麗な URL と意味のある HTTP 動詞によってアクセスおよび操作できるようにするものです。
> Info: Yii はコントローラの名前を自動的に複数形にしてエンドポイントとして使用します (下の「試してみる」(#trying-it-out) を参照してください)。
> この振る舞いは [[yii\rest\UrlRule::$pluralize]] プロパティを使って構成することが可能です。
## JSON の入力を可能にする <span id="enabling-json-input"></span>
API が JSON 形式で入力データを受け取ることが出来るように、`request` [アプリケーションコンポーネント](structure-application-components.md) の [[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。
@ -93,9 +97,6 @@ API が JSON 形式で入力データを受け取ることが出来るように
* `OPTIONS /users`: エンドポイント `/users` に関してサポートされている動詞を示す
* `OPTIONS /users/123`: エンドポイント `/users/123` に関してサポートされている動詞を示す
> Info: Yii はコントローラの名前を自動的に複数形にしてエンドポイントとして使用します。
> この振る舞いは [[yii\rest\UrlRule::$pluralize]] プロパティを使って構成することが可能です。
作成した API は、次のように、`curl` コマンドでアクセスすることが出来ます。
```

2
docs/guide-ja/rest-rate-limiting.md

@ -58,4 +58,4 @@ public function behaviors()
* `X-Rate-Limit-Remaining` - 現在の期間において残っている許可されているリクエスト数
* `X-Rate-Limit-Reset` - 許可されているリクエストの最大数にリセットされるまで待たなければならない秒数
これらのヘッダは、上記のコード例で示されているように、[[yii\filters\RateLimiter::enableRateLimitHeaders]] を false に設定することで無効にすることが出来ます。
これらのヘッダは、上記のコード例で示されているように、[[yii\filters\RateLimiter::enableRateLimitHeaders]] を `false` に設定することで無効にすることが出来ます。

37
docs/guide-ja/rest-resources.md

@ -93,7 +93,7 @@ public function fields()
### `extraFields()` をオーバーライドする<span id="overriding-extra-fields"></span>
デフォルトでは、[[yii\base\Model::extraFields()]] は何も返さず、[[yii\db\ActiveRecord::extraFields()]] は DB から取得されたリレーションの名前を返します。
デフォルトでは、[[yii\base\Model::extraFields()]] は空の配列を返し、[[yii\db\ActiveRecord::extraFields()]] は DB から取得されたリレーションの名前を返します。
`extraFields()` によって返されるデータの形式は `fields()` のそれと同じです。
通常、`extraFields()` は、主として、値がオブジェクトであるフィールドを指定するのに使用されます。
@ -140,23 +140,41 @@ HATEOAS のキーポイントは、リソースデータが API によって提
例えば、
```php
use yii\db\ActiveRecord;
use yii\web\Link;
use yii\base\Model;
use yii\web\Link; // JSON ハイパーメディア API 言語に定義されているリンクオブジェクトを表す
use yii\web\Linkable;
use yii\helpers\Url;
class User extends ActiveRecord implements Linkable
class UserResource extends Model implements Linkable
{
public $id;
public $email;
//...
public function fields()
{
return ['id', 'email'];
}
public function extraFields()
{
return ['profile'];
}
public function getLinks()
{
return [
Link::REL_SELF => Url::to(['user/view', 'id' => $this->id], true),
'edit' => Url::to(['user/view', 'id' => $this->id], true),
'profile' => Url::to(['user/profile/view', 'id' => $this->id], true),
'index' => Url::to(['users'], true),
];
}
}
```
`User` オブジェクトがレスポンスで返されるとき、レスポンスはそのユーザに関連するリンクを表現する `_links` 要素を含むことになります。
`UserResource` オブジェクトがレスポンスで返されるとき、レスポンスはそのユーザに関連するリンクを表現する `_links` 要素を含むことになります。
例えば、
```
@ -167,6 +185,15 @@ class User extends ActiveRecord implements Linkable
"_links" => {
"self": {
"href": "https://example.com/users/100"
},
"edit": {
"href": "https://example.com/users/100"
},
"profile": {
"href": "https://example.com/users/profile/100"
},
"index": {
"href": "https://example.com/users"
}
}
}

2
docs/guide-ja/rest-routing.md

@ -72,7 +72,7 @@
エンドポイントの URL ではコントローラ ID `user``users` という複数形で出現していることに気が付いたかもしれません。
これは、[[yii\rest\UrlRule]] が子 URL 規則を作るときに、コントローラの ID を自動的に複数形にするためです。
この振る舞いは [[yii\rest\UrlRule::pluralize]] を false に設定することで無効にすることが出来ます。
この振る舞いは [[yii\rest\UrlRule::pluralize]] を `false` に設定することで無効にすることが出来ます。
> Info: コントローラ ID の複数形化は [[yii\helpers\Inflector::pluralize()]] によって行われます。
このメソッドは特殊な複数形の規則を考慮します。

8
docs/guide-ja/runtime-handling-errors.md

@ -10,7 +10,7 @@ Yii が内蔵している [[yii\web\ErrorHandler|エラーハンドラ]] は、
* さまざまなエラーレスポンス形式をサポートしています。
[[yii\web\ErrorHandler|エラーハンドラ]] はデフォルトで有効になっています。
アプリケーションの [エントリスクリプト](structure-entry-scripts.md) において、定数 `YII_ENABLE_ERROR_HANDLER` を false と定義することによって、これを無効にすることが出来ます。
アプリケーションの [エントリスクリプト](structure-entry-scripts.md) において、定数 `YII_ENABLE_ERROR_HANDLER``false` と定義することによって、これを無効にすることが出来ます。
## エラーハンドラを使用する <span id="using-error-handler"></span>
@ -59,8 +59,8 @@ throw new NotFoundHttpException();
## エラー表示をカスタマイズする <span id="customizing-error-display"></span>
[[yii\web\ErrorHandler|エラーハンドラ]] は、定数 `YII_DEBUG` の値に従って、エラー表示を調整します。
`YII_DEBUG` が true である (デバッグモードである) 場合は、エラーハンドラは、デバッグがより容易になるように、例外とともに、詳細なコールスタック情報とソースコード行を表示します。
そして、`YII_DEBUG` が false のときは、アプリケーションに関する公開できない情報の開示を防ぐために、エラーメッセージだけが表示されます。
`YII_DEBUG``true` である (デバッグモードである) 場合は、エラーハンドラは、デバッグがより容易になるように、例外とともに、詳細なコールスタック情報とソースコード行を表示します。
そして、`YII_DEBUG` が `false` のときは、アプリケーションに関する公開できない情報の開示を防ぐために、エラーメッセージだけが表示されます。
> Info: 例外が [[yii\base\UserException]] の子孫である場合は、`YII_DEBUG` の値の如何にかかわらず、コールスタックは表示されません。
これは、この種の例外はユーザの誤操作によって引き起こされるものであり、開発者は何も修正する必要がないと考えられるからです。
@ -68,7 +68,7 @@ throw new NotFoundHttpException();
デフォルトでは、[[yii\web\ErrorHandler|エラーハンドラ]] は二つの [ビュー](structure-views.md) を使ってエラーを表示します。
* `@yii/views/errorHandler/error.php`: エラーがコールスタック情報なしで表示されるべき場合に使用されます。
`YII_DEBUG` が false の場合、これが表示される唯一のビューとなります。
`YII_DEBUG``false` の場合、これが表示される唯一のビューとなります。
* `@yii/views/errorHandler/exception.php`: エラーがコールスタック情報と共に表示されるべき場合に使用されます。
エラー表示をカスタマイズするために、エラーハンドラの [[yii\web\ErrorHandler::errorView|errorView]] および [[yii\web\ErrorHandler::exceptionView|exceptionView]] プロパティを構成して、自分自身のビューを使用することが出来ます。

5
docs/guide-ja/runtime-responses.md

@ -191,8 +191,9 @@ public function actionOld()
そして、クライアントサイドで、このヘッダの値を読み、それに応じてブラウザをリダイレクトする JavaScript を書くことが出来ます。
> Info: Yii には `yii.js` という JavaScript ファイルが付属しています。
これは、よく使われる一連の JavaScript 機能を提供するもので、その中には `X-Redirect` ヘッダに基づくブラウザのリダイレクトも含まれています。
従って、あなたが ([[yii\web\YiiAsset]] アセットバンドルを登録して) この JavaScript ファイルを使うつもりなら、AJAX のリダイレクトをサポートするためには、何も書く必要がなくなります。
これは、よく使われる一連の JavaScript 機能を提供するもので、その中には `X-Redirect` ヘッダに基づくブラウザのリダイレクトも含まれています。
従って、あなたが ([[yii\web\YiiAsset]] アセットバンドルを登録して) この JavaScript ファイルを使うつもりなら、AJAX のリダイレクトをサポートするためには、何も書く必要がなくなります。
`yii.js` に関する更なる情報は [クライアントスクリプトの節](output-client-scripts.md#yii.js) にあります。
## ファイルを送信する <span id="sending-files"></span>

177
docs/guide-ja/runtime-routing.md

@ -34,14 +34,17 @@ $url = Url::to(['post/view', 'id' => 100]);
## URL 形式 <span id="url-formats"></span>
[[yii\web\UrlManager|URL マネージャ]] は二つの URL 形式、すなわち、デフォルトの URL 形式と、綺麗な URL 形式をサポートします。
[[yii\web\UrlManager|URL マネージャ]] は二つの URL 形式をサポートします。すなわち、
デフォルトの URL 形式は、`r` というクエリパラメータを使用してルートを表し、通常のクエリパラメータを使用してルートに結び付けられたクエリパラメータを表します。
- デフォルトの URL 形式と、
- 綺麗な URL (プリティ URL) の 形式。
デフォルトの URL 形式は、`r` という [[yii\web\UrlManager::$routeParam|クエリパラメータ]] を使用してルートを表し、通常のクエリパラメータを使用してルートに結び付けられたクエリパラメータを表します。
例えば、`/index.php?r=post/view&id=100` という URL は、`post/view` というルートと、`id` というクエリパラメータが 100 であることを表します。
デフォルトの URL 形式は、[[yii\web\UrlManager|URL マネージャ]] についての構成を何も必要とせず、ウェブサーバの設定がどのようなものでも動作します。
綺麗な URL 形式は、エントリスクリプトの名前に続く追加のパスを使用して、ルートとそれに結び付けられたクエリパラメータを表します。
例えば、`/index.php/post/100` という URL の追加のパスは `/post/100` ですが、適切な [[yii\web\UrlManager::rules|URL 規則]] があれば、この URL が `post/view` というルートと `id` というクエリパラメータが 100 であることを表すことが出来ます。
例えば、`/index.php/post/100` という URL の追加のパスは `/post/100` ですが、適切な [[yii\web\UrlManager::rules|URL 規則]] があれば、この追加のパスが `post/view` というルートと `id` のクエリパラメータ `100` を表すものとすることが出来ます。
綺麗な URL 形式を使用するためには、URL をどのように表現すべきかという実際の要求に従って、一連の [[yii\web\UrlManager::rules|URL 規則]] を設計する必要があります。
この二つの URL 形式は、[[yii\web\UrlManager|URL マネージャ]] の [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] プロパティを ON/OFF することによって、他のアプリケーションコードを少しも変えることなく、切り替えることが出来ます。
@ -49,8 +52,10 @@ $url = Url::to(['post/view', 'id' => 100]);
## ルーティング <span id="routing"></span>
ルーティングは二つのステップを含みます。最初のステップでは、入ってくるリクエストが解析されて、ルートとそれに結び付けられたクエリパラメータに分解されます。
そして、第二のステップでは、解析されたルートに対応する [コントローラアクション](structure-controllers.md#actions) がリクエストを処理するために生成されます。
ルーティングは二つのステップを含みます。
- まず、入ってくるリクエストが解析されて、ルートとそれに結び付けられたクエリパラメータに分解されます。
- そして、解析されたルートに対応する [コントローラアクション](structure-controllers.md#actions) がリクエストを処理するために生成されます。
デフォルトの URL 形式を使っている場合は、リクエストからルートを解析することは、`r` という名前の `GET` クエリパラメータを取得するだけの簡単なことです。
@ -117,7 +122,7 @@ $url = Url::to(['post/view', 'id' => 100]);
`catchAll` プロパティは配列を取り、最初の要素はルートを指定し、残りの要素 (「名前-値」のペア) は [アクションのパラメータ](structure-controllers.md#action-parameters) を指定するものでなければなりません。
> Info: このプロパティを有効にすると、開発環境でデバッグパネルが動作しなくなります。
> Info: このプロパティを有効にすると、開発環境で [デバッグツールバー](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md)が 動作しなくなります。
## URL を生成する <span id="creating-urls"></span>
@ -173,14 +178,14 @@ echo Url::to(['post/index']);
// 絶対ルート: /index.php?r=post%2Findex
echo Url::to(['/post/index']);
// /index.php?r=post%2Findex エイリアス "@posts" が "/post/index" と定義されていると仮定
// "/post/index" と定義されているエイリアス "@posts"を使用: /index.php?r=post%2Findex
echo Url::to(['@posts']);
```
[[yii\helpers\Url::to()]] メソッドは、[[yii\web\UrlManager|URL マネージャ]] の [[yii\web\UrlManager::createUrl()|createUrl()]] メソッド、および、[[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]] を呼び出すことによって実装されています。
次に続くいくつかの項では、[[yii\web\UrlManager|URL マネージャ]] を構成して、生成される URL の形式をカスタマイズする方法を説明します。
[[yii\helpers\Url::to()]] メソッドは、特定のルートとの関係を持たない URL の生成もサポートしています。
[[yii\helpers\Url::to()]] メソッドは、特定のルートとの関係を持た**ない** URL の生成もサポートしています。
その場合、最初のパラメータには、配列を渡す代りに文字列を渡さなければなりません。例えば、
```php
@ -242,7 +247,7 @@ echo Url::previous();
その他のプロパティはオプションですが、上記で示されている構成が最もよく用いられているものです。
* [[yii\web\UrlManager::showScriptName|showScriptName]]: このプロパティは、生成される URL にエントリスクリプトを含めるべきかどうかを決定します。
例えば、このプロパティを false にすると、`/index.php/post/100` という URL を生成する代りに、`/post/100` という URL を生成することが出来ます。
例えば、このプロパティを `false` にすると、`/index.php/post/100` という URL を生成する代りに、`/post/100` という URL を生成することが出来ます。
* [[yii\web\UrlManager::enableStrictParsing|enableStrictParsing]]: このプロパティは、厳密なリクエスト解析を有効にするかどうかを決定します。
厳密な解析が有効にされた場合、リクエストされた URL が有効なリクエストとして扱われるためには、それが [[yii\web\UrlManager::rules|rules]] の少なくとも一つに合致しなければなりません。
そうでなければ、[[yii\web\NotFoundHttpException]] が投げられます。
@ -250,13 +255,13 @@ echo Url::previous();
* [[yii\web\UrlManager::rules|rules]]: このプロパティが URL を解析および生成するための一連の規則を含みます。
このプロパティが、アプリケーションの固有の要求を満たす形式を持つ URL を生成するために、あなたが主として使うプロパティです。
> Note: 生成された URL からエントリスクリプト名を隠すためには、[[yii\web\UrlManager::showScriptName|showScriptName]] を false に設定するだけでなく、ウェブサーバを構成して、リクエストされた URL が PHP スクリプトを明示的に指定していない場合でも、正しい PHP スクリプトを特定出来るようにする必要があります。
もしあなたが Apache ウェブサーバを使うつもりなら、[インストール](start-installation.md#recommended-apache-configuration) の節で説明されている推奨設定を参照することが出来ます。
> Note: 生成された URL からエントリスクリプト名を隠すためには、[[yii\web\UrlManager::showScriptName|showScriptName]] を `false` に設定するだけでなく、ウェブサーバを構成して、リクエストされた URL が PHP スクリプトを明示的に指定していない場合でも、正しい PHP スクリプトを特定出来るようにする必要があります。
もしあなたが Apache または nginx ウェブサーバを使うつもりなら、[インストール](start-installation.md#recommended-apache-configuration) の節で説明されている推奨設定を参照することが出来ます。
### URL 規則 <span id="url-rules"></span>
URL 規則は [[yii\web\UrlRule]] またはその子クラスのインスタンスです。
URL 規則は [[yii\web\UrlRuleInterface]] を実装するクラス、通常は、[[yii\web\UrlRule]] クラスです。
すべての URL 規則は、URL のパス情報の部分との照合に使われるパターン、ルート、そして、いくつかのクエリパラメータから構成されます。
URL 規則は、パターンがリクエストされた URL と合致する場合に、リクエストの解析に使用することが出来ます。
また、URL 規則は、ルートとクエリパラメータ名が与えられたものと合致する場合に、URL の生成に使用することが出来ます。
@ -266,14 +271,14 @@ URL 規則は、パターンがリクエストされた URL と合致する場
そして、その合致する規則を使って URL を解析して、ルートとそれに結び付けられたパラメータを得ます。
同じように、URL を生成するためには、[[yii\web\UrlManager|URL マネージャ]] は、与えられたルートとパラメータに合致する最初の規則を探して、それを使って URL を生成します。
[[yii\web\UrlManager::rules]] は、パターンをキーとし、それに対応するルートを値とする配列として構成することが出来ます。
[[yii\web\UrlManager::rules]] は、 [[yii\web\UrlRule::$pattern|パターン]] をキーとし、それに対応する [[yii\web\UrlRule::$route|ルート]] を値とする配列として構成することが出来ます。
「パターン - ルート」のペアが、それぞれ、URL 規則を構成します。
例えば、次の [[yii\web\UrlManager::rules|rules]] の構成は、二つの URL 規則を宣言するものです。
最初の規則は `posts` という URL に合致し、それを `post/index` というルートにマップします。
第二の規則は `post/(\d+)` という正規表現にマッチする URL に合致し、それを `post/view` というルートと `id` という名前のパラメータにマップします。
```php
[
'rules' => [
'posts' => 'post/index',
'post/<id:\d+>' => 'post/view',
]
@ -288,9 +293,8 @@ URL 規則は、「パターン - ルート」のペアとして宣言する以
例えば、
```php
[
'rules' => [
// ... 他の URL 規則 ...
[
'pattern' => 'posts',
'route' => 'post/index',
@ -300,15 +304,16 @@ URL 規則は、「パターン - ルート」のペアとして宣言する以
```
URL 規則の構成情報で `class` を指定しない場合は、デフォルトとして、[[yii\web\UrlRule]] が使われます。
このクラスが、[[yii\web\UrlManager::$ruleConfig]] でデフォルト値として定義されています。
### 名前付きパラメータ <span id="named-parameters"></span>
URL 規則は、パターンの中で `<ParamName:RgExp>` の形式で指定される、いくつかの名前付きクエリパラメータと結び付けることが出来ます。
URL 規則は、パターンの中で `<ParamName:RgExp>` の形式で指定される、名前付きクエリパラメータと結び付けることが出来ます。
ここで、`ParamName` はパラメータ名を指定し、`RegExp` はパラメータの値との照合に使われるオプションの正規表現を指定するものです。
`RegExp` が指定されていない場合は、パラメータの値がスラッシュを含まない文字列であるべきことを意味します。
> Note: 正規表現はパラメータに対してのみ指定できます。パターンの残りの部分はプレーンテキストとして解釈されます。
> Note: 正規表現はパラメータの中でのみ使用できます。パターンの残りの部分はプレーンテキストとして解釈されます。
規則が URL の解析に使われるときには、URL の対応する部分に合致した値が、結び付けられたパラメータに入れられます。
そして、そのパラメータは、後に `request` アプリケーションコンポーネントによって、`$_GET` に入れられて利用できるようになります。
@ -317,7 +322,7 @@ URL 規則は、パターンの中で `<ParamName:RgExp>` の形式で指定さ
名前付きパラメータの動作を説明するためにいくつかの例を挙げましょう。次の三つの URL 規則を宣言したと仮定してください。
```php
[
'rules' => [
'posts/<year:\d{4}>/<category>' => 'post/index',
'posts' => 'post/index',
'post/<id:\d+>' => 'post/view',
@ -329,8 +334,9 @@ URL 規則は、パターンの中で `<ParamName:RgExp>` の形式で指定さ
- `/index.php/posts` は、二番目の規則を使って解析され、ルート `post/index` になります。
- `/index.php/posts/2014/php` は、最初の規則を使って解析され、ルートは `post/index`、`year` パラメータの値は 2014、そして、`category` パラメータの値は `php` となります。
- `/index.php/post/100` は、三番目の規則を使って解析され、ルートが `post/view`、`id` パラメータの値が 100 となります。
- `/index.php/posts/php` は、どのパターンにも合致しないため、[[yii\web\UrlManager::enableStrictParsing]] が true の場合は、[[yii\web\NotFoundHttpException]] を引き起こします。
[[yii\web\UrlManager::enableStrictParsing]] が false (これがデフォルト値です) の場合は、パス情報の部分である `posts/php` がルートとして返されることになります。
- `/index.php/posts/php` は、どのパターンにも合致しないため、[[yii\web\UrlManager::enableStrictParsing]] が `true` の場合は、[[yii\web\NotFoundHttpException]] を引き起こします。
[[yii\web\UrlManager::enableStrictParsing]] が `false` (これがデフォルト値です) の場合は、パス情報の部分である `posts/php` がルートとして返されることになります。
こうして解析されたルートに対応するアクションがあればそれが実行され、そうでなければ [[yii\web\NotFoundHttpException]] が投げられます。
規則が URL 生成に使われる場合は、
@ -349,20 +355,23 @@ URL 規則のルートにはパラメータ名を埋め込むことが出来ま
例えば、以下の規則は `controller``action` というパラメータをルートに埋め込んでいます。
```php
[
'<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>',
'rules' => [
'<controller:(post|comment)>/create' => '<controller>/create',
'<controller:(post|comment)>/<id:\d+>/<action:(update|delete)>' => '<controller>/<action>',
'<controller:(post|comment)>/<id:\d+>' => '<controller>/view',
'<controller:(post|comment)>s' => '<controller>/index',
]
```
`/index.php/comment/100/create` という URL の解析には、最初の規則が適用され、`controller` パラメータには `comment`、`action` パラメータには `create` がセットされます。
こうして、`<controller>/<action>` というルートは、`comment/create` として解決されます。
`/index.php/comment/100/update` という URL の解析には、二番目の規則が適用され、`controller` パラメータには `comment`、`action` パラメータには `update` がセットされます。
こうして、`<controller>/<action>` というルートは、`comment/update` として解決されます。
同じように、`comment/index` というルートの URL を生成するためには、三番目の規則が適用されて、`index.php/comments` という URL が生成されます。
同じように、`comment/index` というルートの URL を生成するためには、最後の規則が適用されて、`index.php/comments` という URL が生成されます。
> Info: ルートをパラメータ化することによって、URL 規則の数を大幅に減らすことが可能になり、[[yii\web\UrlManager|URL マネージャ]] のパフォーマンスを目に見えて改善することが出来ます。
### デフォルトのパラメータ値 <span id="default-parameter-values"></span>
デフォルトでは、規則の中で宣言されたパラメータは必須となります。
リクエストされた URL が特定のパラメータを含まない場合や、特定のパラメータなしで URL を生成する場合には、規則は適用されません。
パラメータのどれかをオプション扱いにしたい場合は、規則の [[yii\web\UrlRule::defaults|defaults]] プロパティを構成することが出来ます。
@ -371,7 +380,7 @@ URL 規則のルートにはパラメータ名を埋め込むことが出来ま
次の規則の宣言においては、`page` と `tag` のパラメータは両方ともオプション扱いで、提供されなかった場合は、それぞれ、1 と空文字列を取ります。
```php
[
'rules' => [
// ... 他の規則 ...
[
'pattern' => 'posts/<page:\d+>/<tag>',
@ -398,7 +407,7 @@ URL 規則のパターンには、ウェブサーバ名を含むことが出来
例えば、次の規則は、`http://admin.example.com/login` という URL を `admin/user/login` のルートとして解析し、`http://www.example.com/login` を `site/login` として解析するものです。
```php
[
'rules' => [
'http://admin.example.com/login' => 'admin/user/login',
'http://www.example.com/login' => 'site/login',
]
@ -408,14 +417,16 @@ URL 規則のパターンには、ウェブサーバ名を含むことが出来
例えば、次の規則は `http://en.example.com/posts` という URL を解析して、`post/index` というルートと `language=en` というパラメータを取得するものです。
```php
[
'rules' => [
'http://<language:\w+>.example.com/posts' => 'post/index',
]
```
> Note: サーバ名を持つ規則は、エントリスクリプトのサブフォルダをパターンに含むべきではありません。
例えば、アプリケーションが `http://www.example.com/sandbox/blog` の下にある場合は、`http://www.example.com/sandbox/blog/posts` ではなく、`http://www.example.com/posts` というパターンを使うべきです。
こうすれば、アプリケーションをどのようなディレクトリに配置しても、アプリケーションのコードを変更する必要がなくなります。
> Note: サーバ名を持つ規則は、そのパターンに、エントリスクリプトのサブフォルダを**含まない**ようにすべきです。
例えば、アプリケーションのエントリスクリプトが `http://www.example.com/sandbox/blog/index.php` である場合は、
`http://www.example.com/sandbox/blog/posts` ではなく、`http://www.example.com/posts` というパターンを使うべきです。
こうすれば、アプリケーションをどのようなディレクトリに配置しても、URL 規則を変更する必要がなくなります。
Yii はアプリケーションのベース URL を自動的に検出します。
### URL 接尾辞 <span id="url-suffixes"></span>
@ -430,8 +441,7 @@ URL 規則のパターンには、ウェブサーバ名を含むことが出来
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
// ...
'suffix' => '.html',
'rules' => [
// ...
@ -446,7 +456,7 @@ URL 規則のパターンには、ウェブサーバ名を含むことが出来
> Tip: URL が全てスラッシュで終るようにするためには、URL 接尾辞として `/` を設定することが出来ます。
> Note: URL 接尾辞を構成すると、リクエストされた URL が接尾辞を持たない場合は、認識できない URL であると見なされるようになります。
SEO の目的からも、これが推奨されるプラクティスです。
これは、異なる URL 上の重複コンテンツを防止するためのものであり、SEO (検索エンジン最適化) の見地からも推奨されるプラクティスです。
場合によっては、URL によって異なる接尾辞を使いたいことがあるでしょう。
その目的は、個々の URL 規則の [[yii\web\UrlRule::suffix|suffix]] プロパティを構成することによって達成できます。
@ -458,8 +468,7 @@ URL 規則にこのプロパティが設定されている場合は、それが
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
// ...
'suffix' => '.html',
'rules' => [
// ...
@ -481,17 +490,17 @@ RESTful API を実装するときは、使用されている HTTP メソッド
これは、規則のパターンにサポートされている HTTP メソッドを前置することによって、簡単に達成することが出来ます。
一つの規則が複数の HTTP メソッドをサポートする場合は、メソッド名をカンマで区切ります。
例えば、次の三つの規則は、`post/<id:\d+>` という同一のパターンを持って、異なる HTTP メソッドをサポートするものです。
`PUT post/100` に対するリクエストは `post/create` と解析され、`GET post/100` に対するリクエストは `post/view` と解析されることになります。
`PUT post/100` に対するリクエストは `post/update` と解析され、`GET post/100` に対するリクエストは `post/view` と解析されることになります。
```php
[
'PUT,POST post/<id:\d+>' => 'post/create',
'rules' => [
'PUT,POST post/<id:\d+>' => 'post/update',
'DELETE post/<id:\d+>' => 'post/delete',
'post/<id:\d+>' => 'post/view',
]
```
> Note: URL 規則が HTTP メソッドをパターンに含む場合、その規則は解析目的にだけ使用されます。
> Note: URL 規則が HTTP メソッドをパターンに含む場合、指定されたメソッドに `GET` が入っていない限り、その規則は解析目的にだけ使用されます。
[[yii\web\UrlManager|URL マネージャ]] が URL 生成のために呼ばれたときは、その規則はスキップされます。
> Tip: RESTful API のルーティングを簡単にするために、Yii は特別な URL 規則クラス [[yii\rest\UrlRule]] を提供しています。
@ -499,33 +508,11 @@ RESTful API を実装するときは、使用されている HTTP メソッド
詳細については、RESTful API 開発についての [ルーティング](rest-routing.md) の節を参照してください。
### 規則をカスタマイズする <span id="customizing-rules"></span>
これまでの例では、URL 規則は主として「パターン - ルート」のペアの形で宣言されています。これが通常使用される短縮形式です。
特定のシナリオの下では、[[yii\web\UrlRule::suffix]] などのような、他のプロパティを構成して URL 規則をカスタマイズしたいこともあるでしょう。
完全な構成情報配列を使って規則を指定すれば、そうすることが出来ます。
次の例は、[URL 接尾辞](#url-suffixes) の項から抜き出したものです。
```php
[
// ... 他の URL 規則 ...
[
'pattern' => 'posts',
'route' => 'post/index',
'suffix' => '.json',
],
]
```
> Info: 規則の構成情報で `class` を指定しない場合は、デフォルトとして、[[yii\web\UrlRule]] クラスが使われます。
### 規則を動的に追加する <span id="adding-rules"></span>
URL 規則は [[yii\web\UrlManager|URL マネージャ]] に動的に追加することが出来ます。
このことは、再配布可能な [モジュール](structure-modules.md) が自分自身の URL 規則を管理する必要がある場合に、しばしば必要になります。
動的に追加された規則がルーティングのプロセスで効果を発揮するためには、その規則を [ブートストラップ](runtime-bootstrapping.md) の段階で追加しなければなりません。
動的に追加された規則がルーティングのプロセスで効果を発揮するためには、その規則をアプリケーションの [ブートストラップ](runtime-bootstrapping.md) の段階で追加しなければなりません。
これは、モジュールにとっては、次のように、[[yii\base\BootstrapInterface]] を実装して、[[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドの中で規則を追加しなければならないことを意味します。
```php
@ -549,6 +536,8 @@ public function bootstrap($app)
この問題を解決するために、次のような URL 規則クラスを作成することが出来ます。
```php
<?php
namespace app\components;
use yii\web\UrlRuleInterface;
@ -566,7 +555,7 @@ class CarUrlRule extends Object implements UrlRuleInterface
return $params['manufacturer'];
}
}
return false; // この規則は適用されない
return false; // この規則は適用されない
}
public function parseRequest($manager, $request)
@ -575,10 +564,10 @@ class CarUrlRule extends Object implements UrlRuleInterface
if (preg_match('%^(\w+)(/(\w+))?$%', $pathInfo, $matches)) {
// $matches[1] と $matches[3] をチェックして、
// データベースの中の製造者とモデルに合致するかどうか調べる
// 合致すれば、$params['manufacturer'] および/または $params['model'] をセットし、
// ['car/index', $params] を返す
// 合致すれば、$params['manufacturer'] および/または $params['model']
// をセットし、['car/index', $params] を返す
}
return false; // この規則は適用されない
return false; // この規則は適用されない
}
}
```
@ -586,9 +575,8 @@ class CarUrlRule extends Object implements UrlRuleInterface
そして、[[yii\web\UrlManager::rules]] の構成情報で、新しい規則クラスを使います。
```php
[
'rules' => [
// ... 他の規則 ...
[
'class' => 'app\components\CarUrlRule',
// ... 他のプロパティを構成する ...
@ -597,6 +585,55 @@ class CarUrlRule extends Object implements UrlRuleInterface
```
## URL の正規化 <span id="url-normalization"></span>
バージョン 2.0.10 以降、[[yii\web\UrlManager|UrlManager]] で [[yii\web\UrlNormalizer|UrlNormalizer]] を使って、
同一 URL のバリエーション (例えば、末尾のスラッシュの有無) の問題を処理する出来るようになりました。
技術的には `http://example.com/path``http://example.com/path/` は別の URL ですから、
これらの両方に同一のコンテントを提供することは SEO ランキングを低下させる可能性があります。
デフォルトでは、URL ノーマライザは、連続したスラッシュを畳み、サフィックスが末尾のスラッシュを持っているかどうかに従って末尾のスラッシュを追加または削除し、
正規化された URL に [恒久的な移動](https://en.wikipedia.org/wiki/HTTP_301) を使ってリダイレクトします。
ノーマライザは、URL マネージャのためにグローバルに構成することも、各規則のために個別に構成することも出来ます。
各規則は、デフォルトでは、URL マネージャのノーマライザを使用します。
[[yii\web\UrlRule::$normalizer|UrlRule::$normalizer]] を `false` にすれば、特定の URL 規則について正規化を無効にすることが出来ます。
次に、[[yii\web\UrlNormalizer|UrlNormalizer]] の構成例を示します。
```php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'suffix' => '.html',
'normalizer' => [
'class' => 'yii\web\UrlNormalizer',
// デバッグのために、恒久的移動のかわりに一時的リダイレクションを使う
'action' => UrlNormalizer::ACTION_REDIRECT_TEMPORARY,
],
'rules' => [
// ... 他の規則 ...
[
'pattern' => 'posts',
'route' => 'post/index',
'suffix' => '/',
'normalizer' => false, // この規則では正規化を無効にする
],
[
'pattern' => 'tags',
'route' => 'tag/index',
'normalizer' => [
// この規則では連続するスラッシュを畳まない
'collapseSlashes' => false,
],
],
],
]
```
> Note: デフォルトでは [[yii\web\UrlManager::$normalizer|UrlManager::$normalizer]] は無効になっています。
URL の正規化を有効にするためには、明示的に構成する必要があります。
## パフォーマンスに対する考慮 <span id="performance-consideration"></span>
複雑なウェブアプリケーションを開発するときは、リクエストの解析と URL 生成に要する時間を削減するために URL 規則を最適化することが重要になります。

4
docs/guide-ja/runtime-sessions-cookies.md

@ -288,7 +288,7 @@ unset($cookies['language']);
や [[yii\web\Cookie::expire|expire]] など、他のプロパティを定義して、利用可能なクッキー情報の全てを完全に表しています。
クッキーを準備するときに必要に応じてこれらのプロパティを構成してから、レスポンスのクッキーコレクションに追加することが出来ます。
> Note: セキュリティを向上させるために、[[yii\web\Cookie::httpOnly]] のデフォルト値は true に設定されています。
> Note: セキュリティを向上させるために、[[yii\web\Cookie::httpOnly]] のデフォルト値は `true` に設定されています。
これは、クライアントサイドスクリプトが保護されたクッキーにアクセスする危険を軽減するものです (ブラウザがサポートしていれば)。
詳細については、[httpOnly wiki article](https://www.owasp.org/index.php/HttpOnly) を読んでください。
@ -304,7 +304,7 @@ unset($cookies['language']);
これは、サードパーティのライブラリが、クッキー検証を含まない独自の方法でクッキーを操作することが出来るようにするするためです。
クッキー検証はデフォルトで有効になっています。
[[yii\web\Request::enableCookieValidation]] プロパティを false に設定することによって無効にすることが出来ますが、無効にしないことを強く推奨します。
[[yii\web\Request::enableCookieValidation]] プロパティを `false` に設定することによって無効にすることが出来ますが、無効にしないことを強く推奨します。
> Note: `$_COOKIE``setcookie()` によって直接に 読み出し/送信 されるクッキーは検証されません。

4
docs/guide-ja/security-authorization.md

@ -245,6 +245,10 @@ return [
`yii migrate --migrationPath=@yii/rbac/migrations`
異なる名前空間のマイグレーションを扱う方法の詳細については
[分離されたマイグレーション](db-migrations.md#separated-migrations) の節を参照して下さい。
これで `authManager``\Yii::$app->authManager` によってアクセスすることが出来るようになります。

43
docs/guide-ja/security-best-practices.md

@ -227,3 +227,46 @@ H5BP プロジェクトが提供する構成例を参考にすることも出来
- [Apache](https://github.com/h5bp/server-configs-apache).
- [IIS](https://github.com/h5bp/server-configs-iis).
- [Lighttpd](https://github.com/h5bp/server-configs-lighttpd).
サーバの構成をセキュアにする
----------------------------
この節の目的は、Yii ベースのウェブサイトをホストするサーバの構成を作成するときに、
考慮に入れなければならないリスクに照明を当てることにあります。
ここで触れられる問題点以外にも、セキュリティに関連して考慮すべき構成オプションがあるかもしれません。
この節の説明が完全であるとは考えないで下さい。
### `Host` ヘッダ攻撃を避ける
[[yii\web\UrlManager]] や [[yii\helpers\Url]] のクラスは、リンクを生成するために [[yii\web\Request::getHostInfo()|現在リクエストされているホスト名]] を使うことがあります。
って
ウェブサーバが `Host` ヘッダの値とは無関係に同じサイトとして応答するように構成されている場合は、
この情報は [HTTP リクエストを送信するユーザによって偽装され](https://www.acunetix.com/vulnerabilities/web/host-header-attack) て、信頼できないものになっている可能性があります。
そのような状況においては、ウェブサーバの構成を改修して、指定されたホスト名に対してのみ応答するようにするか、
または、`request` アプリケーションコンポーネントの [[yii\web\Request::setHostInfo()|hostInfo]] プロパティを設定して、ホスト名の値を設定ないしフィルタするか、
どちらかの対策を取るべきです。
サーバの構成についての詳細な情報は、ウェブサーバのドキュメントを参照して下さい。
- Apache 2: <http://httpd.apache.org/docs/trunk/vhosts/examples.html#defaultallports>
- Nginx: <https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/>
サーバの構成にアクセスする権限がない場合は、このような攻撃に対して防御するために、[[yii\filters\HostControl]] フィルタを設定することが出来ます。
```php
// ウェブアプリケーション構成ファイル
return [
'as hostControl' => [
'class' => 'yii\filters\HostControl',
'allowedHosts' => [
'example.com',
'*.example.com',
],
'fallbackHostInfo' => 'https://example.com',
],
// ...
];
```
> Note: 「ホストヘッダ攻撃」に対する保護のためには、常に、フィルタの使用よりもウェブサーバの構成を優先すべきです。
[[yii\filters\HostControl]] は、サーバの構成が出来ない場合にだけ使うべきものです。

2
docs/guide-ja/start-forms.md

@ -57,7 +57,7 @@ class EntryForm extends Model
* `email` のデータは構文的に有効なメールアドレスでなければならない
ユーザによって入力されたデータを `EntryForm` オブジェクトに投入した後、[[yii\base\Model::validate()|validate()]] を呼んでデータ検証ルーチンを始動することが出来ます。
データ検証が失敗すると [[yii\base\Model::hasErrors|hasErrors]] プロパティが true に設定されます。
データ検証が失敗すると [[yii\base\Model::hasErrors|hasErrors]] プロパティが `true` に設定されます。
そして、[[yii\base\Model::getErrors|errors]] を通じて、どのような検証エラーが発生したかを知ることが出来ます。

2
docs/guide-ja/start-gii.md

@ -33,7 +33,7 @@ if (YII_ENV_DEV) {
上記の構成情報は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは `gii` という名前のモジュールをインクルードすべきこと、そして `gii` は [[yii\gii\Module]] というクラスであることを記述しています。
アプリケーションの [エントリスクリプト](structure-entry-scripts.md) である `web/index.php` をチェックすると、次の行があることに気付くでしょう。
これは本質的には `YII_ENV_DEV` を true に設定するものです。
これは本質的には `YII_ENV_DEV``true` に設定するものです。
```php
defined('YII_ENV') or define('YII_ENV', 'dev');

4
docs/guide-ja/start-installation.md

@ -50,7 +50,7 @@ Composer は `composer self-update` コマンドを実行してアップデー
> アクセス・トークンの構成の仕方については、[Github API トークンに関する Composer ドキュメント](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens)
> の指示を参照して下さい。
### Yii をインストールする
### Yii をインストールする <span id="installing-from-composer"></span>
Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます。
@ -150,7 +150,7 @@ http://localhost:8080/
```
Yii の最低必要条件を満たすように PHP のインストールを構成しなければなりません。
最も重要なことは、PHP 5.4 以上でなければならないということです。
最も重要なことは、PHP 5.4 以上でなければならないということです。最新の PHP 7 なら理想的です。
また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベースドライバ (MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。

107
docs/guide-ja/structure-assets.md

@ -221,6 +221,49 @@ AppAsset::register($this); // $this はビューオブジェクトを表す
これらのタグの順序は、登録されたバンドル間の依存関係、および、[[yii\web\AssetBundle::css]] と [[yii\web\AssetBundle::js]] のプロパティのリストに挙げられたアセットの順序によって決定されます。
### 動的なアセットバンドル <span id="dynamic-asset-bundles"></span>
アセットバンドルは、通常の PHP クラスですので、内部のパラメータを動的に調整することに関係する追加のロジックを持つことが出来ます。
例えば、洗練された JavaScript ライブラリには、国際化の機能を、サポートする言語ごとに独立したソースファイルにパッケージして提供しているものもあります。
その場合、ライブラリの翻訳を動作させるためには、特定の '.js' ファイルをページに追加しなければなりません。
このことを [[yii\web\AssetBundle::init()]] メソッドをオーバーライドすることによって実現することが出来ます。
```php
namespace app\assets;
use yii\web\AssetBundle;
use Yii;
class SophisticatedAssetBundle extends AssetBundle
{
public $sourcePath = '/path/to/sophisticated/src';
public $js = [
'sophisticated.js' // 常に使用されるファイル
];
public function init()
{
parent::init();
$this->js[] = 'i18n/' . Yii::$app->language . '.js'; // 動的に追加されるファイル
}
}
```
個々のアセットバンドルは、 [[yii\web\AssetBundle::register()]] によって返されるインスタンスによって調整することも出来ます。
例えば、
```php
use app\assets\SophisticatedAssetBundle;
use Yii;
$bundle = SophisticatedAssetBundle::register(Yii::$app->view);
$bundle->js[] = 'i18n/' . Yii::$app->language . '.js'; // 動的に追加されるファイル
```
> Note: アセットバンドルの動的な調整はサポートされてはいますが、**推奨はされません**。
予期しない副作用を引き起こしやすいので、可能であれば避けるべきです。
### アセットバンドルをカスタマイズする <span id="customizing-asset-bundles"></span>
Yii は、[[yii\web\AssetManager]] によって実装されている `assetManager` という名前のアプリケーションコンポーネントを通じてアセットバンドルを管理します。
@ -280,6 +323,55 @@ return [
```
[[yii\web\AssetManager::bundles]] を `false` にセットすることによって、*全て* のバンドルを無効にすることも出来ます。
[[yii\web\AssetManager::bundles]] によってなされたカスタマイズはアセットバンドルの生成時、すなわち、オブジェクトのコンストラクタの段階で適用される、
ということを心に留めてください。
従って、[[yii\web\AssetManager::bundles]] のレベルで設定されたマッピングは、それ以後にバンドルのオブジェクトに対してなされる修正によって上書きされます。
具体的に言えば、[[yii\web\AssetBundle::init()]] メソッドの中での修正や、登録されたバンドルオブジェクトに対する修正は、`AssetManager` の構成よりも優先されます。
以下に、[[yii\web\AssetManager::bundles]] によって設定されたマッピングが効力を持たない例を示します。
```php
// プログラムのソースコード
namespace app\assets;
use yii\web\AssetBundle;
use Yii;
class LanguageAssetBundle extends AssetBundle
{
// ...
public function init()
{
parent::init();
$this->baseUrl = '@web/i18n/' . Yii::$app->language; // AssetManager` では処理出来ない!
}
}
// ...
$bundle = \app\assets\LargeFileAssetBundle::register(Yii::$app->view);
$bundle->baseUrl = YII_DEBUG ? '@web/large-files': '@web/large-files/minified'; // AssetManager` では処理出来ない!
// アプリケーション構成
return [
// ...
'components' => [
'assetManager' => [
'bundles' => [
'app\assets\LanguageAssetBundle' => [
'baseUrl' => 'http://some.cdn.com/files/i18n/en' // 効力を持たない!
],
'app\assets\LargeFileAssetBundle' => [
'baseUrl' => 'http://some.cdn.com/files/large-files' // 効力を持たない!
],
],
],
],
];
```
### アセットマッピング <span id="asset-mapping"></span>
@ -319,7 +411,7 @@ return [
この場所は、[[yii\web\AssetManager::basePath|basePath]] と [[yii\web\AssetManager::baseUrl|baseUrl]] のプロパティを構成してカスタマイズすることが出来ます。
ファイルをコピーすることでアセットを発行する代りに、OS とウェブサーバが許容するなら、シンボリックリンクを使うことを考慮しても良いでしょう。
この機能は [[yii\web\AssetManager::linkAssets|linkAssets]] を true にセットすることで有効にすることが出来ます。
この機能は [[yii\web\AssetManager::linkAssets|linkAssets]] を `true` にセットすることで有効にすることが出来ます。
```php
return [
@ -344,6 +436,7 @@ return [
- [[yii\web\YiiAsset]]: 主として `yii.js` ファイルをインクルードするためのバンドルです。
このファイルはモジュール化された JavaScript のコードを編成するメカニズムを実装しています。
また、`data-method` と `data-confirm` の属性に対する特別なサポートや、その他の有用な機能を提供します。
`yii.js` に関する詳細な情報は [クライアントスクリプトの節](output-client-scripts.md#yii.js) にあります。
- [[yii\web\JqueryAsset]]: jQuery の bower パッケージから `jquery.js` ファイルをインクルードします。
- [[yii\bootstrap\BootstrapAsset]]: Twitter Bootstrap フレームワークから CSS ファイルをインクルードします。
- [[yii\bootstrap\BootstrapPluginAsset]]: Bootstrap JavaScript プラグインをサポートするために、Twitter Bootstrap フレームワークから JavaScript ファイルをインクルードします。
@ -515,6 +608,10 @@ return [
つまり、アセットバンドルの構成情報配列は、本番モードのものは `assets-prod.php` に保存し、開発モードのものは `assets-dev.php` に保存するという訳です。
> Note: このアセット結合のメカニズムは、登録されるアセットバンドルのプロパティをオーバーライドできるという [[yii\web\AssetManager::bundles]] の機能に基づいています。
しかし、既に上で述べたように、この機能は、[[yii\web\AssetBundle::init()]] メソッドの中やバンドルが登録された後で実行されるアセットバンドルの修正をカバーしていません。
そのような動的なバンドルの使用は、アセット結合をする際には避けなければなりません。
### `asset` コマンドを使う <span id="using-asset-command"></span>
@ -541,6 +638,8 @@ return [
'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}',
// CSS ファイルの圧縮のためのコマンド/コールバックを調整。
'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}',
// 圧縮後にアセットのソースを削除するかどうか。
'deleteSource' => false,
// 圧縮するアセットバンドルのリスト。
'bundles' => [
// 'yii\web\YiiAsset',
@ -582,6 +681,12 @@ yii asset assets.php config/assets-prod.php
直前の項で説明したように、この生成された構成情報ファイルをアプリケーションの構成情報にインクルードすることが出来ます。
> Note: アプリケーションのアセットバンドルを [[yii\web\AssetManager::bundles]] または [[yii\web\AssetManager::assetMap]] によってカスタマイズしており、
そのカスタマイズを圧縮のソースファイルにも適用したい場合は、それらのオプションを `asset` コマンドの構成ファイルの `assetManager` のセクションに含めなければいけません。
> Note: 圧縮のソースを指定する場合は、パラメータが動的に (例えば `init()` メソッドの中や登録後に) 修正されるアセットバンドルを避けなければなりません。
なぜなら、パラメータの動的な修正は、圧縮後は正しく働かない可能性があるからです。
> Info: `asset` コマンドを使うことは、アセットの結合・圧縮のプロセスを自動化する唯一の選択肢ではありません。
優秀なタスク実行ツールである [grunt](http://gruntjs.com/) を使っても、同じ目的を達することが出来ます。

2
docs/guide-ja/structure-controllers.md

@ -397,7 +397,7 @@ class SiteController extends Controller
* アクション ID に合致するアクションメソッドが見つかった場合は、インラインアクションが作成される。
* 上記以外の場合は、[[yii\base\InvalidRouteException]] 例外が投げられる。
3. コントローラは、アプリケーション、(コントローラがモジュールに属する場合は) モジュール、そしてコントローラの `beforeAction()` メソッドをこの順で呼び出す。
* どれか一つの呼び出しが false を返した場合は、残りのまだ呼ばれていない `beforeAction()` メソッドはスキップされ、アクションの実行はキャンセルされる。
* どれか一つの呼び出しが `false` を返した場合は、残りのまだ呼ばれていない `beforeAction()` メソッドはスキップされ、アクションの実行はキャンセルされる。
* デフォルトでは、それぞれの `beforeAction()` メソッドは、ハンドラをアタッチすることが可能な `beforeAction` イベントをトリガする。
4. コントローラがアクションを実行する。
* アクションパラメータが解析されて、リクエストデータからデータが投入される。

2
docs/guide-ja/structure-filters.md

@ -60,7 +60,7 @@ public function behaviors()
新しいアクションフィルタを作成するためには、[[yii\base\ActionFilter]] を拡張して、[[yii\base\ActionFilter::beforeAction()|beforeAction()]] および/または [[yii\base\ActionFilter::afterAction()|afterAction()]] メソッドをオーバーライドします。
前者はアクションが走る前に実行され、後者は走った後に実行されます。
[[yii\base\ActionFilter::beforeAction()|beforeAction()]] の返り値が、アクションが実行されるべきか否かを決定します。
返り値が false である場合、このフィルタの後に続くフィルタはスキップされ、アクションは実行を中止されます。
返り値が `false` である場合、このフィルタの後に続くフィルタはスキップされ、アクションは実行を中止されます。
次の例は、アクションの実行時間をログに記録するフィルタを示すものです。

4
docs/guide-ja/structure-models.md

@ -37,7 +37,7 @@ echo $model->name;
```
また、配列の要素にアクセスするようして、属性にアクセスすることも出来ます。
これは、[[yii\base\Model]] が [ArrayAccess インターフェイス](http://php.net/manual/ja/class.arrayaccess.php) と [ArrayIterator クラス](http://jp2.php.net/manual/ja/class.arrayiterator.php) をサポートしている恩恵です。
これは、[[yii\base\Model]] が [ArrayAccess インターフェイス](http://php.net/manual/ja/class.arrayaccess.php) と [Traversable インターフェイス](http://jp2.php.net/manual/ja/class.traversable.php) をサポートしている恩恵です。
```php
$model = new \app\models\ContactForm;
@ -46,7 +46,7 @@ $model = new \app\models\ContactForm;
$model['name'] = 'example';
echo $model['name'];
// 属性に反復アクセスす
// モデルは foreach で中身をたどることが出来
foreach ($model as $name => $value) {
echo "$name: $value\n";
}

2
docs/guide-ja/structure-modules.md

@ -177,7 +177,7 @@ $module = MyModuleClass::getInstance();
ここで `MyModuleClass` は、当該モジュールクラスの名前を指すものです。
`getInstance()` メソッドは、現在リクエストされているモジュールクラスのインスタンスを返します。
モジュールがリクエストされていない場合は、このメソッドは null を返します。
モジュールがリクエストされていない場合は、このメソッドは `null` を返します。
モジュールクラスの新しいインスタンスを手動で作成しようとしてはいけないことに注意してください。
手動で作成したインスタンスは、リクエストに対するレスポンスとして Yii によって作成されたインスタンスとは別のものになります。

2
docs/guide-ja/structure-views.md

@ -596,7 +596,7 @@ $this->registerLinkTag([
これらのイベントに反応することによって、ビューにコンテントを注入したり、エンドユーザに送信される前にレンダリング結果を加工したりすることが出来ます。
- [[yii\base\View::EVENT_BEFORE_RENDER|EVENT_BEFORE_RENDER]]: コントローラでファイルをレンダリングする前にトリガされます。
このイベントのハンドラは、[[yii\base\ViewEvent::isValid]] を false にセットして、レンダリングのプロセスをキャンセルすることが出来ます。
このイベントのハンドラは、[[yii\base\ViewEvent::isValid]] を `false` にセットして、レンダリングのプロセスをキャンセルすることが出来ます。
- [[yii\base\View::EVENT_AFTER_RENDER|EVENT_AFTER_RENDER]]: ファイルのレンダリングの後、[[yii\base\View::afterRender()]] を呼ぶことによってトリガされます。
このイベントのハンドラは、レンダリング結果をプロパティ [[yii\base\ViewEvent::output]] を通じて取得して、それを修正してレンダリング結果を変更することが出来ます。
- [[yii\base\View::EVENT_BEGIN_PAGE|EVENT_BEGIN_PAGE]]: レイアウトの中で [[yii\base\View::beginPage()]] を呼ぶことによってトリガされます。

4
docs/guide-ja/test-overview.md

@ -3,11 +3,11 @@
テストはソフトウェア開発の重要な部分です。
気付いているか否かにかかわらず、私たちは継続的にテストをしています。
例えば、PHP でクラスを書くとき、私たちはステップごとにデバッグしたり、または単純に echo 文や die 文を使ったりして、実装が最初の計画通りに動作することを検証します。
例えば、PHP でクラスを書くとき、私たちはステップごとにデバッグしたり、または単純に `echo` 文や `die` 文を使ったりして、実装が最初の計画通りに動作することを検証します。
ウェブアプリケーションの場合は、何らかのテストデータをフォームに入力して、ページが期待通りにユーザと相互作用をすることを確認します。
テストを実行するプロセスを自動化して、何かを検証する必要があるときは、いつでも、それを代行してくれるコードを呼び出すだけでよいようにすることが出来ます。
結果が計画したものと合致することを検証するコードがテストと呼ばれ、それを作成して更に実行するプロセスがテスト自動化として知られています。
結果が計画したものと合致することを検証するコードが *テスト* と呼ばれ、それを作成して更に実行するプロセスが *テスト自動化* として知られています。
このテストの章の主題は、このテストの自動化です。

97
docs/guide-ja/tutorial-core-validators.md

@ -34,12 +34,12 @@ public function rules()
このバリデータは、入力値が真偽値であるかどうかをチェックします。
- `trueValue`: *true* を表す値。デフォルト値は `'1'`
- `falseValue`: *false* を表す値。デフォルト値は `'0'`
- `trueValue`: `true` を表す値。デフォルト値は `'1'`
- `falseValue`: `false` を表す値。デフォルト値は `'0'`
- `strict`: 入力値の型が `trueValue``falseValue` の型と一致しなければならないかどうか。デフォルト値は `false`
> Note: HTML フォームで送信されたデータ入力値は全て文字列であるため、通常は、[[yii\validators\BooleanValidator::strict|strict]] プロパティは false のままにすべきです。
> Note: HTML フォームで送信されたデータ入力値は全て文字列であるため、通常は、[[yii\validators\BooleanValidator::strict|strict]] プロパティは `false` のままにすべきです。
## [[yii\captcha\CaptchaValidator|captcha]] <span id="captcha"></span>
@ -52,9 +52,9 @@ public function rules()
このバリデータは、通常、[[yii\captcha\CaptchaAction]] および [[yii\captcha\Captcha]] と一緒に使われ、入力値が [[yii\captcha\Captcha|CAPTCHA]] ウィジェットによって表示された検証コードと同じであることを確認します。
- `caseSensitive`: 検証コードの比較で大文字と小文字を区別するかどうか。デフォルト値は false。
- `caseSensitive`: 検証コードの比較で大文字と小文字を区別するかどうか。デフォルト値は `false`
- `captchaAction`: CAPTCHA 画像を表示する [[yii\captcha\CaptchaAction|CAPTCHA アクション]] に対応する [ルート](structure-controllers.md#routes)。デフォルト値は `'site/captcha'`
- `skipOnEmpty`: 入力値が空のときに検証をスキップできるかどうか。デフォルト値は false で、入力が必須であることを意味します。
- `skipOnEmpty`: 入力値が空のときに検証をスキップできるかどうか。デフォルト値は `false` で、入力が必須であることを意味します。
## [[yii\validators\CompareValidator|compare]] <span id="compare"></span>
@ -64,8 +64,11 @@ public function rules()
// "password" 属性の値が "password_repeat" 属性の値と同じであるかどうか検証する
['password', 'compare'],
// 上記と同じだが、比較する属性を明示的に指定
['password', 'compare', 'compareAttribute' => 'password_repeat'],
// "age" が 30 以上であるかどうか検証する
['age', 'compare', 'compareValue' => 30, 'operator' => '>='],
['age', 'compare', 'compareValue' => 30, 'operator' => '>=', 'type' => 'number'],
]
```
@ -86,6 +89,8 @@ public function rules()
* `>=`: 検証される値が比較される値よりも大きいか等しいことを検証する。
* `<`: 検証される値が比較される値よりも小さいことを検証する。
* `<=`: 検証される値が比較される値よりも小さいか等しいことを検証する。
- `type`: デフォルトの比較タイプは '[[yii\validators\CompareValidator::TYPE_STRING|string]]' (文字列) であり、その場合、値は 1 バイトごとに比較されます。
数値を比較する場合は、必ず [[yii\validators\CompareValidator::$type|$type]] を '[[yii\validators\CompareValidator::TYPE_NUMBER|number]]' に設定して、数値としての比較を有効にして下さい。
### 日付の値を比較する
@ -111,9 +116,14 @@ compare バリデータは、文字列や数値を比較するためにしか使
## [[yii\validators\DateValidator|date]] <span id="date"></span>
[[yii\validators\DateValidator|date]] バリデータには 3 つの異なるショートカットがあります。
```php
[
[['from_date', 'to_date'], 'date'],
[['from_datetime', 'to_datetime'], 'datetime'],
[['some_time'], 'time'],
]
```
@ -133,6 +143,9 @@ compare バリデータは、文字列や数値を比較するためにしか使
バージョン 2.0.4 以降では、[[yii\validators\DateValidator::$timestampAttributeFormat|$timestampAttributeFormat]] と [[yii\validators\DateValidator::$timestampAttributeTimeZone|$timestampAttributeTimeZone]] を使って、この属性に対するフォーマットとタイムゾーンを指定することが出来ます。
`timestampAttribute` を使う場合、入力値が UNIX タイムスタンプに変換されること、そして、UNIX タイムスタンプは定義により UTC であることに注意して下さい。
すなわち、[[yii\validators\DateValidator::timeZone|入力のタイムゾーン]] から UTC への変換が実行されます。
- バージョン 2.0.4 以降では、タイムスタンプの [[yii\validators\DateValidator::$min|最小値]] または [[yii\validators\DateValidator::$max|最大値]] を指定することも出来ます。
入力が必須でない場合には、date バリデータに加えて、default バリデータ (デフォルト値フィルタ) を追加すれば、空の入力値が `null` として保存されることを保証することが出来ます。
@ -153,7 +166,7 @@ compare バリデータは、文字列や数値を比較するためにしか使
// 空のときは "country" を "USA" にする
['country', 'default', 'value' => 'USA'],
// 空のときは "from" と "to" に今日から三日後・六日後の日付にす
// 空のときは "from" と "to" に今日から三日後・六日後の日付を入れ
[['from', 'to'], 'default', 'value' => function ($model, $attribute) {
return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days'));
}],
@ -214,7 +227,7 @@ function foo($model, $attribute) {
配列の最初の要素がバリデータのクラス名かエイリアスを指定します。
配列の残りの「名前・値」のペアが、バリデータオブジェクトを構成するのに使われます。
- `allowMessageFromRule`: 埋め込まれた検証規則によって返されるエラーメッセージを使うかどうか。
デフォルト値は true です。これが false の場合は、`message` をエラーメッセージとして使います。
デフォルト値は `true` です。これが `false` の場合は、`message` をエラーメッセージとして使います。
> Note: 属性が配列でない場合は、検証が失敗したと見なされ、`message` がエラーメッセージとして返されます。
@ -230,12 +243,12 @@ function foo($model, $attribute) {
このバリデータは、入力値が有効なメールアドレスであるかどうかをチェックします。
- `allowName`: メールアドレスに表示名 (例えば、`John Smith <john.smith@example.com>`) を許容するか否か。デフォルト値は false。
- `allowName`: メールアドレスに表示名 (例えば、`John Smith <john.smith@example.com>`) を許容するか否か。デフォルト値は `false`
- `checkDNS`: メールのドメインが存在して A または MX レコードを持っているかどうかをチェックするか否か。
このチェックは、メールアドレスが実際には有効なものでも、一時的な DNS の問題によって失敗する場合があることに注意してください。
デフォルト値は false。
デフォルト値は `false`
- `enableIDN`: 検証のプロセスが IDN (国際化ドメイン名) を考慮に入れるか否か。
デフォルト値は false。
デフォルト値は `false`
IDN のバリデーションを使用するためには、`intl` PHP 拡張をインストールして有効化する必要があることに注意してください。そうしないと、例外が投げられます。
@ -287,9 +300,9 @@ function foo($model, $attribute) {
または、`function ($query)` というシグニチャを持つ無名関数でも構いません。
`$query` は関数の中で修正できる [[yii\db\Query|Query]] オブジェクトです。
- `allowArray`: 入力値が配列であることを許容するか否か。
デフォルト値は false。
このプロパティが true で入力値が配列であった場合は、配列の全ての要素がターゲットのカラムに存在しなければなりません。
`targetAttribute` を配列で指定して複数のカラムに対して検証しようとしている場合は、このプロパティを true に設定することが出来ないことに注意してください。
デフォルト値は `false`
このプロパティが `true` で入力値が配列であった場合は、配列の全ての要素がターゲットのカラムに存在しなければなりません。
`targetAttribute` を配列で指定して複数のカラムに対して検証しようとしている場合は、このプロパティを `true` に設定することが出来ないことに注意してください。
## [[yii\validators\FileValidator|file]] <span id="file"></span>
@ -307,24 +320,24 @@ function foo($model, $attribute) {
- `extensions`: アップロードを許可されるファイル名拡張子のリスト。
リストは、配列、または、空白かカンマで区切られたファイル名拡張子からなる文字列 (例えば、"gif, jpg") で指定することが出来ます。
拡張子名は大文字と小文字を区別しません。
デフォルト値は null であり、すべてのファイル名拡張子が許可されることを意味します。
デフォルト値は `null` であり、すべてのファイル名拡張子が許可されることを意味します。
- `mimeTypes`: アップロードを許可されるファイルの MIME タイプのリスト。
リストは、配列、または、空白かカンマで区切られたファイルの MIME タイプからなる文字列 (例えば、"image/jpeg, image/png") で指定することが出来ます。
特殊文字 `*` によるワイルドカードのマスクを使って、一群の MIME タイプに一致させることも出来ます。
例えば `image/*` は、`image/` で始まる全ての MIME タイプ (`image/jpeg`, `image/png` など) を通します。
MIME タイプ名は大文字と小文字を区別しません。
デフォルト値は null であり、すべての MIME タイプが許可されることを意味します。
デフォルト値は `null` であり、すべての MIME タイプが許可されることを意味します。
MIME タイプの詳細については、[一般的なメディアタイプ](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types) を参照してください。
- `minSize`: アップロードされるファイルに要求される最小限のバイト数。
デフォルト値は null であり、下限値が無いことを意味します。
デフォルト値は `null` であり、下限値が無いことを意味します。
- `maxSize`: アップロードされるファイルに許可される最大限のバイト数。
デフォルト値は null であり、上限値が無いことを意味します。
デフォルト値は `null` であり、上限値が無いことを意味します。
- `maxFiles`: 指定された属性が保持しうる最大限のファイル数。
デフォルト値は 1 であり、入力値がアップロードされた一つだけのファイルでなければならないことを意味します。
この値が 2 以上である場合は、入力値は最大で `maxFiles` 数のアップロードされたファイルからなる配列でなければなりません。
- `checkExtensionByMimeType`: ファイルの MIME タイプでファイル拡張子をチェックするか否か。
MIME タイプのチェックから導かれる拡張子がアップロードされたファイルの拡張子と違う場合に、そのファイルは無効であると見なされます。
デフォルト値は true であり、そのようなチェックが行われることを意味します。
デフォルト値は `true` であり、そのようなチェックが行われることを意味します。
`FileValidator` は [[yii\web\UploadedFile]] と一緒に使用されます。
ファイルのアップロードおよびアップロードされたファイルの検証の実行に関する完全な説明は、[ファイルをアップロードする](input-file-upload.md) の節を参照してください。
@ -353,8 +366,8 @@ function foo($model, $attribute) {
関数のシグニチャは ``function ($value) { return $newValue; }` でなければなりません。
このプロパティは必須項目です。
- `skipOnArray`: 入力値が配列である場合にフィルタをスキップするか否か。
デフォルト値は false。
フィルタが配列の入力を処理できない場合は、このプロパティを true に設定しなければなりません。
デフォルト値は `false`
フィルタが配列の入力を処理できない場合は、このプロパティを `true` に設定しなければなりません。
そうしないと、何らかの PHP エラーが生じ得ます。
> Tip: 入力値をトリムしたい場合は、[trim](#trim) バリデータを直接使うことが出来ます。
@ -384,10 +397,10 @@ function foo($model, $attribute) {
これは [file](#file) バリデータを拡張するものであり、従って、そのプロパティの全てを継承しています。
それに加えて、画像の検証の目的に特化した次のプロパティをサポートしています。
- `minWidth`: 画像の幅の最小値。デフォルト値は null であり、下限値がないことを意味します。
- `maxWidth`: 画像の幅の最大値。デフォルト値は null であり、上限値がないことを意味します。
- `minHeight`: 画像の高さの最小値。デフォルト値は null であり、下限値がないことを意味します。
- `maxHeight`: 画像の高さの最大値。デフォルト値は null であり、上限値がないことを意味します。
- `minWidth`: 画像の幅の最小値。デフォルト値は `null` であり、下限値がないことを意味します。
- `maxWidth`: 画像の幅の最大値。デフォルト値は `null` であり、上限値がないことを意味します。
- `minHeight`: 画像の高さの最小値。デフォルト値は `null` であり、下限値がないことを意味します。
- `maxHeight`: 画像の高さの最大値。デフォルト値は `null` であり、上限値がないことを意味します。
## [[yii\validators\IpValidator|ip]] <span id="ip"></span>
@ -411,26 +424,26 @@ function foo($model, $attribute) {
バリデータは以下の構成オプションを持っています。
- `ipv4`: 検証の対象となる値が IPv4 アドレスであってよいか否か。デフォルト値は true。
- `ipv6`: 検証の対象となる値が IPv6 アドレスであってよいか否か。デフォルト値は true。
- `subnet`: アドレスが `192.168.10.0/24` のような CIDR サブネットを持つ IP であってよいか否か。whether the address can be an IP with CIDR subnet, like `192.168.10.0/24`
- `ipv4`: 検証の対象となる値が IPv4 アドレスであってよいか否か。デフォルト値は `true`
- `ipv6`: 検証の対象となる値が IPv6 アドレスであってよいか否か。デフォルト値は `true`
- `subnet`: アドレスが `192.168.10.0/24` のような CIDR サブネットを持つ IP であってよいか否か。
* `true` - サブネットが必要。CIDR の無いアドレスは却下されます
* `false` - アドレスは CIDR を伴ってはいけません
* `null` - CIDR は有っても無くても構いません
デフォルト値は false。
デフォルト値は `false`
- `normalize`: CIDR を持たないアドレスに、最も短い (IPv4 では 32、IPv6 では 128) CIDR プレフィクスを追加するか否か。
`subnet``false` 以外の場合にのみ動作します。
例えば、
* `10.0.1.5``10.0.1.5/32` に正規化され、
* `2008:db0::1``2008:db0::1/128` に正規化されます
デフォルト値は false。
デフォルト値は `false`
- `negation`: 検証の対象となるアドレスが先頭に否定文字 `!` を持つことが出来るか否か。
デフォルト値は false。
デフォルト値は `false`
- `expandIPv6`: IPv6 アドレスを完全な記法に展開するか否か。
例えば、`2008:db0::1` は `2008:0db0:0000:0000:0000:0000:0000:0001` に展開されます。
デフォルト値は false。
デフォルト値は `false`
- `ranges`: 許容または禁止される IPv4 または IPv6 の範囲の配列。
配列が空の場合、またはこのオプションが設定されていない場合は、全ての IP アドレスが許容されます。
@ -482,11 +495,11 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている
- `range`: 与えられた値のリスト。この中に、入力値がなければならない。
- `strict`: 入力値と所与の値の比較が厳密でなければならない (型と値の両方が同じでなければならない) かどうか。
デフォルト値は false。
- `not`: 検証結果を反転すべきか否か。デフォルト値は false。
このプロパティが true に設定されているときは、入力値が所与の値のリストにない場合に検証が成功したとされます。
デフォルト値は `false`
- `not`: 検証結果を反転すべきか否か。デフォルト値は `false`
このプロパティが `true` に設定されているときは、入力値が所与の値のリストにない場合に検証が成功したとされます。
- `allowArray`: 入力値が配列であることを許可するかどうか。
このプロパティが true であるときに、入力値が配列である場合は、配列の全ての要素が所与の値のリストにある必要があり、そうでなければ検証は失敗します。
このプロパティが `true` であるときに、入力値が配列である場合は、配列の全ての要素が所与の値のリストにある必要があり、そうでなければ検証は失敗します。
## [[yii\validators\NumberValidator|integer]] <span id="integer"></span>
@ -549,10 +562,10 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている
- `requiredValue`: 入力値として要求される値。
このプロパティが設定されていない場合は、入力値が空ではいけないことを意味します。
- `strict`: 値を検証するときに、データ型をチェックするかどうか。デフォルト値は false。
`requiredValue` が設定されていない場合、このプロパティが true であるときは、バリデータは入力値が厳密な意味で null であるかどうかをチェックします。
一方、このプロパティが false であるときは、値が空か否かの判断に緩い規則を使います。
`requiredValue` が設定されている場合、このプロパティが true であるときは、入力値と `requiredValue` を比較するときに型のチェックを行います。
- `strict`: 値を検証するときに、データ型をチェックするかどうか。デフォルト値は `false`
`requiredValue` が設定されていない場合、このプロパティが `true` であるときは、バリデータは入力値が厳密な意味で `null` であるかどうかをチェックします。
一方、このプロパティが `false` であるときは、値が空か否かの判断に緩い規則を使います。
`requiredValue` が設定されている場合、このプロパティが `true` であるときは、入力値と `requiredValue` を比較するときに型のチェックを行います。
> Info: 値が空であるか否かを決定する方法については、独立したトピックとして、[空の入力値を扱う](input-validation.md#handling-empty-inputs) の節でカバーされています。
@ -662,9 +675,9 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている
- `validSchemes`: 有効と見なされるべき URI スキームを指定する配列。
デフォルト値は `['http', 'https']` であり、`http` と `https` の URL がともに有効と見なされることを意味します。
- `defaultScheme`: 入力値がスキームの部分を持たないときに前置されるデフォルトの URI スキーム。
デフォルト値は null であり、入力値を修正しないことを意味します。
デフォルト値は `null` であり、入力値を修正しないことを意味します。
- `enableIDN`: バリデータが IDN (国際化ドメイン名) を考慮すべきか否か。
デフォルト値は false。
デフォルト値は `false`
IDN のバリデーションを使用するためには、`intl` PHP 拡張をインストールして有効化する必要があることに注意してください。
そうしないと、例外が投げられます。

73
docs/guide-ja/tutorial-i18n.md

@ -8,20 +8,29 @@ Yii は、全ての領域にわたる国際化機能を提供し、メッセー
## ロケールと言語 <span id="locale-language"></span>
### ロケール
ロケールとは、ユーザの言語、国、そして、ユーザが彼らのユーザインタフェイスにおいて目にすることを期待するすべての変異形式を定義する一連のパラメータです。
ロケールは、通常、言語 ID と地域 ID から成るロケール ID によって定義されます。
例えば、`en-US` は、英語とアメリカ合衆国のロケールを意味します。
例えば、`en-US` という ID は、「英語とアメリカ合衆国」というロケールを意味します。
Yii アプリケーションで使用される全てのロケール ID は、一貫性のために、`ll-CC` の形式に正規化されなければなりません。
ここで `ll` は [ISO-639](http://www.loc.gov/standards/iso639-2/) に従った小文字二つまたは三つの言語コードであり、`CC` は [ISO-3166](http://www.iso.org/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html) に従った二文字の国コードです。
ロケールに関する更なる詳細は [ICU プロジェクトのドキュメント project](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept) に述べられています。
### 言語
Yii では、"言語" という用語でロケールに言及することがしばしばあります。
Yii のアプリケーションでは二つの言語を使用します。
すなわち、[[yii\base\Application::$sourceLanguage|ソース言語]] と [[yii\base\Application::$language|ターゲット言語]] です。
前者はソースコード中のテキストメッセージが書かれている言語を意味し、後者はコンテントをエンドユーザに表示するのに使用されるべき言語を指します。
Yii のアプリケーションでは二つの言語を使用します。すなわち、
* [[yii\base\Application::$sourceLanguage|ソース言語]] : ソースコード中のテキストメッセージが書かれている言語。
* [[yii\base\Application::$language|ターゲット言語]] : コンテントをエンドユーザに表示するのに使用されるべき言語。
いわゆるメッセージ翻訳サービスは、主として、テキストメッセージをソース言語からターゲット言語に翻訳するものです。
### 構成
アプリケーションの言語は、アプリケーションの構成情報で次のように構成することが出来ます。
```php
@ -37,7 +46,7 @@ return [
```
[[yii\base\Application::$sourceLanguage|ソース言語]] のデフォルト値は `en-US` であり、合衆国の英語を意味します。
このデフォルト値は変えないことが推奨されます。
このデフォルト値は変えないことが **推奨** されます。
なぜなら、通常は、英語から他の言語への翻訳者を見つける方が、非英語から非英語への翻訳者を見つけるより、はるかに簡単だからです。
[[yii\base\Application::$language|ターゲット言語]] は、エンドユーザの言語選択など、さまざまな要因に基づいて、動的に設定しなければならないことがよくあります。
@ -54,16 +63,23 @@ return [
## メッセージ翻訳 <span id="message-translation"></span>
### ソース言語からターゲット言語へ
メッセージ翻訳サービスは、テキストメッセージをある言語 (通常は [[yii\base\Application::$sourceLanguage|ソース言語]]) から別の言語 (通常は [[yii\base\Application::$language|ターゲット言語]]) に翻訳するものです。
翻訳は、元のメッセージと翻訳されたメッセージを格納するメッセージソースの中から、翻訳対象となったメッセージを探すことにより行われます。
メッセージが見つかれば、対応する翻訳されたメッセージが返されます。
メッセージが見つからなければ、元のメッセージが翻訳されずに返されます。
### 実装の仕方
メッセージ翻訳サービスを使用するためには、主として次の作業をする必要があります。
* 翻訳する必要のある全てのテキストメッセージを [[Yii::t()]] メソッドの呼び出しの中に包む。
* メッセージ翻訳サービスが翻訳されたメッセージを探すことが出来る一つまたは複数のメッセージソースを構成する。
* 翻訳者にメッセージを翻訳させて、それをメッセージソースに格納する。
1. 翻訳する必要のある全てのテキストメッセージを [[Yii::t()]] メソッドの呼び出しの中に包む。
2. メッセージ翻訳サービスが翻訳されたメッセージを探すことが出来る一つまたは複数のメッセージソースを構成する。
3. 翻訳者にメッセージを翻訳させて、それをメッセージソースに格納する。
#### 1. テキストメッセージを包む
[[Yii::t()]] メソッドは次のように使います。
@ -73,6 +89,8 @@ echo \Yii::t('app', 'This is a string to translate!');
ここで、二番目のパラメータが翻訳されるべきテキストメッセージを示し、最初のパラメータはメッセージを分類するのに使用されるカテゴリ名を示します。
#### 2. 一つまたは複数のメッセージソースを構成する
[[Yii::t()]] メソッドは `i18n` [アプリケーションコンポーネント](structure-application-components.md) の `translate` メソッドを呼んで実際の翻訳作業を実行します。
このコンポーネントはアプリケーションの構成情報の中で次のようにして構成することが出来ます。
@ -96,12 +114,43 @@ echo \Yii::t('app', 'This is a string to translate!');
```
上記のコードにおいては、[[yii\i18n\PhpMessageSource]] によってサポートされるメッセージソースが構成されています。
##### シンボル `*` によるカテゴリのワイルドカード
`app*` は、`app` で始まる全てのメッセージカテゴリがこのメッセージソースを使って翻訳されるべきであることを示しています。
[[yii\i18n\PhpMessageSource]] クラスは、メッセージ翻訳を格納するのに PHP ファイルを使用します。
#### 3. 翻訳者にメッセージを翻訳させて、それをメッセージソースに格納する
[[yii\i18n\PhpMessageSource]] クラスは、単純な PHP 配列を持つ複数の PHP ファイルを使用してメッセージ翻訳を格納します。
それらのファイルが、「ソース言語」のメッセージと「ターゲット言語」の翻訳とのマップを含みます。
> Info: それらのファイルを [`message` コマンド](#message-command) を使用して自動的に生成することが出来ます。
> この節で後で紹介します。
PHP ファイルは、それぞれ、一つのカテゴリのメッセージに対応します。
デフォルトでは、ファイル名はカテゴリ名と同じでなければなりません。
ただし、[[yii\i18n\PhpMessageSource::fileMap|fileMap]] を構成して、別の命名方法によってカテゴリを PHP ファイルに割り付けることも可能です。
上記の例では、(`ja-JP` がターゲット言語であると仮定すると) `app/error` のカテゴリは `@app/messages/ja-JP/error.php` という PHP ファイルに割り付けられます。
`fileMap` を構成しなければ、このカテゴリは `@app/messages/ja-JP/app/error.php` に割り付けられることになります。
`app/messages/nl-NL/main.ph` の例を示します。
```php
<?php
/**
* Translation map for nl-NL
*/
return [
'welcome' => 'welkom'
];
```
##### ファイルのマッピング
ただし、[[yii\i18n\PhpMessageSource::fileMap|fileMap]] を構成して、別の命名方法によってカテゴリを PHP ファイルにマップすることも可能です。
上記の例では、(`ja-JP` がターゲット言語であると仮定すると) `app/error` のカテゴリは `@app/messages/ja-JP/error.php` という PHP ファイルにマップされます。
`fileMap` を構成しなければ、このカテゴリは `@app/messages/ja-JP/app/error.php` にマップされることになります。
##### 他のストレージタイプ
翻訳メッセージを格納するのには、PHP ファイル以外に、次のメッセージソースを使うことも可能です。

19
docs/guide-ja/tutorial-mailing.md

@ -50,9 +50,9 @@ Yii::$app->mailer->compose()
```php
$message = Yii::$app->mailer->compose();
if (Yii::$app->user->isGuest) {
$message->setFrom('from@domain.com')
$message->setFrom('from@domain.com');
} else {
$message->setFrom(Yii::$app->user->identity->email)
$message->setFrom(Yii::$app->user->identity->email);
}
$message->setTo(Yii::$app->params['adminEmail'])
->setSubject('メッセージの題')
@ -60,9 +60,9 @@ $message->setTo(Yii::$app->params['adminEmail'])
->send();
```
> Note: すべての 'mailer' エクステンションは、二つの主要なクラス、すなわち、'Mailer' と 'Message' のセットとして提供されます。
'Mailer' は常に 'Message' のクラス名と仕様を知っています。
'Message' オブジェクトのインスタンスを直接に作成しようとしてはいけません。常に `compose()` メソッドを使って作成してください。
> Note: すべての `mailer` エクステンションは、二つの主要なクラス、すなわち、`Mailer` と `Message` のセットとして提供されます。
`Mailer` は常に `Message` のクラス名と仕様を知っています。
`Message` オブジェクトのインスタンスを直接に作成しようとしてはいけません。常に `compose()` メソッドを使って作成してください。
いくつかのメッセージを一度に送信することも出来ます。
@ -83,7 +83,7 @@ Yii::$app->mailer->sendMultiple($messages);
----------------------------
Yii は実際のメールメッセージを特別なビューファイルによって作成することを許容しています。
デフォルトでは、それらのファイルは '@app/mail' というパスに配置されなければなりません。
デフォルトでは、それらのファイルは `@app/mail` というパスに配置されなければなりません。
以下はメールビューファイルの内容の例です。
@ -92,7 +92,6 @@ Yii は実際のメールメッセージを特別なビューファイルによ
use yii\helpers\Html;
use yii\helpers\Url;
/* @var $this \yii\web\View ビューコンポーネントのインスタンス */
/* @var $message \yii\mail\BaseMessage 新しく作成されたメールメッセージのインスタンス */
@ -188,7 +187,7 @@ $message->attachContent('添付される内容', ['fileName' => 'attach.txt', 'c
--------------
`embed()` メソッドを使って、メッセージのコンテントに画像を埋め込むことが出来ます。
このメソッドは添付ファイルの ID を返しますので、それを 'img' タグで使わなければなりません。
このメソッドは添付ファイルの ID を返しますので、それを `img` タグで使わなければなりません。
このメソッドはビューファイルによってメッセージのコンテントを作成するときに簡単に使うことが出来ます。
```php
@ -210,7 +209,7 @@ Yii::$app->mailer->compose('embed-email', ['imageFileName' => '/path/to/image.jp
開発者は、実際にどのようなメールがアプリケーションによって送信されたか、その内容はどのようなものであったか、等をチェックしなければならないことが多くあります。
Yii は、そのようなチェックが出来ることを `yii\mail\BaseMailer::useFileTransport` によって保証しています。
このオプションを有効にすると、メールのメッセージデータが、通常のように送信される代りに、ローカルファイルに強制的に保存されます。
ファイルは、`yii\mail\BaseMailer::fileTransportPath`、デフォルトでは '@runtime/mail' の下に保存されます。
ファイルは、`yii\mail\BaseMailer::fileTransportPath`、デフォルトでは `@runtime/mail` の下に保存されます。
> Note: メッセージをファイルに保存するか、実際の受信者に送信するか、どちらかを選ぶことが出来ますが、両方を同時に実行することは出来ません。
@ -224,7 +223,7 @@ Yii は、そのようなチェックが出来ることを `yii\mail\BaseMailer:
------------------------------------------
あなた自身のカスタムメールソリューションを作成するためには、二つのクラスを作成する必要があります。
すなわち、一つは 'Mailer' であり、もう一つは 'Message' です。
すなわち、一つは `Mailer` であり、もう一つは `Message` です。
`yii\mail\BaseMailer``yii\mail\BaseMessage` をあなたのソリューションの基底クラスとして使うことが出来ます。
これらのクラスが、このガイドで説明された基本的なロジックを既に持っています。
しかし、それを使用することは強制されていません。

4
docs/guide-ja/tutorial-performance-tuning.md

@ -13,7 +13,7 @@ PHP 環境を正しく構成することは非常に重要です。
- 最新の安定した PHP バージョンを使うこと。
使用する PHP のメジャーリリースを上げると、顕著なパフォーマンスの改善がもたらされることがあります。
- [Opcache](http://php.net/opcache) (PHP 5.5 以降) または [APC](http://ru2.php.net/apc) (PHP 5.4 以前) を使って、バイトコードキャッシュを有効にすること。
- [Opcache](http://php.net/opcache) (PHP 5.5 以降) または [APC](http://php.net/apc) (PHP 5.4) を使って、バイトコードキャッシュを有効にすること。
バイトコードキャッシュによって、リクエストが入ってくるたびに PHP スクリプトを解析してインクルードする時間の浪費を避けることが出来ます。
- [`realpath()` キャッシュをチューニングする](https://github.com/samdark/realpath_cache_tuner).
@ -29,7 +29,7 @@ Yii は、`YII_DEBUG` という名前の定数の値を使って、デバッグ
defined('YII_DEBUG') or define('YII_DEBUG', false);
```
> Info: `YII_DEBUG` のデフォルト値は false です。
> Info: `YII_DEBUG` のデフォルト値は `false` です。
従って、アプリケーションコードの他のどこかでこのデフォルト値を変更していないと確信できるなら、単に上記の行を削除してデバッグモードを無効にしても構いません。
## キャッシュのテクニックを使う <span id="using-caching"></span>

2
docs/guide-ru/README.md

@ -188,7 +188,7 @@ All Rights Reserved.
* [Menu](http://www.yiiframework.com/doc-2.0/yii-widgets-menu.html)
* [LinkPager](http://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html)
* [LinkSorter](http://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html)
* [Виджеты Bootstrap](https://github.com/yiisoft/yii2-bootstrap/blob/master/docs/guide/README.md)
* [Виджеты Bootstrap](https://github.com/yiisoft/yii2-bootstrap/blob/master/docs/guide-ru/README.md)
* [Виджеты Jquery UI](https://github.com/yiisoft/yii2-jui/blob/master/docs/guide/README.md)

2
docs/guide-ru/concept-autoloading.md

@ -3,7 +3,7 @@
Поиск и подключение файлов классов в Yii реализовано при помощи
[автозагрузки классов](http://www.php.net/manual/ru/language.oop5.autoload.php). Фреймворк предоставляет свой быстрый
совместимый с [PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md)
совместимый с [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md)
автозагрузчик, который устанавливается в момент подключения `Yii.php`.
> Note: Для простоты повествования, в этом разделе мы будем говорить только об автозагрузке классов. Тем не менее,

2
docs/guide-ru/concept-components.md

@ -10,7 +10,7 @@
Как по отдельности, так и вместе, эти возможности делают классы Yii более простыми в настройке и использовании.
Например, пользовательские компоненты, включающие в себя [[yii\jui\DatePicker|виджет выбора даты]], могут быть
использованы в [представлении](structure-view.md) для генерации интерактивных элементов выбора даты:
использованы в [представлении](structure-views.md) для генерации интерактивных элементов выбора даты:
```php
use yii\jui\DatePicker;

2
docs/guide-ru/concept-di-container.md

@ -162,7 +162,7 @@ $reader = $container->get('app\storage\DocumentsReader);
```
> Tip: Начиная с версии 2.0.11 контейнер может быть настроен в декларативном стиле через конфигурацию приложения.
Как это сделать ищите в подразделе [Конфигурация приложения](concept-service-locator.md#application-configurations)
Как это сделать ищите в подразделе [Конфигурация приложения](concept-configurations.md#Конфигурация-приложения-)
раздела [Конфигурации](concept-configurations.md).
Вроде всё работает, но если нам необходимо создать экземпляр класса `DocumentWriter`, придётся скопировать код,

2
docs/guide-ru/db-active-record.md

@ -488,7 +488,7 @@ $customer->loadDefaultValues();
Однако, механизм приведения типов имеет несколько ограничений:
* Числа с плавающей точкой не будут обработаны, а будут представленны как строки, в противном случае они могут потерять точность.
* Ковертация целых чисел завист от разрядности используемой операциооной системы. В частности: значения колонок, объявленных
* Конвертация целых чисел зависит от разрядности используемой операциооной системы. В частности: значения колонок, объявленных
как 'unsigned integer' или 'big integer' будут приведены к целому типу PHP только на 64-х разрядных системах, в то время
как на 32-х разрядных - они будут представленны как строки.

37
docs/guide-ru/db-migrations.md

@ -783,12 +783,12 @@ return [
С приведённой выше конфигурацией, каждый раз при запуске команды миграции, таблица `backend_migration` будет использована для записи истории миграций. И Вам больше не нужно указывать её через параметр `migrationTable` в командной строке.
### Отдельностоящие Миграции <span id="separated-migrations"></span>
Иногда может понадобится использовать миграции из другого пространства имён. Это может быть полезно для при использовании
расширений или модулей в вашем проекте. Одним таких примером могут быть миграции для [компонента RBAC](security-authorization.md#configuring-rbac).
Начиная с версии 2.0.10, есть возможность использовать свойство [[yii\console\controllers\MigrateController::migrationNamespaces|migrationNamespaces]]
для указания пространств имён с миграциями:
### Миграции с пространсвом имен <span id="namespaced-migrations"></span>
Начиная с версии 2.0.10 вы можете использовать пространства имен при объявлении класса миграции. Вы можете указать список пространств
имен миграций через [[yii\console\controllers\MigrateController::migrationNamespaces|migrationNamespaces]]. Использование пространств
имен для классов миграции позволяет сочетать несколько источников миграций. Например:
```php
return [
@ -798,14 +798,35 @@ return [
'migrationNamespaces' => [
'app\migrations', // Общие миграции приложения
'module\migrations', // Миграции одного из модулей проекта
               'yii\rbac\migrations', // Миграции одного из расширений
               'some\extension\migrations', // Миграции одного из расширений
],
],
],
];
```
Если необходимо, чтобы миграции из разных пространств имён были независимы друг от друга, вы можете сконфигурировать
> Замечание: миграции из различных пространств имен образуют **единую** историю, т.е. вы не сможете
применить или откатить миграции из одного конкретного пространства имен.
Работая с миграциями по пространствам имен: при создании, отмене и т.д., следует указывать полное имя пространства имен
перед именем миграции. Имейте в виду, что символ обратного слеша (`\`), как правило, является специальным символом в консоли,
так что вам придется экранировать его соответствующим образом во избежании ошибок или неверного поведения. Например:
```
yii migrate/create 'app\\migrations\\createUserTable'
```
> Замечание: миграции заданные через [[yii\console\controllers\MigrateController::migrationPath|migrationPath]] не могут содержать
пространство имен, миграции, объявленные с пространством имен могут быть применены только используя свойство [[yii\console\controllers\MigrateController::migrationNamespaces]].
### Отдельностоящие Миграции <span id="separated-migrations"></span>
Иногда использование единой истории для всех миграция проекта не желательно. Например: вы можете установить расширение
'blog', которое содержит полностью независимый функционал и содержит собственные миграции, которые не должны затрагивать
миграции связанные с основной функциональностью проекта.
Если необходимо, чтобы миграции из разных источников были независимы друг от друга, вы можете сконфигурировать
несколько команд миграции, которые будут использовать разные пространства имён и разные таблицы для хранения истории
миграций:
@ -827,7 +848,7 @@ return [
// Миграции одного из расширений
'migrate-rbac' => [
'class' => 'yii\console\controllers\MigrateController',
           'migrationNamespaces' => ['yii\rbac\migrations'],
'migrationPath' => '@yii/rbac/migrations',
'migrationTable' => 'migration_rbac',
],
],

4
docs/guide-ru/intro-upgrade-from-v1.md

@ -18,7 +18,7 @@
Yii 2.0 широко использует [Composer](https://getcomposer.org/), который является основным менеджером зависимостей для PHP.
Установка как фреймворка, так и расширений, осуществляется через Composer. Подробно о установке Yii 2.0 вы можете узнать
из раздела «[Установка Yii](start-installation.md)». О том, как создавать расширения для Yii 2.0 или адаптировать
уже имеющиеся расширения от версии 1.1, вы можете узнать из раздела «[Создание расширений](extend-creating-extensions.md)».
уже имеющиеся расширения от версии 1.1, вы можете узнать из раздела «[Создание расширений](structure-extensions.md#creating-extensions)».
Требования PHP
@ -528,4 +528,4 @@ User и IdentityInterface
----------------------------------
Информация об использовании кода для Yii 1.1 вместе с Yii 2.0 представлена в разделе
«[Одновременное использование Yii 1.1 и 2.0](extend-using-v1-v2.md)».
«[Одновременное использование Yii 1.1 и 2.0](tutorial-yii-integration.md#using-both-yii2-yii1)».

6
docs/guide-ru/start-gii.md

@ -1,7 +1,7 @@
Генерация кода при помощи Gii
========================
В этом разделе мы опишем, как использовать [Gii](tool-gii.md) для автоматической генерации кода,
В этом разделе мы опишем, как использовать [Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ru/README.md) для автоматической генерации кода,
реализующего некоторые общие функции вебсайта. Для достижения этой цели всё, что вам нужно, это просто ввести необходимую информацию в соответствии с инструкциями, отображаемыми на веб-страницах Gii.
В этом руководстве вы узнаете:
@ -15,7 +15,7 @@
Запускаем Gii <span id="starting-gii"></span>
------------
[Gii](tool-gii.md) представлен в Yii как [модуль](structure-modules.md). Вы можете активировать Gii,
[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ru/README.md) представлен в Yii как [модуль](structure-modules.md). Вы можете активировать Gii,
настроив его в свойстве [[yii\base\Application::modules|modules]]. В зависимости от того, каким образом вы создали приложение, вы можете удостовериться в наличии следующего кода в конфигурационном файле `config/web.php`,
```php
@ -119,7 +119,7 @@ http://hostname/index.php?r=country%2Findex
* Модели: `models/Country.php` и `models/CountrySearch.php`
* Вид: `views/country/*.php`
> Info: Gii разработан как тонконастраиваемый и расширяемый инструмент генерации кода. Используя его с умом, вы можете значительно ускорить скорость разработки приложений. Для более подробной информации, пожалуйста, обратитесь к разделу [Gii](tool-gii.md).
> Info: Gii разработан как тонконастраиваемый и расширяемый инструмент генерации кода. Используя его с умом, вы можете значительно ускорить скорость разработки приложений. Для более подробной информации, пожалуйста, обратитесь к разделу [Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ru/README.md).
Заключение <span id="summary"></span>

2
docs/guide-ru/structure-applications.md

@ -190,7 +190,7 @@ if (YII_ENV_DEV) {
#### [[yii\base\Application::components|components]] <span id="components"></span>
Данное свойство является наиболее важным. Оно позволяет вам зарегистрировать список именованных компонентов, называемых
[компоненты приложения](#structure-application-components.md), которые Вы можете использовать в других местах.
[компоненты приложения](structure-application-components.md), которые Вы можете использовать в других местах.
Например,
```php

2
docs/guide-ru/structure-widgets.md

@ -201,7 +201,7 @@ public function run()
Разрабатываемые виджеты должны быть самодостаточными. Это означает, что для их использования должно быть
достаточно всего лишь добавить виджет в представление. Добиться этого бывает затруднительно в том случае,
когда для его функционирования требуются внешние ресурсы, такие как CSS, JavaScript, изображения и т.д.
К счастью, Yii предоставляет поддержку механизма для работы с ресурсами [asset bundles](structure-asset-bundles.md),
К счастью, Yii предоставляет поддержку механизма для работы с ресурсами [asset bundles](structure-assets.md),
который может быть успешно использован для решения данной проблемы.
В случае, когда виджет не содержит логики, а содержит только код, отвечающий за вывод разметки, он мало

2
docs/guide-uk/concept-autoloading.md

@ -4,7 +4,7 @@
Пошук і підключення файлів класів в Yii реалізовано за допомогою
[автозавантаження класів](http://www.php.net/manual/ru/language.oop5.autoload.php).
Фреймворк надає власний швидкісний автозавантажувач, що сумісний з
[PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md),
[PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md),
який встановлюється в момент підключення файлу `Yii.php`.
> Note: Для простоти опису, в цьому розділі ми будемо говорити тільки про автозавантаження класів.

2
docs/guide-zh-CN/concept-autoloading.md

@ -1,7 +1,7 @@
类自动加载(Autoloading)
=================
Yii 依靠[类自动加载机制](http://www.php.net/manual/en/language.oop5.autoload.php)来定位和包含所需的类文件。它提供一个高性能且完美支持[PSR-4 标准](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md)([中文汉化](https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-4-autoloader.md))的自动加载器。该自动加载器会在引入框架文件 `Yii.php` 时安装好。
Yii 依靠[类自动加载机制](http://www.php.net/manual/en/language.oop5.autoload.php)来定位和包含所需的类文件。它提供一个高性能且完美支持[PSR-4 标准](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md)([中文汉化](https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-4-autoloader.md))的自动加载器。该自动加载器会在引入框架文件 `Yii.php` 时安装好。
> Note: 为了简化叙述,本篇文档中我们只会提及类的自动加载。不过,要记得文中的描述同样也适用于接口和Trait(特质)的自动加载哦。

4
docs/guide/caching-data.md

@ -195,6 +195,10 @@ For example, [[yii\db\Schema]] uses the following key to cache schema informatio
As you can see, the key includes all necessary information needed to uniquely specify a database table.
> Note: Values stored in cache via [[yii\caching\Cache::multiSet()|multiSet()]] or [[yii\caching\Cache::multiAdd()|multiAdd()]] can
have only string or integer keys. If you need to set more complex key store the value separately via
[[yii\caching\Cache::set()|set()]] or [[yii\caching\Cache::add()|add()]].
When the same cache storage is used by different applications, you should specify a unique cache key prefix
for each application to avoid conflicts of cache keys. This can be done by configuring the [[yii\caching\Cache::keyPrefix]]
property. For example, in the application configuration you can write the following code:

2
docs/guide/concept-components.md

@ -9,7 +9,7 @@ or an extended class. The three main features that components provide to other c
* [Behaviors](concept-behaviors.md)
Separately and combined, these features make Yii classes much more customizable and easier to use. For example,
the included [[yii\jui\DatePicker|date picker widget]], a user interface component, can be used in a [view](structure-view.md)
the included [[yii\jui\DatePicker|date picker widget]], a user interface component, can be used in a [view](structure-views.md)
to generate an interactive date picker:
```php

2
docs/guide/db-active-record.md

@ -1625,7 +1625,7 @@ class Customer extends \yii\db\ActiveRecord
return null; // this avoid calling a query searching for null primary keys
}
return $this->ordersAggregation[0]['counted'];
return empty($this->ordersAggregation) ? 0 : $this->ordersAggregation[0]['counted'];
}
/**

57
docs/guide/db-migrations.md

@ -191,7 +191,7 @@ In the following all variants of this feature are described.
### Create Table
```php
```
yii migrate/create create_post_table
```
@ -225,7 +225,7 @@ class m150811_220037_create_post_table extends Migration
To create table fields right away, specify them via `--fields` option.
```php
```
yii migrate/create create_post_table --fields="title:string,body:text"
```
@ -262,7 +262,7 @@ class m150811_220037_create_post_table extends Migration
You can specify more field parameters.
```php
```
yii migrate/create create_post_table --fields="title:string(12):notNull:unique,body:text"
```
@ -303,7 +303,7 @@ class m150811_220037_create_post_table extends Migration
Since 2.0.8 the generator supports foreign keys using the `foreignKey` keyword.
```php
```
yii migrate/create create_post_table --fields="author_id:integer:notNull:foreignKey(user),category_id:integer:defaultValue(1):foreignKey,title:string,body:text"
```
@ -426,7 +426,7 @@ If no schema exists, primary key isn't set or is composite, default name `id` wi
### Drop Table
```php
```
yii migrate/create drop_post_table --fields="title:string(12):notNull:unique,body:text"
```
@ -458,7 +458,7 @@ content would contain `addColumn` and `dropColumn` statements necessary.
To add column:
```php
```
yii migrate/create add_position_column_to_post_table --fields="position:integer"
```
@ -479,6 +479,12 @@ class m150811_220037_add_position_column_to_post_table extends Migration
}
```
You can specify multiple columns as follows:
```
yii migrate/create add_xxx_column_yyy_column_to_zzz_table --fields="xxx:integer,yyy:text"
```
### Drop Column
If the migration name is of the form `drop_xxx_column_from_yyy_table` then
@ -510,7 +516,7 @@ class m150811_220037_drop_position_column_from_post_table extends Migration
If the migration name is of the form `create_junction_table_for_xxx_and_yyy_tables` or `create_junction_xxx_and_yyy_tables`
then code necessary to create junction table will be generated.
```php
```
yii migrate/create create_junction_table_for_post_and_tag_tables --fields="created_at:dateTime"
```
@ -891,12 +897,11 @@ will be used to record the migration history. You no longer need to specify it v
command-line option.
### Separated Migrations <span id="separated-migrations"></span>
### Namespaced Migrations <span id="namespaced-migrations"></span>
Sometimes you may need to use migrations from a different namespace. It can be some extension or module in your own
project. One of such examples is migrations for [RBAC component](security-authorization.md#configuring-rbac).
Since version 2.0.10 you can use [[yii\console\controllers\MigrateController::migrationNamespaces|migrationNamespaces]]
to solve this task:
Since 2.0.10 you can use namespaces for the migration classes. You can specify the list of the migration namespaces via
[[yii\console\controllers\MigrateController::migrationNamespaces|migrationNamespaces]]. Using of the namespaces for
migration classes allows you usage of the several source locations for the migrations. For example:
```php
return [
@ -906,14 +911,36 @@ return [
'migrationNamespaces' => [
'app\migrations', // Common migrations for the whole application
'module\migrations', // Migrations for the specific project's module
               'yii\rbac\migrations', // Migrations for the specific extension
               'some\extension\migrations', // Migrations for the specific extension
],
],
],
];
```
If you want them to be applied and tracked down completely separated from each other, you can configure multiple
> Note: migrations applied from different namespaces will create a **single** migration history, e.g. you might be
unable to apply or revert migrations from particular namespace only.
While operating namespaced migrations: creating new, reverting and so on, you should specify full namespace before
migration name. Note that backslash (`\`) symbol is usually considered a special character in the shell, so you need
to escape it properly to avoid shell errors or incorrect behavior. For example:
```
yii migrate/create 'app\\migrations\\createUserTable'
```
> Note: migrations specified via [[yii\console\controllers\MigrateController::migrationPath|migrationPath]] can not
contain a namespace, namespaced migration can be applied only via [[yii\console\controllers\MigrateController::migrationNamespaces]]
property.
### Separated Migrations <span id="separated-migrations"></span>
Sometimes using single migration history for all project migrations is not desirable. For example: you may install some
'blog' extension, which contains fully separated functionality and contain its own migrations, which should not affect
the ones dedicated to main project functionality.
If you want several migrations to be applied and tracked down completely separated from each other, you can configure multiple
migration commands which will use different namespaces and migration history tables:
```php
@ -934,7 +961,7 @@ return [
// Migrations for the specific extension
'migrate-rbac' => [
'class' => 'yii\console\controllers\MigrateController',
           'migrationNamespaces' => ['yii\rbac\migrations'],
'migrationPath' => '@yii/rbac/migrations',
'migrationTable' => 'migration_rbac',
],
],

261
docs/guide/input-validation.md

@ -563,266 +563,7 @@ As a result, we will not see error message near form fields. To display it, we c
<?= $form->errorSummary($model) ?>
```
### Custom validator <span id="multiple-attributes-custom-validator"></span>
If passing one attribute is not acceptable for you (for example it can be hard to choose which one is more relevant or
you consider it misleading in rules), the more advanced solution is to implement `CustomValidator` with support for
validating multiple attributes at once.
By default if multiple attributes are used for validation, the loop will be used to apply the same validation to each
of them. Let's use a separate trait and override [[yii\base\Validator:validateAttributes()]]:
```php
<?php
namespace app\components;
trait BatchValidationTrait
{
/**
* @var bool whether to validate multiple attributes at once
*/
public $batch = false;
/**
* Validates the specified object.
* @param \yii\base\Model $model the data model being validated.
* @param array|null $attributes the list of attributes to be validated.
* Note that if an attribute is not associated with the validator, or is is prefixed with `!` char - it will be
* ignored. If this parameter is null, every attribute listed in [[attributes]] will be validated.
*/
public function validateAttributes($model, $attributes = null)
{
if (is_array($attributes)) {
$newAttributes = [];
foreach ($attributes as $attribute) {
if (in_array($attribute, $this->attributes) || in_array('!' . $attribute, $this->attributes)) {
$newAttributes[] = $attribute;
}
}
$attributes = $newAttributes;
} else {
$attributes = [];
foreach ($this->attributes as $attribute) {
$attributes[] = $attribute[0] === '!' ? substr($attribute, 1) : $attribute;
}
}
foreach ($attributes as $attribute) {
$skip = $this->skipOnError && $model->hasErrors($attribute)
|| $this->skipOnEmpty && $this->isEmpty($model->$attribute);
if ($skip) {
// Skip validation if at least one attribute is empty or already has error
// (according skipOnError and skipOnEmpty options must be set to true
return;
}
}
if ($this->batch) {
// Validate all attributes at once
if ($this->when === null || call_user_func($this->when, $model, $attribute)) {
// Pass array with all attributes instead of one attribute
$this->validateAttribute($model, $attributes);
}
} else {
// Validate each attribute separately using the same validation logic
foreach ($attributes as $attribute) {
if ($this->when === null || call_user_func($this->when, $model, $attribute)) {
$this->validateAttribute($model, $attribute);
}
}
}
}
}
```
Then we need to create custom validator and use the created trait:
```php
<?php
namespace app\components;
use yii\validators\Validator;
class CustomValidator extends Validator
{
use BatchValidationTrait;
}
```
To support inline validation as well we can extend default inline validator and also use this trait:
```php
<?php
namespace app\components;
use yii\validators\InlineValidator;
class CustomInlineValidator extends InlineValidator
{
use BatchValidationTrait;
}
```
Couple more changes are needed.
First to use our `CustomInlineValidator` instead of default `InlineValidator` we need to override
[[\yii\validators\Validator::createValidator()]] method in `CustomValidator`:
```php
public static function createValidator($type, $model, $attributes, $params = [])
{
$params['attributes'] = $attributes;
if ($type instanceof \Closure || $model->hasMethod($type)) {
// method-based validator
// The following line is changed to use our CustomInlineValidator
$params['class'] = __NAMESPACE__ . '\CustomInlineValidator';
$params['method'] = $type;
} else {
if (isset(static::$builtInValidators[$type])) {
$type = static::$builtInValidators[$type];
}
if (is_array($type)) {
$params = array_merge($type, $params);
} else {
$params['class'] = $type;
}
}
return Yii::createObject($params);
}
```
And finally to support our custom validator in model we can create the trait and override
[[\yii\base\Model::createValidators()]] like this:
```php
<?php
namespace app\components;
use yii\base\InvalidConfigException;
trait CustomValidationTrait
{
/**
* Creates validator objects based on the validation rules specified in [[rules()]].
* Unlike [[getValidators()]], each time this method is called, a new list of validators will be returned.
* @return ArrayObject validators
* @throws InvalidConfigException if any validation rule configuration is invalid
*/
public function createValidators()
{
$validators = new ArrayObject;
foreach ($this->rules() as $rule) {
if ($rule instanceof Validator) {
$validators->append($rule);
} elseif (is_array($rule) && isset($rule[0], $rule[1])) { // attributes, validator type
// The following line is changed in order to use our CustomValidator
$validator = CustomValidator::createValidator($rule[1], $this, (array) $rule[0], array_slice($rule, 2));
$validators->append($validator);
} else {
throw new InvalidConfigException('Invalid validation rule: a rule must specify both attribute names and validator type.');
}
}
return $validators;
}
}
```
Now we can implement custom validator by extending from `CustomValidator`:
```php
<?php
namespace app\validators;
use app\components\CustomValidator;
class ChildrenFundsValidator extends CustomValidator
{
public function validateAttribute($model, $attribute)
{
// $attribute here is not a single attribute, it's an array containing all related attributes
$totalSalary = $this->personalSalary + $this->spouseSalary;
// Double the minimal adult funds if spouse salary is specified
$minAdultFunds = $this->spouseSalary ? self::MIN_ADULT_FUNDS * 2 : self::MIN_ADULT_FUNDS;
$childFunds = $totalSalary - $minAdultFunds;
if ($childFunds / $this->childrenCount < self::MIN_CHILD_FUNDS) {
$this->addError('*', 'Your salary is not enough for children.');
}
}
}
```
Because `$attribute` contains the list of all related attributes, we can use loop in case of adding errors for all
attributes is needed:
```php
foreach ($attribute as $singleAttribute) {
$this->addError($attribute, 'Your salary is not enough for children.');
}
```
Now it's possible to specify all related attributes in according validation rule:
```php
[
['personalSalary', 'spouseSalary', 'childrenCount'],
\app\validators\ChildrenFundsValidator::className(),
'batch' => `true`,
'when' => function ($model) {
return $model->childrenCount > 0;
}
],
```
For inline validation the rule will be:
```php
[
['personalSalary', 'spouseSalary', 'childrenCount'],
'validateChildrenFunds',
'batch' => `true`,
'when' => function ($model) {
return $model->childrenCount > 0;
}
],
```
And here is according validation method:
```php
public function validateChildrenFunds($attribute, $params)
{
// $attribute here is not a single attribute, it's an array containing all related attributes
$totalSalary = $this->personalSalary + $this->spouseSalary;
// Double the minimal adult funds if spouse salary is specified
$minAdultFunds = $this->spouseSalary ? self::MIN_ADULT_FUNDS * 2 : self::MIN_ADULT_FUNDS;
$childFunds = $totalSalary - $minAdultFunds;
if ($childFunds / $this->childrenCount < self::MIN_CHILD_FUNDS) {
$this->addError('childrenCount', 'Your salary is not enough for children.');
}
}
```
The advantages of this approach:
- It better reflects all attributes that participate in validation (the rules become more readable);
- It respects the options [[yii\validators\Validator::skipOnError]] and [[yii\validators\Validator::skipOnEmpty]] for
**each** used attribute (not only for that you decided to choose as more relevant).
If you have problems with implementing client validation, you can:
- combine [[yii\widgets\ActiveForm::enableAjaxValidation|enableClientValidation]] and
[[yii\widgets\ActiveForm::enableAjaxValidation|enableAjaxValidation]] options, so multiple attributes will be validated
with AJAX without page reload;
- implement validation outside of [[yii\validators\Validator::clientValidateAttribute]] because it's designed to work
with single attribute.
> Note: Creating validator which validates multiple attributes at once is well described in the [community cookbook](https://github.com/samdark/yii2-cookbook/blob/master/book/forms-validator-multiple-attributes.md).
## Client-Side Validation <span id="client-side-validation"></span>

2
docs/guide/intro-upgrade-from-v1.md

@ -536,5 +536,5 @@ Using Yii 1.1 and 2.x together
------------------------------
If you have legacy Yii 1.1 code that you want to use together with Yii 2.0, please refer to
the [Using Yii 1.1 and 2.0 Together](tutorial-yii-integration.md) section.
the [Using Yii 1.1 and 2.0 Together](tutorial-yii-integration.md#using-both-yii2-yii1) section.

4
docs/guide/intro-yii.md

@ -50,8 +50,8 @@ This guide is mainly about version 2.0.
Requirements and Prerequisites
------------------------------
Yii 2.0 requires PHP 5.4.0 or above. You can find more detailed requirements for individual features
by running the requirement checker included in every Yii release.
Yii 2.0 requires PHP 5.4.0 or above and runs best with the latest version of PHP 7. You can find more detailed
requirements for individual features by running the requirement checker included in every Yii release.
Using Yii requires basic knowledge of object-oriented programming (OOP), as Yii is a pure OOP-based framework.
Yii 2.0 also makes use of the latest features of PHP, such as [namespaces](http://www.php.net/manual/en/language.namespaces.php)

8
docs/guide/output-client-scripts.md

@ -46,7 +46,7 @@ instead of adding a new one. If you don't provide it, the JS code itself will be
### Registering script files <span id="script-files"></span>
The arguments for [[yii\web\View::registerJsFile()|registerJsFile()]] are similar to those for
[[yii\web\View::registerCssFile()|registerCssFile()]]. In the above example,
[[yii\web\View::registerCssFile()|registerCssFile()]]. In the following example,
we register the `main.js` file with the dependency on the [[yii\web\JqueryAsset]]. It means that the `main.js` file
will be added AFTER `jquery.js`. Without such dependency specification, the relative order between
`main.js` and `jquery.js` would be undefined and the code would not work.
@ -67,7 +67,7 @@ multiple JS files, which is desirable for high traffic websites.
## Registering CSS <span id="register-css"></span>
Similar to Javascript, you can register CSS using
Similar to JavaScript, you can register CSS using
[[yii\web\View::registerCss()|registerCss()]] or
[[yii\web\View::registerCssFile()|registerCssFile()]].
The former registers a block of CSS code while the latter registers an external CSS file.
@ -170,7 +170,7 @@ variable definition, e.g.:
var yiiOptions = {"appName":"My Yii Application","baseUrl":"/basic/web","language":"en"};
```
In your Javascript code you can now access these like `yiiOptions.baseUrl` or `yiiOptions.language`.
In your JavaScript code you can now access these like `yiiOptions.baseUrl` or `yiiOptions.language`.
### Passing translated messages <span id="translated-messages"></span>
@ -189,7 +189,7 @@ JS
```
The above example code uses PHP
[Heredoc syntax](http://php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc) for better readability. This also enables better syntax highlighting in most IDEs so it is the
[Heredoc syntax](http://php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc) for better readability. This also enables better syntax highlighting in most IDEs so it is the
preferred way of writing inline JavaScript, especially useful for code that is longer than a single line. The variable `$message` is created in PHP and
thanks to [[yii\helpers\Json::htmlEncode|Json::htmlEncode]] it contains the
string in valid JS syntax, which can be inserted into the JavaScript code to place the dynamic string in the function call to `alert()`.

10
docs/guide/output-data-widgets.md

@ -29,8 +29,8 @@ echo DetailView::widget([
[ // the owner name of the model
'label' => 'Owner',
'value' => $model->owner->name,
'contentOptions' => ['class' => 'bg-red'], // to HTML customize attributes of value tag
'captionOptions' => ['tooltip' => 'Tooltip'], // to HTML customize attributes of label tag
'contentOptions' => ['class' => 'bg-red'], // HTML attributes to customize value tag
'captionOptions' => ['tooltip' => 'Tooltip'], // HTML attributes to customize label tag
],
'created_at:datetime', // creation date formatted as datetime
],
@ -38,8 +38,8 @@ echo DetailView::widget([
```
Remember that unlike [[yii\widgets\GridView|GridView]] which processes a set of models,
[[yii\widgets\DetailView|DetailView]] processes just one. So most of the times there is no need for using closure since
`$model` is the only one model for display and available in view as variable.
[[yii\widgets\DetailView|DetailView]] processes just one. So most of the time there is no need for using closure since
`$model` is the only one model for display and available in view as a variable.
However some cases can make using of closure useful. For example when `visible` is specified and you want to prevent
`value` calculations in case it evaluates to `false`:
@ -600,7 +600,7 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name'
> $query->andFilterWhere(['LIKE', 'au.name', $this->getAttribute('author.name')]);
> ```
>
> The same is `true` for the sorting definition:
> The same is true for the sorting definition:
>
> ```php
> $dataProvider->sort->attributes['author.name'] = [

5
docs/guide/runtime-routing.md

@ -43,7 +43,7 @@ The [[yii\web\UrlManager|URL manager]] supports two URL formats:
- the default URL format;
- the pretty URL format.
The default URL format uses a query parameter named `r` to represent the route and normal query parameters
The default URL format uses a [[yii\web\UrlManager::$routeParam|query parameter]] named `r` to represent the route and normal query parameters
to represent the query parameters associated with the route. For example, the URL `/index.php?r=post/view&id=100` represents
the route `post/view` and the `id` query parameter `100`. The default URL format does not require any configuration of
the [[yii\web\UrlManager|URL manager]] and works in any Web server setup.
@ -458,6 +458,9 @@ will parse the URL `http://en.example.com/posts` into the route `post/index` and
]
```
Since version 2.0.11, you may also use protocol relative patterns that work for both, `http` and `https`.
The syntax is the same as above but skipping the `http:` part, e.g.: `'//www.example.com/login' => 'site/login'`.
> Note: Rules with server names should **not** include the subfolder of the entry script in their patterns. For example, if the applications entry script is at `http://www.example.com/sandbox/blog/index.php`, then you should use the pattern
`http://www.example.com/posts` instead of `http://www.example.com/sandbox/blog/posts`. This will allow your application
to be deployed under any directory without the need to change your url rules. Yii will automatically detect the base url of the application.

2
docs/guide/runtime-sessions-cookies.md

@ -200,7 +200,7 @@ $session->setFlash('postDeleted', 'You have successfully deleted your post.');
echo $session->getFlash('postDeleted');
// Request #3
// $result will be `false` since the flash message was automatically deleted
// $result will be false since the flash message was automatically deleted
$result = $session->hasFlash('postDeleted');
```

2
docs/guide/start-installation.md

@ -152,7 +152,7 @@ Yii's requirements. You can check if the minimum requirements are met using one
```
You should configure your PHP installation so that it meets the minimum requirements of Yii. Most importantly, you
should have PHP 5.4 or above. You should also install the [PDO PHP Extension](http://www.php.net/manual/en/pdo.installation.php)
should have PHP 5.4 or above. Ideally latest PHP 7. You should also install the [PDO PHP Extension](http://www.php.net/manual/en/pdo.installation.php)
and a corresponding database driver (such as `pdo_mysql` for MySQL databases), if your application needs a database.

10
docs/guide/structure-assets.md

@ -349,9 +349,9 @@ return [
You can also disable *all* asset bundles by setting [[yii\web\AssetManager::bundles]] as `false`.
Keep in mind that customization made via [[yii\web\AssetManager::bundles]] applied at the creation of the asset bundle, e.g.
at object constructor stage. Thus any adjustments, which are made to the bundle object after that, will override the mapping,
which has been setup at [[yii\web\AssetManager::bundles]] level. In particular: adjustments made inside [[yii\web\AssetBundle::init()]]
Keep in mind that customization made via [[yii\web\AssetManager::bundles]] is applied at the creation of the asset bundle, e.g.
at object constructor stage. Thus any adjustments made to the bundle object after that will override the mapping setup at [[yii\web\AssetManager::bundles]] level.
In particular: adjustments made inside [[yii\web\AssetBundle::init()]]
method or over the registered bundle object will take precedence over `AssetManager` configuration.
Here are the examples, where mapping set via [[yii\web\AssetManager::bundles]] makes no effect:
@ -676,7 +676,7 @@ return [
That is, the asset bundle configuration array is saved in `assets-prod.php` for production mode, and
`assets-dev.php` for non-production mode.
> Note: this asset combining mechanism is based on ability of [[yii\web\AssetManager::bundles]] to override the properties
> Note: this asset combining mechanism is based on the ability of [[yii\web\AssetManager::bundles]] to override the properties
of the registered asset bundles. However, as it already has been said above, this ability does not cover asset bundle
adjustments, which are performed at [[yii\web\AssetBundle::init()]] method or after bundle is registered. You should
avoid usage of such dynamic bundles during the asset combining.
@ -761,7 +761,7 @@ the last subsection.
[[yii\web\AssetManager::assetMap]] and want this customization to be applied for the compression source files,
you should include these options to the `assetManager` section inside asset command configuration file.
> Note: while specifying the compression source, you should avoid usage of the asset bundles, which parameters may be
> Note: while specifying the compression source, you should avoid the use of asset bundles whose parameters may be
adjusted dynamically (e.g. at `init()` method or after registration), since they may work incorrectly after compression.

4
docs/guide/tutorial-core-validators.md

@ -26,7 +26,7 @@ In the following, we will describe the main usage and properties of every core v
// checks if "selected" is either 0 or 1, regardless of data type
['selected', 'boolean'],
// checks if "deleted" is of boolean type, either `true` or `false`
// checks if "deleted" is of boolean type, either true or false
['deleted', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true],
]
```
@ -175,7 +175,7 @@ or `1970-01-01` in the input field of a date picker.
```php
[
// set "age" to be `null` if it is empty
// set "age" to be null if it is empty
['age', 'default', 'value' => null],
// set "country" to be "USA" if it is empty

4
docs/guide/tutorial-performance-tuning.md

@ -11,8 +11,8 @@ factors and explain how you can improve your application performance by adjustin
A well configured PHP environment is very important. In order to get maximum performance,
- Use the latest stable PHP version. Major releases of PHP may bring significant performance improvements.
- Enable bytecode caching with [Opcache](http://php.net/opcache) (PHP 5.5 or later) or [APC](http://ru2.php.net/apc)
(PHP 5.4 or earlier). Bytecode caching avoids the time spent in parsing and including PHP scripts for every
- Enable bytecode caching with [Opcache](http://php.net/opcache) (PHP 5.5 or later) or [APC](http://php.net/apc)
(PHP 5.4). Bytecode caching avoids the time spent in parsing and including PHP scripts for every
incoming request.
- [Tune `realpath()` cache](https://github.com/samdark/realpath_cache_tuner).

9
docs/internals-ja/automation.md

@ -9,12 +9,15 @@ Yii の開発に取り組む際に、自動化できるタスクがいくつか
- クラスファイルの中の、ゲッターとセッターによって導入されるプロパティを記述する `@property` 注釈の生成。
`./build/build php-doc/property` を実行して注釈を更新してください。
- コードスタイルと phpdoc コメントの些細な問題の修正。
- コードスタイルと phpdoc コメントの細かい問題の修正。
`./build/build php-doc/fix` を実行して修正してください。
このコマンドは完璧なものではないため、望ましくない変更があるかもしれませんので、コミットする前に変更点をチェックしてください。
`git add -p` を使って変更をレビューすることが出来ます。
- Mime マジックファイル (`framework/helpers/mimeTypes.php`) の Apache HTTPd レポジトリによる更新。
- Mime タイプマジックファイル (`framework/helpers/mimeTypes.php`) の Apache HTTPd レポジトリによる更新。
`./build/build mime-type` を実行してファイルを更新して下さい。
上記のコマンドの全てが [release process]() に含まれています。これらをリリースの間に実行しても構いませんが、必要ではありません。
- CHANGELOG ファイルのエントリの出現順序は、`./build/build release/sort-changelog framework`
を実行することで更新することが出来ます。
上記のコマンドの全てが [リリースの工程]() に含まれています。これらをリリースとリリースの間に実行しても構いませんが、必要ではありません。

28
docs/internals-ja/core-code-style.md

@ -143,11 +143,31 @@ class Foo
}
```
### 4.4 Doc ブロック
### 4.4 PHPDoc ブロック
- `@param`、`@var`、`@property` および `@return``bool`、`int`、`string`、`array` または `null` として型を宣言しなければなりません。
`Model` または `ActiveRecord` のようなクラス名を使うことも出来ます。
- 型付きの配列に対しては `ClassName[]` を使います。
- PHPDoc の最初の行には、メソッドの目的を記述しなければなりません。
- メソッドが何かをチェックする (たとえば、`isActive`, `hasClass` など) ものである場合は、
最初の行は `Checks whether` で始まらなければなりません。
- `@return` は、厳密に何が返されるのかを明示的に記述しなければなりません。
```php
/**
* Checks whether the IP is in subnet range
*
* @param string $ip an IPv4 or IPv6 address
* @param int $cidr the CIDR lendth
* @param string $range subnet in CIDR format e.g. `10.0.0.0/8` or `2001:af::/64`
* @return bool whether the IP is in subnet range
*/
private function inRange($ip, $cidr, $range)
{
// ...
}
```
`@param`、`@var`、`@property` および `@return``bool`、`int`、`string`、`array` または `null` として型を宣言しなければなりません。
`Model` または `ActiveRecord` のようなクラス名を使うことも出来ます。
型付きの配列に対しては `ClassName[]` を使います。
### 4.5 コンストラクタ

4
docs/internals-ja/design-decisions.md

@ -23,3 +23,7 @@
unsigned の場合、32 bit システムでは、文字列を使って表現しなければならなくなる。
また、unsigned int はサイズを倍にするとはいうものの、そのような広大な数値空間を必要とするテーブルを持っている場合は、unsigned に頼るより bigint または mediumint を使用する方が安全である。
<https://github.com/yiisoft/yii/pull/1923#issuecomment-11881967>
6. [ヘルパか、独立した非スタティックなクラスか](https://github.com/yiisoft/yii2/pull/12661#issuecomment-251599463)
7. **セッターメソッドチェイニング** は、意味のある値を返すメソッドがそのクラスに存在する場合は、避けるべきである。
チェイニングは、クラスがビルダーであり、全てのセッターが内部状態を修正するものである場合にサポートされうる。
https://github.com/yiisoft/yii2/issues/13026

39
docs/internals-ja/git-workflow.md

@ -1,8 +1,8 @@
Yii 2 寄稿者のための Git ワークフロー
=====================================
Yii の開発に寄稿したい、ですって? すばらしい!
ただし、あなたの修正案が速やかに採用されるチャンスを増やすために、以下のステップを踏むようにしてください。
で、Yii の開発に貢献したい、と。すばらしい。
でも、あなたの修正案が速やかに採用されるチャンスを増やすために、以下のステップを踏むようにしてください。
あなたが git と github については初めてだという場合は、最初に [github help](http://help.github.com/) や [try git](https://try.github.com) を精査したり、[git internal data model](http://nfarina.com/post/9868516270/git-is-simpler) についていくらか学習したりする必要があるかもしれません。
あなたの開発環境を準備する
@ -19,6 +19,8 @@ git clone git@github.com:YOUR-GITHUB-USERNAME/yii2.git
Linux において、GitHub で GIT を設定するのに問題が生じたり、"Permission Denied (publickey)" のようなエラーが発生したりする場合は、[setup your GIT installation to work with GitHub](http://help.github.com/linux-set-up-git/) に従ってください。
> Tip: あなたが Git に精通していない場合は、素晴らしい無料の [プロ Git ブック](https://git-scm.com/book/en/v2) を読むことをお勧めします。
### 2. メインの Yii リポジトリを "upstream" という名前でリモートとして追加する
Yii をクローンしたディレクトリ、通常は "yii2" に入って、以下のコマンドを打ち込みます。
@ -31,18 +33,26 @@ git remote add upstream git://github.com/yiisoft/yii2.git
以下のステップは、翻訳またはドキュメントだけに取り組みたい場合は、必要ではありません。
- `composer update` を実行して、依存パッケージをインストールします ([composer をグローバルにインストール](https://getcomposer.org/doc/00-intro.md#globally) したものと仮定しています)。
- `composer install` を実行して、依存パッケージをインストールします ([composer をグローバルにインストール](https://getcomposer.org/doc/00-intro.md#globally) したものと仮定しています)。
> Note: `Problem 1 The requested package bower-asset/jquery could not be found in any version, there may be a typo in the package name.` というようなエラーが生ずる場合は、`composer global require "fxp/composer-asset-plugin:^1.2.0"` を実行する必要があります。
JavaScript を扱おうとしている場合は、
- `npm install` を実行して JavaScript テストツール群とその依存ライブラリをインストールします
([Node.js と NPM のインストール](https://nodejs.org/en/download/package-manager/) は完了しているものとします)。
> Note: JavaScript のテストが依存している [jsdom](https://github.com/tmpvar/jsdom) ライブラリは、Node.js 4 以降を必要とします。
Node.js 6 または 7 を使用することをより強く推奨します。
- `php build/build dev/app basic` を実行して、ベーシックアプリケーションをクローンし、その依存パッケージをインストールします。
- `php build/build dev/app basic <fork>` を実行し、ベーシックアプリケーションをクローンし、ベーシックアプリケーションのための composer 依存パッケージをインストールします
ここで `<fork>` は、`git@github.com:my_nickname/yii2-app-basic.git` のような、あなたのレポジトリのフォークの URL です。
あなたがコアフレームワークの貢献者である場合は、フォークの指定を省略しても構いません。
このコマンドは外部 composer パッケージは通常どおりインストールしますが、yii2 レポジトリは現在チェックアウトされているものをリンクします。
これで、インストールされる全てのコードについて、一つのインスタンスを持つことになります。
必要であれば、アドバンストアプリケーションについても同様にします: `php build/build dev/app advanced`
必要であれば、アドバンストアプリケーションについても同様にします: `php build/build dev/app advanced <fork>`
このコマンドは後日、依存パッケージを更新するためにも使用されます。
このコマンドは内部的に `composer update` を実行します。
このコマンドは後日、依存パッケージを更新するためにも使用されます。このコマンドは内部的に `composer update` を実行します。
> Note: デフォルトの git レポジトリの Url を使うため、SSH 経由で github からクローンすることになります。
> `build` コマンドに `--useHttp` フラグを追加すれば、代りに HTTP を使うことが出来ます。
@ -63,20 +73,29 @@ phpunit をグローバルにインストールしていない場合は、代り
例えば、バリデータと redis のためのテストだけを走らせるためには、`phpunit --group=validators,redis` とします。
利用できるグループのリストを取得するためには、`phpunit --list-groups` を実行してください。
JavaScript の単体テストは、レポジトリのルートディレクトリで `npm test` を走らせることによって実行することが出来ます。
> Note: タイムアウトエラー、例えば `Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.` になる場合は、
タイムアウトになる時間を延ばすことが出来ます。
`npm test -- --timeout 30000`
(`--` を忘れないように。追加の引数を渡すために必要です)。
### エクステンション
エクステンションに取り組むためには、エクステンションのレポジトリをクローンする必要があります。
私たちは、あなたに代ってそれをするコマンドを作っています。
```
php build/build dev/ext <extension-name>
php build/build dev/ext <extension-name> <fork>
```
ここで `<extension-name>` がエクステンションの名前、例えば `redis` です。
そして `<fork>` は、`git@github.com:my_nickname/yii2-redis.git` のような、あなたのエクステンションのフォークの URL です。
あなたがコアフレームワークの貢献者である場合は、フォークの指定を省略しても構いません。
エクステンションをアプリケーションテンプレートのどちらかでテストしたい場合は、通常そうするように、アプリケーションの `composer.json` にそれを追加するだけです。
例えば、ベーシックアプリケーションの `require` セクションに `"yiisoft/yii2-redis": "*"` を追加します。
`php build/build dev/app basic` を実行すると、エクステンションとその依存パッケージがインストールされ、`extensions/redis` に対するシンボリックリンクが作成されます。
例えば、ベーシックアプリケーションの `require` セクションに `"yiisoft/yii2-redis": "~2.0.0"` を追加します。
`php build/build dev/app basic <fork>` を実行すると、エクステンションとその依存パッケージがインストールされ、`extensions/redis` に対するシンボリックリンクが作成されます。
こうすることで、composer の vendor ディレクトリではなく、直接に yii2 のレポジトリで作業をすることが出来るようになります。
> Note: デフォルトの git レポジトリの Url を使うため、SSH 経由で github からクローンすることになります。

4
docs/internals-ja/versions.md

@ -6,9 +6,9 @@ Yii バージョン規約
私たちはこれを [Semantic Versioning](http://semver.org/) より現実的で合理的であると考えます
(詳細については [#7408](https://github.com/yiisoft/yii2/issues/7408) を参照してください)。
コア開発者チームの内部では、2.0.x リリースを 100% 後方互換に保つことが重要であることが、何度かに渡って強調されました。
コア開発者チームの内部では、2.0.x リリースを 100% 後方互換に保つことが重要であることが、何度強調されました。
しかし、これは理想としての計画です。
ferver の記事は、Semantic Versioning を使おうが使うまいが、これが現実には達成が困難な計画であることを示す現実世界の例を示しています。
ferver の記事は、Semantic Versioning を使っても使わなくても、これが現実には達成が困難な計画であることを示す現実世界の例を示しています。
要約すれば、Yii 2 に対する私たちのバージョン付与ポリシーは次のようになります。

2
docs/internals/core-code-style.md

@ -153,7 +153,7 @@ class Foo
```php
/**
* Checkes whether the IP is in subnet range
* Checks whether the IP is in subnet range
*
* @param string $ip an IPv4 or IPv6 address
* @param int $cidr the CIDR lendth

11
docs/internals/git-workflow.md

@ -47,11 +47,12 @@ If you are going to work with JavaScript:
> Note: JavaScript tests depend on [jsdom](https://github.com/tmpvar/jsdom) library which requires Node.js 4 or newer.
Using of Node.js 6 or 7 is more preferable.
- run `php build/build dev/app basic` to clone the basic app and install composer dependencies for the basic app.
- run `php build/build dev/app basic <fork>` to clone the basic app and install composer dependencies for the basic app.
`<fork>` is URL of your repository fork such as `git@github.com:my_nickname/yii2-app-basic.git`. If you are core framework contributor you may skip specifying fork.
This command will install foreign composer packages as normal but will link the yii2 repo to
the currently checked out repo, so you have one instance of all the code installed.
Do the same for the advanced app if needed: `php build/build dev/app advanced`.
Do the same for the advanced app if needed: `php build/build dev/app advanced <fork>`.
This command will also be used to update dependencies, it runs `composer update` internally.
@ -84,14 +85,14 @@ additional arguments).
To work on extensions you have to clone the extension repository. We have created a command that can do this for you:
```
php build/build dev/ext <extension-name>
php build/build dev/ext <extension-name> <fork>
```
where `<extension-name>` is the name of the extension, e.g. `redis`.
where `<extension-name>` is the name of the extension, e.g. `redis` and `<fork>` is URL of your extension fork such as `git@github.com:my_nickname/yii2-redis.git`. If you are core framework contributor you may skip specifying fork.
If you want to test the extension in one of the application templates, just add it to the `composer.json` of the application as you would
normally do e.g. add `"yiisoft/yii2-redis": "~2.0.0"` to the `require` section of the basic app.
Running `php build/build dev/app basic` will install the extension and its dependencies and create
Running `php build/build dev/app basic <fork>` will install the extension and its dependencies and create
a symlink to `extensions/redis` so you are not working in the composer vendor dir but in the yii2 repository directly.
> Note: The default git repository Urls clone from github via SSH, you may add the `--useHttp` flag to the `build` command

14
framework/BaseYii.php

@ -93,7 +93,7 @@ class BaseYii
*/
public static function getVersion()
{
return '2.0.11-dev';
return '2.0.12-dev';
}
/**
@ -378,7 +378,8 @@ class BaseYii
* Logs a trace message.
* Trace messages are logged mainly for development purpose to see
* the execution work flow of some code.
* @param string $message the message to be logged.
* @param string|array $message the message to be logged. This can be a simple string or a more
* complex data structure, such as array.
* @param string $category the category of the message.
*/
public static function trace($message, $category = 'application')
@ -392,7 +393,8 @@ class BaseYii
* Logs an error message.
* An error message is typically logged when an unrecoverable error occurs
* during the execution of an application.
* @param string $message the message to be logged.
* @param string|array $message the message to be logged. This can be a simple string or a more
* complex data structure, such as array.
* @param string $category the category of the message.
*/
public static function error($message, $category = 'application')
@ -404,7 +406,8 @@ class BaseYii
* Logs a warning message.
* A warning message is typically logged when an error occurs while the execution
* can still continue.
* @param string $message the message to be logged.
* @param string|array $message the message to be logged. This can be a simple string or a more
* complex data structure, such as array.
* @param string $category the category of the message.
*/
public static function warning($message, $category = 'application')
@ -416,7 +419,8 @@ class BaseYii
* Logs an informative message.
* An informative message is typically logged by an application to keep record of
* something important (e.g. an administrator logs in).
* @param string $message the message to be logged.
* @param string|array $message the message to be logged. This can be a simple string or a more
* complex data structure, such as array.
* @param string $category the category of the message.
*/
public static function info($message, $category = 'application')

79
framework/CHANGELOG.md

@ -1,20 +1,47 @@
Yii Framework 2 Change Log
==========================
2.0.11 under development
2.0.12 under development
--------------------------
- Bug #13538: Fixed `yii\db\BaseActiveRecord::deleteAll()` changes method signature declared by `yii\db\ActiveRecordInterface::deleteAll()` (klimov-paul)
- Enh #13278: `yii\caching\DbQueryDependency` created allowing specification of the cache dependency via `yii\db\QueryInterface` (klimov-paul)
2.0.11.2 February 08, 2017
--------------------------
- Bug #13501: Fixed `yii\rbac\DbManager::getRule()` and `yii\rbac\DbManager::getRules()` to properly handle resource data came from Rule table when using PostgreSQL (StalkAlex)
- Bug #13508: Fixed duplicate attachment of behavior BC break (cebe)
- Bug #13522: Issue with UrlRule, which created duplicate slashes when a default value was used (cebe)
- Bug #13533: Fixed BC break in `yii\validators\ExistValidator::$targetAttribute` (developeruz)
2.0.11.1 February 02, 2017
------------------------
- Bug #11502: Fixed `yii\console\controllers\MessageController` to properly populate missing languages in case of extraction with "db" format (bizley)
- Bug #13489: Fixed button names in ActionColumn to contain proper `Yii::t()` tags and restored missing translations for `el`, `fa`, `ja`, `ru`, and `sk` (cebe, softark)
2.0.11 February 01, 2017
------------------------
- Bug #13277: Fixed invalid parsing of `--` ("End of Options" special argument) in CLI (rugabarbo)
- Bug #4113: Error page stacktrace was generating links to private methods which are not part of the API docs (samdark)
- Bug #7727: Fixed `yii\helpers\StringHelper::truncateHtml()` leaving extra tags (developeruz)
- Bug #9305: Fixed MSSQL `Schema::TYPE_TIMESTAMP` to be 'datetime' instead of 'timestamp', which is just an incremental number (nkovacs)
- Bug #9616: Fixed mysql\Schema::loadColumnSchema to set enumValues attribute correctly if enum definition contains commas (fphammerle)
- Bug #9796: Initialization of not existing `yii\grid\ActionColumn` default buttons (arogachev)
- Bug #10488: Fixed incorrect behavior of `yii\validation\NumberValidator` when used with locales where decimal separator is comma (quantum13, samdark, rob006)
- Bug #11122: Fixed can not use `orderBy` with aggregate functions like `count` (Ni-san)
- Bug #11771: Fixed semantics of `yii\di\ServiceLocator::__isset()` to match the behavior of `__get()` which fixes inconsistent behavior on newer PHP versions (cebe)
- Bug #12133: Fixed `getDbTargets()` function in `yii\log\migrations\m141106_185632_log_init` that would create a log table correctly (bumstik)
- Bug #12213: Fixed `yii\db\ActiveRecord::unlinkAll()` to respect `onCondition()` of the relational query (silverfire)
- Bug #12345: Fixed `Formatter::asCurrency()` for proper decimal formatting (Oxyaction)
- Bug #12599: Fixed MSSQL fail to work with `nvarbinary`. Enhanced SQL scripts compatibility with older versions (samdark)
- Bug #12681: Changed `data` column type from `text` to `blob` to handle null-byte (`\0`) in serialized RBAC rule properly (silverfire)
- Bug #12703: Fixed `StringHelper::truncateHtml()` non functional when dom PHP extension is disabled (samdark)
- Bug #12713: Fixed `yii\caching\FileDependency` to clear stat cache before reading filemtime (SG5)
- Bug #12714: Fixed `yii\validation\EmailValidator` to prevent false-positives checks when property `checkDns` is set to `true` (silverfire)
- Bug #12735: Fixed `yii\console\controllers\MigrateController` creating multiple primary keys for field `bigPrimaryKey:unsigned` (SG5)
- Bug #12791: Fixed `yii\behaviors\AttributeTypecastBehavior` unable to automatically detect `attributeTypes`, triggering PHP Fatal Error (klimov-paul)
@ -30,6 +57,7 @@ Yii Framework 2 Change Log
- Bug #12880: Fixed `yii\behaviors\AttributeTypecastBehavior` marks attributes with `null` value as 'dirty' (klimov-paul)
- Bug #12904: Fixed lowercase table name in migrations (zlakomanoff)
- Bug #12939: Hard coded table names for MSSQL in RBAC migration (arogachev)
- Bug #12969: Improved unique ID generation for `yii\widgets\Pjax` widgets (dynasource, samdark, rob006)
- Bug #12974: Fixed incorrect order of migrations history in case `yii\console\controllers\MigrateController::$migrationNamespaces` is in use (evgen-d, klimov-paul)
- Bug #13071: Help option for commands was not working in modules (arogachev, haimanman)
- Bug #13089: Fixed `yii\console\controllers\AssetController::adjustCssUrl()` breaks URL reference specification (`url(#id)`) (vitalyzhakov)
@ -40,38 +68,58 @@ Yii Framework 2 Change Log
- Bug #13159: Fixed `destroy` method in `yii.captcha.js` which did not work as expected (arogachev)
- Bug #13198: Fixed order of checks in `yii\validators\IpValidator` that sometimes caused wrong error message (silverfire)
- Bug #13200: Creating URLs for routes specified in `yii\rest\UrlRule::$extraPatterns` did not work if no HTTP verb was specified (cebe)
- Bug #13212: Fixed `DbSession::regenerateID()` failure when `session_regenerate_id()` fails (andrewnester)
- Bug #13229: Fix fetching schema information for `pgsql` when `PDO::ATTR_CASE` is set (klimov-paul)
- Bug #13231: Fixed `destroy` method in `yii.gridView.js` which did not work as expected (arogachev)
- Bug #13232: Event handlers were not detached with changed selector in `yii.gridView.js` (arogachev)
- Bug #12969: Improved unique ID generation for `yii\widgets\Pjax` widgets (dynasource, samdark, rob006)
- Bug #13277: Fixed invalid parsing of `--` ("End of Options" special argument) in CLI (rugabarbo)
- Bug #13287: Fixed translating "and" separator in `UniqueValidator` error message (jetexe)
- Bug #13300: Allow pjax with "data-pjax" with no value in `yii.js` (arogachev)
- Bug #13307: Preventing of race conditions in script filter in `yii.js` works incorrectly (arogachev)
- Bug #13309: Fixes incorrect console width/height detecting with using Stty on Mac (nowm)
- Bug #13310: Handle relative and absolute URLs coincidence in CSS filter in `yii.js` (arogachev)
- Bug #13312: `skipOuterContainers` option was incorrectly passed to pjax in `handleAction` in `yii.js` (arogachev)
- Bug #13326: Fixed wrong background color generation in `BaseConsole::renderColoredString()` (nowm, silverfire)
- Bug #13401: Fixed lack of escaping of request dump at exception screens (samdark)
- Bug #13416: Fixed `yii\web\MultipartFormDataParser` adds an extra newline to every value (klimov-paul)
- Enh #475: Added Bash and Zsh completion support for the `./yii` command (cebe, silverfire)
- Enh #6242: Access to validator in inline validation (arogachev)
- Enh #6373: Introduce `yii\db\Query::emulateExecution()` to force returning an empty result for a query (klimov-paul)
- Enh #6809: Added `yii\caching\Cache::$defaultDuration` property, allowing to set custom default cache duration (sdkiller)
- Enh #7333: Improved error message for `yii\di\Instance::ensure()` when a component does not exist (cebe)
- Enh #7420: Attributes for prompt generated with `renderSelectOptions` of `\yii\helpers\Html` helper (arogachev)
- Enh #7435: Added `EVENT_BEFORE_RUN`, `EVENT_AFTER_RUN` and corresponding methods to `yii\base\Widget` (petrabarus)
- Enh #7820: Add `or` relation for `targetAttribute` in `yii\validators\UniqueValidator` (developeruz)
- Enh #8293: `yii\db\Query` can be passed to `insert` method in `yii\db\QueryBuilder` (voroks)
- Enh #9053: Added`yii\grid\RadioButtonColumn` (darwinisgod)
- Enh #9162: Added support of closures in `value` for attributes in `yii\widgets\DetailView` (arogachev)
- Enh #10896: Select only primary key when counting records in UniqueValidator (developeruz)
- Enh #10970: Allow omit specifying empty default params on URL creation (rob006)
- Enh #11037: `yii.js` and `yii.validation.js` use `Regexp.test()` instead of `String.match()` (arogachev, nkovacs)
- Enh #11163: Added separate method for client-side validation options `yii\validators\Validator::getClientOptions()` (arogachev)
- Enh #11464: Populate foreign key names from schema (joaoppereira)
- Enh #11697: Added `filterHaving()`, `andFilterHaving()` and `orFilterHaving()` to `yii\db\Query` (nicdnepr, samdark)
- Enh #11756: Added type mapping for `varbinary` data type in MySQL DBMS (silverfire)
- Enh #11758: Implemented Dependency Injection Container configuration using Application configuration array (silverfire)
- Enh #11929: Changed `type` column type from `int` to `smallInt` in RBAC migrations (silverfire)
- Enh #11959: Added `yii\caching\Cache::getOrSet()` method (silverfire)
- Enh #12000: Added EVENT_INIT to widget (user57376)
- Enh #12015: Changed visibility `yii\db\ActiveQueryTrait::createModels()` from private to protected (ArekX, dynasource)
- Enh #12145: Added `beforeCacheResponse` and `afterRestoreResponse` to `yii\filters\PageCache` to be more easily extendable (sergeymakinen)
- Enh #12390: Avoid creating queries with false where condition (`0=1`) when fetching relational data (klimov-paul)
- Enh #12399: Added `ActiveField::addAriaAttributes` property for `aria-required` and `aria-invalid` attributes rendering (Oxyaction, samdark)
- Enh #12419: Added ability to remove root tag and object tags for `yii\web\XmlResponseFormatter` (mhthnz, samdark)
- Enh #12612: Query conditions added with `yii\db\Query::andWhere()` now get appended to the existing conditions if they were already being joined with the `and` operator (brandonkelly)
- Enh #12619: Added catch `Throwable` in `yii\base\ErrorHandler::handleException()`, transactions and simlar places where consistency must be kept after exception (rob006, cebe)
- Enh #12659: Suggest alternatives when console command was not found (mdmunir, cebe)
- Enh #12691: Added support for protocol-relative URLs in `yii\web\UrlRule::$pattern` (erickskrauch)
- Enh #12710: Added `beforeItem` and `afterItem` to `yii\widgets\ListView` (mdmunir, silverfire)
- Enh #12725: Enhanced `yii\widgets\Menu` to allow item option `active` be a Closure (voskobovich, silverfire)
- Enh #12726: `yii\base\Application::$version` converted to `yii\base\Module::$version` virtual property, allowing to specify version as a PHP callback (klimov-paul)
- Enh #12732: Added `is_dir()` validation to `yii\helpers\BaseFileHelper::findFiles()` method (zalatov, silverfire)
- Enh #12738: Added support for creating protocol-relative URLs in `UrlManager::createAbsoluteUrl()` and `Url` helper methods (rob006)
- Enh #12748: Migration generator now tries to fetch reference column name for foreignKey from schema if it's not set explicitly (MKiselev)
- Enh #12750: `yii\widgets\ListView::itemOptions` can be a closure now (webdevsega, silverfire)
- Enh #12758: Added the ability to use instances of `\yii\db\Query` class as values in the `\yii\db\QueryBuilder::insert()` method (PowerGamer1)
- Enh #12771: Skip \yii\rbac\PhpManager::checkAccessRecursive and \yii\rbac\DbManager::checkAccessRecursive if role assignments are empty (Ni-san)
- Enh #12790: Added `scrollToErrorOffset` option for `yii\widgets\ActiveForm` which adds ability to specify offset in pixels when scrolling to error (mg-code)
- Enh #12798: Changed `yii\cache\Dependency::getHasChanged()` (deprecated, to be removed in 2.1) to `yii\cache\Dependency::isChanged()` (dynasource)
@ -87,21 +135,27 @@ Yii Framework 2 Change Log
- Enh #13050: Added `yii\filters\HostControl` allowing protection against 'host header' attacks (klimov-paul, rob006)
- Enh #13074: Improved `yii\log\SyslogTarget` with `$options` to be able to change the default `openlog` options (timbeks)
- Enh #13122: Optimized query for information about foreign keys in `yii\db\oci` (zlakomanoff)
- Enh #13134: Added logging URL rules (bashkarev)
- Enh #13202: Refactor validateAttribute method in UniqueValidator (developeruz)
- Enh #13268: Added logging of memory usage (bashkarev)
- Enh: Added constants for specifying `yii\validators\CompareValidator::$type` (cebe)
- Enh: Refactored `yii\web\ErrorAction` to make it reusable (silverfire)
- Enh #13219: Enhancements for `yii\db\Connection` (Vovan-VE)
- Enh #13219: Enhancements for `yii\db\Connection` (Vovan-VE)
- Added `shuffleMasters` option which adds ability to disable shuffling of masters connections.
- Added `getMaster()` getter and `master` property for getting currently active master connection.
- Extracted `openFromPoolSequentially()` protected method from `openFromPool()` protected method.
- Enh #13264: Added `yii\widgets\InputWidget::$field` field, allowing access to the related `yii\widget\ActiveField` instance (klimov-paul)
- Enh #13266: Added `yii\validators\EachValidator::$stopOnFirstError` allowing addition of more than one error (klimov-paul)
- Enh #13268: Added logging of memory usage (bashkarev)
- Enh #13417: Allow customizing `yii\data\ActiveDataProvider` in `yii\rest\IndexAction` (leandrogehlen)
- Enh #13453: Select only primary key when counting records in UniqueValidator (developeruz)
- Enh: Added constants for specifying `yii\validators\CompareValidator::$type` (cebe)
- Enh: Refactored `yii\web\ErrorAction` to make it reusable (silverfire)
- Enh: Added support for field `yii\console\controllers\BaseMigrateController::$migrationNamespaces` setup from CLI (schmunk42)
- Chg #11906: Updated `yii\widgets\MaskedInput` inputmask dependency to `~3.3.3` (samdark)
2.0.10 October 20, 2016
-----------------------
- Bug #7670: Added `yii\web\UrlNormalizer` for normalizing requests with and without trailing slashes (rob006, cronfy, klimov-paul)
- Bug #12345 Fixed `Formatter::asCurrency()` for proper decimal formatting (Oxyaction)
- Bug #7670: Added `UrlNormalizer` for normalizing requests with and without trailing slashes (rob006, cronfy, klimov-paul)
- Bug #9027: Fixed descendant class of `yii\web\UploadedFile` returns parent instances in case invoked after it (andrewnester)
- Bug #9277: Fixed `yii\console\controllers\AssetController` looses custom options of 'target' bundles (petrabarus, klimov-paul)
@ -148,7 +202,6 @@ Yii Framework 2 Change Log
- Bug #12605: Make 'safe' validator work on write-only properties (arthibald, CeBe)
- Bug #12629: Fixed `yii\widgets\ActiveField::widget()` to call `adjustLabelFor()` for `InputWidget` descendants (coderlex)
- Bug #12649: Fixed consistency of `indexBy` handling for `yii\db\Query::column()` (silverfire)
- Bug #12713: Fixed `yii\caching\FileDependency` to clear stat cache before reading filemtime (SG5)
- Enh #384: Added ability to run migration from several locations via `yii\console\controllers\BaseMigrateController::$migrationNamespaces` (klimov-paul)
- Enh #6996: Added `yii\web\MultipartFormDataParser`, which allows proper processing of 'multipart/form-data' encoded non POST requests (klimov-paul)
- Enh #8719: Add support for HTML5 attributes on submitbutton (formaction/formmethod...) for ActiveForm (VirtualRJ)
@ -183,13 +236,11 @@ Yii Framework 2 Change Log
- Enh #12440: Added `yii\base\Event::offAll()` method allowing clear all registered class-level event handlers (klimov-paul)
- Enh #12499: When AJAX validation in enabled, `yii.activeForm.js` will run it forcefully on form submit to display all possible errors (silverfire)
- Enh #12580: Make `yii.js` comply with strict and non-strict javascript mode to allow concatenation with external code (mikehaertl)
- Enh #12612: Query conditions added with `yii\db\Query::andWhere()` now get appended to the existing conditions if they were already being joined with the `and` operator (brandonkelly)
- Enh #12664: Added support for wildcards for `optional` at `yii\filters\auth\AuthMethod` (mg-code)
- Enh #12744: Added `afterInit` event to `yii.activeForm.js` (werew01f)
- Enh #12710: Added `beforeItem` and `afterItem` to `yii\widgets\ListView` (mdmunir, silverfire)
- Enh #12727: Enhanced `yii\widgets\Menu` to allow item option `active` be a Closure (voskobovich, silverfire)
- Enh: Method `yii\console\controllers\AssetController::getAssetManager()` automatically enables `yii\web\AssetManager::forceCopy` in case it is not explicitly specified (pana1990, klimov-paul)
2.0.9 July 11, 2016
-------------------
@ -250,7 +301,6 @@ Yii Framework 2 Change Log
- Enh #11857: `yii\filters\AccessRule::$verbs` can now be configured in upper and lowercase (DrDeath72, samdark)
- Chg #11364: Updated jQuery dependency to include versions `1.12.*` (cebe)
- Chg #11683: Fixed fixture command to work with short syntax. `yii fixture "*, -User"` should be used instead of `yii fixture "*" -User` (Faryshta, samdark)
- Chg #11906: Updated `yii\widgets\MaskedInput` inputmask dependency to `~3.3.3` (samdark)
2.0.8 April 28, 2016
@ -1708,3 +1758,4 @@ Yii Framework 2 Change Log
- [Smarty View Renderer](https://github.com/yiisoft/yii2-smarty)
- [Twig View Renderer](https://github.com/yiisoft/yii2-twig)

10
framework/UPGRADE.md

@ -26,13 +26,13 @@ as well as a stable version of Composer:
The simple way to upgrade Yii, for example to version 2.0.10 (replace this with the version you want) will be running `composer require`:
composer require "yiisoft/yii2:~2.0.10"
composer require "yiisoft/yii2:~2.0.10" --update-with-dependencies
This however may fail due to changes in the dependencies of yiisoft/yii2, which may change due to security updates
in other libraries or by adding support for newer versions. `composer require` will not update any other packages
as a safety feature.
This command will only upgrade Yii and its direct dependencies, if necessary. Without `--update-with-dependencies` the
upgrade might fail when the Yii version you chose has slightly different dependencies than the version you had before.
`composer require` will by default not update any other packages as a safety feature.
The better way to upgrade is to change the `composer.json` file to require the new Yii version and then
Another way to upgrade is to change the `composer.json` file to require the new Yii version and then
run `composer update` by specifying all packages that are allowed to be updated.
composer update yiisoft/yii2 yiisoft/yii2-composer bower-asset/jquery.inputmask

404
framework/assets/yii.js

@ -17,13 +17,13 @@
* A module may be structured as follows:
*
* ```javascript
* yii.sample = (function($) {
* window.yii.sample = (function($) {
* var pub = {
* // whether this module is currently active. If false, init() will not be called for this module
* // it will also not be called for all its child modules. If this property is undefined, it means true.
* isActive: true,
* init: function() {
* // ... module initialization code go here ...
* // ... module initialization code goes here ...
* },
*
* // ... other public functions and properties go here ...
@ -32,7 +32,7 @@
* // ... private functions and properties go here ...
*
* return pub;
* })(jQuery);
* })(window.jQuery);
* ```
*
* Using this structure, you can define public and private functions/properties for a module.
@ -46,9 +46,9 @@ window.yii = (function ($) {
/**
* List of JS or CSS URLs that can be loaded multiple times via AJAX requests.
* Each item may be represented as either an absolute URL or a relative one.
* Each item may contain a wildcart matching character `*`, that means one or more
* Each item may contain a wildcard matching character `*`, that means one or more
* any characters on the position. For example:
* - `/css/*.js` will match any file ending with `.js` in the `css` directory of the current web site
* - `/css/*.css` will match any file ending with `.css` in the `css` directory of the current web site
* - `http*://cdn.example.com/*` will match any files on domain `cdn.example.com`, loaded with HTTP or HTTPS
* - `/js/myCustomScript.js?realm=*` will match file `/js/myCustomScript.js` with defined `realm` parameter
*/
@ -56,7 +56,8 @@ window.yii = (function ($) {
/**
* The selector for clickable elements that need to support confirmation and form submission.
*/
clickableSelector: 'a, button, input[type="submit"], input[type="button"], input[type="reset"], input[type="image"]',
clickableSelector: 'a, button, input[type="submit"], input[type="button"], input[type="reset"], ' +
'input[type="image"]',
/**
* The selector for changeable elements that need to support confirmation and form submission.
*/
@ -107,7 +108,7 @@ window.yii = (function ($) {
* @param cancel a callback to be called when the user cancels the confirmation
*/
confirm: function (message, ok, cancel) {
if (confirm(message)) {
if (window.confirm(message)) {
!ok || ok();
} else {
!cancel || cancel();
@ -143,74 +144,70 @@ window.yii = (function ($) {
* 'name2' => 'value2',
* ],
* ],
* ];
* ]);
* ```
*
* @param $e the jQuery representation of the element
* @param event Related event
*/
handleAction: function ($e, event) {
var $form = $e.attr('data-form') ? $('#' + $e.attr('data-form')) : $e.closest('form'),
method = !$e.data('method') && $form ? $form.attr('method') : $e.data('method'),
action = $e.attr('href'),
isValidAction = action && action !== '#',
params = $e.data('params'),
pjax = $e.data('pjax') || 0,
usePjax = pjax !== 0 && $.support.pjax,
pjaxPushState = !!$e.data('pjax-push-state'),
pjaxReplaceState = !!$e.data('pjax-replace-state'),
pjaxTimeout = $e.data('pjax-timeout'),
pjaxScrollTo = $e.data('pjax-scrollto'),
pjaxPushRedirect = $e.data('pjax-push-redirect'),
pjaxReplaceRedirect = $e.data('pjax-replace-redirect'),
pjaxSkipOuterContainers = $e.data('pjax-skip-outer-containers'),
areValidParams = params && $.isPlainObject(params),
pjax = $e.data('pjax'),
usePjax = pjax !== undefined && pjax !== 0 && $.support.pjax,
pjaxContainer,
pjaxOptions = {};
if (usePjax) {
if ($e.data('pjax-container')) {
pjaxContainer = $e.data('pjax-container');
} else {
pjaxContainer = $e.closest('[data-pjax-container=""]');
}
// default to body if pjax container not found
pjaxContainer = $e.data('pjax-container') || $e.closest('[data-pjax-container]');
if (!pjaxContainer.length) {
pjaxContainer = $('body');
}
pjaxOptions = {
container: pjaxContainer,
push: pjaxPushState,
replace: pjaxReplaceState,
scrollTo: pjaxScrollTo,
pushRedirect: pjaxPushRedirect,
replaceRedirect: pjaxReplaceRedirect,
pjaxSkipOuterContainers: pjaxSkipOuterContainers,
timeout: pjaxTimeout,
push: !!$e.data('pjax-push-state'),
replace: !!$e.data('pjax-replace-state'),
scrollTo: $e.data('pjax-scrollto'),
pushRedirect: $e.data('pjax-push-redirect'),
replaceRedirect: $e.data('pjax-replace-redirect'),
skipOuterContainers: $e.data('pjax-skip-outer-containers'),
timeout: $e.data('pjax-timeout'),
originalEvent: event,
originalTarget: $e
}
};
}
if (method === undefined) {
if (action && action != '#') {
if (usePjax) {
$.pjax.click(event, pjaxOptions);
} else {
window.location = action;
}
if (isValidAction) {
usePjax ? $.pjax.click(event, pjaxOptions) : window.location.assign(action);
} else if ($e.is(':submit') && $form.length) {
if (usePjax) {
$form.on('submit',function(e){
$form.on('submit', function (e) {
$.pjax.submit(e, pjaxOptions);
})
});
}
$form.trigger('submit');
}
return;
}
var newForm = !$form.length;
if (newForm) {
if (!action || !/(^\/|:\/\/)/.test(action)) {
action = window.location.href;
var oldMethod,
oldAction,
newForm = !$form.length;
if (!newForm) {
oldMethod = $form.attr('method');
$form.attr('method', method);
if (isValidAction) {
oldAction = $form.attr('action');
$form.attr('action', action);
}
} else {
if (!isValidAction) {
action = pub.getCurrentUrl();
}
$form = $('<form/>', {method: method, action: action});
var target = $e.attr('target');
@ -219,9 +216,10 @@ window.yii = (function ($) {
}
if (!/(get|post)/i.test(method)) {
$form.append($('<input/>', {name: '_method', value: method, type: 'hidden'}));
method = 'POST';
method = 'post';
$form.attr('method', method);
}
if (!/(get|head|options)/i.test(method)) {
if (/post/i.test(method)) {
var csrfParam = pub.getCsrfParam();
if (csrfParam) {
$form.append($('<input/>', {name: csrfParam, value: pub.getCsrfToken(), type: 'hidden'}));
@ -232,49 +230,41 @@ window.yii = (function ($) {
var activeFormData = $form.data('yiiActiveForm');
if (activeFormData) {
// remember who triggers the form submission. This is used by yii.activeForm.js
// Remember the element triggered the form submission. This is used by yii.activeForm.js.
activeFormData.submitObject = $e;
}
// temporarily add hidden inputs according to data-params
if (params && $.isPlainObject(params)) {
$.each(params, function (idx, obj) {
$form.append($('<input/>').attr({name: idx, value: obj, type: 'hidden'}));
if (areValidParams) {
$.each(params, function (name, value) {
$form.append($('<input/>').attr({name: name, value: value, type: 'hidden'}));
});
}
var oldMethod = $form.attr('method');
$form.attr('method', method);
var oldAction = null;
if (action && action != '#') {
oldAction = $form.attr('action');
$form.attr('action', action);
}
if (usePjax) {
$form.on('submit',function(e){
$form.on('submit', function (e) {
$.pjax.submit(e, pjaxOptions);
})
});
}
$form.trigger('submit');
$.when($form.data('yiiSubmitFinalizePromise')).then(
function () {
if (oldAction != null) {
$form.attr('action', oldAction);
}
$form.attr('method', oldMethod);
// remove the temporarily added hidden inputs
if (params && $.isPlainObject(params)) {
$.each(params, function (idx, obj) {
$('input[name="' + idx + '"]', $form).remove();
});
}
$.when($form.data('yiiSubmitFinalizePromise')).then(function () {
if (newForm) {
$form.remove();
return;
}
if (newForm) {
$form.remove();
}
if (oldAction !== undefined) {
$form.attr('action', oldAction);
}
$form.attr('method', oldMethod);
if (areValidParams) {
$.each(params, function (name) {
$('input[name="' + name + '"]', $form).remove();
});
}
);
});
},
getQueryParams: function (url) {
@ -284,67 +274,183 @@ window.yii = (function ($) {
}
var pairs = url.substring(pos + 1).split('#')[0].split('&'),
params = {},
pair,
i;
params = {};
for (i = 0; i < pairs.length; i++) {
pair = pairs[i].split('=');
for (var i = 0, len = pairs.length; i < len; i++) {
var pair = pairs[i].split('=');
var name = decodeURIComponent(pair[0].replace(/\+/g, '%20'));
var value = decodeURIComponent(pair[1].replace(/\+/g, '%20'));
if (name.length) {
if (params[name] !== undefined) {
if (!$.isArray(params[name])) {
params[name] = [params[name]];
}
params[name].push(value || '');
} else {
params[name] = value || '';
if (!name.length) {
continue;
}
if (params[name] === undefined) {
params[name] = value || '';
} else {
if (!$.isArray(params[name])) {
params[name] = [params[name]];
}
params[name].push(value || '');
}
}
return params;
},
initModule: function (module) {
if (module.isActive === undefined || module.isActive) {
if ($.isFunction(module.init)) {
module.init();
}
$.each(module, function () {
if ($.isPlainObject(this)) {
pub.initModule(this);
}
});
if (module.isActive !== undefined && !module.isActive) {
return;
}
if ($.isFunction(module.init)) {
module.init();
}
$.each(module, function () {
if ($.isPlainObject(this)) {
pub.initModule(this);
}
});
},
init: function () {
initCsrfHandler();
initRedirectHandler();
initScriptFilter();
initAssetFilters();
initDataMethods();
},
/**
* Returns the URL of the current page without params and trailing slash. Separated and made public for testing.
* @returns {string}
*/
getBaseCurrentUrl: function () {
return window.location.protocol + '//' + window.location.host;
},
/**
* Returns the URL of the current page. Used for testing, you can always call `window.location.href` manually
* instead.
* @returns {string}
*/
getCurrentUrl: function () {
return window.location.href;
}
};
function initCsrfHandler() {
// automatically send CSRF token for all AJAX requests
$.ajaxPrefilter(function (options, originalOptions, xhr) {
if (!options.crossDomain && pub.getCsrfParam()) {
xhr.setRequestHeader('X-CSRF-Token', pub.getCsrfToken());
}
});
pub.refreshCsrfToken();
}
function initRedirectHandler() {
// handle AJAX redirection
$(document).ajaxComplete(function (event, xhr, settings) {
$(document).ajaxComplete(function (event, xhr) {
var url = xhr && xhr.getResponseHeader('X-Redirect');
if (url) {
window.location = url;
window.location.assign(url);
}
});
}
function initCsrfHandler() {
// automatically send CSRF token for all AJAX requests
$.ajaxPrefilter(function (options, originalOptions, xhr) {
if (!options.crossDomain && pub.getCsrfParam()) {
xhr.setRequestHeader('X-CSRF-Token', pub.getCsrfToken());
function initAssetFilters() {
/**
* Used for storing loaded scripts and information about loading each script if it's in the process of loading.
* A single script can have one of the following values:
*
* - `undefined` - script was not loaded at all before or was loaded with error last time.
* - `true` (boolean) - script was successfully loaded.
* - object - script is currently loading.
*
* In case of a value being an object the properties are:
* - `xhrList` - represents a queue of XHR requests sent to the same URL (related with this script) in the same
* small period of time.
* - `xhrDone` - boolean, acts like a locking mechanism. When one of the XHR requests in the queue is
* successfully completed, it will abort the rest of concurrent requests to the same URL until cleanup is done
* to prevent possible errors and race conditions.
* @type {{}}
*/
var loadedScripts = {};
$('script[src]').each(function () {
var url = getAbsoluteUrl(this.src);
loadedScripts[url] = true;
});
$.ajaxPrefilter('script', function (options, originalOptions, xhr) {
if (options.dataType == 'jsonp') {
return;
}
var url = getAbsoluteUrl(options.url),
forbiddenRepeatedLoad = loadedScripts[url] === true && !isReloadableAsset(url),
cleanupRunning = loadedScripts[url] !== undefined && loadedScripts[url]['xhrDone'] === true;
if (forbiddenRepeatedLoad || cleanupRunning) {
xhr.abort();
return;
}
if (loadedScripts[url] === undefined || loadedScripts[url] === true) {
loadedScripts[url] = {
xhrList: [],
xhrDone: false
};
}
xhr.done(function (data, textStatus, jqXHR) {
// If multiple requests were successfully loaded, perform cleanup only once
if (loadedScripts[jqXHR.yiiUrl]['xhrDone'] === true) {
return;
}
loadedScripts[jqXHR.yiiUrl]['xhrDone'] = true;
for (var i = 0, len = loadedScripts[jqXHR.yiiUrl]['xhrList'].length; i < len; i++) {
var singleXhr = loadedScripts[jqXHR.yiiUrl]['xhrList'][i];
if (singleXhr && singleXhr.readyState !== XMLHttpRequest.DONE) {
singleXhr.abort();
}
}
loadedScripts[jqXHR.yiiUrl] = true;
}).fail(function (jqXHR, textStatus) {
if (textStatus === 'abort') {
return;
}
delete loadedScripts[jqXHR.yiiUrl]['xhrList'][jqXHR.yiiIndex];
var allFailed = true;
for (var i = 0, len = loadedScripts[jqXHR.yiiUrl]['xhrList'].length; i < len; i++) {
if (loadedScripts[jqXHR.yiiUrl]['xhrList'][i]) {
allFailed = false;
}
}
if (allFailed) {
delete loadedScripts[jqXHR.yiiUrl];
}
});
// Use prefix for custom XHR properties to avoid possible conflicts with existing properties
xhr.yiiIndex = loadedScripts[url]['xhrList'].length;
xhr.yiiUrl = url;
loadedScripts[url]['xhrList'][xhr.yiiIndex] = xhr;
});
$(document).ajaxComplete(function () {
var styleSheets = [];
$('link[rel=stylesheet]').each(function () {
var url = getAbsoluteUrl(this.href);
if (isReloadableAsset(url)) {
return;
}
$.inArray(url, styleSheets) === -1 ? styleSheets.push(url) : $(this).remove();
});
});
pub.refreshCsrfToken();
}
function initDataMethods() {
@ -374,13 +480,9 @@ window.yii = (function ($) {
.on('change.yii', pub.changeableSelector, handler);
}
function isReloadable(url) {
var hostInfo = getHostInfo();
function isReloadableAsset(url) {
for (var i = 0; i < pub.reloadableScripts.length; i++) {
var rule = pub.reloadableScripts[i];
rule = rule.charAt(0) === '/' ? hostInfo + rule : rule;
var rule = getAbsoluteUrl(pub.reloadableScripts[i]);
var match = new RegExp("^" + escapeRegExp(rule).split('\\*').join('.*') + "$").test(url);
if (match === true) {
return true;
@ -395,76 +497,18 @@ window.yii = (function ($) {
return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}
function getHostInfo() {
return location.protocol + '//' + location.host;
}
function initScriptFilter() {
var hostInfo = getHostInfo();
var loadedScripts = {};
var scripts = $('script[src]').map(function () {
return this.src.charAt(0) === '/' ? hostInfo + this.src : this.src;
}).toArray();
for (var i = 0, len = scripts.length; i < len; i++) {
loadedScripts[scripts[i]] = true;
}
$.ajaxPrefilter('script', function (options, originalOptions, xhr) {
if (options.dataType == 'jsonp') {
return;
}
var url = options.url.charAt(0) === '/' ? hostInfo + options.url : options.url;
if (url in loadedScripts) {
var item = loadedScripts[url];
// If the concurrent XHR request is running and URL is not reloadable
if (item !== true && !isReloadable(url)) {
// Abort the current XHR request when previous finished successfully
item.done(function () {
if (xhr && xhr.readyState !== 4) {
xhr.abort();
}
});
// Or abort previous XHR if the current one is loaded faster
xhr.done(function () {
if (item && item.readyState !== 4) {
item.abort();
}
});
} else if (!isReloadable(url)) {
xhr.abort();
}
} else {
loadedScripts[url] = xhr.done(function () {
loadedScripts[url] = true;
}).fail(function () {
delete loadedScripts[url];
});
}
});
$(document).ajaxComplete(function (event, xhr, settings) {
var styleSheets = [];
$('link[rel=stylesheet]').each(function () {
if (isReloadable(this.href)) {
return;
}
if ($.inArray(this.href, styleSheets) == -1) {
styleSheets.push(this.href)
} else {
$(this).remove();
}
})
});
/**
* Returns absolute URL based on the given URL
* @param {string} url Initial URL
* @returns {string}
*/
function getAbsoluteUrl(url) {
return url.charAt(0) === '/' ? pub.getBaseCurrentUrl() + url : url;
}
return pub;
})(jQuery);
})(window.jQuery);
jQuery(function () {
yii.initModule(yii);
window.jQuery(function () {
window.yii.initModule(window.yii);
});

1
framework/base/Application.php

@ -21,6 +21,7 @@ use Yii;
* @property string $basePath The root directory of the application.
* @property \yii\caching\Cache $cache The cache application component. Null if the component is not enabled.
* This property is read-only.
* @property array $container Values given in terms of name-value pairs. This property is write-only.
* @property \yii\db\Connection $db The database connection. This property is read-only.
* @property \yii\web\ErrorHandler|\yii\console\ErrorHandler $errorHandler The error handler application
* component. This property is read-only.

14
framework/base/Component.php

@ -390,7 +390,7 @@ class Component extends Object
*
* @param string $name the property name
* @param bool $checkBehaviors whether to treat behaviors' methods as methods of this component
* @return bool whether the property is defined
* @return bool whether the method is defined
*/
public function hasMethod($name, $checkBehaviors = true)
{
@ -669,14 +669,14 @@ class Component extends Object
if (is_int($name)) {
$behavior->attach($this);
$this->_behaviors[] = $behavior;
} else {
if (isset($this->_behaviors[$name])) {
$this->_behaviors[$name]->detach();
}
$behavior->attach($this);
$this->_behaviors[$name] = $behavior;
}
if (isset($this->_behaviors[$name])) {
$this->_behaviors[$name]->detach();
}
$behavior->attach($this);
$this->_behaviors[$name] = $behavior;
return $behavior;
}
}

2
framework/base/Controller.php

@ -43,7 +43,7 @@ class Controller extends Component implements ViewContextInterface
*/
public $id;
/**
* @var Module $module the module that this controller belongs to.
* @var Module the module that this controller belongs to.
*/
public $module;
/**

3
framework/base/Module.php

@ -32,8 +32,9 @@ use yii\di\ServiceLocator;
* @property string $layoutPath The root directory of layout files. Defaults to "[[viewPath]]/layouts".
* @property array $modules The modules (indexed by their IDs).
* @property string $uniqueId The unique ID of the module. This property is read-only.
* @property string $version The version of this module. Note that the type of this property differs in getter
* and setter. See [[getVersion()]] and [[setVersion()]] for details.
* @property string $viewPath The root directory of view files. Defaults to "[[basePath]]/views".
* @property string|callable $version The version of this module.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0

101
framework/base/Widget.php

@ -27,6 +27,23 @@ use ReflectionClass;
class Widget extends Component implements ViewContextInterface
{
/**
* @event Event an event that is triggered when the widget is initialized via [[init()]].
* @since 2.0.11
*/
const EVENT_INIT = 'init';
/**
* @event WidgetEvent an event raised right before executing a widget.
* You may set [[WidgetEvent::isValid]] to be false to cancel the widget execution.
* @since 2.0.11
*/
const EVENT_BEFORE_RUN = 'beforeRun';
/**
* @event WidgetEvent an event raised right after executing a widget.
* @since 2.0.11
*/
const EVENT_AFTER_RUN = 'afterRun';
/**
* @var int a counter used to generate [[id]] for widgets.
* @internal
*/
@ -45,6 +62,17 @@ class Widget extends Component implements ViewContextInterface
/**
* Initializes the object.
* This method is called at the end of the constructor.
* The default implementation will trigger an [[EVENT_INIT]] event.
*/
public function init()
{
parent::init();
$this->trigger(self::EVENT_INIT);
}
/**
* Begins a widget.
* This method creates an instance of the calling class. It will apply the configuration
* to the created instance. A matching [[end()]] call should be called later.
@ -76,7 +104,12 @@ class Widget extends Component implements ViewContextInterface
if (!empty(static::$stack)) {
$widget = array_pop(static::$stack);
if (get_class($widget) === get_called_class()) {
echo $widget->run();
/* @var $widget Widget */
if ($widget->beforeRun()) {
$result = $widget->run();
$result = $widget->afterRun($result);
echo $result;
}
return $widget;
} else {
throw new InvalidCallException('Expecting end() of ' . get_class($widget) . ', found ' . get_called_class());
@ -101,7 +134,11 @@ class Widget extends Component implements ViewContextInterface
/* @var $widget Widget */
$config['class'] = get_called_class();
$widget = Yii::createObject($config);
$out = $widget->run();
$out = '';
if ($widget->beforeRun()) {
$result = $widget->run();
$out = $widget->afterRun($result);
}
} catch (\Exception $e) {
// close the output buffer opened above if it has not been closed already
if (ob_get_level() > 0) {
@ -220,4 +257,64 @@ class Widget extends Component implements ViewContextInterface
return dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'views';
}
/**
* This method is invoked right before the widget is executed.
*
* The method will trigger the [[EVENT_BEFORE_RUN]] event. The return value of the method
* will determine whether the widget should continue to run.
*
* When overriding this method, make sure you call the parent implementation like the following:
*
* ```php
* public function beforeRun()
* {
* if (!parent::beforeRun()) {
* return false;
* }
*
* // your custom code here
*
* return true; // or false to not run the widget
* }
* ```
*
* @return bool whether the widget should continue to be executed.
* @since 2.0.11
*/
public function beforeRun()
{
$event = new WidgetEvent();
$this->trigger(self::EVENT_BEFORE_RUN, $event);
return $event->isValid;
}
/**
* This method is invoked right after a widget is executed.
*
* The method will trigger the [[EVENT_AFTER_RUN]] event. The return value of the method
* will be used as the widget return value.
*
* If you override this method, your code should look like the following:
*
* ```php
* public function afterRun($result)
* {
* $result = parent::afterRun($result);
* // your custom code here
* return $result;
* }
* ```
*
* @param mixed $result the widget return result.
* @return mixed the processed widget result.
* @since 2.0.11
*/
public function afterRun($result)
{
$event = new WidgetEvent();
$event->result = $result;
$this->trigger(self::EVENT_AFTER_RUN, $event);
return $event->result;
}
}

30
framework/base/WidgetEvent.php

@ -0,0 +1,30 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\base;
/**
* WidgetEvent represents the event parameter used for a widget event.
*
* By setting the [[isValid]] property, one may control whether to continue running the widget.
*
* @author Petra Barus <petra.barus@gmail.com>
* @since 2.0.11
*/
class WidgetEvent extends Event
{
/**
* @var mixed the widget result. Event handlers may modify this property to change the widget result.
*/
public $result;
/**
* @var boolean whether to continue running the widget. Event handlers of
* [[Widget::EVENT_BEFORE_RUN]] may set this property to decide whether
* to continue running the current widget.
*/
public $isValid = true;
}

8
framework/caching/ArrayCache.php

@ -43,9 +43,8 @@ class ArrayCache extends Cache
{
if (isset($this->_cache[$key]) && ($this->_cache[$key][1] === 0 || $this->_cache[$key][1] > microtime(true))) {
return $this->_cache[$key][0];
} else {
return false;
}
return false;
}
/**
@ -64,10 +63,9 @@ class ArrayCache extends Cache
{
if (isset($this->_cache[$key]) && ($this->_cache[$key][1] === 0 || $this->_cache[$key][1] > microtime(true))) {
return false;
} else {
$this->_cache[$key] = [$value, $duration === 0 ? 0 : microtime(true) + $duration];
return true;
}
$this->_cache[$key] = [$value, $duration === 0 ? 0 : microtime(true) + $duration];
return true;
}
/**

1
framework/caching/DbDependency.php

@ -49,6 +49,7 @@ class DbDependency extends Dependency
*/
protected function generateDependencyData($cache)
{
/* @var $db Connection */
$db = Instance::ensure($this->db, Connection::className());
if ($this->sql === null) {
throw new InvalidConfigException('DbDependency::sql must be set.');

109
framework/caching/DbQueryDependency.php

@ -0,0 +1,109 @@
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace yii\caching;
use yii\base\InvalidConfigException;
use yii\db\QueryInterface;
use yii\di\Instance;
/**
* DbQueryDependency represents a dependency based on the query result of an [[QueryInterface]] instance.
*
* If the query result changes, the dependency is considered as changed.
* The query is specified via the [[query]] property.
*
* Object of any class which matches [[QueryInterface]] can be used, so this dependency can be used not only
* with regular relational databases but with MongoDB, Redis and so on as well.
*
* For more details and usage information on Cache, see the [guide article on caching](guide:caching-overview).
*
* @see QueryInterface
*
* @author Paul Klimov <klimov.paul@gmail.com>
* @since 2.0.12
*/
class DbQueryDependency extends Dependency
{
/**
* @var string|array|object the application component ID of the database connection, connection object or
* its array configuration.
* This field can be left blank, allowing query to determine connection automatically.
*/
public $db;
/**
* @var QueryInterface the query which result is used to determine if the dependency has been changed.
* Actual query method to be invoked is determined by [[method]].
*/
public $query;
/**
* @var string|callable method which should be invoked in over the [[query]] object.
*
* If specified as a string an own query method with such name will be invoked, passing [[db]] value as its
* first argument. For example: `exists`, `all`.
*
* This field can be specified as a PHP callback of following signature:
*
* ```php
* function (QueryInterface $query, mixed $db) {
* //return mixed;
* }
* ```
*
* If not set - [[QueryInterface::one()]] will be used.
*/
public $method;
/**
* Generates the data needed to determine if dependency is changed.
* This method returns the query result
* @param Cache $cache the cache component that is currently evaluating this dependency
* @return mixed the data needed to determine if dependency has been changed.
* @throws InvalidConfigException on invalid configuration.
*/
protected function generateDependencyData($cache)
{
$db = $this->db;
if ($db !== null) {
$db = Instance::ensure($db);
}
if (!$this->query instanceof QueryInterface) {
throw new InvalidConfigException('"' . get_class($this) . '::$query" should be an instance of "yii\db\QueryInterface".');
}
if (!empty($db->enableQueryCache)) {
// temporarily disable and re-enable query caching
$originEnableQueryCache = $db->enableQueryCache;
$db->enableQueryCache = false;
$result = $this->executeQuery($this->query, $db);
$db->enableQueryCache = $originEnableQueryCache;
} else {
$result = $this->executeQuery($this->query, $db);
}
return $result;
}
/**
* Executes the query according to [[method]] specification.
* @param QueryInterface $query query to be executed.
* @param mixed $db connection.
* @return mixed query result.
*/
private function executeQuery($query, $db)
{
if ($this->method === null) {
return $query->one($db);
}
if (is_string($this->method)) {
return call_user_func([$query, $this->method], $db);
}
return call_user_func($this->method, $query, $db);
}
}

2
framework/caching/migrations/schema-mssql.sql

@ -8,6 +8,8 @@
* @license http://www.yiiframework.com/license/
* @since 2.0.7
*/
if object_id('[cache]', 'U') is not null
drop table [cache];
drop table if exists [cache];

4
framework/classes.php

@ -54,6 +54,7 @@ return [
'yii\base\ViewNotFoundException' => YII2_PATH . '/base/ViewNotFoundException.php',
'yii\base\ViewRenderer' => YII2_PATH . '/base/ViewRenderer.php',
'yii\base\Widget' => YII2_PATH . '/base/Widget.php',
'yii\base\WidgetEvent' => YII2_PATH . '/base/WidgetEvent.php',
'yii\behaviors\AttributeBehavior' => YII2_PATH . '/behaviors/AttributeBehavior.php',
'yii\behaviors\AttributeTypecastBehavior' => YII2_PATH . '/behaviors/AttributeTypecastBehavior.php',
'yii\behaviors\BlameableBehavior' => YII2_PATH . '/behaviors/BlameableBehavior.php',
@ -142,6 +143,7 @@ return [
'yii\filters\AccessRule' => YII2_PATH . '/filters/AccessRule.php',
'yii\filters\ContentNegotiator' => YII2_PATH . '/filters/ContentNegotiator.php',
'yii\filters\Cors' => YII2_PATH . '/filters/Cors.php',
'yii\filters\HostControl' => YII2_PATH . '/filters/HostControl.php',
'yii\filters\HttpCache' => YII2_PATH . '/filters/HttpCache.php',
'yii\filters\PageCache' => YII2_PATH . '/filters/PageCache.php',
'yii\filters\RateLimitInterface' => YII2_PATH . '/filters/RateLimitInterface.php',
@ -159,6 +161,7 @@ return [
'yii\grid\DataColumn' => YII2_PATH . '/grid/DataColumn.php',
'yii\grid\GridView' => YII2_PATH . '/grid/GridView.php',
'yii\grid\GridViewAsset' => YII2_PATH . '/grid/GridViewAsset.php',
'yii\grid\RadioButtonColumn' => YII2_PATH . '/grid/RadioButtonColumn.php',
'yii\grid\SerialColumn' => YII2_PATH . '/grid/SerialColumn.php',
'yii\helpers\ArrayHelper' => YII2_PATH . '/helpers/ArrayHelper.php',
'yii\helpers\BaseArrayHelper' => YII2_PATH . '/helpers/BaseArrayHelper.php',
@ -299,6 +302,7 @@ return [
'yii\web\MultipartFormDataParser' => YII2_PATH . '/web/MultipartFormDataParser.php',
'yii\web\NotAcceptableHttpException' => YII2_PATH . '/web/NotAcceptableHttpException.php',
'yii\web\NotFoundHttpException' => YII2_PATH . '/web/NotFoundHttpException.php',
'yii\web\RangeNotSatisfiableHttpException' => YII2_PATH . '/web/RangeNotSatisfiableHttpException.php',
'yii\web\Request' => YII2_PATH . '/web/Request.php',
'yii\web\RequestParserInterface' => YII2_PATH . '/web/RequestParserInterface.php',
'yii\web\Response' => YII2_PATH . '/web/Response.php',

10
framework/console/Controller.php

@ -282,6 +282,16 @@ class Controller extends \yii\base\Controller
/**
* Asks user to confirm by typing y or n.
*
* A typical usage looks like the following:
*
* ```php
* if ($this->confirm("Are you sure?")) {
* echo "user typed yes\n";
* } else {
* echo "user typed no\n";
* }
* ```
*
* @param string $message to echo out before waiting for user input
* @param bool $default this value is returned if no selection is made.
* @return bool whether user confirmed.

1
framework/console/UnknownCommandException.php

@ -21,6 +21,7 @@ class UnknownCommandException extends Exception
* @var string the name of the command that could not be recognized.
*/
public $command;
/**
* @var Application
*/

5
framework/console/controllers/BaseMigrateController.php

@ -35,6 +35,9 @@ abstract class BaseMigrateController extends Controller
* @var string the directory containing the migration classes. This can be either
* a path alias or a directory path.
*
* Migration classes located at this path should be declared without a namespace.
* Use [[migrationNamespaces]] property in case you are using namespaced migrations.
*
* If you have set up [[migrationNamespaces]], you may set this field to `null` in order
* to disable usage of migrations that are not namespaced.
*/
@ -73,7 +76,7 @@ abstract class BaseMigrateController extends Controller
{
return array_merge(
parent::options($actionID),
['migrationPath'], // global for all actions
['migrationPath', 'migrationNamespaces'], // global for all actions
$actionID === 'create' ? ['templateFile'] : [] // action create
);
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save