From 314b66827b4151caf511b5872894b31a7585eb29 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 10 Apr 2018 09:40:15 +0200 Subject: [PATCH 001/902] added test to verify #15298 --- tests/framework/helpers/FormatConverterTest.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/framework/helpers/FormatConverterTest.php b/tests/framework/helpers/FormatConverterTest.php index e7f273527b8..cd06418821c 100644 --- a/tests/framework/helpers/FormatConverterTest.php +++ b/tests/framework/helpers/FormatConverterTest.php @@ -103,5 +103,21 @@ public function testPhpToICU() $expected = "'dDjlNSwZWFmMntLoYyaBghHisueIOPTZcru'"; $actual = FormatConverter::convertDatePhpToIcu('\d\D\j\l\N\S\w\Z\W\F\m\M\n\t\L\o\Y\y\a\B\g\h\H\i\s\u\e\I\O\P\T\Z\c\r\u'); $this->assertEquals($expected, $actual); + + $expected = "yyyy-MM-dd'T'HH:mm:ssxxx"; + $actual = FormatConverter::convertDatePhpToIcu('c'); + $this->assertEquals($expected, $actual); + } + + public function testPhpFormatC() + { + $time = time(); + + $formatter = new Formatter(['locale' => 'en-US']); + $this->assertEquals(date('c', $time), $formatter->asDatetime($time, 'php:c')); + + date_default_timezone_set('Europe/Moscow'); + $formatter = new Formatter(['locale' => 'ru-RU', 'timeZone' => 'Europe/Moscow']); + $this->assertEquals(date('c', $time), $formatter->asDatetime($time, 'php:c')); } } From 1d336963a553936380acfe1eeb64bb0b1c910457 Mon Sep 17 00:00:00 2001 From: Tobias Munk Date: Tue, 17 Apr 2018 23:14:27 +0200 Subject: [PATCH 002/902] Updated asset installation info (#16112) [skip ci] --- framework/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/README.md b/framework/README.md index a88beeeab71..161f8d13a01 100644 --- a/framework/README.md +++ b/framework/README.md @@ -12,10 +12,11 @@ Installation The preferred way to install the Yii framework is through [composer](http://getcomposer.org/download/). +Refer to [Bower and NPM Assets installation](https://www.yiiframework.com/doc/guide/2.0/en/structure-assets#bower-npm-assets) to select an asset installation method. + Either run ``` -composer global require "fxp/composer-asset-plugin:^1.4.1" composer require yiisoft/yii2 ``` From 4fcf97e2464d45e6d8a546b4f752ae7ed462cba8 Mon Sep 17 00:00:00 2001 From: Filippo Tessarotto Date: Wed, 18 Apr 2018 22:41:32 +0200 Subject: [PATCH 003/902] Add AppVeyor CI (#16123) --- .appveyor.yml | 41 +++++++++++++++++++++++++++++++++++++++++ .gitattributes | 1 + 2 files changed, 42 insertions(+) create mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 00000000000..ad34461ebf2 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,41 @@ +build: false +version: dev-{build} +shallow_clone: true +clone_folder: C:\projects\yii2 + +environment: + matrix: + - php_ver: 7.2.4 + +cache: + - '%APPDATA%\Composer' + - '%LOCALAPPDATA%\Composer' + - C:\tools\php -> .appveyor.yml + - C:\tools\composer.phar -> .appveyor.yml + +init: + - SET PATH=C:\tools\php;%PATH% + +install: + - ps: Set-Service wuauserv -StartupType Manual + - IF NOT EXIST C:\tools\php (choco install --yes --allow-empty-checksums php --version %php_ver% --params '/InstallDir:C:\tools\php') + - cd C:\tools\php + - copy php.ini-production php.ini + - echo date.timezone="UTC" >> php.ini + - echo memory_limit=512M >> php.ini + - echo extension_dir=ext >> php.ini + - echo extension=php_curl.dll >> php.ini + - echo extension=php_fileinfo.dll >> php.ini + - echo extension=php_gd2.dll >> php.ini + - echo extension=php_intl.dll >> php.ini + - echo extension=php_mbstring.dll >> php.ini + - echo extension=php_openssl.dll >> php.ini + - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/1.4.1/composer.phar) + +before_test: + - cd C:\projects\yii2 + - php C:\tools\composer.phar update --no-interaction --no-progress --prefer-stable --no-ansi + +test_script: + - cd C:\projects\yii2 + - vendor\bin\phpunit --exclude-group mssql,mysql,pgsql,sqlite,db,oci,wincache,xcache,zenddata,cubrid diff --git a/.gitattributes b/.gitattributes index 4fee40f1f8d..08f809af71e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -24,6 +24,7 @@ # 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. +/.appveyor.yml export-ignore /.github export-ignore /.editorconfig export-ignore /.gitattributes export-ignore From 713a8b92f8522e20fc9e8f16270944474731e761 Mon Sep 17 00:00:00 2001 From: Filipe Leuch Bonfim Date: Wed, 18 Apr 2018 18:01:00 -0300 Subject: [PATCH 004/902] Fix action name in commentaries (list -> index) (#16124) [skip ci] Signed-off-by: filipe1309 --- framework/filters/HttpCache.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/filters/HttpCache.php b/framework/filters/HttpCache.php index b69be0c35c1..59ed52428e9 100644 --- a/framework/filters/HttpCache.php +++ b/framework/filters/HttpCache.php @@ -17,7 +17,7 @@ * It is an action filter that can be added to a controller and handles the `beforeAction` event. * * To use HttpCache, declare it in the `behaviors()` method of your controller class. - * In the following example the filter will be applied to the `list`-action and + * In the following example the filter will be applied to the `index` action and * the Last-Modified header will contain the date of the last update to the user table in the database. * * ```php From 89c9703283b3ea306b44a8f275f325bafab77833 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 20 Apr 2018 08:00:21 +0900 Subject: [PATCH 005/902] docs/guide/structure-widgets.md small fix [ci skip] (#16131) --- docs/guide/structure-widgets.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-widgets.md b/docs/guide/structure-widgets.md index 015fa154592..39427471f19 100644 --- a/docs/guide/structure-widgets.md +++ b/docs/guide/structure-widgets.md @@ -87,7 +87,7 @@ details. ## Creating Widgets To create a widget, extend from [[yii\base\Widget]] and override the [[yii\base\Widget::init()]] and/or -[[yii\base\Widget::run()]] methods. Usually, the `init()` method should contain the code that normalizes the widget +[[yii\base\Widget::run()]] methods. Usually, the `init()` method should contain the code that initializes the widget properties, while the `run()` method should contain the code that generates the rendering result of the widget. The rendering result may be directly "echoed" or returned as a string by `run()`. From 871d5b8835d457a6edb630c1872e36bc51c49dc1 Mon Sep 17 00:00:00 2001 From: gilbert Date: Sat, 21 Apr 2018 03:30:20 +0800 Subject: [PATCH 006/902] Fixes typo (#16133) [skip ci] --- docs/guide/concept-events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/concept-events.md b/docs/guide/concept-events.md index 7d0315da2fb..59f1d3d79c3 100644 --- a/docs/guide/concept-events.md +++ b/docs/guide/concept-events.md @@ -403,7 +403,7 @@ Event::on('*', '*', function ($event) { In order to detach event handler specified by wildcard pattern, you should repeat same pattern at [[yii\base\Component::off()]] or [[yii\base\Event::off()]] invocation. Keep in mind that passing wildcard -during detaching of event handler will detach ony the handler specified for this wildcard, while handlers +during detaching of event handler will detach only the handler specified for this wildcard, while handlers attached for regular event names will remain even if they match the pattern. For example: ```php From a30ba624133f416003ba145f033963b511623970 Mon Sep 17 00:00:00 2001 From: Mef45 Date: Sun, 22 Apr 2018 02:45:24 +0500 Subject: [PATCH 007/902] Update concept-events.md (#16140) [skip ci] --- docs/guide-ru/concept-events.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/concept-events.md b/docs/guide-ru/concept-events.md index 12d01ab7b4e..1602045126c 100644 --- a/docs/guide-ru/concept-events.md +++ b/docs/guide-ru/concept-events.md @@ -72,7 +72,7 @@ function function_name($event) { Порядок обработки событий ------------------- -К одному событию можно присоединить несколько обработчиков. При срабатывании события обработчики будут вызываться в том порядке, к котором они присоединялись к событию. Чтобы запретить в обработчике вызов всех следующих за ним обработчиков, необходимо установить свойство [[yii\base\Event::handled]] параметра `$event` в `true`: +К одному событию можно присоединить несколько обработчиков. При срабатывании события обработчики будут вызываться в том порядке, в котором они присоединялись к событию. Чтобы запретить в обработчике вызов всех следующих за ним обработчиков, необходимо установить свойство [[yii\base\Event::handled]] параметра `$event` в `true`: ```php $foo->on(Foo::EVENT_HELLO, function ($event) { From 8a090753042b87a130b28728635b884d3bb6b65a Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 22 Apr 2018 06:46:10 +0900 Subject: [PATCH 008/902] guide/structure-extensions.md revised [ci skip] (#16139) --- docs/guide/structure-extensions.md | 59 ++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/docs/guide/structure-extensions.md b/docs/guide/structure-extensions.md index 10917deda16..a0f10956390 100644 --- a/docs/guide/structure-extensions.md +++ b/docs/guide/structure-extensions.md @@ -388,50 +388,71 @@ help other people learn about and use your extension: ## Core Extensions -Yii provides the following core extensions that are developed and maintained by the Yii developer team. They are all +Yii provides the following core extensions (or ["Official Extensions"](https://www.yiiframework.com/extensions/official)) that are developed and maintained by the Yii developer team. They are all registered on [Packagist](https://packagist.org/) and can be easily installed as described in the [Using Extensions](#using-extensions) subsection. -- [yiisoft/yii2-apidoc](https://github.com/yiisoft/yii2-apidoc): +- [yiisoft/yii2-apidoc](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc): provides an extensible and high-performance API documentation generator. It is also used to generate the core framework API documentation. -- [yiisoft/yii2-authclient](https://github.com/yiisoft/yii2-authclient): +- [yiisoft/yii2-authclient](https://www.yiiframework.com/extension/yiisoft/yii2-authclient): provides a set of commonly used auth clients, such as Facebook OAuth2 client, GitHub OAuth2 client. -- [yiisoft/yii2-bootstrap](https://github.com/yiisoft/yii2-bootstrap): +- [yiisoft/yii2-bootstrap](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap): provides a set of widgets that encapsulate the [Bootstrap](http://getbootstrap.com/) components and plugins. -- [yiisoft/yii2-codeception](https://github.com/yiisoft/yii2-codeception): +- [yiisoft/yii2-codeception](https://github.com/yiisoft/yii2-codeception) (deprecated): provides testing support based on [Codeception](http://codeception.com/). -- [yiisoft/yii2-debug](https://github.com/yiisoft/yii2-debug): +- [yiisoft/yii2-debug](https://www.yiiframework.com/extension/yiisoft/yii2-debug): provides debugging support for Yii applications. When this extension is used, a debugger toolbar will appear at the bottom of every page. The extension also provides a set of standalone pages to display more detailed debug information. -- [yiisoft/yii2-elasticsearch](https://github.com/yiisoft/yii2-elasticsearch): +- [yiisoft/yii2-elasticsearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch): provides the support for using [Elasticsearch](http://www.elasticsearch.org/). It includes basic querying/search support and also implements the [Active Record](db-active-record.md) pattern that allows you to store active records in Elasticsearch. -- [yiisoft/yii2-faker](https://github.com/yiisoft/yii2-faker): - provides the support for using [Faker](https://github.com/fzaninotto/Faker) to generate fake data for you. -- [yiisoft/yii2-gii](https://github.com/yiisoft/yii2-gii): +- [yiisoft/yii2-faker](https://www.yiiframework.com/extension/yiisoft/yii2-faker): + provides the support for using [Faker](https://www.yiiframework.com/extension/fzaninotto/Faker) to generate fake data for you. +- [yiisoft/yii2-gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii): provides a Web-based code generator that is highly extensible and can be used to quickly generate models, forms, modules, CRUD, etc. -- [yiisoft/yii2-httpclient](https://github.com/yiisoft/yii2-httpclient): +- [yiisoft/yii2-httpclient](https://www.yiiframework.com/extension/yiisoft/yii2-httpclient): provides an HTTP client. -- [yiisoft/yii2-imagine](https://github.com/yiisoft/yii2-imagine): +- [yiisoft/yii2-imagine](https://www.yiiframework.com/extension/yiisoft/yii2-imagine): provides commonly used image manipulation functions based on [Imagine](http://imagine.readthedocs.org/). -- [yiisoft/yii2-jui](https://github.com/yiisoft/yii2-jui): +- [yiisoft/yii2-jui](https://www.yiiframework.com/extension/yiisoft/yii2-jui): provides a set of widgets that encapsulate the [JQuery UI](http://jqueryui.com/) interactions and widgets. -- [yiisoft/yii2-mongodb](https://github.com/yiisoft/yii2-mongodb): +- [yiisoft/yii2-mongodb](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb): provides the support for using [MongoDB](http://www.mongodb.org/). It includes features such as basic query, Active Record, migrations, caching, code generation, etc. -- [yiisoft/yii2-redis](https://github.com/yiisoft/yii2-redis): +- [yiisoft/yii2-queue](https://www.yiiframework.com/extension/yiisoft/yii2-queue): + provides the supports for running tasks asynchronously via queues. + It supports queues based on DB, Redis, RabbitMQ, AMQP, Beanstalk and Gearman. +- [yiisoft/yii2-redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis): provides the support for using [redis](http://redis.io/). It includes features such as basic query, Active Record, caching, etc. -- [yiisoft/yii2-smarty](https://github.com/yiisoft/yii2-smarty): +- [yiisoft/yii2-shell](https://www.yiiframework.com/extension/yiisoft/yii2-shell): + provides an interactive shell based on [psysh](http://psysh.org/). +- [yiisoft/yii2-smarty](https://www.yiiframework.com/extension/yiisoft/yii2-smarty): provides a template engine based on [Smarty](http://www.smarty.net/). -- [yiisoft/yii2-sphinx](https://github.com/yiisoft/yii2-sphinx): +- [yiisoft/yii2-sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx): provides the support for using [Sphinx](http://sphinxsearch.com). It includes features such as basic query, Active Record, code generation, etc. -- [yiisoft/yii2-swiftmailer](https://github.com/yiisoft/yii2-swiftmailer): +- [yiisoft/yii2-swiftmailer](https://www.yiiframework.com/extension/yiisoft/yii2-swiftmailer): provides email sending features based on [swiftmailer](http://swiftmailer.org/). -- [yiisoft/yii2-twig](https://github.com/yiisoft/yii2-twig): +- [yiisoft/yii2-twig](https://www.yiiframework.com/extension/yiisoft/yii2-twig): provides a template engine based on [Twig](http://twig.sensiolabs.org/). + +The following official extensions are for Yii 2.1 and above. +You don't need to install them for Yii 2.0, since they are included in the core framework. + +- [yiisoft/yii2-captcha](https://www.yiiframework.com/extension/yiisoft/yii2-captcha): + provides an CAPTCHA. +- [yiisoft/yii2-jquery](https://www.yiiframework.com/extension/yiisoft/yii2-jquery): + provides a support for [jQuery](https://jquery.com/). +- [yiisoft/yii2-maskedinput](https://www.yiiframework.com/extension/yiisoft/yii2-maskedinput): + provides a masked input widget based on [jQuery Input Mask plugin](http://robinherbots.github.io/Inputmask/). +- [yiisoft/yii2-mssql](https://www.yiiframework.com/extension/yiisoft/yii2-mssql): + provides the support for using [MSSQL](https://www.microsoft.com/sql-server/). +- [yiisoft/yii2-oracle](https://www.yiiframework.com/extension/yiisoft/yii2-oracle): + provides the support for using [Oracle](https://www.oracle.com/). +- [yiisoft/yii2-rest](https://www.yiiframework.com/extension/yiisoft/yii2-rest): + provides a support for the REST API. From 009682ca0411008fb96f598a69b9a2a4e095c967 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 22 Apr 2018 15:24:28 +0900 Subject: [PATCH 009/902] guide-ja revised [ci skip] (#16143) * guide-ja/intro revised [ci skip] * docs/guide-ja/start-* revised [ci skip] * docs/guide-ja translation for "Active Record" revised [ci skip] * docs/guide-ja/structure small fix [ci skip] * docs/guide-ja/structure-models.md revised [ci skip] * docs/guide-ja/structure-views.md reviewed [ci skip] * guide-ja/structure-modules.md guide-ja/structure-filters.md revised [ci skip] * guide-ja/structure-widgets.md updated [ci skip] * guide-ja/structure revised [ci skip] * guide-ja/structure-extensions.md revised [ci skip] * guide-ja/structure-extensions.md revised [ci skip] * guide-ja/intro adjusted line counts [ci skip] * guide-ja/start adjusted line counts [ci skip] * guide-ja/start line counts adjusted [ci skip] * guide-ja/structure-extensions.md typo fixed [ci skip] * guide-ja/structure line count adjusted [ci skip] * guide-ja/structure line count adjusted [ci skip] --- docs/guide-ja/README.md | 24 +- docs/guide-ja/caching-data.md | 2 +- docs/guide-ja/concept-behaviors.md | 4 +- docs/guide-ja/concept-components.md | 2 +- docs/guide-ja/concept-configurations.md | 2 +- docs/guide-ja/concept-di-container.md | 2 +- docs/guide-ja/concept-events.md | 4 +- docs/guide-ja/db-active-record.md | 212 +++++++++--------- docs/guide-ja/db-dao.md | 6 +- docs/guide-ja/db-migrations.md | 8 +- docs/guide-ja/helper-array.md | 2 +- docs/guide-ja/input-forms.md | 4 +- docs/guide-ja/input-tabular-input.md | 2 +- docs/guide-ja/intro-upgrade-from-v1.md | 127 +++++------ docs/guide-ja/intro-yii.md | 20 +- docs/guide-ja/output-data-providers.md | 6 +- docs/guide-ja/output-data-widgets.md | 10 +- docs/guide-ja/output-sorting.md | 2 +- docs/guide-ja/rest-controllers.md | 4 +- docs/guide-ja/rest-quick-start.md | 4 +- docs/guide-ja/rest-resources.md | 2 +- docs/guide-ja/runtime-bootstrapping.md | 2 +- docs/guide-ja/runtime-overview.md | 2 +- docs/guide-ja/security-authentication.md | 4 +- docs/guide-ja/security-authorization.md | 2 +- docs/guide-ja/security-best-practices.md | 2 +- docs/guide-ja/start-databases.md | 67 +++--- docs/guide-ja/start-forms.md | 46 ++-- docs/guide-ja/start-gii.md | 44 ++-- docs/guide-ja/start-hello.md | 37 +-- docs/guide-ja/start-installation.md | 106 +++++---- docs/guide-ja/start-looking-ahead.md | 4 +- docs/guide-ja/start-prerequisites.md | 16 +- docs/guide-ja/start-workflow.md | 35 +-- .../structure-application-components.md | 18 +- docs/guide-ja/structure-applications.md | 150 +++++++------ docs/guide-ja/structure-assets.md | 211 ++++++++++------- docs/guide-ja/structure-controllers.md | 101 ++++++--- docs/guide-ja/structure-entry-scripts.md | 15 +- docs/guide-ja/structure-extensions.md | 134 +++++++---- docs/guide-ja/structure-filters.md | 66 +++--- docs/guide-ja/structure-models.md | 107 +++++---- docs/guide-ja/structure-modules.md | 89 ++++---- docs/guide-ja/structure-overview.md | 12 +- docs/guide-ja/structure-views.md | 162 ++++++++----- docs/guide-ja/structure-widgets.md | 30 ++- docs/guide-ja/test-fixtures.md | 4 +- docs/guide-ja/tutorial-core-validators.md | 10 +- docs/guide-ja/tutorial-performance-tuning.md | 10 +- .../tutorial-yii-as-micro-framework.md | 2 +- docs/guide-ja/tutorial-yii-integration.md | 6 +- 51 files changed, 1114 insertions(+), 829 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index 9990cc74e95..d7756d06338 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -77,9 +77,9 @@ All Rights Reserved. * [データベース・アクセス・オブジェクト](db-dao.md): データベースへの接続、基本的なクエリ、トランザクション、および、スキーマ操作 * [クエリ・ビルダ](db-query-builder.md): シンプルな抽象レイヤを使ってデータベースに対してクエリを行う -* [アクティブレコード](db-active-record.md): アクティブレコード ORM、レコードの読み出しと操作、リレーションの定義 +* [アクティブ・レコード](db-active-record.md): アクティブ・レコード ORM、レコードの読み出しと操作、リレーションの定義 * [マイグレーション](db-migrations.md): チーム開発環境においてデータベースにバージョン・コントロールを適用 -* [Sphinx](https://yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide) +* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide) * [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide) * [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide) * [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide) @@ -130,8 +130,8 @@ All Rights Reserved. * [HTTP キャッシュ](caching-http.md) -RESTful ウェブサービス ----------------------- +RESTful ウェブ・サービス +------------------------ * [クイック・スタート](rest-quick-start.md) * [リソース](rest-resources.md) @@ -182,14 +182,14 @@ RESTful ウェブサービス ウィジェット ------------ -* [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) +* [[yii\grid\GridView|GridView]] +* [[yii\widgets\ListView|ListView]] +* [[yii\widgets\DetailView|DetailView]] +* [[yii\widgets\ActiveForm|ActiveForm]] +* [[yii\widgets\Pjax|Pjax]] +* [[yii\widgets\Menu|Menu]] +* [[yii\widgets\LinkPager|LinkPager]] +* [[yii\widgets\LinkSorter|LinkSorter]] * [Bootstrap ウィジェット](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide) * [jQuery UI ウィジェット](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide) diff --git a/docs/guide-ja/caching-data.md b/docs/guide-ja/caching-data.md index 95f20650d67..16f1792d0d5 100644 --- a/docs/guide-ja/caching-data.md +++ b/docs/guide-ja/caching-data.md @@ -267,7 +267,7 @@ $result = $db->cache(function ($db) { }); ``` -クエリ・キャッシュは [DAO](db-dao.md) だけではなく [アクティブレコード](db-active-record.md) でも使用することができます。 +クエリ・キャッシュは [DAO](db-dao.md) だけではなく [アクティブ・レコード](db-active-record.md) でも使用することができます。 ```php $result = Customer::getDb()->cache(function ($db) { diff --git a/docs/guide-ja/concept-behaviors.md b/docs/guide-ja/concept-behaviors.md index 9298edac747..e7c84d99af9 100644 --- a/docs/guide-ja/concept-behaviors.md +++ b/docs/guide-ja/concept-behaviors.md @@ -251,10 +251,10 @@ $component->detachBehaviors(); ------------------------------ しめくくりに、[[yii\behaviors\TimestampBehavior]] を見てみましょう。このビヘイビアは、 -`insert()`、`update()` または `save()` のメソッドを通じて [[yii\db\ActiveRecord|アクティブレコード]] モデルが保存されるときに、 +`insert()`、`update()` または `save()` のメソッドを通じて [[yii\db\ActiveRecord|アクティブ・レコード]] モデルが保存されるときに、 タイムスタンプ属性の自動的な更新をサポートします。 -まず、使用しようと考えている [[yii\db\ActiveRecord|アクティブレコード]] クラスに、このビヘイビアをアタッチします: +まず、使用しようと考えている [[yii\db\ActiveRecord|アクティブ・レコード]] クラスに、このビヘイビアをアタッチします: ```php namespace app\models\User; diff --git a/docs/guide-ja/concept-components.md b/docs/guide-ja/concept-components.md index 41e061fa2a3..511ebe2eb55 100644 --- a/docs/guide-ja/concept-components.md +++ b/docs/guide-ja/concept-components.md @@ -80,7 +80,7 @@ $component = \Yii::createObject([ > Note: [[Yii::createObject()]] を呼び出すアプローチは複雑に見えますが、より強力です。というのも、それが [依存性注入コンテナ](concept-di-container.md) 上に実装されているからです。 -[[yii\base\BaseObject]] クラスには、次のオブジェクト・ライフ・サイクルが適用されます: +[[yii\base\BaseObject]] クラスには、次のオブジェクト・ライフサイクルが適用されます: 1. コンストラクタ内の事前初期化。ここでデフォルトのプロパティ値を設定することができます。 2. `$config` によるオブジェクトの構成。構成情報は、コンストラクタ内で設定されたデフォルト値を上書きすることがあります。 diff --git a/docs/guide-ja/concept-configurations.md b/docs/guide-ja/concept-configurations.md index 9d52f6a3b2d..25d462130e9 100644 --- a/docs/guide-ja/concept-configurations.md +++ b/docs/guide-ja/concept-configurations.md @@ -77,7 +77,7 @@ Yii::configure($object, $config); ## 構成情報を使用する 構成情報は Yii の多くの場所で使用されています。このセクションの冒頭では、 [[Yii::createObject()]] -を使って、構成情報に応じてオブジェクトを作成する方法を示しました。このサブ・セクションでは、 +を使って、構成情報に応じてオブジェクトを作成する方法を示しました。この項では、 アプリケーションの構成とウィジェットの構成という、2つの主要な構成情報の用途を説明します。 diff --git a/docs/guide-ja/concept-di-container.md b/docs/guide-ja/concept-di-container.md index cb9edbda1fe..e26085eb46d 100644 --- a/docs/guide-ja/concept-di-container.md +++ b/docs/guide-ja/concept-di-container.md @@ -41,7 +41,7 @@ $foo = new Foo($bar); ### メソッド・インジェクション -通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフ・サイクル全体にわたって利用可能になります。 +通常、クラスの依存はコンストラクタに渡されて、そのクラスの内部でライフサイクル全体にわたって利用可能になります。 メソッド・インジェクションを使うと、クラスのメソッドの一つだけに必要となる依存、例えば、コンストラクタに渡すことが不可能であったり、大半のユースケースにおいてはオーバーヘッドが大きすぎるような依存を提供することが可能になります。 クラスのメソッドを次の例の `doSomething` メソッドのように定義することが出来ます。 diff --git a/docs/guide-ja/concept-events.md b/docs/guide-ja/concept-events.md index d4b6249f505..3f61e599000 100644 --- a/docs/guide-ja/concept-events.md +++ b/docs/guide-ja/concept-events.md @@ -199,9 +199,9 @@ $foo->off(Foo::EVENT_HELLO); イベントに応答したいことがあります。すべてのインスタンスにイベント・ハンドラをアタッチする代わりに、静的メソッド [[yii\base\Event::on()]] を呼び出すことで、 *クラス・レベル* でハンドラをアタッチすることができます。 -たとえば、[アクティブレコード](db-active-record.md) オブジェクトは、データベースに新しいレコードを挿入するたびに、 +たとえば、[アクティブ・レコード](db-active-record.md) オブジェクトは、データベースに新しいレコードを挿入するたびに、 [[yii\db\BaseActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] イベントをトリガします。 *すべての* -[アクティブレコード](db-active-record.md) オブジェクトによって行われる挿入を追跡するには、次のコードが使えます: +[アクティブ・レコード](db-active-record.md) オブジェクトによって行われる挿入を追跡するには、次のコードが使えます: ```php use Yii; diff --git a/docs/guide-ja/db-active-record.md b/docs/guide-ja/db-active-record.md index b3d0489b857..68a4f80a7ca 100644 --- a/docs/guide-ja/db-active-record.md +++ b/docs/guide-ja/db-active-record.md @@ -1,12 +1,12 @@ -アクティブレコード -================== +アクティブ・レコード +==================== -[アクティブレコード](http://ja.wikipedia.org/wiki/Active_Record) は、データベースに保存されているデータにアクセスするために、オブジェクト指向のインタフェイスを提供するものです。 -アクティブレコード・クラスはデータベース・テーブルと関連付けられます。 -アクティブレコードのインスタンスはそのテーブルの行に対応し、アクティブレコードのインスタンスの *属性* がその行にある特定のカラムの値を表現します。 -生の SQL 文を書く代りに、アクティブレコードの属性にアクセスしたり、アクティブレコードのメソッドを呼んだりして、データベース・テーブルに保存さているデータにアクセスしたり、データを操作したりします。 +[アクティブ・レコード](http://ja.wikipedia.org/wiki/Active_Record) は、データベースに保存されているデータにアクセスするために、オブジェクト指向のインタフェイスを提供するものです。 +アクティブ・レコード・クラスはデータベース・テーブルと関連付けられます。 +アクティブ・レコードのインスタンスはそのテーブルの行に対応し、アクティブ・レコードのインスタンスの *属性* がその行にある特定のカラムの値を表現します。 +生の SQL 文を書く代りに、アクティブ・レコードの属性にアクセスしたり、アクティブ・レコードのメソッドを呼んだりして、データベース・テーブルに保存さているデータにアクセスしたり、データを操作したりします。 -例えば、`Customer` が `customer` テーブルに関連付けられたアクティブレコード・クラスであり、`name` が `customer` テーブルのカラムであると仮定しましょう。 +例えば、`Customer` が `customer` テーブルに関連付けられたアクティブ・レコード・クラスであり、`name` が `customer` テーブルのカラムであると仮定しましょう。 `customer` テーブルに新しい行を挿入するために次のコードを書くことが出来ます。 ```php @@ -24,7 +24,7 @@ $db->createCommand('INSERT INTO `customer` (`name`) VALUES (:name)', [ ])->execute(); ``` -Yii は次のリレーショナル・データベースに対して、アクティブレコードのサポートを提供しています。 +Yii は次のリレーショナル・データベースに対して、アクティブ・レコードのサポートを提供しています。 * MySQL 4.1 以降: [[yii\db\ActiveRecord]] による。 * PostgreSQL 7.3 以降: [[yii\db\ActiveRecord]] による。 @@ -36,22 +36,22 @@ Yii は次のリレーショナル・データベースに対して、アクテ * Sphinx: [[yii\sphinx\ActiveRecord]] による。`yii2-sphinx` エクステンションが必要。 * ElasticSearch: [[yii\elasticsearch\ActiveRecord]] による。`yii2-elasticsearch` エクステンションが必要。 -これらに加えて、Yii は次の NoSQL データベースに対しても、アクティブレコードの使用をサポートしています。 +これらに加えて、Yii は次の NoSQL データベースに対しても、アクティブ・レコードの使用をサポートしています。 * Redis 2.6.12 以降: [[yii\redis\ActiveRecord]] による。`yii2-redis` エクステンションが必要。 * MongoDB 1.3.0 以降: [[yii\mongodb\ActiveRecord]] による。`yii2-mongodb` エクステンションが必要。 -このチュートリアルでは、主としてリレーショナル・データベースのためのアクティブレコードの使用方法を説明します。 -しかし、ここで説明するほとんどの内容は NoSQL データベースのためのアクティブレコードにも適用することが出来るものです。 +このチュートリアルでは、主としてリレーショナル・データベースのためのアクティブ・レコードの使用方法を説明します。 +しかし、ここで説明するほとんどの内容は NoSQL データベースのためのアクティブ・レコードにも適用することが出来るものです。 -## アクティブレコード・クラスを宣言する +## アクティブ・レコード・クラスを宣言する -まずは、[[yii\db\ActiveRecord]] を拡張してアクティブレコード・クラスを宣言するところから始めましょう。 +まずは、[[yii\db\ActiveRecord]] を拡張してアクティブ・レコード・クラスを宣言するところから始めましょう。 ### テーブル名を設定する -デフォルトでは、すべてのアクティブレコード・クラスはデータベース・テーブルと関連付けられます。 +デフォルトでは、すべてのアクティブ・レコード・クラスはデータベース・テーブルと関連付けられます。 [[yii\db\ActiveRecord::tableName()|tableName()]] メソッドが、クラス名を [[yii\helpers\Inflector::camel2id()]] によって変換して、テーブル名を返します。 テーブル名がこの規約に従っていない場合は、このメソッドをオーバライドすることが出来ます。 @@ -62,7 +62,7 @@ Yii は次のリレーショナル・データベースに対して、アクテ 例えば、`{{%post}}` は `{{tbl_post}}` となります。 テーブル名を囲む二重波括弧は、[テーブル名を囲む引用符号](db-dao.md#quoting-table-and-column-names) となります。 -次の例では、`customer` というデータベース・テーブルのための `Customer` という名前のアクティブレコード・クラスを宣言しています。 +次の例では、`customer` というデータベース・テーブルのための `Customer` という名前のアクティブ・レコード・クラスを宣言しています。 ```php namespace app\models; @@ -75,7 +75,7 @@ class Customer extends ActiveRecord const STATUS_ACTIVE = 1; /** - * @return string このアクティブレコード・クラスと関連付けられるテーブルの名前 + * @return string このアクティブ・レコード・クラスと関連付けられるテーブルの名前 */ public static function tableName() { @@ -84,17 +84,17 @@ class Customer extends ActiveRecord } ``` -### アクティブレコードは「モデル」と呼ばれる +### アクティブ・レコードは「モデル」と呼ばれる -アクティブレコードのインスタンスは [モデル](structure-models.md) であると見なされます。 -この理由により、私たちは通常 `app\models` 名前空間 (あるいはモデル・クラスを保管するための他の名前空間) の下にアクティブレコード・クラスを置きます。 +アクティブ・レコードのインスタンスは [モデル](structure-models.md) であると見なされます。 +この理由により、私たちは通常 `app\models` 名前空間 (あるいはモデル・クラスを保管するための他の名前空間) の下にアクティブ・レコード・クラスを置きます。 [[yii\db\ActiveRecord]] は [[yii\base\Model]] から拡張していますので、属性、検証規則、データのシリアル化など、[モデル](structure-models.md) が持つ *全ての* 機能を継承しています。 ## データベースに接続する -デフォルトでは、アクティブレコードは、`db` [アプリケーション・コンポーネント](structure-application-components.md) を [[yii\db\Connection|DB 接続]] として使用して、データベースのデータにアクセスしたり操作したりします。 +デフォルトでは、アクティブ・レコードは、`db` [アプリケーション・コンポーネント](structure-application-components.md) を [[yii\db\Connection|DB 接続]] として使用して、データベースのデータにアクセスしたり操作したりします。 [データベース・アクセス・オブジェクト](db-dao.md) で説明したように、次のようにして、アプリケーションの構成情報ファイルの中で `db` コンポーネントを構成することが出来ます。 ```php @@ -127,12 +127,12 @@ class Customer extends ActiveRecord ## データをクエリする -アクティブレコード・クラスを宣言した後、それを使って対応するデータベース・テーブルからデータをクエリすることが出来ます。 +アクティブ・レコード・クラスを宣言した後、それを使って対応するデータベース・テーブルからデータをクエリすることが出来ます。 このプロセスは通常次の三つのステップを踏みます。 1. [[yii\db\ActiveRecord::find()]] メソッドを呼んで、新しいクエリ・オブジェクトを作成する。 2. [クエリ構築メソッド](db-query-builder.md#building-queries) を呼んで、クエリ・オブジェクトを構築する。 -3. [クエリ・メソッド](db-query-builder.md#query-methods) を呼んで、アクティブレコードのインスタンスの形でデータを取得する。 +3. [クエリ・メソッド](db-query-builder.md#query-methods) を呼んで、アクティブ・レコードのインスタンスの形でデータを取得する。 ご覧のように、このプロセスは [クエリ・ビルダ](db-query-builder.md) による手続きと非常によく似ています。 唯一の違いは、`new` 演算子を使ってクエリ・オブジェクトを生成する代りに、[[yii\db\ActiveQuery]] クラスであるクエリ・オブジェクトを返す [[yii\db\ActiveRecord::find()]] を呼ぶ、という点です。 @@ -173,8 +173,8 @@ $customers = Customer::find() プライマリ・キーの値や一群のカラムの値でクエリをすることはよく行われる仕事ですので、Yii はこの目的のために、二つのショートカット・メソッドを提供しています。 -- [[yii\db\ActiveRecord::findOne()]]: クエリ結果の最初の行を一つのアクティブレコード・インスタンスに投入して返す。 -- [[yii\db\ActiveRecord::findAll()]]: *全ての* クエリ結果をアクティブレコード・インスタンスの配列に投入して返す。 +- [[yii\db\ActiveRecord::findOne()]]: クエリ結果の最初の行を一つのアクティブ・レコード・インスタンスに投入して返す。 +- [[yii\db\ActiveRecord::findAll()]]: *全ての* クエリ結果をアクティブ・レコード・インスタンスの配列に投入して返す。 どちらのメソッドも、次のパラメータ形式のどれかを取ることが出来ます。 @@ -234,7 +234,7 @@ $customers = Customer::findAll([ あなたのクエリが多数のデータ行を返すかもしれない場合は、パフォーマンスを向上させるために、`limit(1)` を明示的に呼ぶべきです。 例えば `Customer::find()->limit(1)->one()` のように。 -クエリ構築メソッドを使う以外に、生の SQL を書いてデータをクエリして結果をアクティブレコード・オブジェクトに投入することも出来ます。 +クエリ構築メソッドを使う以外に、生の SQL を書いてデータをクエリして結果をアクティブ・レコード・オブジェクトに投入することも出来ます。 そうするためには [[yii\db\ActiveRecord::findBySql()]] メソッドを呼ぶことが出来ます。 ```php @@ -247,9 +247,9 @@ $customers = Customer::findBySql($sql, [':status' => Customer::STATUS_INACTIVE]) ## データにアクセスする -既に述べたように、データベースから取得されたデータはアクティブレコードのインスタンスに投入されます。 -そして、クエリ結果の各行がアクティブレコードの一つのインスタンスに対応します。 -アクティブレコード・インスタンスの属性にアクセスすることによって、カラムの値にアクセスすることが出来ます。 +既に述べたように、データベースから取得されたデータはアクティブ・レコードのインスタンスに投入されます。 +そして、クエリ結果の各行がアクティブ・レコードの一つのインスタンスに対応します。 +アクティブ・レコード・インスタンスの属性にアクセスすることによって、カラムの値にアクセスすることが出来ます。 例えば、 ```php @@ -259,11 +259,11 @@ $id = $customer->id; $email = $customer->email; ``` -> Note: アクティブレコードの属性の名前は、関連付けられたテーブルのカラムの名前に従って、大文字と小文字を区別して名付けられます。 - Yii は、関連付けられたテーブルの全てのカラムに対して、アクティブレコードの属性を自動的に定義します。 +> Note: アクティブ・レコードの属性の名前は、関連付けられたテーブルのカラムの名前に従って、大文字と小文字を区別して名付けられます。 + Yii は、関連付けられたテーブルの全てのカラムに対して、アクティブ・レコードの属性を自動的に定義します。 これらの属性は、すべて、再宣言してはいけません。 -アクティブレコードの属性はテーブルのカラムに従って命名されるため、テーブルのカラム名がアンダースコアで単語を分ける方法で命名されている場合は、`$customer->first_name` のような属性名を使って PHP コードを書くことになります。 +アクティブ・レコードの属性はテーブルのカラムに従って命名されるため、テーブルのカラム名がアンダースコアで単語を分ける方法で命名されている場合は、`$customer->first_name` のような属性名を使って PHP コードを書くことになります。 コード・スタイルの一貫性が気になるのであれば、テーブルのカラム名を (例えば camelCase を使う名前に) 変更しなければなりません。 @@ -271,7 +271,7 @@ $email = $customer->email; 入力または表示されるデータの形式が、データベースにデータを保存するときに使われるものと異なる場合がよくあります。 例えば、データベースでは顧客の誕生日を UNIX タイムスタンプで保存している (まあ、あまり良い設計ではありませんが) けれども、ほとんどの場合において誕生日を `'YYYY/MM/DD'` という形式の文字列として操作したい、というような場合です。 -この目的を達するために、次のように、`Customer` アクティブレコード・クラスにおいて *データ変換* メソッドを定義することが出来ます。 +この目的を達するために、次のように、`Customer` アクティブ・レコード・クラスにおいて *データ変換* メソッドを定義することが出来ます。 ```php class Customer extends ActiveRecord @@ -299,7 +299,7 @@ class Customer extends ActiveRecord ### データを配列に取得する -データをアクティブレコード・オブジェクトの形で取得するのは便利であり柔軟ですが、大きなメモリ使用量を要するために、大量のデータを取得しなければならない場合は、必ずしも望ましい方法ではありません。 +データをアクティブ・レコード・オブジェクトの形で取得するのは便利であり柔軟ですが、大きなメモリ使用量を要するために、大量のデータを取得しなければならない場合は、必ずしも望ましい方法ではありません。 そういう場合は、クエリ・メソッドを実行する前に [[yii\db\ActiveQuery::asArray()|asArray()]] を呼ぶことによって、PHP 配列を使ってデータを取得することが出来ます。 ```php @@ -310,9 +310,9 @@ $customers = Customer::find() ->all(); ``` -> Note: このメソッドはメモリを節約してパフォーマンスを向上させますが、低レベルの DB 抽象レイヤに近いものであり、あなたはアクティブレコードの機能のほとんどを失うことになります。 +> Note: このメソッドはメモリを節約してパフォーマンスを向上させますが、低レベルの DB 抽象レイヤに近いものであり、あなたはアクティブ・レコードの機能のほとんどを失うことになります。 非常に重要な違いが、カラムの値のデータ型に現れます。 - アクティブレコード・インスタンスとしてデータを返す場合、カラムの値は実際のカラムの型に従って自動的に型キャストされます。 + アクティブ・レコード・インスタンスとしてデータを返す場合、カラムの値は実際のカラムの型に従って自動的に型キャストされます。 一方、配列としてデータを返す場合は、実際のカラムの型に関係なく、カラムの値は文字列になります。 なぜなら、何も処理をしない場合の PDO の結果は文字列だからです。 @@ -320,7 +320,7 @@ $customers = Customer::find() ### データをバッチ・モードで取得する [クエリ・ビルダ](db-query-builder.md) において、大量のデータをデータベースから検索する場合に、メモリ使用量を最小化するために *バッチ・クエリ* を使うことが出来るということを説明しました。 -おなじテクニックをアクティブレコードでも使うことが出来ます。 +おなじテクニックをアクティブ・レコードでも使うことが出来ます。 例えば、 ```php @@ -341,10 +341,10 @@ foreach (Customer::find()->with('orders')->each() as $customer) { ## データを保存する -アクティブレコードを使えば、次のステップを踏んで簡単にデータをデータベースに保存することが出来ます。 +アクティブ・レコードを使えば、次のステップを踏んで簡単にデータをデータベースに保存することが出来ます。 -1. アクティブレコードのインスタンスを準備する -2. アクティブレコードの属性に新しい値を割り当てる +1. アクティブ・レコードのインスタンスを準備する +2. アクティブ・レコードの属性に新しい値を割り当てる 3. [[yii\db\ActiveRecord::save()]] を呼んでデータをデータベースに保存する 例えば、 @@ -361,11 +361,11 @@ $customer->email = 'james@newexample.com'; $customer->save(); ``` -[[yii\db\ActiveRecord::save()|save()]] メソッドは、アクティブレコード・インスタンスの状態に従って、データ行を挿入するか、または、更新することが出来ます。 +[[yii\db\ActiveRecord::save()|save()]] メソッドは、アクティブ・レコード・インスタンスの状態に従って、データ行を挿入するか、または、更新することが出来ます。 インスタンスが `new` 演算子によって新しく作成されたものである場合は、[[yii\db\ActiveRecord::save()|save()]] を呼び出すと、新しい行が挿入されます。 インスタンスがクエリ・メソッドの結果である場合は、[[yii\db\ActiveRecord::save()|save()]] を呼び出すと、そのインスタンスと関連付けられた行が更新されます。 -アクティブレコード・インスタンスの二つの状態は、その [[yii\db\ActiveRecord::isNewRecord|isNewRecord]] プロパティの値をチェックすることによって区別することが出来ます。 +アクティブ・レコード・インスタンスの二つの状態は、その [[yii\db\ActiveRecord::isNewRecord|isNewRecord]] プロパティの値をチェックすることによって区別することが出来ます。 下記のように、このプロパティは [[yii\db\ActiveRecord::save()|save()]] によっても内部的に使用されています。 ```php @@ -396,8 +396,8 @@ public function save($runValidation = true, $attributeNames = null) ### 一括代入 -通常の [モデル](structure-models.md) と同じように、アクティブレコードのインスタンスも [一括代入機能](structure-models.md#massive-assignment) を享受することが出来ます。 -この機能を使うと、下記で示されているように、一つの PHP 文で、アクティブレコード・インスタンスの複数の属性に値を割り当てることが出来ます。 +通常の [モデル](structure-models.md) と同じように、アクティブ・レコードのインスタンスも [一括代入機能](structure-models.md#massive-assignment) を享受することが出来ます。 +この機能を使うと、下記で示されているように、一つの PHP 文で、アクティブ・レコード・インスタンスの複数の属性に値を割り当てることが出来ます。 ただし、[安全な属性](structure-models.md#safe-attributes) だけが一括代入が可能であることを記憶しておいてください。 ```php @@ -433,11 +433,11 @@ $post->updateCounters(['view_count' => 1]); ### ダーティな属性 -[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブレコード・インスタンスを保存すると、*ダーティな属性* だけが保存されます。 +[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブ・レコード・インスタンスを保存すると、*ダーティな属性* だけが保存されます。 属性は、DB からロードされた後、または、最後に保存された後にその値が変更されると、*ダーティ* であると見なされます。 -ただし、データ検証は、アクティブレコード・インスタンスがダーティな属性を持っているかどうかに関係なく実施されることに注意してください。 +ただし、データ検証は、アクティブ・レコード・インスタンスがダーティな属性を持っているかどうかに関係なく実施されることに注意してください。 -アクティブレコードはダーティな属性のリストを自動的に保守します。 +アクティブ・レコードはダーティな属性のリストを自動的に保守します。 そうするために、一つ前のバージョンの属性値を保持して、最新のバージョンと比較します。 [[yii\db\ActiveRecord::getDirtyAttributes()]] を呼ぶと、現在ダーティである属性を取得することが出来ます。 また、[[yii\db\ActiveRecord::markAttributeDirty()]] を呼んで、ある属性をダーティであると明示的にマークすることも出来ます。 @@ -454,8 +454,8 @@ $post->updateCounters(['view_count' => 1]); ### デフォルト属性値 あなたのテーブルのカラムの中には、データベースでデフォルト値が定義されているものがあるかも知れません。 -そして、場合によっては、アクティブレコード・インスタンスのウェブ・フォームに、そういうデフォルト値をあらかじめ投入したいことがあるでしょう。 -同じデフォルト値を繰り返して書くことを避けるために、[[yii\db\ActiveRecord::loadDefaultValues()|loadDefaultValues()]] を呼んで、DB で定義されたデフォルト値を対応するアクティブレコードの属性に投入することが出来ます。 +そして、場合によっては、アクティブ・レコード・インスタンスのウェブ・フォームに、そういうデフォルト値をあらかじめ投入したいことがあるでしょう。 +同じデフォルト値を繰り返して書くことを避けるために、[[yii\db\ActiveRecord::loadDefaultValues()|loadDefaultValues()]] を呼んで、DB で定義されたデフォルト値を対応するアクティブ・レコードの属性に投入することが出来ます。 ```php $customer = new Customer(); @@ -468,7 +468,7 @@ $customer->loadDefaultValues(); [[yii\db\ActiveRecord]] は、クエリの結果を投入されるときに、[データベース・テーブル・スキーマ](db-dao.md#database-schema) からの情報を使って、自動的な型キャストを実行します。これによって、整数として宣言されているテーブルカラムから取得されるデータを -アクティブレコードのインスタンスでも PHP の integer として投入し、 +アクティブ・レコードのインスタンスでも PHP の integer として投入し、 真偽値として宣言されているデータを boolean として投入することが出来るようになっています。 しかしながら、型キャストのメカニズムには、いくつかの制約があります。 @@ -477,22 +477,22 @@ $customer->loadDefaultValues(); 'unsigned integer' または 'big integer' として宣言されたカラムの値は、64-bit オペレーティングシステムでのみ PHP の integer に変換されます。 32-bit オペレーティングシステムでは、文字列として表されます。 -属性の型キャストは、アクティブレコードのインスタンスにクエリの結果から値を投入するときだけしか実行されないことに注意してください。 +属性の型キャストは、アクティブ・レコードのインスタンスにクエリの結果から値を投入するときだけしか実行されないことに注意してください。 HTTP リクエストから値をロードしたり、プロパティにアクセスして直接に値を設定したりするときには、自動的な変換は行われません。 -また、アクティブレコードのデータ保存のための SQL 文を準備する際にもテーブル・スキーマが使用されて、値が正しい型でクエリにバインドされることを保証します。 -しかし、アクティブレコードのインスタンスの属性値は保存の過程において変換されることはありません。 +また、アクティブ・レコードのデータ保存のための SQL 文を準備する際にもテーブル・スキーマが使用されて、値が正しい型でクエリにバインドされることを保証します。 +しかし、アクティブ・レコードのインスタンスの属性値は保存の過程において変換されることはありません。 -> Tip: アクティブレコードの検証や保存の際の属性型キャストを楽にするために +> Tip: アクティブ・レコードの検証や保存の際の属性型キャストを楽にするために [[yii\behaviors\AttributeTypecastBehavior]] を使うことが出来ます。 -2.0.14 以降、Yii のアクティブレコードは、JSON や多次元配列のような複雑な型をサポートしています。 +2.0.14 以降、Yii のアクティブ・レコードは、JSON や多次元配列のような複雑な型をサポートしています。 #### MySQL および PostgreSQL における JSON データが取得された後、JSON カラムの値は標準的な JSON デコード規則に従って、 自動的に JSON からデコードされます。 -アクティブレコードは、属性値を JSON カラムに保存するために [[yii\db\JsonExpression|JsonExpression]] +アクティブ・レコードは、属性値を JSON カラムに保存するために [[yii\db\JsonExpression|JsonExpression]] オブジェクトを自動的に生成します。このオブジェクトが [クエリ・ビルダ](db-query-builder.md) レベルで JSON 文字列にエンコードされます。 #### PostgreSQL における配列 @@ -501,7 +501,7 @@ HTTP リクエストから値をロードしたり、プロパティにアクセ このオブジェクトは PHP の `ArrayAccess` インタフェイスを実装しているため、これを配列として使うこと事が出来ます。 また、`->getValue()` を呼んで配列そのものを取得することも出来ます。 -アクティブレコードは、属性値を配列カラムに保存するために [[yii\db\ArrayExpression|ArrayExpression]] +アクティブ・レコードは、属性値を配列カラムに保存するために [[yii\db\ArrayExpression|ArrayExpression]] オブジェクトを生成します。このオブジェクトが [クエリ・ビルダ](db-query-builder.md) のレベルで配列を表す PgSQL 文字列にエンコードされます。 JSON カラムに対して条件を使用することも出来ます。 @@ -515,7 +515,7 @@ $query->andWhere(['=', 'json', new ArrayExpression(['foo' => 'bar']) ### 複数の行を更新する -上述のメソッドは、すべて、個別のアクティブレコード・インスタンスに対して作用し、個別のテーブル行を挿入したり更新したりするものです。 +上述のメソッドは、すべて、個別のアクティブ・レコード・インスタンスに対して作用し、個別のテーブル行を挿入したり更新したりするものです。 複数の行を同時に更新するためには、代りに、スタティックなメソッドである [[yii\db\ActiveRecord::updateAll()|updateAll()]] を呼ばなければなりません。 ```php @@ -533,7 +533,7 @@ Customer::updateAllCounters(['age' => 1]); ## データを削除する -一行のデータを削除するためには、最初にその行に対応するアクティブレコード・インスタンスを取得して、次に [[yii\db\ActiveRecord::delete()]] メソッドを呼びます。 +一行のデータを削除するためには、最初にその行に対応するアクティブ・レコード・インスタンスを取得して、次に [[yii\db\ActiveRecord::delete()]] メソッドを呼びます。 ```php $customer = Customer::findOne(123); @@ -550,37 +550,37 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]); なぜなら、条件の指定を間違うと、あなたのテーブルからすべてのデータを完全に消し去ってしまうことになるからです。 -## アクティブレコードのライフ・サイクル +## アクティブ・レコードのライフサイクル -アクティブレコードがさまざまな目的で使用される場合のそれぞれのライフ・サイクルを理解しておくことは重要なことです。 -それぞれのライフ・サイクルにおいては、特定の一続きのメソッドが呼び出されます。 -そして、これらのメソッドをオーバーライドして、ライフ・サイクルをカスタマイズするチャンスを得ることが出来ます。 -また、ライフ・サイクルの中でトリガされる特定のアクティブレコード・イベントに反応して、あなたのカスタム・コードを挿入することも出来ます。 -これらのイベントが特に役に立つのは、アクティブレコードのライフ・サイクルをカスタマイズする必要のあるアクティブレコード・[ビヘイビア](concept-behaviors.md) を開発する際です。 +アクティブ・レコードがさまざまな目的で使用される場合のそれぞれのライフサイクルを理解しておくことは重要なことです。 +それぞれのライフサイクルにおいては、特定の一続きのメソッドが呼び出されます。 +そして、これらのメソッドをオーバーライドして、ライフサイクルをカスタマイズするチャンスを得ることが出来ます。 +また、ライフサイクルの中でトリガされる特定のアクティブ・レコード・イベントに反応して、あなたのカスタム・コードを挿入することも出来ます。 +これらのイベントが特に役に立つのは、アクティブ・レコードのライフサイクルをカスタマイズする必要のあるアクティブ・レコード・[ビヘイビア](concept-behaviors.md) を開発する際です。 -次に、さまざまなアクティブレコードのライフ・サイクルと、そのライフ・サイクルに含まれるメソッドやイベントを要約します。 +次に、さまざまなアクティブ・レコードのライフサイクルと、そのライフサイクルに含まれるメソッドやイベントを要約します。 -### 新しいインスタンスのライフ・サイクル +### 新しいインスタンスのライフサイクル -`new` 演算子によって新しいアクティブレコード・インスタンスを作成する場合は、次のライフ・サイクルを経ます。 +`new` 演算子によって新しいアクティブ・レコード・インスタンスを作成する場合は、次のライフサイクルを経ます。 1. クラスのコンストラクタ。 2. [[yii\db\ActiveRecord::init()|init()]]: [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] イベントをトリガ。 -### データをクエリする際のライフ・サイクル +### データをクエリする際のライフサイクル -[クエリ・メソッド](#querying-data) のどれか一つによってデータをクエリする場合は、新しくデータを投入されるアクティブレコードは次のライフ・サイクルを経ます。 +[クエリ・メソッド](#querying-data) のどれか一つによってデータをクエリする場合は、新しくデータを投入されるアクティブ・レコードは次のライフサイクルを経ます。 1. クラスのコンストラクタ。 2. [[yii\db\ActiveRecord::init()|init()]]: [[yii\db\ActiveRecord::EVENT_INIT|EVENT_INIT]] イベントをトリガ。 3. [[yii\db\ActiveRecord::afterFind()|afterFind()]]: [[yii\db\ActiveRecord::EVENT_AFTER_FIND|EVENT_AFTER_FIND]] イベントをトリガ。 -### データを保存する際のライフ・サイクル +### データを保存する際のライフサイクル -[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブレコード・インスタンスを挿入または更新する場合は、次のライフ・サイクルを経ます。 +[[yii\db\ActiveRecord::save()|save()]] を呼んでアクティブ・レコード・インスタンスを挿入または更新する場合は、次のライフサイクルを経ます。 1. [[yii\db\ActiveRecord::beforeValidate()|beforeValidate()]]: [[yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE|EVENT_BEFORE_VALIDATE]] イベントをトリガ。 このメソッドが `false` を返すか、[[yii\base\ModelEvent::isValid]] が `false` であった場合、残りのステップはスキップされる。 @@ -592,9 +592,9 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]); 6. [[yii\db\ActiveRecord::afterSave()|afterSave()]]: [[yii\db\ActiveRecord::EVENT_AFTER_INSERT|EVENT_AFTER_INSERT]] または [[yii\db\ActiveRecord::EVENT_AFTER_UPDATE|EVENT_AFTER_UPDATE]] イベントをトリガ。 -### データを削除する際のライフ・サイクル +### データを削除する際のライフサイクル -[[yii\db\ActiveRecord::delete()|delete()]] を呼んでアクティブレコード・インスタンスを削除する際は、次のライフ・サイクルを経ます。 +[[yii\db\ActiveRecord::delete()|delete()]] を呼んでアクティブ・レコード・インスタンスを削除する際は、次のライフサイクルを経ます。 1. [[yii\db\ActiveRecord::beforeDelete()|beforeDelete()]]: [[yii\db\ActiveRecord::EVENT_BEFORE_DELETE|EVENT_BEFORE_DELETE]] イベントをトリガ。 このメソッドが `false` を返すか、[[yii\base\ModelEvent::isValid]] が `false` であった場合は、残りのステップはスキップされる。 @@ -602,7 +602,7 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]); 3. [[yii\db\ActiveRecord::afterDelete()|afterDelete()]]: [[yii\db\ActiveRecord::EVENT_AFTER_DELETE|EVENT_AFTER_DELETE]] イベントをトリガ。 -> Note: 次のメソッドを呼んだ場合は、いずれの場合も、上記のライフ・サイクルのどれかを開始させることはありません。 +> Note: 次のメソッドを呼んだ場合は、いずれの場合も、上記のライフサイクルのどれかを開始させることはありません。 > これらのメソッドは、レコード単位ではなく、データベース上で直接に動作するためです。 > > - [[yii\db\ActiveRecord::updateAll()]] @@ -610,17 +610,17 @@ Customer::deleteAll(['status' => Customer::STATUS_INACTIVE]); > - [[yii\db\ActiveRecord::updateCounters()]] > - [[yii\db\ActiveRecord::updateAllCounters()]] -### データをリフレッシュする際のライフ・サイクル +### データをリフレッシュする際のライフサイクル -[[yii\db\ActiveRecord::refresh()|refresh()]] を呼んでアクティブレコード・インスタンスをリフレッシュする際は、リフレッシュが成功してメソッドが `true` を返すと +[[yii\db\ActiveRecord::refresh()|refresh()]] を呼んでアクティブ・レコード・インスタンスをリフレッシュする際は、リフレッシュが成功してメソッドが `true` を返すと [[yii\db\ActiveRecord::EVENT_AFTER_REFRESH|EVENT_AFTER_REFRESH]] イベントがトリガされます。 ## トランザクションを扱う -アクティブレコードを扱う際には、二つの方法で [トランザクション](db-dao.md#performing-transactions) を処理することができます。 +アクティブ・レコードを扱う際には、二つの方法で [トランザクション](db-dao.md#performing-transactions) を処理することができます。 -最初の方法は、次に示すように、アクティブレコードのメソッドの呼び出しを明示的にトランザクションのブロックで囲む方法です。 +最初の方法は、次に示すように、アクティブ・レコードのメソッドの呼び出しを明示的にトランザクションのブロックで囲む方法です。 ```php $customer = Customer::findOne(123); @@ -696,12 +696,12 @@ class Post extends \yii\db\ActiveRecord 楽観的ロックを使用するためには、次のようにします。 -1. アクティブレコード・クラスと関連付けられている DB テーブルに、各行のバージョン番号を保存するカラムを作成します。 +1. アクティブ・レコード・クラスと関連付けられている DB テーブルに、各行のバージョン番号を保存するカラムを作成します。 カラムは長倍精度整数 (big integer) タイプでなければなりません (MySQL では `BIGINT DEFAULT 0` です)。 2. [[yii\db\ActiveRecord::optimisticLock()]] メソッドをオーバーライドして、このカラムの名前を返すようにします。 3. ユーザ入力を収集するウェブフォームに、更新されるレコードの現在のバージョン番号を保持する隠しフィールドを追加します。 バージョン属性が入力の検証規則を持っており、検証が成功することを確かめてください。 -4. アクティブレコードを使って行の更新を行うコントローラ・アクションにおいて、[[\yii\db\StaleObjectException]] 例外を捕捉して、衝突を解決するために必要なビジネス・ロジック (例えば、変更をマージしたり、データの陳腐化を知らせたり) を実装します。 +4. アクティブ・レコードを使って行の更新を行うコントローラ・アクションにおいて、[[\yii\db\StaleObjectException]] 例外を捕捉して、衝突を解決するために必要なビジネス・ロジック (例えば、変更をマージしたり、データの陳腐化を知らせたり) を実装します。 例えば、バージョン番号のカラムが `version` と名付けられているとすると、次のようなコードによって楽観的ロックを実装することが出来ます。 @@ -739,15 +739,15 @@ public function actionUpdate($id) ## リレーショナル・データを扱う -個々のデータベース・テーブルを扱うだけでなく、アクティブレコードは関連したテーブルのデータも一緒に読み出して、主たるデータを通して簡単にアクセス出来るようにすることが出来ます。 +個々のデータベース・テーブルを扱うだけでなく、アクティブ・レコードは関連したテーブルのデータも一緒に読み出して、主たるデータを通して簡単にアクセス出来るようにすることが出来ます。 例えば、一人の顧客は一つまたは複数の注文を発することがあり得ますので、顧客のデータは注文のデータと関連を持っていることになります。 このリレーションが適切に宣言されていれば、`$customer->orders` という式を使って顧客の注文情報にアクセスすることが出来ます。 -`$customer->orders` は、顧客の注文情報を `Order` アクティブレコード・インスタンスの配列として返してくれます。 +`$customer->orders` は、顧客の注文情報を `Order` アクティブ・レコード・インスタンスの配列として返してくれます。 ### リレーションを宣言する -アクティブレコードを使ってリレーショナル・データを扱うためには、最初に、アクティブレコード・クラスの中でリレーションを宣言する必要があります。 +アクティブ・レコードを使ってリレーショナル・データを扱うためには、最初に、アクティブ・レコード・クラスの中でリレーションを宣言する必要があります。 これは、以下のように、関心のあるそれぞれのリレーションについて *リレーション・メソッド* を宣言するだけの簡単な作業です。 ```php @@ -782,11 +782,11 @@ class Order extends ActiveRecord - リレーションの多重性: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]] のどちらかを呼ぶことによって指定されます。 上記の例では、リレーションの宣言において、顧客は複数の注文を持ち得るが、一方、注文は一人の顧客しか持たない、ということが容易に読み取れます。 -- 関連するアクティブレコード・クラスの名前: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]] の最初のパラメータとして指定されます。 +- 関連するアクティブ・レコード・クラスの名前: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]] の最初のパラメータとして指定されます。 クラス名を取得するのに `Xyz::className()` を呼ぶのが推奨されるプラクティスです。 そうすれば、IDE の自動補完のサポートを得ることことが出来るだけでなく、コンパイル段階でエラーを検出することが出来ます。 - 二つのデータタイプ間のリンク: 二つのデータタイプの関連付けに用いられるカラムを指定します。 - 配列の値は主たるデータ (リレーションを宣言しているアクティブレコード・クラスによって表されるデータ) のカラムであり、配列のキーは関連するデータのカラムです。 + 配列の値は主たるデータ (リレーションを宣言しているアクティブ・レコード・クラスによって表されるデータ) のカラムであり、配列のキーは関連するデータのカラムです。 ### リレーショナル・データにアクセスする @@ -808,8 +808,8 @@ $orders = $customer->orders; > Info: `xyz` という名前のリレーションを getter メソッド `getXyz()` によって宣言すると、`xyz` を [オブジェクト・プロパティ](concept-properties.md) のようにアクセスすることが出来るようになります。 名前は大文字と小文字を区別することに注意してください。 -リレーションが [[yii\db\ActiveRecord::hasMany()|hasMany()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブレコード・インスタンスの配列が返されます。 -リレーションが [[yii\db\ActiveRecord::hasOne()|hasOne()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブレコード・インスタンスか、関連付けられたデータが見つからないときは `null` が返されます。 +リレーションが [[yii\db\ActiveRecord::hasMany()|hasMany()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブ・レコード・インスタンスの配列が返されます。 +リレーションが [[yii\db\ActiveRecord::hasOne()|hasOne()]] によって宣言されている場合は、このリレーション・プロパティにアクセスすると、関連付けられたアクティブ・レコード・インスタンスか、関連付けられたデータが見つからないときは `null` が返されます。 リレーション・プロパティに最初にアクセスしたときは、上記の例で示されているように、SQL 文が実行されます。 その同じプロパティに再びアクセスしたときは、SQL 文を再実行することなく、以前の結果が返されます。 @@ -960,7 +960,7 @@ class Customer extends ActiveRecord ### レイジー・ローディングとイーガー・ローディング -[リレーショナル・データにアクセスする](#accessing-relational-data) において、通常のオブジェクト・プロパティにアクセスするのと同じようにして、アクティブレコード・インスタンスのリレーション・プロパティにアクセスすることが出来ることを説明しました。 +[リレーショナル・データにアクセスする](#accessing-relational-data) において、通常のオブジェクト・プロパティにアクセスするのと同じようにして、アクティブ・レコード・インスタンスのリレーション・プロパティにアクセスすることが出来ることを説明しました。 SQL 文は、リレーション・プロパティに最初にアクセスするときにだけ実行されます。 このようなリレーショナル・データのアクセス方法を *レイジー・ローディング* と呼びます。 例えば、 @@ -977,7 +977,7 @@ $orders2 = $customer->orders; ``` レイジー・ローディングは非常に使い勝手が良いものです。 -しかし、複数のアクティブレコード・インスタンスの同じリレーション・プロパティにアクセスする必要がある場合は、パフォーマンスの問題を生じ得ます。 +しかし、複数のアクティブ・レコード・インスタンスの同じリレーション・プロパティにアクセスする必要がある場合は、パフォーマンスの問題を生じ得ます。 次のコードサンプルを考えて見てください。実行される SQL 文の数はいくらになるでしょう? ```php @@ -1009,12 +1009,12 @@ foreach ($customers as $customer) { } ``` -[[yii\db\ActiveQuery::with()]] を呼ぶことによって、最初の 100 人の顧客の注文をたった一つの SQL 文で返すように、アクティブレコードに指示をしています。 +[[yii\db\ActiveQuery::with()]] を呼ぶことによって、最初の 100 人の顧客の注文をたった一つの SQL 文で返すように、アクティブ・レコードに指示をしています。 結果として、実行される SQL 文の数は 101 から 2 に減ります。 イーガー・ローディングは、一つだけでなく、複数のリレーションに対しても使うことが出来ます。 さらには、*ネストされたリレーション* でさえ、イーガー・ロードすることが出来ます。 -ネストされたリレーションというのは、関連するアクティブレコードの中で宣言されているリレーションです。 +ネストされたリレーションというのは、関連するアクティブ・レコードの中で宣言されているリレーションです。 例えば、`Cutomer` が `orders` リレーションによって `Order` と関連しており、`Order` が `items` リレーションによって `Item` と関連している場合です。 `Customer` に対するクエリを実行するときに、ネストされたリレーションの記法である `orders.items` を使って、`items` をイーガー・ロードすることが出来ます。 @@ -1196,7 +1196,7 @@ $query->joinWith(['orders o' => function($q) { ### 逆リレーション -リレーションの宣言は、たいていの場合、二つのアクティブレコード・クラスの間で相互的なものになります。 +リレーションの宣言は、たいていの場合、二つのアクティブ・レコード・クラスの間で相互的なものになります。 例えば、`Customer` は `orders` リレーションによって `Order` に関連付けられ、逆に、`Order` は`customer` リレーションによって `Customer` に関連付けられる、という具合です。 ```php @@ -1263,7 +1263,7 @@ echo $customer2 === $customer ? '同じ' : '異なる'; リレーショナル・データを扱う時には、たいてい、さまざまなデータ間にリレーションを確立したり、既存のリレーションを破棄したりする必要があります。 そのためには、リレーションを定義するカラムの値を適切に設定することが必要です。 -アクティブレコードを使う場合は、結局の所、次のようなコードを書くことになるでしょう。 +アクティブ・レコードを使う場合は、結局の所、次のようなコードを書くことになるでしょう。 ```php $customer = Customer::findOne(123); @@ -1276,7 +1276,7 @@ $order->customer_id = $customer->id; $order->save(); ``` -アクティブレコードは、この仕事をもっと楽に達成することが出来るように、[[yii\db\ActiveRecord::link()|link()]] メソッドを提供しています。 +アクティブ・レコードは、この仕事をもっと楽に達成することが出来るように、[[yii\db\ActiveRecord::link()|link()]] メソッドを提供しています。 ```php $customer = Customer::findOne(123); @@ -1287,11 +1287,11 @@ $order->subtotal = 100; $order->link('customer', $customer); ``` -[[yii\db\ActiveRecord::link()|link()]] メソッドは、リレーション名と、リレーションを確立する対象のアクティブレコード・インスタンスを指定することを要求します。 -このメソッドは、二つのアクティブレコード・インスタンスをリンクする属性の値を修正して、それをデータベースに書き込みます。 +[[yii\db\ActiveRecord::link()|link()]] メソッドは、リレーション名と、リレーションを確立する対象のアクティブ・レコード・インスタンスを指定することを要求します。 +このメソッドは、二つのアクティブ・レコード・インスタンスをリンクする属性の値を修正して、それをデータベースに書き込みます。 上記の例では、`Order` インスタンスの `customer_id` 属性を `Customer` インスタンスの `id` 属性の値になるようにセットして、それをデータベースに保存します。 -> Note: 二つの新規作成されたアクティブレコード・インスタンスをリンクすることは出来ません。 +> Note: 二つの新規作成されたアクティブ・レコード・インスタンスをリンクすることは出来ません。 [[yii\db\ActiveRecord::link()|link()]] を使用することの利点は、リレーションが [中間テーブル](#junction-table) によって定義されている場合に、さらに明白になります。 例えば、一つの `Order` インスタンスと一つの`Item` インスタンスをリンクするのに、次のコードを使うことが出来ます。 @@ -1302,11 +1302,11 @@ $order->link('items', $item); 上記のコードによって、`order_item` 中間テーブルに、注文と商品を関連付けるための行が自動的に挿入されます。 -> Info: [[yii\db\ActiveRecord::link()|link()]] メソッドは、影響を受けるアクティブレコード・インスタンスを保存する際に、データ検証を実行しません。 +> Info: [[yii\db\ActiveRecord::link()|link()]] メソッドは、影響を受けるアクティブ・レコード・インスタンスを保存する際に、データ検証を実行しません。 このメソッドを呼ぶ前にすべての入力値を検証することはあなたの責任です。 [[yii\db\ActiveRecord::link()|link()]] の逆の操作が [[yii\db\ActiveRecord::unlink()|unlink()]] です。 -これは、既存の二つのアクティブレコード・インスタンスのリレーションを破棄します。 +これは、既存の二つのアクティブ・レコード・インスタンスのリレーションを破棄します。 例えば、 ```php @@ -1322,7 +1322,7 @@ $customer->unlink('orders', $customer->orders[0]); ## DBMS 間のリレーション -アクティブレコードは、異なるデータベースをバックエンドに持つアクティブレコードの間でリレーションを宣言することを可能にしています。 +アクティブ・レコードは、異なるデータベースをバックエンドに持つアクティブ・レコードの間でリレーションを宣言することを可能にしています。 データベースは異なるタイプ (例えば、MySQL と PostgreSQL、または、MS SQL と MongoDB) であってもよく、別のサーバで動作していても構いません。 同じ構文を使ってリレーショナル・クエリを実行することが出来ます。 例えば、 @@ -1370,8 +1370,8 @@ $customers = Customer::find()->with('comments')->all(); ## クエリ・クラスをカスタマイズする -デフォルトでは、全てのアクティブレコードのクエリは [[yii\db\ActiveQuery]] によってサポートされます。 -カスタマイズされたクエリ・クラスをアクティブレコードで使用するためには、[[yii\db\ActiveRecord::find()]] メソッドをオーバーライドして、カスタマイズされたクエリ・クラスのインスタンスを返すようにしなければなりません。 +デフォルトでは、全てのアクティブ・レコードのクエリは [[yii\db\ActiveQuery]] によってサポートされます。 +カスタマイズされたクエリ・クラスをアクティブ・レコードで使用するためには、[[yii\db\ActiveRecord::find()]] メソッドをオーバーライドして、カスタマイズされたクエリ・クラスのインスタンスを返すようにしなければなりません。 例えば、 ```php @@ -1431,7 +1431,7 @@ $inactiveComments = Comment::find()->active(false)->all(); ``` -> Tip: 大きなプロジェクトでは、アクティブレコード・クラスをクリーンに保つことが出来るように、クエリ関連のコードのほとんどをカスタマイズされたクエリ・クラスに保持することが推奨されます。 +> Tip: 大きなプロジェクトでは、アクティブ・レコード・クラスをクリーンに保つことが出来るように、クエリ関連のコードのほとんどをカスタマイズされたクエリ・クラスに保持することが推奨されます。 この新しいクエリ構築メソッドは、`Comment` に関するリレーションを定義するときや、リレーショナル・クエリを実行するときにも使用することが出来ます。 @@ -1469,15 +1469,15 @@ $customers = Customer::find()->with([ ## 追加のフィールドを選択する -アクティブレコードのインスタンスにクエリ結果からデータが投入されるときは、受け取ったデータセットのカラムの値が対応する属性に入れられます。 +アクティブ・レコードのインスタンスにクエリ結果からデータが投入されるときは、受け取ったデータセットのカラムの値が対応する属性に入れられます。 -クエリ結果から追加のカラムや値を取得して、アクティブレコードの内部に格納することが出来ます。 +クエリ結果から追加のカラムや値を取得して、アクティブ・レコードの内部に格納することが出来ます。 例えば、ホテルの客室の情報を含む `room` という名前のテーブルがあるとしましょう。 そして、全ての客室のデータは `length` (長さ)、`width` (幅)、`height` (高さ) というフィールドを使って、部屋の幾何学的なサイズに関する情報を格納しているとします。 空いている全ての部屋の一覧を容積の降順で取得する必要がある場合を考えて見てください。 レコードをその値で並べ替える必要があるので、PHP を使って容積を計算することは出来ません。 しかし、同時に、一覧には `volume` (容積) も表示したいでしょう。 -目的を達するためには、`Room` アクティブレコード・クラスにおいて追加のフィールドを宣言し、`volume` の値を格納する必要があります。 +目的を達するためには、`Room` アクティブ・レコード・クラスにおいて追加のフィールドを宣言し、`volume` の値を格納する必要があります。 ```php class Room extends \yii\db\ActiveRecord diff --git a/docs/guide-ja/db-dao.md b/docs/guide-ja/db-dao.md index 7121857476f..0208a065697 100644 --- a/docs/guide-ja/db-dao.md +++ b/docs/guide-ja/db-dao.md @@ -2,7 +2,7 @@ ==================================== [PDO](http://www.php.net/manual/ja/book.pdo.php) の上に構築された Yii DAO (データベース・アクセス・オブジェクト) は、リレーショナル・データベースにアクセスするためのオブジェクト指向 API を提供するものです。 -これは、データベースにアクセスする他のもっと高度な方法、例えば [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) の基礎でもあります。 +これは、データベースにアクセスする他のもっと高度な方法、例えば [クエリ・ビルダ](db-query-builder.md) や [アクティブ・レコード](db-active-record.md) の基礎でもあります。 Yii DAO を使うときは、主として素の SQL と PHP 配列を扱う必要があります。 結果として、Yii DAO はデータベースにアクセスする方法としては最も効率的なものになります。 @@ -202,7 +202,7 @@ $post2 = $command->queryOne(); このやり方でクエリを実行すると、パラメータの値が違うごとに新しいクエリを実行するのに比べて、はるかに効率を良くすることが出来ます。 > Info: パラメータ・バインディングは、素の SQL を含む文字列に値を挿入しなければならない場所でのみ使用されます。 -> [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) のような高レベルの抽象的レイヤーでは、 +> [クエリ・ビルダ](db-query-builder.md) や [アクティブ・レコード](db-active-record.md) のような高レベルの抽象的レイヤーでは、 > 多くの場所で SQL に変換される値の配列を指定する場合がよくあります。 > これらの場所では Yii によってパラメータ・バインディングが内部的に実行されますので、 > パラメータを手動で指定する必要はありません。 @@ -654,4 +654,4 @@ $table = Yii::$app->db->getTableSchema('post'); ``` このメソッドは、テーブルのカラム、プライマリ・キー、外部キーなどの情報を含む [[yii\db\TableSchema]] オブジェクトを返します。 -これらの情報は、主として [クエリ・ビルダ](db-query-builder.md) や [アクティブレコード](db-active-record.md) によって利用されて、特定のデータベースに依存しないコードを書くことを助けてくれています。 +これらの情報は、主として [クエリ・ビルダ](db-query-builder.md) や [アクティブ・レコード](db-active-record.md) によって利用されて、特定のデータベースに依存しないコードを書くことを助けてくれています。 diff --git a/docs/guide-ja/db-migrations.md b/docs/guide-ja/db-migrations.md index 00fc2591d05..a09eb23c783 100644 --- a/docs/guide-ja/db-migrations.md +++ b/docs/guide-ja/db-migrations.md @@ -691,11 +691,11 @@ class m150101_185401_create_news_table extends Migration これは、通常、データベースからのデータ取得については、メッセージを追加して表示する必要がないからです。 更にまた、複雑なクエリを構築して実行するためには、強力な [クエリ・ビルダ](db-query-builder.md) を使うことが出来るからです。 -> Note: マイグレーションを使ってデータを操作する場合に、あなたは、あなたの [アクティブレコード](db-active-record.md) クラスをデータ操作に使えば便利じゃないか、と気付くかもしれません。 -> なぜなら、いくつかのロジックは既にアクティブレコードで実装済みだから、と。 +> Note: マイグレーションを使ってデータを操作する場合に、あなたは、あなたの [アクティブ・レコード](db-active-record.md) クラスをデータ操作に使えば便利じゃないか、と気付くかもしれません。 +> なぜなら、いくつかのロジックは既にアクティブ・レコードで実装済みだから、と。 > しかしながら、マイグレーションの中で書かれるコードが永久に不変であることを本質とするのと対照的に、アプリケーションのロジックは変化にさらされるものであるということを心に留めなければなりません。 -> 従って、マイグレーションのコードでアクティブレコードを使用していると、アクティブレコードのレイヤにおけるロジックの変更が思いがけず既存のマイグレーションを破壊することがあり得ます。 -> このような理由のため、マイグレーションのコードはアクティブレコードのようなアプリケーションの他のロジックから独立を保つべきです。 +> 従って、マイグレーションのコードでアクティブ・レコードを使用していると、アクティブ・レコードのレイヤにおけるロジックの変更が思いがけず既存のマイグレーションを破壊することがあり得ます。 +> このような理由のため、マイグレーションのコードはアクティブ・レコードのようなアプリケーションの他のロジックから独立を保つべきです。 ## マイグレーションを適用する diff --git a/docs/guide-ja/helper-array.md b/docs/guide-ja/helper-array.md index 886c1c32383..d606c4c4f71 100644 --- a/docs/guide-ja/helper-array.md +++ b/docs/guide-ja/helper-array.md @@ -419,7 +419,7 @@ $result = ArrayHelper::merge($array1, $array2); ## オブジェクトを配列に変換する オブジェクトまたはオブジェクトの配列を配列に変換する必要があることがよくあります。 -最もよくあるのは、REST API によってデータ配列を提供するなどの目的で、アクティブレコード・モデルを変換する場合です。 +最もよくあるのは、REST API によってデータ配列を提供するなどの目的で、アクティブ・レコード・モデルを変換する場合です。 そうするために、次のコードを使うことが出来ます。 ```php diff --git a/docs/guide-ja/input-forms.md b/docs/guide-ja/input-forms.md index 5316c32aa6d..6c15f59d3d6 100644 --- a/docs/guide-ja/input-forms.md +++ b/docs/guide-ja/input-forms.md @@ -1,7 +1,7 @@ フォームを作成する ================== -アクティブレコードに基づくフォーム : ActiveForm +アクティブ・レコードに基づくフォーム : ActiveForm ----------------------------------------------- Yii においてフォームを使用するときは、主として [[yii\widgets\ActiveForm]] による方法を使います。 フォームがモデルに基づくものである場合はこの方法を選ぶべきです。 @@ -10,7 +10,7 @@ Yii においてフォームを使用するときは、主として [[yii\widget フォームは、クライアント・サイドで表示されるものですが、たいていの場合、対応する [モデル](structure-models.md) を持ち、それを使ってサーバ・サイドでフォームの入力を検証します (入力の検証の詳細については、[入力を検証する](input-validation.md) のセクションを参照してください)。 モデルに基づくフォームを作成する場合、最初のステップは、モデルそのものを定義することです。 -モデルは、データベースの何らかのデータを表現するために [アクティブレコード](db-active-record.md) から派生させたクラスか、あるいは、任意の入力、例えばログイン・フォームの入力を保持するための ([[yii\base\Model]] から派生させた) 汎用的な Model クラスか、どちらかにすることが出来ます。 +モデルは、データベースの何らかのデータを表現するために [アクティブ・レコード](db-active-record.md) から派生させたクラスか、あるいは、任意の入力、例えばログイン・フォームの入力を保持するための ([[yii\base\Model]] から派生させた) 汎用的な Model クラスか、どちらかにすることが出来ます。 > Tip: フォームのフィールドがデータベースのカラムと異なっていたり、そのフォーム特有のフォーマット形式やロジックがあったりする場合は、 > [[yii\base\Model]] を拡張した独自のモデルを作るほうを選んで下さい。 diff --git a/docs/guide-ja/input-tabular-input.md b/docs/guide-ja/input-tabular-input.md index 0628353dd74..37217c9552c 100644 --- a/docs/guide-ja/input-tabular-input.md +++ b/docs/guide-ja/input-tabular-input.md @@ -2,7 +2,7 @@ ================================== 時として、一つのフォームで同じ種類の複数のモデルを扱わなければならないことがあります。 -例えば、それぞれが「名前-値」の形で保存され、`Setting` [アクティブレコード](db-active-record.md) モデルとして表される複数の設定項目を扱うフォームです。 +例えば、それぞれが「名前-値」の形で保存され、`Setting` [アクティブ・レコード](db-active-record.md) モデルとして表される複数の設定項目を扱うフォームです。 この種のフォームは「表形式インプット」と呼ばれることもよくあります。 これとは対照的な、異なる種類のさまざまなモデルを扱うことについては、[複数のモデルを持つ複雑なフォーム](input-multiple-models.md) のセクションで扱います。 diff --git a/docs/guide-ja/intro-upgrade-from-v1.md b/docs/guide-ja/intro-upgrade-from-v1.md index 91df3f84be3..acece2f6654 100644 --- a/docs/guide-ja/intro-upgrade-from-v1.md +++ b/docs/guide-ja/intro-upgrade-from-v1.md @@ -5,9 +5,9 @@ Yii フレームワークは 2.0 のために完全に書き直されたため 結果として、バージョン 1.1 からのアップグレードは、マイナー・バージョン間でのアップグレードのような些細な仕事ではなくなりました。 このセクションでは、二つのバージョン間の主要な違いを説明します。 -もし以前に Yii 1.1 を使ったことがなければ、あなたはこのセクションを飛ばして直接に "[始めよう](start-installation.md)" に進んでも、問題はありません。 +もしあなたが以前に Yii 1.1 を使ったことがなければ、このガイドを飛ばして直接に "[始めよう](start-installation.md)" に進んでも、問題はありません。 -Yii 2.0 は、この要約でカバーされているよりも多くの新機能を導入していることに注意してください。 +Yii 2.0 はこの要約でカバーされているよりも多くの新機能を導入していることに注意してください。 決定版ガイド全体を通読して全ての新機能について学習することを強く推奨します。 おそらく、以前は自分自身で開発する必要があったいくつかの機能が、今ではコア・コードの一部になっていることに気付くでしょう。 @@ -37,14 +37,15 @@ Yii 2.0 は PHP 5.4 以上を必要とします。PHP 5.4 は、Yii 1.1 によ - [遅延静的束縛(Late Static Bindings)](http://php.net/manual/ja/language.oop5.late-static-bindings.php)。 - [日付と時刻](http://php.net/manual/ja/book.datetime.php)。 - [トレイト](http://php.net/manual/ja/language.oop5.traits.php)。 -- [国際化(intl)](http://php.net/manual/ja/book.intl.php)。Yii 2.0 は国際化の機能をサポートするために `intl` PHP 拡張を利用しています。 +- [国際化(intl)](http://php.net/manual/ja/book.intl.php)。 + Yii 2.0 は国際化の機能をサポートするために `intl` PHP 拡張を利用しています。 名前空間 -------- Yii 2.0 での最も顕著な変更は名前空間の使用です。 -ほとんど全てのコアクラスが、例えば、`yii\web\Request` のように名前空間に属します。 +ほとんど全てのコア・クラスが、例えば、`yii\web\Request` のように名前空間に属します。 クラス名に "C" の接頭辞はもう使われません。 命名のスキームはディレクトリ構造に従うようになりました。 例えば、`yii\web\Request` は、対応するクラス・ファイルが Yii フレームワーク・フォルダの下の `web/Request.php` であることを示します。 @@ -57,17 +58,20 @@ Yii 2.0 での最も顕著な変更は名前空間の使用です。 Yii 2.0 は、1.1 の `CComponent` クラスを二つのクラス、すなわち、[[yii\base\BaseObject]] と [[yii\base\Component]] に分割しました。 [[yii\base\BaseObject|BaseObject]] クラスは、ゲッターとセッターを通じて [オブジェクト・プロパティ](concept-properties.md) を定義することを可能にする、軽量な基底クラスです。 -[[yii\base\Component|Component]] クラスは [[yii\base\BaseObject|BaseObject]] からの拡張であり、[イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートします。 +[[yii\base\Component|Component]] クラスは [[yii\base\BaseObject|BaseObject]] からの拡張であり、 +[イベント](concept-events.md) と [ビヘイビア](concept-behaviors.md) をサポートします。 -あなたのクラスがイベントやビヘイビアの機能を必要としない場合は、[[yii\base\BaseObject|BaseObject]] を基底クラスとして使うことを考慮すべきです。 -通常は、基本的なデータ構造を表すクラスに対して、このことが当てはまります。 +あなたのクラスがイベントやビヘイビアの機能を必要としない場合は、[[yii\base\BaseObject|BaseObject]] +を基底クラスとして使うことを考慮すべきです。 +基本的なデータ構造を表すクラスに対して、通常、このことが当てはまります。 オブジェクトの構成 ------------------ [[yii\base\BaseObject|BaseObject]] クラスはオブジェクトを構成するための統一された方法を導入しています。 -[[yii\base\BaseObject|BaseObject]] の全ての派生クラスは、コンストラクタが必要な場合には、インスタンスが正しく構成されるように、コンストラクタを以下のようにして宣言しなければなりません。 +[[yii\base\BaseObject|BaseObject]] の全ての派生クラスは、コンストラクタが必要な場合には、インスタンスが正しく構成されるように、 +コンストラクタを以下のようにして宣言しなければなりません。 ```php class MyClass extends \yii\base\BaseObject @@ -89,10 +93,12 @@ class MyClass extends \yii\base\BaseObject ``` 上記のように、コンストラクタは最後のパラメータとして構成情報の配列を取らなければなりません。 -構成情報の配列に含まれる「名前-値」のペアが、コンストラクタの最後でプロパティを構成します。 -[[yii\base\BaseObject::init()|init()]] メソッドをオーバーライドして、構成情報が適用された後に行うべき初期化処理を行うことが出来ます。 +構成情報の配列に含まれる「名前・値」のペアが、コンストラクタの最後でプロパティを構成します。 +[[yii\base\BaseObject::init()|init()]] メソッドをオーバーライドして、 +構成情報が適用された後に行うべき初期化処理を行うことが出来ます。 -この規約に従うことによって、新しいオブジェクトを生成して構成するときに、構成情報配列を使うことが出来るようになります。 +この規約に従うことによって、構成情報配列を使って新しいオブジェクトを生成して構成することが +出来るようになります。 ```php $object = Yii::createObject([ @@ -108,8 +114,7 @@ $object = Yii::createObject([ イベント -------- -Yii 1 では、イベントは `on` メソッド (例えば、`onBeforeSave`) を定義することによって作成されました。 -Yii 2 では、どのようなイベント名でも使うことが出来るようになりました。 +Yii 1 では、イベントは `on` メソッド (例えば、`onBeforeSave`) を定義することによって作成されました。Yii 2 では、どのようなイベント名でも使うことが出来るようになりました。 [[yii\base\Component::trigger()|trigger()]] メソッドを呼んでイベントを発生させます。 ```php @@ -141,7 +146,7 @@ Yii 2.0 は、パス・エイリアスの使用を、ファイル/ディレク ルートの名前空間に対しては、それぞれ、パス・エイリアスを定義することが推奨されます。 そうすれば、余計な構成をしなくても、Yii のクラス・オートローダを使うことが出来るようになります。 例えば、`@yii` が Yii のインストール・ディレクトリを指しているので、`yii\web\Request` というようなクラスをオートロードすることが出来る訳です。 -サードパーティのライブラリ、例えば Zend フレームワークなどを使う場合にも、そのフレームワークのインストール・ディレクトリを指す `@Zend` というパス・エイリアスを定義することが出来ます。 +サード・パーティのライブラリ、例えば Zend フレームワークなどを使う場合にも、そのフレームワークのインストール・ディレクトリを指す `@Zend` というパス・エイリアスを定義することが出来ます。 一旦そうしてしまえば、その Zend フレームワークのライブラリ内のどんなクラスでも、Yii からオートロードすることが出来るようになります。 パス・エイリアスに関する詳細は [エイリアス](concept-aliases.md) のセクションを参照してください。 @@ -151,14 +156,12 @@ Yii 2.0 は、パス・エイリアスの使用を、ファイル/ディレク ------ Yii 2 のビューについての最も顕著な変更は、ビューの中の `$this` という特殊な変数が現在のコントローラやウィジェットを指すものではなくなった、ということです。 -今や `$this` は 2.0 で新しく導入された概念である *ビュー* オブジェクトを指します。 +今や `$this` は 2.0 で新しく導入された概念である *ビュー*・オブジェクトを指します。 *ビュー*・オブジェクトは [[yii\web\View]] という型であり、MVC パターンのビューの部分を表すものです。 ビューにおいてコントローラやウィジェットにアクセスしたい場合は、`$this->context` を使うことが出来ます。 -パーシャル・ビューを別のビューの中でレンダリングするためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。 -さらに、`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。 -と言うのは、`render()` メソッドは、レンダリング結果を返すものであり、それを直接に表示するものではないからです。 -例えば、 +パーシャル・ビューを別のビューの中でレンダリングするためには、`$this->renderPartial()` ではなく、`$this->render()` を使います。さらに、`render` の呼び出しは、2.0 では明示的に echo しなくてはなりません。 +と言うのは、`render()` メソッドは、レンダリング結果を返すものであり、それを直接に表示するものではないからです。例えば、 ```php echo $this->render('_item', ['item' => $item]); @@ -166,20 +169,19 @@ echo $this->render('_item', ['item' => $item]); PHP を主たるテンプレート言語として使う以外に、Yii 2.0 は人気のある二つのテンプレート・エンジン、Smarty と Twig に対する正式なサポートを備えています。 Prado テンプレート・エンジンはもはやサポートされていません。 -これらのテンプレート・エンジンを使うためには、[[yii\base\View::$renderers|View::$renderers]] プロパティをセットして、`view` アプリケーション・コンポーネントを構成する必要があります。 +これらのテンプレート・エンジンを使うためには、`view` アプリケーション・コンポーネントを構成して +[[yii\base\View::$renderers|View::$renderers]] プロパティをセットする必要があります。 詳細は [テンプレート・エンジン](tutorial-template-engines.md) のセクションを参照してください。 モデル ------ -Yii 2.0 は [[yii\base\Model]] を 1.1 における `CModel` と同様な基底モデルとして使います。 -`CFormModel` というクラスは完全に廃止されました。 -Yii 2 では、それの代りに [[yii\base\Model]] を拡張して、フォームのモデル・クラスを作成すべきです。 +Yii 2.0 は 1.1 における `CModel` と同様な [[yii\base\Model]] を基底モデルとして使います。`CFormModel` というクラスは完全に廃止されました。 +Yii 2 では、それの代りに [[yii\base\Model]] を拡張して、フォームのモデル・クラスを作成しなければなりません。 Yii 2.0 は サポートされるシナリオを宣言するための [[yii\base\Model::scenarios()|scenarios()]] という新しいメソッドを導入しました。 -このメソッドを使って、どのシナリオの下で、ある属性が検証される必要があるか、また、安全とみなされるか否か、などを宣言することが出来ます。 -例えば、 +このメソッドを使って、どのシナリオの下で、ある属性が検証される必要があるか、また、安全とみなされるか否か、などを宣言します。例えば、 ```php public function scenarios() @@ -193,13 +195,13 @@ public function scenarios() 上記では二つのシナリオ、すなわち、`backend` と `frontend` が宣言されています。 `backend` シナリオでは、`email` と `role` の属性が両方とも安全であり、一括代入が可能です。 -`frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。 -`email` と `role` は、両方とも、規則を使って検証されなければなりません。 +`frontend` シナリオでは、`email` は一括代入が可能ですが、`role` は不可能です。`email` と `role` は、両方とも、規則を使って検証されなければなりません。 [[yii\base\Model::rules()|rules()]] メソッドが、Yii 1.1 に引き続き、検証規則を宣言するために使われます。 [[yii\base\Model::scenarios()|scenarios()]] が導入されたことにより、`unsafe` バリデータが無くなったことに注意してください。 -ほとんどの場合、すなわち、[[yii\base\Model::rules()|rules()]] メソッドが存在しうるシナリオを完全に指定しており、そして `unsafe` な属性を宣言する必要が無いなら、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。 +ほとんどの場合、すなわち、[[yii\base\Model::rules()|rules()]] メソッドが存在しうるシナリオを完全に指定しており、 +そして `unsafe` な属性を宣言する必要が無い場合であれば、[[yii\base\Model::scenarios()|scenarios()]] をオーバーライドする必要はありません。 モデルについての詳細を学習するためには、[モデル](structure-models.md) のセクションを参照してください。 @@ -207,11 +209,11 @@ public function scenarios() コントローラ ------------ -Yii 2.0 は [[yii\web\Controller]] を基底のコントローラ・クラスとして使います。 -これは Yii 1.1 における`CController` と同様なクラスです。 +Yii 2.0 は [[yii\web\Controller]] を基底のコントローラ・クラスとして使います。これは Yii 1.1 における`CController` と同様なクラスです。 [[yii\base\Action]] がアクション・クラスの基底クラスです。 -コントローラに関して、あなたのコードに最も顕著な影響を及ぼす変更点は、コントローラのアクションは表示したいコンテントを、エコーするのでなく、返さなければならなくなった、ということです。 +コントローラに関して、あなたのコードに最も顕著な影響を及ぼす変更点は、 +コントローラのアクションは表示したいコンテントを、エコーするのでなく、返さなければならなくなった、ということです。 ```php public function actionView($id) @@ -234,7 +236,8 @@ public function actionView($id) Yii 2.0 は [[yii\base\Widget]] を基底のウィジェット・クラスとして使用します。これは Yii 1.1 の `CWidget` と同様なクラスです。 いろんな IDE においてフレームワークに対するより良いサポートを得るために、Yii 2.0 はウィジェットを使うための新しい構文を導入しました。 -スタティックなメソッド [[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、そして [[yii\base\Widget::widget()|widget()]] が導入されました。以下のようにして使います。 +スタティックなメソッド [[yii\base\Widget::begin()|begin()]]、[[yii\base\Widget::end()|end()]]、そして [[yii\base\Widget::widget()|widget()]] が導入されました。 +以下のようにして使います。 ```php use yii\widgets\Menu; @@ -258,7 +261,7 @@ ActiveForm::end(); テーマ ------ -テーマは 2.0 では完全に違う動作をします。 +テーマは 2.0 では完全に違う動き方をします。 テーマは、ソースのビュー・ファイル・パスをテーマのビュー・ファイル・パスにマップするパス・マッピング機構に基づくものになりました。 例えば、あるテーマのパス・マップが `['/web/views' => '/web/themes/basic']` である場合、ビュー・ファイル `/web/views/site/index.php` のテーマ版は `/web/themes/basic/site/index.php` になります。 この理由により、テーマはどのようなビュー・ファイルに対してでも適用することが出来るようになりました。 @@ -292,7 +295,8 @@ Yii 2.0 はコメント・ブロックからコマンドのヘルプ情報を自 Yii 2.0 は [PECL intl PHP モジュール](http://pecl.php.net/package/intl) に賛同して、内蔵の日付フォーマッタと数字フォーマッタの部品を取り除きました。 メッセージは `i18n` アプリケーション・コンポーネント経由で翻訳されるようになりました。 -このコンポーネントは一連のメッセージ・ソースを管理するもので、メッセージのカテゴリに基づいて異なるメッセージ・ソースを使うことを可能にするものです。 +このコンポーネントは一連のメッセージ・ソースを管理するもので、 +メッセージのカテゴリに基づいて異なるメッセージ・ソースを使うことを可能にするものです。 詳細については [国際化](tutorial-i18n.md) のセクションを参照してください。 @@ -300,10 +304,9 @@ Yii 2.0 は [PECL intl PHP モジュール](http://pecl.php.net/package/intl) アクション・フィルタ -------------------- -アクション・フィルタはビヘイビアによって実装されるようになりました。 -新しいカスタム・フィルタを定義するためには、[[yii\base\ActionFilter]] を拡張します。 +アクション・フィルタはビヘイビアによって実装されるようになりました。新しいカスタム・フィルタを定義するためには、[[yii\base\ActionFilter]] を拡張します。 フィルタを使うためには、そのフィルタ・クラスをビヘイビアとしてコントローラにアタッチします。 -例えば、[[yii\filters\AccessControl]] を使うためには、コントローラに次のコードを書くことになります。 +例えば、[[yii\filters\AccessControl]] フィルタを使うためには、コントローラに次のコードを書くことになります。 ```php public function behaviors() @@ -329,7 +332,8 @@ Yii 2.0 は、*アセット・バンドル* と呼ばれる新しい概念を導 アセット・バンドルは、あるディレクトリの下に集められた一群のアセット・ファイル (例えば、JavaScript ファイル、CSS ファイル、イメージ・ファイルなど) です。 それぞれのアセット・バンドルは [[yii\web\AssetBundle]] を拡張したクラスとして表わされます。 -アセット・バンドルを [[yii\web\AssetBundle::register()]] を通じて登録することによって、そのバンドルに含まれるアセットにウェブ経由でアクセスできるようになります。 +アセット・バンドルを [[yii\web\AssetBundle::register()]] を通じて登録することによって、 +そのバンドルに含まれるアセットにウェブ経由でアクセスできるようになります。 Yii 1 とは異なり、バンドルを登録したページは、そのバンドルで指定されている JavaScript と CSS ファイルへの参照を自動的に含むようになります。 詳細については [アセット](structure-assets.md) のセクションを参照してください。 @@ -346,8 +350,7 @@ Yii 2.0 はよく使われるスタティックなヘルパ・クラスを数多 * [[yii\helpers\FileHelper]] * [[yii\helpers\Json]] -詳細については、ヘルパの [概要](helper-overview.md) のセクションを参照してください。 - +詳細については、[ヘルパの概要](helper-overview.md) のセクションを参照してください。 フォーム -------- @@ -389,19 +392,18 @@ $sql = $command->sql; $rows = $command->queryAll(); ``` -何より良いのは、このようなクエリ構築メソッドが [アクティブレコード](db-active-record.md) を扱う時にも使える、ということです。 +何より良いのは、このようなクエリ構築メソッドが [アクティブ・レコード](db-active-record.md) を扱う時にも使える、ということです。 詳細については [クエリ・ビルダ](db-query-builder.md) のセクションを参照してください。 -アクティブレコード ------------------- +アクティブ・レコード +-------------------- -Yii 2.0 は [アクティブレコード](db-active-record.md) に数多くの変更を導入しました。 +Yii 2.0 は [アクティブ・レコード](db-active-record.md) に数多くの変更を導入しました。 最も顕著な違いは、クエリの構築方法とリレーショナル・クエリの処理の二つです。 -1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。 -このクラスは [[yii\db\Query]] を拡張したものであり、従って全てのクエリ構築メソッドを継承します。 +1.1 の `CDbCriteria` クラスは Yii 2 では [[yii\db\ActiveQuery]] に置き換えられました。このクラスは [[yii\db\Query]] を拡張したものであり、従って全てのクエリ構築メソッドを継承します。 以下のように、[[yii\db\ActiveRecord::find()]] を呼んでクエリの構築を開始します。 ```php @@ -413,8 +415,7 @@ $customers = Customer::find() ``` リレーションを宣言するために必要なことは、[[yii\db\ActiveQuery|ActiveQuery]] オブジェクトを返す getter メソッドを定義するだけのことです。 -getter によって定義されたプロパティの名前がリレーションの名前を表します。 -例えば、以下のコードは `orders` リレーションを宣言するものです +getter によって定義されたプロパティの名前がリレーションの名前を表します。例えば、以下のコードは `orders` リレーションを宣言するものです (1.1 では `relations()` という一個の中枢でリレーションを宣言しなければなりませんでした)。 ```php @@ -428,7 +429,7 @@ class Customer extends \yii\db\ActiveRecord ``` こうすることで、`$customer->orders` という構文によって関連テーブルにある顧客のオーダにアクセスすることが出来るようになります。 -また、下記のコードを用いて、カスタマイズしたクエリ条件によるオンザフライのリレーショナル・クエリを実行することも出来ます。 +また、下記のコードを用いて、カスタマイズしたクエリ条件によるリレーショナル・クエリをその場で実行することも出来ます。 ```php $orders = $customer->getOrders()->andWhere('status=1')->all(); @@ -439,8 +440,8 @@ $orders = $customer->getOrders()->andWhere('status=1')->all(); Yii 2.0 では、JOIN を使わずに二つの SQL 文が実行されます。 すなわち、第一の SQL 文が主たるレコードを返し、第二の SQL 文は主レコードのプライマリ・キーを使うフィルタリングによって関連レコードを返します。 -多数のレコードを返すクエリを構築するときは、[[yii\db\ActiveRecord|ActiveRecord]] を返す代りに、[[yii\db\ActiveQuery::asArray()|asArray()]] メソッドをチェインすることが出来ます。 -そうすると、クエリ結果は配列として返されることになり、レコードの数が多い場合は、必要な CPU 時間とメモリを著しく削減することが出来ます。 +多数のレコードを返すクエリを構築するときは、[[yii\db\ActiveRecord|ActiveRecord]] オブジェクトを返す代りに、[[yii\db\ActiveQuery::asArray()|asArray()]] メソッドをチェインすることが出来ます。 +そうすると、クエリ結果は配列として返されることになり、レコードの数が多い場合は、必要とされる CPU 時間とメモリを著しく削減することが出来ます。 例えば、 ```php @@ -448,7 +449,7 @@ $customers = Customer::find()->asArray()->all(); ``` もう一つの変更点は、属性のデフォルト値を public なプロパティによって定義することは出来なくなった、ということです。 -デフォルト値を定義する必要がある場合は、アクティブレコード・クラスの `init` メソッドの中で設定しなければなりません。 +デフォルト値を定義する必要がある場合は、アクティブ・レコード・クラスの `init` メソッドの中で設定しなければなりません。 ```php public function init() @@ -458,19 +459,18 @@ public function init() } ``` -1.1 では、アクティブレコード・クラスのコンストラクタをオーバーライドすることについて、いくつか問題がありました。 -バージョン 2.0 では、もう問題はありません。 +1.1 では、アクティブ・レコード・クラスのコンストラクタをオーバーライドすることについて、いくつか問題がありました。バージョン 2.0 では、もう問題はありません。 コンストラクタにパラメータを追加する場合は、[[yii\db\ActiveRecord::instantiate()]] をオーバーライドする必要があるかもしれないことに注意してください。 -アクティブレコードについては、他にも多くの変更と機能強化がなされています。 -詳細については [アクティブレコード](db-active-record.md) のセクションを参照してください。 +アクティブ・レコードについては、他にも多くの変更と機能強化がなされています。 +詳細については [アクティブ・レコード](db-active-record.md) のセクションを参照してください。 -アクティブレコードのビヘイビア ------------------------------- +アクティブ・レコードのビヘイビア +-------------------------------- -2.0 では基底のビヘイビア・クラス `CActiveRecordBehavior` が廃止されました。 -アクティブレコードのビヘイビアを作成したいときは、直接に `yii\base\Behavior` を拡張しなければなりません。 +2.0 では基底のビヘイビア・クラス `CActiveRecordBehavior` を廃止しました。 +アクティブ・レコードのビヘイビアを作成したいときは、直接に `yii\base\Behavior` を拡張しなければなりません。 ビヘイビア・クラスがオーナーの何らかのイベントに反応する必要がある場合は、以下のように `events()` メソッドをオーバーライドしなければなりません。 ```php @@ -502,10 +502,10 @@ User と IdentityInterface ------------------------- 1.1 の `CWebUser` クラスは [[yii\web\User]] に取って換られました。 -そして `CUserIdentity` クラスはもうありません。代りに、使い方がもっと単純な [[yii\web\IdentityInterface]] を実装すべきです。 +そして `CUserIdentity` クラスはもうありません。代りに、使い方がもっと単純な [[yii\web\IdentityInterface]] を実装しなければなりません。 アドバンスト・プロジェクト・テンプレートがそういう例を提供しています。 -詳細は [認証](security-authentication.md)、[権限付与](security-authorization.md)、そして [アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) のセクションを参照してください。 +詳細は [認証](security-authentication.md)、[権限付与](security-authorization.md)、そして [アドバンスト・プロジェクト・テンプレート](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) のセクションを参照してください。 URL 管理 @@ -526,7 +526,8 @@ Yii 2 の URL 管理は 1.1 のそれと似たようなものです。 詳細については [ルーティングと URL 生成](runtime-routing.md) のセクションを参照してください。 -ルートの命名規約における重要な変更は、コントローラとアクションのキャメルケースの名前が各単語をハイフンで分けた小文字の名前になるようになった、という点です。 +ルートの命名規約における重要な変更は、コントローラとアクションのキャメル・ケースの名前が +各単語をハイフンで分けた小文字の名前になるようになった、という点です。 例えば、`CamelCaseController` のコントローラ ID は `camel-case` となります。 詳細については、[コントローラ ID](structure-controllers.md#controller-ids) と [アクション ID](structure-controllers.md#action-ids) のセクションを参照してください。 diff --git a/docs/guide-ja/intro-yii.md b/docs/guide-ja/intro-yii.md index 73d0c1e117c..595093f2b70 100644 --- a/docs/guide-ja/intro-yii.md +++ b/docs/guide-ja/intro-yii.md @@ -11,7 +11,8 @@ Yii は何に適しているか Yii は汎用的なウェブ・プログラミング・フレームワークです。 つまり、あらゆる種類のウェブ・アプリケーションを PHP を使って開発するときに、Yii を使用することが出来ます。 -コンポーネント・ベースのアーキテクチャと洗練されたキャッシュ・サポートを持っているため、Yii は大規模なアプリケーション、たとえば、ポータル、フォーラム、コンテント・マネージメント・システム (CMS)、電子商取引プロジェクト、RESTful ウェブ・サービス、等々を開発するのに特に適しています。 +コンポーネント・ベースのアーキテクチャと洗練されたキャッシュ・サポートを有しているため、Yii は大規模なアプリケーション、 +たとえば、ポータル、フォーラム、コンテント・マネージメント・システム (CMS)、電子商取引プロジェクト、RESTful ウェブ・サービス、等々を開発するのに特に適しています。 Yii を他のフレームワークと比べると @@ -19,25 +20,28 @@ Yii を他のフレームワークと比べると あなたが既に他のフレームワークに親しんでいる場合は、Yii を比較するとどうなのかを知りたいでしょう。 -- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) アーキテクチャ・パターンを実装し、このパターンに基づいたコードの編成を推進しています。 +- ほとんどの PHP フレームワーク同様、Yii は MVC (Model-View-Controller) アーキテクチャ・パターンを実装し、 + このパターンに基づいたコードの編成を推進しています。 - Yii は、コードはシンプルかつエレガントに書かれるべきである、という哲学を採用しています。 - 何らかのデザイン・パターンの厳密な遵守を主な目的とする凝りすぎた設計を、Yii がしようと試みることは決してありません。 + 何らかのデザイン・パターンの厳密な遵守を主目的とする凝りすぎた設計は、Yii が決して試みようとしないものです。 - Yii はフル装備のフレームワークです。 - クエリ・ビルダ、リレーショナル・データベースと NoSQL データベースの双方のためのアクティブレコード、RESTful API 開発サポート、多層構成のキャッシュ・サポート、その他、検証済みで直ちに使える多数の機能を提供します。 + クエリ・ビルダ、リレーショナル・データベースと NoSQL データベース双方のためのアクティブ・レコード、RESTful API 開発サポート、多層構成のキャッシュ・サポート、 + 等々、検証済みで直ちに使える多数の機能を提供します。 - Yii は極めて拡張性の高いフレームワークです。あなたはコアのコードのほとんど全ての要素をカスタマイズしたり置き換えたりすることが出来ます。 また、Yii の堅固なエクステンション・アーキテクチャを利用して、再配布可能なエクステンションを使用したり開発したりすることも出来ます。 - 高性能であることは常に Yii の主たる目標です。 -Yii はワンマン・ショーではありません。Yii は [強力なコア開発チーム](http://www.yiiframework.com/team/) および Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。 +Yii はワンマン・ショーではありません。Yii は [強力なコア開発チーム](http://www.yiiframework.com/team/) および +Yii 開発に間断なく貢献してくれるプロフェッショナルの大きなコミュニティーに支えられたプロジェクトです。 Yii 開発チームは、最新のウェブ開発の潮流と、他のフレームワークやプロジェクトに見出される最善のプラクティスと機能を、注意深く見守り続けています。 -他のところで見出された最善のプラクティスと機能で最も適切なものは、定期的にコアフレームワークに組み込まれ、シンプルかつエレガントなインタフェイスを通じて公開されます。 +他のところで見出された最善のプラクティスと機能で最も適切なものは、定期的にコア・フレームワークに組み込まれ、 +シンプルかつエレガントなインタフェイスを通じて公開されます。 Yii のバージョン ---------------- -Yii は現在、利用可能な二つのメジャー・バージョン、すなわち 1.1 と 2.0 を持っています。 -バージョン 1.1 は古い世代のもので、現在はメンテナンス・モードにあります。 +Yii は現在、利用可能な二つのメジャー・バージョン、すなわち 1.1 と 2.0 を持っています。バージョン 1.1 は古い世代のもので、現在はメンテナンス・モードにあります。 バージョン 2.0 は、最新のテクノロジーとプロトコル、例えば、Composer、PSR、名前空間、トレイトなどを採用して、Yii を完全に書き直したものです。 バージョン 2.0 がこのフレームワークの現世代を表すものであり、今後数年間にわたって主要な開発努力の対象となるものです。 このガイドは主としてバージョン 2.0 について述べます。 diff --git a/docs/guide-ja/output-data-providers.md b/docs/guide-ja/output-data-providers.md index 758e13ae682..02fadc70313 100644 --- a/docs/guide-ja/output-data-providers.md +++ b/docs/guide-ja/output-data-providers.md @@ -9,7 +9,7 @@ Yii のリリースには次のデータ・プロバイダのクラスが含まれています。 -* [[yii\data\ActiveDataProvider]]: [[yii\db\Query]] または [[yii\db\ActiveQuery]] を使ってデータベースからデータを取得して、配列または [アクティブレコード](db-active-record.md) インスタンスの形式でデータを返します。 +* [[yii\data\ActiveDataProvider]]: [[yii\db\Query]] または [[yii\db\ActiveQuery]] を使ってデータベースからデータを取得して、配列または [アクティブ・レコード](db-active-record.md) インスタンスの形式でデータを返します。 * [[yii\data\SqlDataProvider]]: SQL 文を実行して、データベースのデータを配列として返します。 * [[yii\data\ArrayDataProvider]]: 大きな配列を受け取り、ページネーションと並べ替えの指定に基づいて、一部分を切り出して返します。 @@ -54,7 +54,7 @@ echo yii\grid\GridView::widget([ [[yii\data\ActiveDataProvider]] を使用するためには、その [[yii\data\ActiveDataProvider::query|query]] プロパティを構成しなければなりません。 これは、[[yii\db\Query]] または [[yii\db\ActiveQuery]] のオブジェクトを取ることが出来ます。 前者であれば、返されるデータは配列になります。 -後者であれば、返されるデータは配列または [アクティブレコード](db-active-record.md) インスタンスとすることが出来ます。 +後者であれば、返されるデータは配列または [アクティブ・レコード](db-active-record.md) インスタンスとすることが出来ます。 例えば、 ```php @@ -139,7 +139,7 @@ $models = $provider->getModels(); [[yii\data\ArrayDataProvider]] は、一つの大きな配列を扱う場合に最も適しています。 このデータ・プロバイダによって、一つまたは複数のカラムで並べ替えた配列データの 1 ページ分を返すことが出来ます。 [[yii\data\ArrayDataProvider]] を使用するためには、全体の大きな配列として [[yii\data\ArrayDataProvider::allModels|allModels]] プロパティを指定しなければなりません。 -この大きな配列の要素は、連想配列 (例えば [DAO](db-dao.md) のクエリ結果) またはオブジェクト (例えば [アクティブレコード](db-active-record.md) インスタンス) とすることが出来ます。 +この大きな配列の要素は、連想配列 (例えば [DAO](db-dao.md) のクエリ結果) またはオブジェクト (例えば [アクティブ・レコード](db-active-record.md) インスタンス) とすることが出来ます。 例えば、 ```php diff --git a/docs/guide-ja/output-data-widgets.md b/docs/guide-ja/output-data-widgets.md index 23f18700128..cfd868649bd 100644 --- a/docs/guide-ja/output-data-widgets.md +++ b/docs/guide-ja/output-data-widgets.md @@ -12,7 +12,7 @@ DetailView DetailView は単一のデータ [[yii\widgets\DetailView::$model|モデル]] の詳細を表示します。 モデルを標準的な書式で表示する場合 (例えば、全てのモデル属性をそれぞれテーブルの一行として表示する場合) に最も適しています。 -モデルは [[\yii\base\Model]] またはそのサブ・クラス、例えば [アクティブレコード](db-active-record.md) のインスタンスか、連想配列かのどちらかにすることが出来ます。 +モデルは [[\yii\base\Model]] またはそのサブ・クラス、例えば [アクティブ・レコード](db-active-record.md) のインスタンスか、連想配列かのどちらかにすることが出来ます。 DetailView は [[yii\widgets\DetailView::$attributes]] プロパティを使って、モデルのどの属性が表示されるべきか、また、どういうフォーマットで表示されるべきかを決定します。 利用できるフォーマットのオプションについては、[フォーマッタのセクション](output-formatting.md) を参照してください。 @@ -360,7 +360,7 @@ echo GridView::widget([ データをフィルタリングするためには、GridView は検索基準を表す [モデル](structure-models.md) を必要とします。 検索基準は、通常は、グリッドビューのテーブルのフィルタのフィールドから取得されます。 -[アクティブレコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデル・クラスを作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。 +[アクティブ・レコード](db-active-record.md) を使用している場合は、必要な機能を提供する検索用のモデル・クラスを作成するのが一般的なプラクティスです (あなたに代って [Gii](start-gii.md) が生成してくれます)。 このクラスが、グリッドビューのテーブルに表示されるフィルタ・コントロールのための検証規則を定義し、 検索基準に従って修正されたクエリを持つデータ・プロバイダを返す `search()` メソッドを提供します。 @@ -527,7 +527,7 @@ $query->andFilterWhere(['>=', 'creation_date', $this->createdFrom]) ### モデルのリレーションを扱う -GridView でアクティブレコードを表示するときに、リレーションのカラムの値、例えば、単に投稿者の `id` というのではなく、投稿者の名前を表示するという場合に遭遇するかも知れません。 +GridView でアクティブ・レコードを表示するときに、リレーションのカラムの値、例えば、単に投稿者の `id` というのではなく、投稿者の名前を表示するという場合に遭遇するかも知れません。 `Post` モデルが `author` という名前のリレーションを持っていて、その投稿者のモデルが `name` という属性を持っているなら、[[yii\grid\GridView::$columns]] の属性名を `author.name` と定義します。 そうすれば、GridView が投稿者の名前を表示するようになります。 ただし、並べ替えとフィルタリングは、デフォルトでは有効になりません。 @@ -611,7 +611,7 @@ $query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name' > $dataProvider->sort->defaultOrder = ['author.name' => SORT_ASC]; > ``` -> Info: `joinWith` およびバックグラウンドで実行されるクエリの詳細については、[アクティブレコード - リレーションを使ってテーブルを結合する](db-active-record.md#joining-with-relations) を参照してください。 +> Info: `joinWith` およびバックグラウンドで実行されるクエリの詳細については、[アクティブ・レコード - リレーションを使ってテーブルを結合する](db-active-record.md#joining-with-relations) を参照してください。 #### SQL ビューを使って、データのフィルタリング・並べ替え・表示をする @@ -673,7 +673,7 @@ class UserView extends ActiveRecord } ``` -このようにした後は、この UserView アクティブレコードを検索用のモデルとともに使うことが出来ます。 +このようにした後は、この UserView アクティブ・レコードを検索用のモデルとともに使うことが出来ます。 並べ替えやフィルタリングの属性を追加で定義する必要はありません。 全ての属性がそのままで動作します。 この手法にはいくつかの長所と短所があることに注意してください。 diff --git a/docs/guide-ja/output-sorting.md b/docs/guide-ja/output-sorting.md index 4a1b0ee8ddb..211ac4a7b99 100644 --- a/docs/guide-ja/output-sorting.md +++ b/docs/guide-ja/output-sorting.md @@ -40,7 +40,7 @@ $articles = Article::find() 上記の例では、[[yii\data\Sort|Sort]] オブジェクトに対して二つの属性が宣言されています。 すなわち、`age` と `name` です。 -`age` 属性は `Article` アクティブレコード・クラスの `age` 属性に対応する *単純な* 属性です。 +`age` 属性は `Article` アクティブ・レコード・クラスの `age` 属性に対応する *単純な* 属性です。 これは、次の宣言と等価です。 ```php diff --git a/docs/guide-ja/rest-controllers.md b/docs/guide-ja/rest-controllers.md index c0e37b89d2e..798e061bcd2 100644 --- a/docs/guide-ja/rest-controllers.md +++ b/docs/guide-ja/rest-controllers.md @@ -5,8 +5,8 @@ Yii は、RESTful アクションを作成する仕事を簡単にするための二つの基底コントローラ・クラスを提供しています。 すなわち、[[yii\rest\Controller]] と [[yii\rest\ActiveController]] です。 -二つのコントローラの違いは、後者は [アクティブレコード](db-active-record.md) として表現されるリソースの扱いに特化した一連のアクションをデフォルトで提供する、という点にあります。 -従って、あなたが [アクティブレコード](db-active-record.md) を使っていて、提供される組み込みのアクションに満足できるのであれば、コントローラ・クラスを [[yii\rest\ActiveController]] から拡張することを検討すると良いでしょう。 +二つのコントローラの違いは、後者は [アクティブ・レコード](db-active-record.md) として表現されるリソースの扱いに特化した一連のアクションをデフォルトで提供する、という点にあります。 +従って、あなたが [アクティブ・レコード](db-active-record.md) を使っていて、提供される組み込みのアクションに満足できるのであれば、コントローラ・クラスを [[yii\rest\ActiveController]] から拡張することを検討すると良いでしょう。 そうすれば、最小限のコードで強力な RESTful API を作成することが出来ます。 [[yii\rest\Controller]] と [[yii\rest\ActiveController]] は、ともに、下記の機能を提供します。 diff --git a/docs/guide-ja/rest-quick-start.md b/docs/guide-ja/rest-quick-start.md index ab20150d43f..16d4f17b674 100644 --- a/docs/guide-ja/rest-quick-start.md +++ b/docs/guide-ja/rest-quick-start.md @@ -4,7 +4,7 @@ Yii は、RESTful ウェブサービス API を実装する仕事を簡単にするために、一揃いのツールを提供しています。 具体的に言えば、RESTful API に関する次の機能をサポートしています。 -* [アクティブレコード](db-active-record.md) のための共通 API をサポートした迅速なプロトタイプ作成 +* [アクティブ・レコード](db-active-record.md) のための共通 API をサポートした迅速なプロトタイプ作成 * レスポンス形式のネゴシエーション (デフォルトで JSON と XML をサポート) * 出力フィールドの選択をサポートした、カスタマイズ可能なオブジェクトのシリアライゼーション * コレクション・データと検証エラーの適切な書式設定 @@ -20,7 +20,7 @@ Yii は、RESTful ウェブサービス API を実装する仕事を簡単にす 以下においては、例を使って、どのようにして最小限のコーディング労力で一組の RESTful API を構築することが出来るかを説明します。 ユーザのデータを RESTful API によって公開したいと仮定しましょう。 -ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [アクティブレコード](db-active-record.md) クラス `app\models\User` が既に作成済みであるとします。 +ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [アクティブ・レコード](db-active-record.md) クラス `app\models\User` が既に作成済みであるとします。 ## コントローラを作成する diff --git a/docs/guide-ja/rest-resources.md b/docs/guide-ja/rest-resources.md index cc8cd4f5f35..74fba791824 100644 --- a/docs/guide-ja/rest-resources.md +++ b/docs/guide-ja/rest-resources.md @@ -11,7 +11,7 @@ MVC の枠組の中では、リソースは [モデル](structure-models.md) と * [[yii\base\Model]] は [入力値の検証](input-validation.md) をサポートしています。 これは、RESTful API がデータ入力をサポートする必要がある場合に役に立ちます。 * [[yii\db\ActiveRecord]] は DB データのアクセスと操作に対する強力なサポートを提供しています。 - リソース・データがデータベースに保存されているときは、アクティブレコードが最適の選択です。 + リソース・データがデータベースに保存されているときは、アクティブ・レコードが最適の選択です。 このセクションでは、主として、[[yii\base\Model]] クラス (またはその子クラス) から拡張したリソース・クラスにおいて、RESTful API を通じて返すことが出来るデータを指定する方法を説明します。 リソース・クラスが [[yii\base\Model]] から拡張したものでない場合は、全てのパブリックなメンバ変数が返されます。 diff --git a/docs/guide-ja/runtime-bootstrapping.md b/docs/guide-ja/runtime-bootstrapping.md index 28ca5c863b3..2d708426c3f 100644 --- a/docs/guide-ja/runtime-bootstrapping.md +++ b/docs/guide-ja/runtime-bootstrapping.md @@ -23,7 +23,7 @@ ブートストラップの仕事は *全て* のリクエストを処理する前に、毎回しなければなりませんので、この過程を軽いものに保って可能な限り最適化することは非常に重要なことです。 あまりに多くのブートストラップ・コンポーネントを登録しないように努めてください。 -ブートストラップ・コンポーネントが必要になるのは、リクエスト処理のライフ・サイクル全体に関与する必要がある場合だけです。 +ブートストラップ・コンポーネントが必要になるのは、リクエスト処理のライフサイクル全体に関与する必要がある場合だけです。 例えば、モジュールが追加の URL 解析規則を登録する必要がある場合は、モジュールを [bootstrap プロパティ](structure-applications.md#bootstrap) のリストに挙げなければなりません。 なぜなら、URL 規則を使ってリクエストが解決される前に、新しい URL 規則を有効にしなければならないからです。 diff --git a/docs/guide-ja/runtime-overview.md b/docs/guide-ja/runtime-overview.md index 1bfed53ee3b..e35d946eae0 100644 --- a/docs/guide-ja/runtime-overview.md +++ b/docs/guide-ja/runtime-overview.md @@ -17,6 +17,6 @@ Yii のアプリケーションがリクエストを処理するときは、毎 次の図は、アプリケーションがどのようにしてリクエストを処理するかを示すものです。 -![リクエストのライフ・サイクル](images/request-lifecycle.png) +![リクエストのライフサイクル](images/request-lifecycle.png) このセクションでは、これらのステップのいくつかについて、どのように動作するかを詳細に説明します。 diff --git a/docs/guide-ja/security-authentication.md b/docs/guide-ja/security-authentication.md index b1467423e4f..43357a1cb52 100644 --- a/docs/guide-ja/security-authentication.md +++ b/docs/guide-ja/security-authentication.md @@ -45,7 +45,7 @@ return [ 特定のメソッドが必要でない場合は、中身を空にして実装しても構いません。 例えば、あなたのアプリケーションが純粋なステート・レス RESTful アプリケーションであるなら、実装する必要があるのは [[yii\web\IdentityInterface::findIdentityByAccessToken()|findIdentityByAccessToken()]] と [[yii\web\IdentityInterface::getId()|getId()]] だけであり、他のメソッドは全て中身を空にしておくことが出来ます。 -次の例では、[[yii\web\User::identityClass|ユーザ識別情報クラス]] は、`user` データベース・テーブルと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されています。 +次の例では、[[yii\web\User::identityClass|ユーザ識別情報クラス]] は、`user` データベース・テーブルと関連付けられた [アクティブ・レコード](db-active-record.md) クラスとして実装されています。 ```php Note: ユーザ識別情報クラスである `User` と [[yii\web\User]] を混同してはいけません。 - 前者は認証のロジックを実装するクラスであり、普通は、ユーザの認証情報を保存する何らかの持続的ストレージと関連付けられた [アクティブレコード](db-active-record.md) クラスとして実装されます。 + 前者は認証のロジックを実装するクラスであり、普通は、ユーザの認証情報を保存する何らかの持続的ストレージと関連付けられた [アクティブ・レコード](db-active-record.md) クラスとして実装されます。 後者はユーザの認証状態の管理に責任を持つアプリケーション・コンポーネントです。 diff --git a/docs/guide-ja/security-authorization.md b/docs/guide-ja/security-authorization.md index b0d129fb1e6..bea65d866d6 100644 --- a/docs/guide-ja/security-authorization.md +++ b/docs/guide-ja/security-authorization.md @@ -601,7 +601,7 @@ public function behaviors() 'allow' => true, 'actions' => ['update'], 'roles' => ['updatePost'], - 'roleParams' => ['postId' => Yii::$app->request->get('id')]; + 'roleParams' => ['postId' => Yii::$app->request->get('id')], ], ``` diff --git a/docs/guide-ja/security-best-practices.md b/docs/guide-ja/security-best-practices.md index eadb0d79465..7a0124ceb4e 100644 --- a/docs/guide-ja/security-best-practices.md +++ b/docs/guide-ja/security-best-practices.md @@ -69,7 +69,7 @@ SELECT * FROM user WHERE username = ''; DROP TABLE user; --' これは有効なクエリで、空のユーザ名を持つユーザを探してから、`user` テーブルを削除します。 おそらく、ウェブ・サイトは破壊されて、データは失われることになります (定期的なバックアップは設定済みですよね、ね? )。 -Yii においては、ほとんどのデータベース・クエリは、PDO のプリペアド・ステートメントを適切に使用する [アクティブレコード](db-active-record.md) を経由して実行されます。 +Yii においては、ほとんどのデータベース・クエリは、PDO のプリペアド・ステートメントを適切に使用する [アクティブ・レコード](db-active-record.md) を経由して実行されます。 プリペアド・ステートメントの場合は、上で説明したようなクエリの改竄は不可能です。 それでも、[生のクエリ](db-dao.md) や [クエリ・ビルダ](db-query-builder.md) を必要とする場合はあります。 diff --git a/docs/guide-ja/start-databases.md b/docs/guide-ja/start-databases.md index a90666decb8..93289bdaa0a 100644 --- a/docs/guide-ja/start-databases.md +++ b/docs/guide-ja/start-databases.md @@ -2,13 +2,15 @@ ================== このセクションでは、`country` という名前のデータベース・テーブルから読み出した国データを表示する新しいページの作り方を説明します。 -この目的を達するために、データベース接続を構成し、[アクティブレコード](db-active-record.md) クラスを作成し、[アクション](structure-controllers.md) を定義し、そして [ビュー](structure-views.md) を作成します。 +この目的を達するために、データベース接続を構成し、 +[アクティブ・レコード](db-active-record.md) クラスを作成し、[アクション](structure-controllers.md) を定義し、 +そして [ビュー](structure-views.md) を作成します。 このチュートリアルを通じて、次のことを学びます。 * DB 接続を構成する方法 -* アクティブレコードのクラスを定義する方法 -* アクティブレコードのクラスを使ってデータを検索する方法 +* アクティブ・レコードのクラスを定義する方法 +* アクティブ・レコードのクラスを使ってデータを検索する方法 * 改ページを伴う仕方でビューにデータを表示する方法 このセクションを完了するためには、データベースを使うことについて基本的な知識と経験が無ければならないことに注意してください。 @@ -19,11 +21,9 @@ ---------------------- まず初めに、`yii2basic` という名前のデータベースを作成してください。このデータベースからアプリケーションにデータを読み出すことになります。 -Yii は多数のデータベース製品に対するサポートを内蔵していますので、作成するデータベースは、SQLite、MySQL、PosttreSQL、MSSQL または Oracle から選ぶことが出来ます。 -以下の説明では、話を単純にするために、MySQL を前提とします。 +Yii は多数のデータベース製品に対するサポートを内蔵しており、作成するデータベースは、SQLite、MySQL、PosttreSQL、MSSQL または Oracle から選ぶことが出来ます。以下の説明では、話を単純にするために、MySQL を前提とします。 -次に、データベースに `country` という名前のテーブルを作り、いくつかのサンプル・データを挿入します。 -そうするためには、次の SQL 文を実行することが出来ます。 +次に、データベースに `country` という名前のテーブルを作り、いくつかのサンプル・データを挿入します。そうするためには、次の SQL 文を実行することが出来ます。 ```sql CREATE TABLE `country` ( @@ -46,11 +46,11 @@ INSERT INTO `country` VALUES ('US','United States',322976000); この時点で、あなたは `yii2basic` という名前のデータベースを持ち、その中に三つのカラムを持つ `country` というテーブルがあり、`country` テーブルは 10 行のデータを持っている、ということになります。 - DB 接続を構成する ----------------- -先に進む前に、[PDO](http://www.php.net/manual/en/book.pdo.php) PHP 拡張および使用しているデータベースの PDO ドライバ (例えば、MySQL のための `pdo_mysql`) の両方をインストール済みであることを確認してください。 +先に進む前に、[PDO](http://www.php.net/manual/en/book.pdo.php) PHP 拡張および使用しているデータベースの PDO ドライバ +(例えば、MySQL のための `pdo_mysql`) の両方をインストール済みであることを確認してください。 アプリケーションがリレーショナル・データベースを使う場合、これは基本的な必要条件です。 これらがインストール済みなら、`config/db.php` というファイルを開いて、あなたのデータベースに適合するようにパラメータを変更してください。 @@ -68,14 +68,16 @@ return [ ]; ``` -この `config/db.php` というファイルは典型的なファイルベースの [構成情報](concept-configurations.md) ツールです。 -この構成情報ファイルが、背後のデータベースに対する SQL クエリの実行を可能にする [[yii\db\Connection]] インスタンスの作成と初期化に必要なパラメータを指定するものです。 +この `config/db.php` というファイルは典型的なファイル・ベースの [構成情報](concept-configurations.md) ツールです。 +この構成情報ファイルが、背後のデータベースに対する SQL クエリの実行を可能にする [[yii\db\Connection]] +インスタンスの作成と初期化に必要なパラメータを指定するものです。 上記のようにして構成された DB 接続は、アプリケーション・コードの中で `Yii::$app->db` という式でアクセスすることが出来ます。 > Info: `config/db.php` は、メインのアプリケーション構成情報ファイルである `config/web.php` によってインクルードされます。 この `config/web.php` が [アプリケーション](structure-applications.md) インスタンスが初期化される仕方を指定するものです。 詳しい情報については、[構成情報](concept-configurations.md) のセクションを参照してください。 + Yii がサポートを内蔵していないデータベースを扱う必要がある場合は、以下のエクステンションの利用を検討してください。 - [Informix](https://github.com/edgardmessias/yii2-informix) @@ -83,10 +85,11 @@ Yii がサポートを内蔵していないデータベースを扱う必要が - [Firebird](https://github.com/edgardmessias/yii2-firebird) -アクティブレコードを作成する ----------------------------- +アクティブ・レコードを作成する +------------------------------ -`country` テーブルの中のデータを表現し取得するために、[アクティブレコード](db-active-record.md) から派生した `Country` という名前のクラスを作成し、それを `models/Country.php` というファイルに保存します。 +`country` テーブルの中のデータを表現し取得するために、[アクティブ・レコード](db-active-record.md) から派生した `Country` という名前のクラスを作成し、 +それを `models/Country.php` というファイルに保存します。 ```php Info: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]] メソッドをオーバーライドして、関連づけられたテーブル名を明示的に指定することが出来ます。 +> Info: クラス名とテーブル名を直接に合致させることが出来ない場合は、[[yii\db\ActiveRecord::tableName()]] +メソッドをオーバーライドして、関連づけられたテーブル名を明示的に指定することが出来ます。 `Country` クラスを使うことによって、以下のコード断片で示すように、`country` テーブルの中のデータを簡単に操作することが出来ます。 @@ -124,8 +128,7 @@ $country->name = 'U.S.A.'; $country->save(); ``` -> Info: アクティブレコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。 -[アクティブレコード](db-active-record.md) のセクションで、詳細な情報を得ることが出来ます。 +> Info: アクティブ・レコードは、オブジェクト指向の流儀でデータベースのデータにアクセスし、操作する強力な方法です。[アクティブ・レコード](db-active-record.md) のセクションで、詳細な情報を得ることが出来ます。 もう一つの方法として、[データベース・アクセス・オブジェクト](db-dao.md) と呼ばれる、より低レベルなデータ・アクセス方法を使ってデータベースを操作することも出来ます。 @@ -172,13 +175,14 @@ class CountryController extends Controller 上記のコードを `controllers/CountryController.php` というファイルに保存します。 -`index` アクションは `Country::find()` を呼び出します。 -このアクティブレコードのメソッドは DB クエリを構築して、`country` テーブルから全てのデータを読み出します。 +`index` アクションは `Country::find()` を呼び出します。このアクティブ・レコードのメソッドは DB クエリを構築して、`country` テーブルから全てのデータを読み出します。 一回のリクエストで返される国の数を制限するために、クエリは [[yii\data\Pagination]] オブジェクトの助けを借りてページ付けされます。 `Pagination` オブジェクトは二つの目的に奉仕します。 -* クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、一度に一ページ分のデータだけ (1ページ最大5行) を返すようにします。 -* 次の項で説明されるように、一連のページ・ボタンからなるページャをビューに表示するために使われます。 +* クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、 + 一度に一ページ分のデータだけ (1ページ最大5行) を返すようにします。 +* 次の項で説明されるように、一連のページ・ボタンからなるページャを + ビューに表示するために使われます。 コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングしています。 このとき、国データだけでなく、そのページネーション情報がビューに渡されます。 @@ -226,8 +230,7 @@ http://hostname/index.php?r=country%2Findex ![国リスト](images/start-country-list.png) -最初、ページは5つの国を表示しています。 -そして、国リストの下には、4つのボタンを持ったページャがあります。 +最初、ページは5つの国を表示しています。そして、国リストの下には、4つのボタンを持ったページャがあります。 "2" のボタンをクリックすると、ページはデータベースにある次の5つの国、すなわち、2ページ目のレコードを表示します。 注意深く観察すると、ブラウザの URL も次のように変ったことに気付くでしょう。 @@ -235,16 +238,17 @@ http://hostname/index.php?r=country%2Findex http://hostname/index.php?r=country%2Findex&page=2 ``` -舞台裏では、[[yii\data\Pagination|Pagination]] が、データセットをページ付けするのに必要な全ての機能を提供しています。 +舞台裏では、[[yii\data\Pagination|Pagination]] が、データ・セットをページ付けするのに必要な全ての機能を提供しています。 * 初期状態では、[[yii\data\Pagination|Pagination]] は、1ページ目を表しています。 - これを反映して、国の SELECT クエリは `LIMIT 5 OFFSET 0` という句を伴うことになります。 - その結果、最初の5つの国が取得されて表示されます。 -* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された URL を使ってページ・ボタンをレンダリングします。 + これを反映して、国の SELECT クエリは `LIMIT 5 OFFSET 0` という句を伴うことになります。その結果、最初の5つの国が取得されて表示されます。 +* [[yii\widgets\LinkPager|LinkPager]] ウィジェットは、[[yii\data\Pagination::createUrl()|Pagination]] によって作成された + URL を使ってページ・ボタンをレンダリングします。 URL は、別々のページ番号を表現する `page` というクエリ・パラメータを含んだものになります。 -* ページボタン "2" をクリックすると、`country/index` のルートに対する新しいリクエストが発行され、処理されます。 +* ページ・ボタン "2" をクリックすると、`country/index` のルートに対する新しいリクエストが発行され、処理されます。 [[yii\data\Pagination|Pagination]] が URL から `page` クエリ・パラメータを読み取って、カレント・ページ番号を 2 にセットします。 - こうして、新しい国のクエリは `LIMIT 5 OFFSET 5` という句を持ち、次の5つの国を表示のために返すことになります。 + こうして、新しい国のクエリは `LIMIT 5 OFFSET 5` という句を持ち、 + 次の5つの国を表示のために返すことになります。 まとめ @@ -253,6 +257,7 @@ http://hostname/index.php?r=country%2Findex&page=2 このセクションでは、データベースを扱う方法を学びました。 また、[[yii\data\Pagination]] と [[yii\widgets\LinkPager]] の助けを借りて、ページ付けされたデータを取得し表示する方法も学びました。 -次のセクションでは、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) と呼ばれる強力なコード生成ツールを使う方法を学びます。 -このツールは、データベース・テーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、通常必要とされることが多いいくつかの機能の迅速な実装を手助けしてくれるものです。 +次のセクションでは、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) と呼ばれる強力なコード生成ツールを使う方法を学びます。 +このツールは、データベース・テーブルのデータを取り扱うための「作成・読出し・更新・削除 (CRUD)」操作のような、 +通常必要とされることが多い諸機能の迅速な実装を手助けしてくれるものです。 実際のところ、あなたがたった今書いたばかりのコードは、Gii ツールを使えば、全部、Yii が自動的に生成してくれるものです。 diff --git a/docs/guide-ja/start-forms.md b/docs/guide-ja/start-forms.md index 635b7ecb4ac..fb22618dcff 100644 --- a/docs/guide-ja/start-forms.md +++ b/docs/guide-ja/start-forms.md @@ -3,9 +3,10 @@ このセクションでは、ユーザからデータを取得するためのフォームを持つ新しいページを作る方法を説明します。 このページは名前のインプット・フィールドとメールのインプット・フィールドを持つフォームを表示します。 -ユーザからこれら二つの情報を受け取った後、ページは入力された値を確認のためにエコー・バックします。 +ユーザからこれら二つの情報を受け取った後、ウェブ・ページは確認のために入力された値をエコー・バックします。 -この目的を達するために、一つの [アクション](structure-controllers.md) と 二つの [ビュー](structure-views.md) を作成する以外に、一つの [モデル](structure-models.md) をも作成します。 +この目的を達するために、一つの [アクション](structure-controllers.md) と 二つの [ビュー](structure-views.md) を作成する以外に、 +一つの [モデル](structure-models.md) をも作成します。 このチュートリアルを通じて、次の方法を学びます。 @@ -17,7 +18,8 @@ モデルを作成する ---------------- -ユーザに入力してもらうデータは、下に示されているように `EntryForm` モデル・クラスとして表現され、`models/EntryForm.php` というファイルに保存されます。 +ユーザに入力してもらうデータは、下に示されているように `EntryForm` モデル・クラスとして表現され、 +`models/EntryForm.php` というファイルに保存されます。 クラス・ファイルの命名規約についての詳細は [クラスのオートロード](concept-autoloading.md) のセクションを参照してください。 ```php @@ -44,7 +46,7 @@ class EntryForm extends Model ``` このクラスは、Yii によって提供される基底クラス [[yii\base\Model]] を拡張するものです。 -通常、この基底クラスがフォームデータを表現するのに使われます。 +通常、この基底クラスがフォーム・データを表現するのに使われます。 > Info: [[yii\base\Model]] はデータベース・テーブルと関連*しない*モデル・クラスの親として使われます。 データベース・テーブルと対応するモデル・クラスでは、通常は [[yii\db\ActiveRecord]] が親になります。 @@ -114,7 +116,8 @@ class SiteController extends Controller アクションは最初に `EntryForm` オブジェクトを生成します。 次に、モデルに `$_POST` のデータ、Yii においては [[yii\web\Request::post()]] によって提供されるデータを投入しようと試みます。 -モデルへのデータ投入が成功した場合(つまり、ユーザが HTML フォームを送信した場合)、アクションは[[yii\base\Model::validate()|validate()]] を呼んで、入力された値が有効なものであるかどうかを確認します。 +モデルへのデータ投入が成功した場合(つまり、ユーザが HTML フォームを送信した場合)、アクションは[[yii\base\Model::validate()|validate()]] を呼んで、 +入力された値が有効なものであるかどうかを確認します。 > Info: `Yii::$app` という式は [アプリケーション](structure-applications.md) インスタンスを表現します。 これはグローバルにアクセス可能なシングルトンです。 @@ -122,10 +125,12 @@ class SiteController extends Controller 上記のコードでは、アプリケーション・インスタンスの `request` コンポーネントが `$_POST` データにアクセスするために使われています。 すべてが適正である場合、アクションは `entry-confirm` という名前のビューを表示して、データの送信が成功したことをユーザに確認させます。 -データが送信されなかったり、データがエラーを含んでいたりする場合は、`entry` ビューが表示され、その中で HTML フォームが (もし有れば) 検証エラーのメッセージとともに表示されます。 +データが送信されなかったり、データがエラーを含んでいたりする場合は、`entry` ビューが表示され、 +その中で HTML フォームが (もし有れば) 検証エラーのメッセージとともに表示されます。 > Note: この簡単な例では、有効なデータ送信に対して単純に確認ページを表示しています。 - 実際の仕事では、[フォーム送信の諸問題](http://en.wikipedia.org/wiki/Post/Redirect/Get) を避けるために、[[yii\web\Controller::refresh()|refresh()]] または [[yii\web\Controller::redirect()|redirect()]] を使うことを考慮すべきです。 + 実際の仕事では、[フォーム送信の諸問題](http://en.wikipedia.org/wiki/Post/Redirect/Get) を避けるために、 + [[yii\web\Controller::refresh()|refresh()]] または [[yii\web\Controller::redirect()|redirect()]] を使うことを考慮すべきです。 ビューを作成する @@ -168,7 +173,8 @@ use yii\widgets\ActiveForm; ``` -このビューは HTML フォームを構築するのに、[[yii\widgets\ActiveForm|ActiveForm]] と呼ばれる強力な [ウィジェット](structure-widgets.md) を使います。 +このビューは HTML フォームを構築するのに、[[yii\widgets\ActiveForm|ActiveForm]] と呼ばれる強力な +[ウィジェット](structure-widgets.md) を使います。 ウィジェットの `begin()` メソッドと `end()` メソッドが、それぞれ、フォームの開始タグと終了タグをレンダリングします。 この二つのメソッドの呼び出しの間に、[[yii\widgets\ActiveForm::field()|field()]] メソッドによってインプット・フィールドが作成されます。 最初のインプット・フィールドは "name" のデータ、第二のインプット・フィールドは "email" のデータのためのものです。 @@ -184,34 +190,38 @@ use yii\widgets\ActiveForm; http://hostname/index.php?r=site%2Fentry ``` -二つのインプット・フィールドを持つフォームを表示するページが表示されるでしょう。 -それぞれのインプット・フィールドの前には、どんなデータを入力すべきかを示すラベルがあります。 +二つのインプット・フィールドを持つフォームを表示するページが表示されるでしょう。それぞれのインプット・フィールドの前には、どんなデータを入力すべきかを示すラベルがあります。 何も入力せずに、あるいは、無効なメール・アドレスを入力して送信ボタンをクリックすると、それぞれ問題のあるインプット・フィールドの後ろにエラー・メッセージが表示されます。 ![検証エラーのあるフォーム](images/start-form-validation.png) -有効な名前とメール・アドレスを入力してから送信ボタンをクリックすると、たった今入力したデータを表示する新しいページが表示されます。 +有効な名前とメール・アドレスを入力してから送信ボタンをクリックすると、 +たった今入力したデータを表示する新しいページが表示されます。 ![データ入力の確認](images/start-entry-confirmation.png) + ### 魔法の説明 あなたは、舞台裏で HTML フォームがどのように動いているのか、不思議に思うかも知れません。 -なぜなら、フォームが、ほとんど魔法のように、各インプット・フィールドのラベルを表示し、データを正しく入力しなかった場合には、ページをリロードすることなく、エラー・メッセージを表示するからです。 +なぜなら、フォームが、ほとんど魔法のように、各インプット・フィールドのラベルを表示し、データを正しく入力しなかった場合には、 +ページをリロードすることなく、エラー・メッセージを表示するからです。 そう、データの検証は、最初に JavaScript を使ってクライアント・サイドで実行され、次に PHP によってサーバ・サイドで実行されます。 -[[yii\widgets\ActiveForm]] は、賢いことに、`EntryForm` で宣言した検証規則を抽出し、それを実行可能な JavaScript コードに変換して、JavaScript を使ってデータ検証を実行します。 +[[yii\widgets\ActiveForm]] は、賢いことに、`EntryForm` で宣言した検証規則を抽出し、それを実行可能な JavaScript コードに変換して、 +JavaScript を使ってデータ検証を実行します。 ブラウザで JavaScript を無効にした場合でも、`actionEntry()` メソッドで示されているように、サーバ・サイドでの検証は引き続き実行されます。 これにより、どのような状況であっても、データの有効性が保証されます。 > Warning: クライアント・サイドの検証は、ユーザにとってのより良い使い心地のために利便性を提供するものです。 - クライアント・サイドの検証の有無にかかわらず、サーバ・サイドの検証は常に必要とされます。 + クライアント・サイドの検証の有無にかかわらず、サーバ・サイドの検証は常に必要です。 インプット・フィールドのラベルは、モデルのプロパティ名を使用して、`field()` メソッドによって生成されます。 例えば、`name` というプロパティから `Name` というラベルが生成されます。 -ビューの中で、下記のコードのように、ラベルをカスタマイズすることも出来ます。 +ビューの中で、下記のコードのように、 +ラベルをカスタマイズすることも出来ます。 ```php field($model, 'name')->label('お名前') ?> @@ -220,14 +230,14 @@ http://hostname/index.php?r=site%2Fentry > Info: Yii はこのようなウィジェットを数多く提供して、複雑で動的なビューを素速く作成することを手助けしてくれます。 後で学ぶように、新しいウィジェットを書くことも非常に簡単です。 - あなたは、将来のビュー開発を単純化するために、多くのビューコードを再利用可能なウィジェットに変換したいと思うことでしょう。 + あなたは、将来のビュー開発を単純化するために、多くのビュー・コードを再利用可能なウィジェットに変換したいと思うことでしょう。 まとめ ------ -ガイドのこのセクションにおいては、MVC アーキテクチャパターンの全ての部分に触れました。 -そして、ユーザデータを表現し、当該データを検証するモデル・クラスを作成する方法を学びました。 +ガイドのこのセクションにおいては、MVC アーキテクチャ・パターンの全ての部分に触れました。 +そして、ユーザ・データを表現し、当該データを検証するモデル・クラスを作成する方法を学びました。 また、ユーザからデータを取得する方法と、ブラウザにデータを表示して返す方法も学びました。 この作業は、アプリケーションを開発するときに、多大な時間を必要とするものになり得るものです。 diff --git a/docs/guide-ja/start-gii.md b/docs/guide-ja/start-gii.md index b4b4719336a..be49ca03ada 100644 --- a/docs/guide-ja/start-gii.md +++ b/docs/guide-ja/start-gii.md @@ -1,13 +1,13 @@ Gii でコードを生成する ====================== -このセクションでは、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) を使って、ウェブ・サイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。 +このセクションでは、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) を使って、ウェブ・サイトの一般的な機能のいくつかを実装するコードを自動的に生成する方法を説明します。 Gii を使ってコードを自動生成することは、Gii のウェブ・ページに表示される指示に対して正しい情報を入力するだけのことです。 このチュートリアルを通じて、次のことを学びます。 * アプリケーションで Gii を有効にする方法 -* Gii を使って、アクティブレコードのクラスを生成する方法 +* Gii を使って、アクティブ・レコードのクラスを生成する方法 * Gii を使って、DB テーブルの CRUD 操作を実装するコードを生成する方法 * Gii によって生成されるコードをカスタマイズする方法 @@ -15,9 +15,8 @@ Gii を使ってコードを自動生成することは、Gii のウェブ・ペ Gii を開始する -------------- -[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) は Yii の [モジュール](structure-modules.md) として提供されています。 -Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。 -アプリケーションを生成した仕方にもよりますが、`config/web.php` の構成情報ファイルの中に、多分、下記のコードが既に提供されているでしょう。 +[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) は Yii の [モジュール](structure-modules.md) として提供されています。 +Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で構成することで有効にすることが出来ます。アプリケーションを生成した仕方にもよりますが、`config/web.php` の構成情報ファイルの中に、多分、下記のコードが既に提供されているでしょう。 ```php $config = [ ... ]; @@ -30,7 +29,8 @@ if (YII_ENV_DEV) { } ``` -上記の構成情報は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは `gii` という名前のモジュールをインクルードすべきこと、そして `gii` は [[yii\gii\Module]] というクラスであることを記述しています。 +上記の構成情報は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは `gii` という名前のモジュールをインクルードすべきこと、 +そして `gii` は [[yii\gii\Module]] というクラスであることを記述しています。 アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) である `web/index.php` をチェックすると、次の行があることに気付くでしょう。 これは本質的には `YII_ENV_DEV` を `true` に設定するものです。 @@ -39,8 +39,7 @@ if (YII_ENV_DEV) { defined('YII_ENV') or define('YII_ENV', 'dev'); ``` -この行のおかげで、アプリケーションは開発モードになっており、上記の構成情報によって、Gii が既に有効になっています。 -これで、下記の URL によって Gii にアクセスすることが出来ます。 +この行のおかげで、アプリケーションは開発モードになっており、上記の構成情報によって、Gii が既に有効になっています。これで、下記の URL によって Gii にアクセスすることが出来ます。 ``` http://hostname/index.php?r=gii @@ -59,28 +58,25 @@ http://hostname/index.php?r=gii ![Gii](images/start-gii.png) -アクティブレコードのクラスを生成する +アクティブ・レコードのクラスを生成する ------------------------------------ -Gii を使ってアクティブレコードのクラスを生成するためには、"Model Generator" を選びます -(Gii のインデックス・ページのリンクをクリックして下さい)。 -そして、次のようにフォームに入力します。 +Gii を使ってアクティブ・レコードのクラスを生成するためには、"Model Generator" を選びます (Gii のインデックス・ページのリンクをクリックして下さい)。そして、次のようにフォームに入力します。 * Table Name: `country` * Model Class: `Country` ![Model Generator](images/start-gii-model.png) -次に、"Preview" ボタンをクリックします。 -そうすると、結果として作成されるクラス・ファイルのリストに `models/Country.php` が挙ってきます。 -クラス・ファイルの名前をクリックすると、内容をプレビューすることが出来ます。 +次に、"Preview" ボタンをクリックします。そうすると、結果として作成されるクラス・ファイルのリストに `models/Country.php` が挙ってきます。クラス・ファイルの名前をクリックすると、内容をプレビューすることが出来ます。 -Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、ファイル名の隣の `diff` ボタンをクリックして、生成されようとしているコードと既存のバージョンの違いを見てください。 +Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、 +ファイル名の隣の `diff` ボタンをクリックして、 +生成されようとしているコードと既存のバージョンの違いを見てください。 ![Model Generator のプレビュー](images/start-gii-model-preview.png) -既存のファイルを上書きするときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。 -新しいファイルを作成するときは、単に "Generate" をクリックすれば十分です。 +既存のファイルを上書きするときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。新しいファイルを作成するときは、単に "Generate" をクリックすれば十分です。 次に、コードの生成が成功したことを示す確認ページが表示されます。 既存のファイルがあった場合は、それが新しく生成されたコードで上書きされたことを示すメッセージも同じく表示されます。 @@ -89,9 +85,7 @@ Gii を使うときに、既に同じファイルを作成していて、それ CRUD コードを生成する --------------------- -CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、ほとんどのウェブ・サイトでデータを扱うときによく用いられる4つのタスクを表しています。 -Gii を使って CRUD 機能を作成するためには、"CRUD Generator" を選びます (Gii のインデックス・ページのリンクをクリックしてください) 。 -「国リスト」のサンプルのためには、表示されたフォームに以下のように入力します。 +CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、ほとんどのウェブ・サイトでデータを扱うときによく用いられる4つのタスクを表しています。Gii を使って CRUD 機能を作成するためには、"CRUD Generator" を選びます (Gii のインデックス・ページのリンクをクリックしてください) 。「国リスト」のサンプルのためには、表示されたフォームに以下のように入力します。 * Model Class: `app\models\Country` * Search Model Class: `app\models\CountrySearch` @@ -99,8 +93,7 @@ Gii を使って CRUD 機能を作成するためには、"CRUD Generator" を ![CRUD Generator](images/start-gii-crud.png) -次に、"Preview" ボタンをクリックします。 -生成されるファイルのリストは、次のようになります。 +次に、"Preview" ボタンをクリックします。生成されるファイルのリストは、次のようになります。 ![CRUD Generator のプレビュー](images/start-gii-crud-preview.png) @@ -136,10 +129,11 @@ http://hostname/index.php?r=country%2Findex > Info: Gii は非常にカスタマイズしやすく拡張しやすいコード生成ツールとして設計されています。 これを賢く使うと、アプリケーションの開発速度を大いに高めることが出来ます。 - 詳細については、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) のセクションを参照してください。 + 詳細については、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) のセクションを参照してください。 まとめ ------ -このセクションでは、Gii を使ってコードを生成して、データベース・テーブルに保存されているコンテントのための完全な CRUD 機能を実装する方法を学びました。 +このセクションでは、Gii を使ってコードを生成して、データベース・テーブルに保存されているコンテントのための +完全な CRUD 機能を実装する方法を学びました。 diff --git a/docs/guide-ja/start-hello.md b/docs/guide-ja/start-hello.md index ed95fbec46d..23209f01be8 100644 --- a/docs/guide-ja/start-hello.md +++ b/docs/guide-ja/start-hello.md @@ -2,7 +2,8 @@ ================== このセクションでは、アプリケーションに「こんにちは」という新しいページを作成する方法を説明します。 -この目的を達するために、[アクション](structure-controllers.md#creating-actions) と [ビュー](structure-views.md) を作成します。 +この目的を達するために、[アクション](structure-controllers.md#creating-actions) と +[ビュー](structure-views.md) を作成します。 * アプリケーションは、このページへのリクエストをそのアクションに送付します。 * 次にそのアクションが「こんにちは」という言葉をエンド・ユーザに示すビューを表示します。 @@ -17,7 +18,8 @@ アクションを作成する -------------------- -「こんにちは」のタスクのために、リクエストから `message` パラメータを読んで、そのメッセージをユーザに表示して返す `say` [アクション](structure-controllers.md#creating-actions) を作ります。 +「こんにちは」のタスクのために、リクエストから `message` パラメータを読んで、そのメッセージをユーザに表示して返す +`say` [アクション](structure-controllers.md#creating-actions) を作ります。 リクエストが `message` パラメータを提供しなかった場合は、アクションはデフォルト値として "こんにちは" というメッセージを表示するものとします。 > Info: [アクション](structure-controllers.md#creating-actions) は、エンド・ユーザが直接に参照して実行できるオブジェクトです。 @@ -26,8 +28,7 @@ アクションは [コントローラ](structure-controllers.md) の中で宣言されなければなりません。 話を簡単にするために、`say` アクションを既存の `SiteController` の中で宣言しましょう。 -このコントローラは `controllers/SiteController.php` というクラス・ファイルの中で定義されています。 -次のようにして、新しいアクションが始まります。 +このコントローラは `controllers/SiteController.php` というクラス・ファイルの中で定義されています。次のようにして、新しいアクションが始まります。 ```php @@ -105,13 +107,13 @@ http://hostname/index.php?r=site%2Fsay&message=Hello+World ![Hello World](images/start-hello-world.png) -この URL は、結果として、"Hello World" を表示するページになります。 -このページはアプリケーションの他のページと同じヘッダとフッタを共有しています。 +この URL は、結果として、"Hello World" を表示するページになります。このページはアプリケーションの他のページと同じヘッダとフッタを共有しています。 URL から `message` パラメータを省略すると、"こんにちは" を表示するページを見ることになるでしょう。 これは、`message` が `actionSay()` メソッドにパラメータとして渡されるものであり、それが省略された場合には、デフォルト値である `"こんにちは"` が代りに使われるからです。 -> Info: 新しいページは他のページと同じヘッダとフッタを共有していますが、それは [[yii\web\Controller::render()|render()]] メソッドが `say` ビューの結果をいわゆる [レイアウト](structure-views.md#layouts) に自動的に埋め込むからです。 +> Info: 新しいページは他のページと同じヘッダとフッタを共有していますが、それは [[yii\web\Controller::render()|render()]] メソッドが `say` ビューの結果を +いわゆる [レイアウト](structure-views.md#layouts) に自動的に埋め込むからです。 レイアウトは、この場合、`views/layouts/main.php` にあります。 上記の URL の `r` パラメータについては、さらに説明が必要でしょう。 @@ -122,10 +124,10 @@ URL から `message` パラメータを省略すると、"こんにちは" を この例で言えば、`site/say` というルートは、`SiteController` コントローラ・クラスと `say` アクションとして解決されます。 結果として、`SiteController::actionSay()` メソッドがリクエストを処理するために呼び出されます。 - > Info: アクションと同じく、コントローラもまたアプリケーションの中で一意に定義される ID を持ちます。 コントローラ ID も、アクション ID と同じ命名規則を使います。 - コントローラ・クラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、結果として出来る文字列に `Controller` という接尾辞を追加したものとなります。 + コントローラ・クラスの名前は、コントローラ ID からダッシュを削除し、各単語の最初の文字を大文字にし、 + 結果として出来る文字列に `Controller` という接尾辞を追加したものとなります。 例えば、`post-comment` というコントローラ ID に対応するコントローラ・クラスの名前は `PostCommentController` です。 @@ -133,8 +135,7 @@ URL から `message` パラメータを省略すると、"こんにちは" を ------ このセクションでは、MVC アーキテクチャ・パターンのうちのコントローラとビューの部分に触れました。 -特定のリクエストを処理するためのアクションをコントローラの一部として作成しました。 -また、レスポンスのコンテントを作成するためのビューも作成しました。 +特定のリクエストを処理するためのアクションをコントローラの一部として作成しました。また、レスポンスのコンテントを作成するためのビューも作成しました。 この単純な例においては、使用される唯一のデータが `message` パラメータであったため、モデルは関係していません。 また、Yii におけるルートについても学びました。ルートはユーザのリクエストとコントローラのアクションとの橋渡しとして働くものです。 diff --git a/docs/guide-ja/start-installation.md b/docs/guide-ja/start-installation.md index fb760578822..762ff18fff0 100644 --- a/docs/guide-ja/start-installation.md +++ b/docs/guide-ja/start-installation.md @@ -6,10 +6,10 @@ Yii は二つの方法でインストールすることが出来ます。すな Yii の標準的なインストールを実行すると、フレームワークとプロジェクト・テンプレートの両方がダウンロードされてインストールされます。 プロジェクト・テンプレートは、いくつかの基本的な機能、例えば、ログインやコンタクト・フォームなどを実装した、動作する Yii アプリケーションです。 -そのコードは推奨される方法に従って編成されています。 -そのため、プロジェクト・テンプレートは、あなたのプロジェクトのための良い開始点としての役割を果たしうるものです。 +そのコードは推奨される方法に従って編成されています。そのため、プロジェクト・テンプレートは、あなたのプロジェクトのための良い開始点としての役割を果たしうるものです。 -ここから続くいくつかのセクションにおいては、いわゆる *ベーシック・プロジェクト・テンプレート* とともに Yii をインストールする方法、および、このテンプレート上に新しい機能を実装する方法を説明します。 +ここから続くいくつかのセクションにおいては、いわゆる *ベーシック・プロジェクト・テンプレート* とともに Yii をインストールする方法、 +および、このテンプレートの上に新しい機能を実装する方法を説明します。 Yii はもう一つ、[アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) と呼ばれるテンプレートも提供しています。 こちらは、チーム開発環境において多層構造のアプリケーションを開発するときに使用する方が望ましいものです。 @@ -23,7 +23,7 @@ Composer によるインストール ### Composer をインストールする -まだ Composer をインストールしていない場合は、[getcomposer.org]() の指示に従ってインストールすることが出来ます。 +まだ Composer をインストールしていない場合は、[getcomposer.org](https://getcomposer.org/download/) の指示に従ってインストールすることが出来ます。 Linux や Mac OS X では、次のコマンドを実行します。 ```bash @@ -33,10 +33,13 @@ mv composer.phar /usr/local/bin/composer Windows では、[Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe) をダウンロードして実行します。 -何か問題が生じたときは、[Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md) を参照してください。 -Composer は初めてだという場合は、少なくとも、Composer ドキュメントの [基本的な使い方のセクション](https://getcomposer.org/doc/01-basic-usage.md) も参照することを推奨します。 +何か問題が生じたときは、[Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md) +を参照してください。 +Composer は初めてだという場合は、少なくとも、Composer ドキュメントの [基本的な使い方のセクション](https://getcomposer.org/doc/01-basic-usage.md) +も参照することを推奨します。 -このガイドでは、composer のコマンドの全ては、あなたが composer を [グローバル](https://getcomposer.org/doc/00-intro.md#globally) にインストールし、`composer` コマンドとして使用できるようにしているものと想定しています。 +このガイドでは、composer のコマンドの全ては、あなたが composer を [グローバル](https://getcomposer.org/doc/00-intro.md#globally) にインストールし、 +`composer` コマンドとして使用できるようにしているものと想定しています。 そうではなく、ローカル・ディレクトリにある `composer.phar` を使おうとする場合は、例に出てくるコマンドをそれに合せて修正しなければなりません。 以前に Composer をインストールしたことがある場合は、確実に最新のバージョンを使うようにしてください。 @@ -44,7 +47,7 @@ Composer は `composer self-update` コマンドを実行してアップデー > Note: Yii のインストールを実行する際に、Composer は大量の情報を Github API から要求する必要が生じます。 > リクエストの数は、あなたのアプリケーションが持つ依存の数によりますが、**Github API レート制限** より大きくなることがあり得ます。 -> この制限にかかった場合、Composer は Github API トークンを取得するために、あなたの Github ログイン認証情報を要求するでしょう。 +> この制限にかかった場合、Composer は Github API アクセス・トークンを取得するために、あなたの Github ログイン認証情報を要求するでしょう。 > 高速な接続においては、Composer が対処できるよりも早い段階でこの制限にかかることもありますので、 > Yii のインストールの前に、このアクセス・トークンを構成することを推奨します。 > アクセス・トークンの構成の仕方については、[Github API トークンに関する Composer ドキュメント](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) @@ -52,26 +55,23 @@ Composer は `composer self-update` コマンドを実行してアップデー ### Yii をインストールする -Composer がインストールされたら、ウェブからアクセスできるフォルダで下記のコマンドを実行することによって Yii をインストールすることが出来ます。 +Composer がインストールされたら、ウェブ・アクセス可能なフォルダで下記のコマンドを実行することによって +Yii アプリケーション・テンプレートをインストールすることが出来ます。 ```bash -composer global require "fxp/composer-asset-plugin:~1.3.1" composer create-project --prefer-dist yiisoft/yii2-app-basic basic ``` -最初のコマンドは [composer アセット・プラグイン](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。 -これにより、Composer を通じて bower と npm の依存パッケージを管理することが出来るようになります。 -このコマンドは一度だけ実行すれば十分です。 -第二のコマンドは `basic` という名前のディレクトリに Yii の最新の安定版をインストールします。 +このコマンドが `basic` という名前のディレクトリに Yii アプリケーション/テンプレートの最新の安定版をインストールします。 必要なら別のディレクトリ名を選ぶことも出来ます。 -> Info: `composer create-project` コマンドが失敗するときは、composer asset plugin が正しくインストール出来ているかどうかを確認して下さい。 -> `composer global show` を実行することで確認することが出来ます。このコマンドの出力に `fxp/composer-asset-plugin` のエントリが含まれていなければなりません。. -> よくあるエラーについては、[Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md) -> も参照して下さい。 -> エラーを修正した後は、`basic` ディレクトリの中で `composer update` を実行して、中断されたインストールを再開することが出来ます。 +> Info: `composer create-project` コマンドが失敗するときは、 +> よくあるエラーについて [Composer ドキュメントのトラブル・シューティングのセクション](https://getcomposer.org/doc/articles/troubleshooting.md) を参照して下さい。 +> エラーを修正した後は、`basic` ディレクトリの中で `composer update` を実行して、 +> 中断されたインストールを再開することが出来ます。 -> Tip: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) を追加した次のコマンドを代りに使うことが出来ます。 +> Tip: Yii の最新の開発バージョンをインストールしたい場合は、[stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability) +> を追加した次のコマンドを代りに使うことが出来ます。 > > ```bash > composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic @@ -85,9 +85,9 @@ composer create-project --prefer-dist yiisoft/yii2-app-basic basic アーカイブ・ファイルから Yii をインストールするには、三つの手順を踏みます。 -1. [yiiframework.com](http://www.yiiframework.com/download/) からアーカイブ・ファイルをダウンロードする。 -2. ダウンロードしたファイルをウェブからアクセスできるフォルダーに展開する。 -3. `config/web.php` ファイルを編集して、`cookieValidationKey` という構成情報の項目に秘密キーを入力する +1. [yiiframework.com](http://www.yiiframework.com/download/) からアーカイブ・ファイルをダウンロードします。 +2. ダウンロードしたファイルをウェブ・アクセス可能なフォルダに展開します。 +3. `config/web.php` ファイルを編集して、`cookieValidationKey` という構成情報の項目に秘密キーを入力します (Composer を使って Yii をインストールするときは、これは自動的に実行されます)。 ```php @@ -105,17 +105,17 @@ composer create-project --prefer-dist yiisoft/yii2-app-basic basic しかし、他のインストール・オプションも利用可能です。 -* コアフレームワークだけをインストールし、アプリケーション全体を一から構築したい場合は、[アプリケーションを一から構築する](tutorial-start-from-scratch.md) +* コア・フレームワークだけをインストールし、アプリケーション全体を一から構築したい場合は、[アプリケーションを一から構築する](tutorial-start-from-scratch.md) で説明されている指示に従うことが出来ます。 -* もっと洗練された、チーム開発環境により適したアプリケーションから開始したい場合は、 [アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) をインストールすることを考慮することが出来ます。 +* もっと洗練された、チーム開発環境により適したアプリケーションから開始したい場合は、 + [アドバンスト・プロジェクト・テンプレート](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/README.md) をインストールすることを考慮することが出来ます。 アセットをインストールする -------------------------- -Yii は、アセット (CSS および JavaScript) ライブラリのインストールについて -[Bower](http://bower.io/) および/または [NPM](https://www.npmjs.org/) のパッケージに依存しています。 -Yii はこれらのライブラリを取得するのに Composer を使って、PHP と CSS/JavaScript のパッケージバージョンを同時に解決できるようにしています。 +Yii は、アセット (CSS および JavaScript) ライブラリのインストールについて [Bower](http://bower.io/) および/または [NPM](https://www.npmjs.org/) のパッケージに依存しています。 +Yii はこれらのライブラリを取得するのに Composer を使って、PHP と CSS/JavaScript のパッケージ・バージョンを同時に解決できるようにしています。 このことは、[asset-packagist.org](https://asset-packagist.org) または [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) を使用することによって達成されます。 詳細は [アセットのドキュメント](structure-assets.md) を参照して下さい。 @@ -131,15 +131,14 @@ Composer によるアセットのインストールを抑止するためには }, ``` -> Note: Composer によるアセットのインストールをバイパスする場合は、アセットのインストールとバージョン衝突の解決について -> あなたが責任を持たなければなりません。 +> Note: Composer によるアセットのインストールをバイパスする場合は、アセットのインストールとバージョン衝突の解決についてあなたが責任を持たなければなりません。 > さまざまなエクステンションに由来するアセット・ファイル間で不整合が生じうることを覚悟して下さい。 インストールを検証する ---------------------- -インストール完了後、あなたのウェブ・サーバを構成してください (次の説を参照してください)。 +インストール完了後、あなたのウェブ・サーバを構成してください (次のセクションを参照してください)。 あるいは、プロジェクトの `web` ディレクトリで次のコマンドを実行して、 [PHP の内蔵ウェブ・サーバ](https://secure.php.net/manual/ja/features.commandline.webserver.php) を使ってください。 @@ -147,9 +146,8 @@ Composer によるアセットのインストールを抑止するためには php yii serve ``` -> Note: デフォルトでは、この HTTP サーバは 8080 ポートをリスンします。 -しかし、このポートがすでに使われていたり、複数のアプリケーションをこの方法で動かしたい場合は、どのポートを使うかを指定したいと思うでしょう。 -単に --port 引数を追加して下さい。 +> Note: デフォルトでは、この HTTP サーバは 8080 ポートをリスンします。しかし、このポートがすでに使われていたり、複数のアプリケーションをこの方法で動かしたい場合は、 + どのポートを使うかを指定したいと思うでしょう。単に --port 引数を追加して下さい。 ```bash php yii serve --port=8888 @@ -163,11 +161,10 @@ http://localhost:8080/ ![Yii のインストールが成功](images/start-app-installed.png) -ブラウザに上のような "おめでとう!" のページが表示されるはずです。 -もし表示されなかったら、PHP のインストールが Yii の必要条件を満たしているかどうか、チェックしてください。 +ブラウザに上のような "おめでとう!" のページが表示されるはずです。もし表示されなかったら、PHP のインストールが Yii の必要条件を満たしているかどうか、チェックしてください。 最低限の必要条件を満たしているかどうかは、次の方法のどちらかによってチェックすることが出来ます。 -* `requirements.php` を `/web/requirements.php` としてコピーし、ブラウザを使って URL `http://localhost/requirements.php` にアクセスする。 +* `/requirements.php` を `/web/requirements.php` としてコピーし、ブラウザを使って URL `http://localhost/requirements.php` にアクセスする。 * 次のコマンドを実行する。 ```bash @@ -177,29 +174,37 @@ http://localhost:8080/ Yii の最低必要条件を満たすように PHP のインストールを構成しなければなりません。 最も重要なことは、PHP 5.4 以上でなければならないということです。最新の PHP 7 なら理想的です。 -また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベースドライバ (MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。 +また、アプリケーションがデータベースを必要とする場合は、[PDO PHP 拡張](http://www.php.net/manual/ja/pdo.installation.php) および対応するデータベース・ドライバ (MySQL データベースのための `pdo_mysql` など) をインストールしなければなりません。 ウェブ・サーバを構成する ------------------------ -> Info: もし Yii の試運転をしているだけで、本番サーバに配備する意図がないのであれば、当面、この項は飛ばしても構いません。 +> Info: もし Yii の試運転をしているだけで、本番サーバに配備する意図がないのであれば、 + 当面、この項は飛ばしても構いません。 -上記の説明に従ってインストールされたアプリケーションは、[Apache HTTP サーバ](http://httpd.apache.org/) と [Nginx HTTP サーバ](http://nginx.org/) のどちらでも、また、Windows、Mac OS X、Linux のどれでも、PHP 5.4 以上を走らせている環境であれば、そのままの状態で動作するはずです。 +上記の説明に従ってインストールされたアプリケーションは、[Apache HTTP サーバ](http://httpd.apache.org/) +と [Nginx HTTP サーバ](http://nginx.org/) のどちらでも、また、Windows、Mac OS X、Linux のどれでも、 +PHP 5.4 以上を走らせている環境であれば、そのままの状態で動作するはずです。 Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性があります。 ただし HHVM がネイティブの PHP とは異なる振舞いをする特殊なケースもいくつかありますので、HHVM を使うときはいくらか余分に注意を払う必要があります。 -本番用のサーバでは、`http://www.example.com/basic/web/index.php` の代りに `http://www.example.com/index.php` という URL でアプリケーションにアクセス出来るようにウェブ・サーバを設定したいでしょう。 -そういう設定をするためには、ウェブ・サーバのドキュメントルートを `basic/web` フォルダに向けることが必要になります。 +本番用のサーバでは、`http://www.example.com/basic/web/index.php` の代りに `http://www.example.com/index.php` という +URL でアプリケーションにアクセス出来るようにウェブ・サーバを設定したいでしょう。 +そういう設定をするためには、ウェブ・サーバのドキュメント・ルートを `basic/web` フォルダに向けることが必要になります。 また、[ルーティングと URL 生成](runtime-routing.md) のセクションで述べられているように、URL から `index.php` を隠したいとも思うでしょう。 -このセクションでは、これらの目的を達するために Apache または Nginx サーバをどのように設定すれば良いかを学びます。 +この項では、これらの目的を達するために Apache または Nginx サーバをどのように設定すれば良いかを学びます。 -> Info: `basic/web` をドキュメント・ルートに設定することは、`basic/web` の兄弟ディレクトリに保存されたプライベートなアプリケーション・コードや公開できないデータ・ファイルにエンド・ユーザがアクセスすることを防止することにもなります。 +> Info: `basic/web` をドキュメント・ルートに設定することは、`basic/web` の兄弟ディレクトリに保存されたプライベートなアプリケーション・コードや +公開できないデータ・ファイルにエンド・ユーザがアクセスすることを防止することにもなります。 `basic/web` 以外のフォルダに対するアクセスを拒否することはセキュリティ強化の一つです。 -> Info: あなたがウェブ・サーバの設定を修正する権限を持たない共用ホスティング環境でアプリケーションが走る場合であっても、セキュリティ強化のためにアプリケーションの構造を調整することがまだ出来ます。 +> Info: あなたがウェブ・サーバの設定を修正する権限を持たない共用ホスティング環境でアプリケーションが走る場合であっても、 +セキュリティ強化のためにアプリケーションの構造を調整することがまだ出来ます。 詳細については、[共有ホスティング環境](tutorial-shared-hosting.md) のセクションを参照してください。 +> Info: あなたのアプリケーションをリバース・プロキシの背後で動かそうとする場合は、 +> リクエスト・コンポーネントの [信頼できるプロキシとヘッダ](runtime-requests.md#trusted-proxies) を構成する必要があるかもしれません。 ### 推奨される Apache の構成 @@ -207,7 +212,7 @@ Yii 2.0 は、また、facebook の [HHVM](http://hhvm.com/) とも互換性が `path/to/basic/web` の部分を `basic/web` の実際のパスに置き換えなければならないことに注意してください。 ```apache -# ドキュメントルートを "basic/web" に設定 +# ドキュメント・ルートを "basic/web" に設定 DocumentRoot "path/to/basic/web" @@ -219,6 +224,9 @@ DocumentRoot "path/to/basic/web" # そうでなければ、リクエストを index.php に送付する RewriteRule . index.php + # UrlManager の $showScriptName が false の場合は、スクリプト名で URL にアクセスすることを許さない + RewriteRule ^index.php/ - [L,R=404] + # ... 他の設定 ... ``` @@ -275,6 +283,8 @@ server { } ``` -この構成を使う場合は、多数の不要な `stat()` システム・コールを避けるために、`php.ini` ファイルで `cgi.fix_pathinfo=0` を同時に設定しておくべきです。 +この構成を使う場合は、多数の不要な `stat()` システム・コールを避けるために、 +`php.ini` ファイルで `cgi.fix_pathinfo=0` を同時に設定しておくべきです。 -また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、`fastcgi_param HTTPS on;` を追加しなければならないことにも注意を払ってください。 +また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、 +`fastcgi_param HTTPS on;` を追加しなければならないことにも注意を払ってください。 diff --git a/docs/guide-ja/start-looking-ahead.md b/docs/guide-ja/start-looking-ahead.md index 2a2d6191541..fb893a5d712 100644 --- a/docs/guide-ja/start-looking-ahead.md +++ b/docs/guide-ja/start-looking-ahead.md @@ -3,7 +3,7 @@ 「はじめよう」の章全体を読み通したなら、いまやあなたは、完全な Yii のアプリケーションを作成したことがある、ということになります。 その過程で、あなたは必要とされることが多いいくつかの機能、例えば、HTML フォームを通じてユーザからデータを取得することや、データベースからデータを取得すること、また、ページ付けをしてデータを表示することなどを実装する方法を学びました。 -また、[Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide-ja/README.md) を使ってコードを自動的に生成する方法も学びました。 +また、[Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) を使ってコードを自動的に生成する方法も学びました。 Gii をコード生成に使うと、ウェブ開発のプロセスの大部分が、いくつかのフォームに入力していくだけの簡単な仕事になります。 このセクションでは、Yii フレームワークを使うときの生産性を更に高めるために利用できるリソースについてまとめます。 @@ -11,7 +11,7 @@ Gii をコード生成に使うと、ウェブ開発のプロセスの大部分 * ドキュメント - [決定版ガイド](http://www.yiiframework.com/doc-2.0/guide-README.html): 名前が示すように、このガイドは Yii がどのように動作すべきものかを正確に記述し、Yii を使用するについての全般的な手引きを提供するものです。 - これは唯一の最も重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前にあなたはこれを読まなければなりません。 + これは唯一の最も重要な Yii のチュートリアルであり、Yii のコードを少しでも書く前にあなたが読まなければならないものです。 - [クラス・リファレンス](http://www.yiiframework.com/doc-2.0/index.html): これは Yii によって提供される全てのクラスの使用法を記述しています。 主として、コードを書いている時に、特定のクラス、メソッド、プロパティについて理解したい場合に読まれるべきものです。 diff --git a/docs/guide-ja/start-prerequisites.md b/docs/guide-ja/start-prerequisites.md index c31cd7ce5ab..4a37d68ed65 100644 --- a/docs/guide-ja/start-prerequisites.md +++ b/docs/guide-ja/start-prerequisites.md @@ -5,19 +5,19 @@ Yii の学習曲線は他の PHP フレームワークほど急峻ではあり ## PHP Yii は PHP フレームワークですから、必ず [言語リファレンスを読んで理解する](http://php.net/manual/ja/langref.php) ようにして下さい。 -Yii を使って開発するときはオブジェクト指向でコードを書くことになりますから、必ず、 -[クラスとオブジェクト](https://secure.php.net/manual/ja/language.oop5.basic.php) および [名前空間](https://secure.php.net/manual/ja/language.namespaces.php) には慣れ親しんでおいて下さい。 +Yii を使って開発するときはオブジェクト指向の流儀でコードを書くことになりますから、必ず、[クラスとオブジェクト](https://secure.php.net/manual/ja/language.oop5.basic.php) および [名前空間](https://secure.php.net/manual/ja/language.namespaces.php) には慣れ親しんでおいて下さい。 ## オブジェクト指向プログラミング オブジェクト指向プログラミングの基礎的な理解が必要です。これに慣れていない場合は、利用できるチュートリアルが沢山ありますので、その中の一つをチェックして下さい。 例えば、[tuts+ の中の一つ](https://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762) など。 -あなたのアプリケーションが複雑であればあるほど、その複雑性を管理するために、より高度な OOP 概念を学ぶ必要があることに留意して下さい。 +あなたのアプリケーションが複雑であればあるほど、その複雑性をうまく管理するために、 +より高度な OOP 概念を学ぶ必要があることに留意して下さい。 -## コマンドラインと Composer +## コマンド・ラインと Composer + +Yii は業界標準の PHP パッケージ管理ソフトである [Composer](https://getcomposer.org/) を広範囲に使用していますので、必ずその [ガイド](https://getcomposer.org/doc/01-basic-usage.md) を読んで理解して下さい。 +あなたがコマンド・ラインの使用に慣れていないのであれば、今こそ使い始めてみるべき時です。 +いったん基礎さえ学習してしまえば、二度とコマンド・ラインなしで仕事をしようとは思わなくなりますよ。 -Yii は業界標準の PHP パッケージ管理ソフトである [Composer](https://getcomposer.org/) を広範囲に使用していますので、 -必ずその [ガイド](https://getcomposer.org/doc/01-basic-usage.md) を読んで理解して下さい。 -あなたがコマンドラインの使用に慣れていないのであれば、今こそ使い始めてみるべき時です。 -いったん基礎を学習すれば、二度とコマンドラインなしで仕事をしようとは思わなくなりますよ。 diff --git a/docs/guide-ja/start-workflow.md b/docs/guide-ja/start-workflow.md index 3d49c996831..5a0a61293e4 100644 --- a/docs/guide-ja/start-workflow.md +++ b/docs/guide-ja/start-workflow.md @@ -3,38 +3,40 @@ Yii のインストールが終ると、実際に動く Yii のアプリケーションにアクセスすることが出来ます。 その URL は、`http://hostname/basic/web/index.php` あるいは `http://hostname/index.php` など、設定によって異なります。 -このセクションでは、アプリケーションに組み込み済みの機能を紹介し、コードがどのように編成されているか、そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。 +このセクションでは、アプリケーションに組み込み済みの機能を紹介し、コードがどのように編成されているか、 +そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。 -> Info: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、`basic/web` をウェブ・サーバのドキュメント・ルートとして設定したと仮定します。 +> Info: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、`basic/web` + をウェブ・サーバのドキュメント・ルートとして設定したと仮定します。 そして、アプリケーションにアクセスするための URL は `http://hostname/index.php` またはそれに似たものになるように設定したと仮定します。 必要に応じて、説明の中の URL を読み替えてください。 - フレームワークそのものとは異なり、プロジェクト・テンプレートはインストール後は完全にあなたのものであることに注意してください。 必要に応じてコードを追加したり削除したり、完全に書き換えたりするのはあなたの自由です。 + 機能 ---- -インストールされた基本的なアプリケーションは四つのページを持っています。 +インストールされたベーシック・アプリケーションは四つのページを持っています。 * ホームページ: `http://hostname/index.php` の URL にアクセスすると表示されます。 * 「について」のページ。 * 「コンタクト」のページ: エンド・ユーザがメールであなたに連絡を取ることが出来るコンタクト・フォームが表示されます。 * 「ログイン」ページ: エンド・ユーザを認証するためのログイン・フォームが表示されます。 - "admin/admin" でログインしてみてください。 - 「ログイン」のメイン・メニュー項目が「ログアウト」に変ることに気付くでしょう。 + "admin/admin" でログインしてみてください。「ログイン」のメイン・メニュー項目が「ログアウト」に変ることに気付くでしょう。 これらのページは共通のヘッダとフッタを持っています。 ヘッダには、異なるページ間を行き来することを可能にするメイン・メニュー・バーがあります。 ブラウザのウィンドウの下部にツールバーがあることにも気がつくはずです。 -これは Yii によって提供される便利な [デバッグ・ツール・バー](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) であり、たくさんのデバッグ情報、例えば、ログ・メッセージ、レスポンスのステータス、実行されたデータベース・クエリなどを記録して表示するものです。 +これは Yii によって提供される便利な [デバッグ・ツール](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) であり、たくさんのデバッグ情報、例えば、ログ・メッセージ、レスポンスのステータス、実行されたデータベース・クエリなどを記録して表示するものです。 ウェブ・アプリケーションに加えて、`yii` というコンソール・スクリプトがアプリケーションのベース・ディレクトリにあります。 このスクリプトは、バックグラウンドのタスクまたはメンテナンスのタスクを実行するために使用することが出来ます。 これについては、[コンソール・アプリケーションのセクション](tutorial-console.md) で説明されています。 + アプリケーションの構造 ---------------------- @@ -52,7 +54,7 @@ basic/ アプリケーションのベース・パス runtime/ 実行時に Yii によって生成されるファイル (ログやキャッシュなど) を格納 vendor/ インストールされた Composer パッケージ (Yii フレームワークそのものを含む) を格納 views/ ビュー・ファイルを格納 - web/ アプリケーションのウェブ・ルート。ウェブからアクセス可能なファイルを格納 + web/ アプリケーションのウェブ・ルート。ウェブ・アクセス可能なファイルを格納 assets/ Yii によって発行されるアセット・ファイル (javascript と CSS) を格納 index.php アプリケーションのエントリ・スクリプト (ブートストラップ・スクリプト) yii Yii コンソール・コマンド実行スクリプト @@ -61,7 +63,8 @@ basic/ アプリケーションのベース・パス 一般に、アプリケーションのファイルは二種類に分けることが出来ます。すなわち、`basic/web` の下にあるファイルとその他のディレクトリの下にあるファイルです。 前者は HTTP で (すなわちブラウザで) 直接にアクセスすることが出来ますが、後者は直接のアクセスは出来ませんし、許可すべきでもありません。 -Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) アーキテクチャ・パターンを実装していますが、それが上記のディレクトリ構成にも反映されています。 +Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) アーキテクチャ・パターンを実装していますが、 +それが上記のディレクトリ構成にも反映されています。 `models` ディレクトリが全ての [モデル・クラス](structure-models.md) を格納し、`views` ディレクトリが全ての [ビュー・スクリプト](structure-views.md) を格納し、 `controllers` ディレクトリが全ての [コントローラ・クラス](structure-controllers.md) を格納しています。 @@ -70,22 +73,24 @@ Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/ ![アプリケーションの静的な構造](images/application-structure.png) 各アプリケーションは一つのエントリ・スクリプト `web/index.php` を持ちます。 -これはアプリケーション中で唯一ウェブからアクセス可能な PHP スクリプトです。 +これはアプリケーション中で唯一ウェブ・アクセス可能な PHP スクリプトです。 エントリ・スクリプトは入力されたリクエストを受け取って、[アプリケーション](structure-applications.md) のインスタンスを作成します。 [アプリケーション](structure-applications.md) は [コンポーネント](concept-components.md) の助力を得てリクエストを解決し、リクエストを MVC に送付します。 [ウィジェット](structure-widgets.md) は、複雑で動的なユーザ・インタフェイス要素を構築するために、[ビュー](structure-views.md) の中で使われます。 -リクエストのライフ・サイクル ----------------------------- +リクエストのライフサイクル +-------------------------- 次の図は、アプリケーションがどのようにリクエストを処理するかを示すものです。 -![リクエストのライフ・サイクル](images/request-lifecycle.png) +![リクエストのライフサイクル](images/request-lifecycle.png) 1. ユーザが [エントリ・スクリプト](structure-entry-scripts.md) `web/index.php` に対してリクエストを出します。 -2. エントリ・スクリプトはアプリケーションの [構成情報](concept-configurations.md) を読み出して、リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。 -3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーション・コンポーネントの助力を得て、リクエストされた [ルート](runtime-routing.md) を解決します。 +2. エントリ・スクリプトはアプリケーションの [構成情報](concept-configurations.md) を読み出して、 + リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。 +3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーション・コンポーネントの助力を得て、 + リクエストされた [ルート](runtime-routing.md) を解決します。 4. アプリケーションがリクエストを処理する [コントローラ](structure-controllers.md) のインスタンスを作成します。 5. コントローラが [アクション](structure-controllers.md) のインスタンスを作成し、アクションのためのフィルタを実行します。 6. 一つでもフィルタが失敗したときは、アクションはキャンセルされます。 diff --git a/docs/guide-ja/structure-application-components.md b/docs/guide-ja/structure-application-components.md index 02e05fc9a2c..a75554af1af 100644 --- a/docs/guide-ja/structure-application-components.md +++ b/docs/guide-ja/structure-application-components.md @@ -2,8 +2,9 @@ ================================ アプリケーションは [サービス・ロケータ](concept-service-locator.md) です。 -アプリケーションは、リクエストを処理するためのいろいろなサービスを提供する一連のオブジェクト、いわゆる *アプリケーション・コンポーネント* をホストします。 -例えば、`urlManager` がウェブ・リクエストを適切なコントローラにルーティングする役割を負い、`db` コンポーネントが DB 関連のサービスを提供する、等々です。 +アプリケーションは、リクエストを処理するためのいろいろなサービスを提供する一組の *アプリケーション・コンポーネント* と呼ばれるものをホストします。 +例えば、`urlManager` がウェブ・リクエストを適切なコントローラにルーティングする役割を負い、 +`db` コンポーネントが DB 関連のサービスを提供する、等々です。 全てのアプリケーション・コンポーネントは、それぞれ、同一のアプリケーション内で他のアプリケーション・コンポーネントから区別できるように、ユニークな ID を持ちます。 アプリケーション・コンポーネントには、次の式によってアクセス出来ます。 @@ -57,8 +58,7 @@ けれども、場合によっては、明示的にアクセスされないときでも、リクエストごとにアプリケーション・コンポーネントのインスタンスを作成したいことがあります。 そうするために、アプリケーションの [[yii\base\Application::bootstrap|bootstrap]] プロパティのリストにそのコンポーネントの ID を挙げることが出来ます。 -また、特別なコンポーネントをブートストラップするためにクロージャを用いることも出来ます。 -インスタンス化されたコンポーネントを返すことは要求されません。 +また、カスタマイズしたコンポーネントをブートストラップするためにクロージャを用いることも出来ます。インスタンス化されたコンポーネントを返すことは要求されません。 単に [[yii\base\Application]] のインスタンス化の後にコードを走らせるだけのためにクロージャを使うことも出来ます。 例えば、次のアプリケーション構成情報は、`log` コンポーネントが常にロードされることを保証するものです。 @@ -87,9 +87,10 @@ ## コア・アプリケーション・コンポーネント Yii は固定の ID とデフォルトの構成情報を持つ一連の *コア*・アプリケーション・コンポーネントを定義しています。 -例えば、[[yii\web\Application::request|request]] コンポーネントは、ユーザ・リクエストに関する情報を収集して、それを [ルート](runtime-routing.md) として解決するために使用されます。 +例えば、[[yii\web\Application::request|request]] コンポーネントは、ユーザ・リクエストに関する情報を収集して、 +それを [ルート](runtime-routing.md) として解決するために使用されます。 また、[[yii\base\Application::db|db]] コンポーネントは、それを通じてデータ・ベースクエリを実行できるデータベース接続を表現します。 -Yii のアプリケーションがユーザリクエストを処理出来るのは、まさにこれらのコア・アプリケーション・コンポーネントの助けがあってこそです。 +Yii のアプリケーションがユーザ・リクエストを処理出来るのは、まさにこれらのコア・アプリケーション・コンポーネントの助けがあってこそです。 下記が事前に定義されたコア・アプリケーション・コンポーネントです。 通常のアプリケーション・コンポーネントに対するのと同様に、これらを構成し、カスタマイズすることが出来ます。 @@ -98,8 +99,9 @@ Yii のアプリケーションがユーザリクエストを処理出来るの * [[yii\web\AssetManager|assetManager]]: アセット・バンドルとアセットの発行を管理します。 詳細は [アセット](structure-assets.md) のセクションを参照してください。 * [[yii\db\Connection|db]]: データベース接続を表します。これを通じて、DB クエリを実行することが出来ます。 - このコンポーネントを構成するときは、コンポーネントのクラスはもちろん、[[yii\db\Connection::dsn]] のような必須のコンポーネント・プロパティを指定しなければならないことに注意してください。 - 詳細は [データアクセス・オブジェクト](db-dao.md) のセクションを参照してください。 + このコンポーネントを構成するときは、コンポーネントのクラスはもちろん、[[yii\db\Connection::dsn]] + のような必須のコンポーネント・プロパティを指定しなければならないことに注意してください。 + 詳細は [データベース・アクセス・オブジェクト](db-dao.md) のセクションを参照してください。 * [[yii\base\Application::errorHandler|errorHandler]]: PHP のエラーと例外を処理します。 詳細は [エラー処理](runtime-handling-errors.md) のセクションを参照してください。 * [[yii\i18n\Formatter|formatter]]: エンド・ユーザに表示されるデータに書式を設定します。 diff --git a/docs/guide-ja/structure-applications.md b/docs/guide-ja/structure-applications.md index 03f9b558b1e..aa6542629f4 100644 --- a/docs/guide-ja/structure-applications.md +++ b/docs/guide-ja/structure-applications.md @@ -1,19 +1,22 @@ アプリケーション ================ -アプリケーションは Yii アプリケーション・システム全体の構造とライフ・サイクルを統制するオブジェクトです。 +アプリケーションは Yii アプリケーション・システム全体の構造とライフサイクルを統制するオブジェクトです。 全ての Yii アプリケーション・システムは、それぞれ、単一のアプリケーション・オブジェクトを持ちます。 アプリケーション・オブジェクトは、[エントリ・スクリプト](structure-entry-scripts.md) において作成され、`\Yii::$app` という式でグローバルにアクセスすることが出来るオブジェクトです。 -> Info: ガイドの中で「アプリケーション」という言葉は、文脈に応じて、アプリケーション・オブジェクトを意味したり、アプリケーション・システムを意味したりします。 +> Info: ガイドの中で「アプリケーション」という言葉は、文脈に応じて、アプリケーション・オブジェクトを意味したり、 + アプリケーション・システムを意味したりします。 -二種類のアプリケーション、すなわち、[[yii\web\Application|ウェブ・アプリケーション]] と [[yii\console\Application|コンソール・アプリケーション]] があります。 +二種類のアプリケーション、すなわち、[[yii\web\Application|ウェブ・アプリケーション]] と +[[yii\console\Application|コンソール・アプリケーション]] があります。 名前が示すように、前者は主にウェブのリクエストを処理し、後者はコンソール・コマンドのリクエストを処理します。 ## アプリケーションの構成情報 -[エントリ・スクリプト](structure-entry-scripts.md) は、アプリケーションを作成するときに、下記のように、[構成情報](concept-configurations.md) を読み込んで、それをアプリケーションに適用します。 +[エントリ・スクリプト](structure-entry-scripts.md) は、アプリケーションを作成するときに、下記のように、 +[構成情報](concept-configurations.md) を読み込んで、それをアプリケーションに適用します。 ```php require __DIR__ . '/../vendor/autoload.php'; @@ -26,8 +29,10 @@ $config = require __DIR__ . '/../config/web.php'; (new yii\web\Application($config))->run(); ``` -通常の [構成情報](concept-configurations.md) と同じように、アプリケーションの構成情報は、アプリケーション・オブジェクトのプロパティをどのように初期化するかを指定するものです。 -アプリケーションの構成情報は、たいていは非常に複雑なものですから、通常は、上記の例の `web.php` ファイルのように、[構成情報ファイル](concept-configurations.md#configuration-files) に保管されます。 +通常の [構成情報](concept-configurations.md) と同じように、アプリケーションの構成情報は、 +アプリケーション・オブジェクトのプロパティをどのように初期化するかを指定するものです。 +アプリケーションの構成情報は、たいていは非常に複雑なものですから、通常は、上記の例の `web.php` ファイルのように、 +[構成情報ファイル](concept-configurations.md#configuration-files) に保管されます。 ## アプリケーションのプロパティ @@ -55,22 +60,22 @@ $config = require __DIR__ . '/../config/web.php'; [[yii\base\Application::basePath|basePath]] プロパティは、アプリケーションのルート・ディレクトリを指定するものです。 これは、アプリケーション・システムの全ての保護されたソース・コードを収容するディレクトリです。 -通常、このディレクトリの下に、MVC パターンに対応するソース・コードを収容した `models`、`views`、`controllers` などのサブ・ディレクトリがあります。 +通常、このディレクトリの下に、MVC パターンに対応するソース・コードを収容した `models`、`views`、`controllers` +などのサブ・ディレクトリがあります。 [[yii\base\Application::basePath|basePath]] プロパティの構成には、ディレクトリ・パスを使っても、[パス・エイリアス](concept-aliases.md) を使っても構いません。 どちらの形式においても、対応するディレクトリが存在しなければなりません。 -さもなくば、例外が投げられます。 -パスは `realpath()` 関数を呼び出して正規化されます。 +さもなくば、例外が投げられます。パスは `realpath()` 関数を呼び出して正規化されます。 [[yii\base\Application::basePath|basePath]] プロパティは、しばしば、他の重要なパス (例えば、runtime のパス) を派生させるために使われます。 このため、`basePath` を示す `@app` というパス・エイリアスが、あらかじめ定義されています。 -その結果、派生的なパスはこのエイリアスを使って形成することが出来ます -(例えば、runtime ディレクトリを示す `@app/runtime` など)。 +その結果、派生的なパスはこのエイリアスを使って形成することが出来ます(例えば、runtime ディレクトリを示す `@app/runtime` など)。 ### 重要なプロパティ -この項で説明するプロパティは、アプリケーションごとに異なってくるものであるため、たいてい、構成する必要が生じます。 +この項で説明するプロパティは、アプリケーションごとに異なるものであるため、 +構成する必要がよく生じるものです。 #### [[yii\base\Application::aliases|aliases]] @@ -88,14 +93,16 @@ $config = require __DIR__ . '/../config/web.php'; ] ``` -このプロパティが提供されているのは、[[Yii::setAlias()]] メソッドを呼び出す代りに、アプリケーションの構成情報を使ってエイリアスを定義することが出来るようにするためです。 +このプロパティが提供されているのは、[[Yii::setAlias()]] メソッドを呼び出す代りに、 +アプリケーションの構成情報を使ってエイリアスを定義することが出来るようにするためです。 #### [[yii\base\Application::bootstrap|bootstrap]] これは非常に有用なプロパティです。 これによって、アプリケーションの [[yii\base\Application::bootstrap()|ブートストラップの過程]] において走らせるべきコンポーネントを配列として指定することが出来ます。 -例えば、ある [モジュール](structure-modules.md) に [URL 規則](runtime-routing.md) をカスタマイズさせたいときに、モジュールの ID をこのプロパティの要素として挙げることが出来ます。 +例えば、ある [モジュール](structure-modules.md) に [URL 規則](runtime-routing.md) をカスタマイズさせたいときに、 +モジュールの ID をこのプロパティの要素として挙げることが出来ます。 このプロパティにリストする各コンポーネントは、以下の形式のいずれかによって指定することが出来ます。 @@ -130,8 +137,10 @@ $config = require __DIR__ . '/../config/web.php'; ] ``` -> Info: モジュール ID と同じ ID のアプリケーション・コンポーネントがある場合は、ブートストラップの過程ではアプリケーション・コンポーネントが使われます。 -> 代りにモジュールを使いたいときは、次のように、無名関数を使って指定することが出来ます。 +> Info: モジュール ID と同じ ID のアプリケーション・コンポーネントがある場合は、 +> ブートストラップの過程ではアプリケーション・コンポーネントが使われます。 +> 代りにモジュールを使いたいときは、次のように、無名関数を使って指定することが出来ます。 +> > ```php > [ > function () { @@ -140,11 +149,14 @@ $config = require __DIR__ . '/../config/web.php'; > ] > ``` + ブートストラップの過程で、各コンポーネントのインスタンスが作成されます。 -そして、コンポーネント・クラスが [[yii\base\BootstrapInterface]] を実装している場合は、その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドも呼び出されます。 +そして、コンポーネント・クラスが [[yii\base\BootstrapInterface]] を実装している場合は、 +その [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] メソッドも呼び出されます。 もう一つの実用的な例が [ベーシック・プロジェクト・テンプレート](start-installation.md) のアプリケーションの構成情報の中にあります。 -そこでは、アプリケーションが開発環境で走るときには `debug` モジュールと `gii` モジュールがブートストラップ・コンポーネントとして構成されています。 +そこでは、アプリケーションが開発環境で走るときには `debug` モジュールと `gii` モジュールが +ブートストラップ・コンポーネントとして構成されています。 ```php if (YII_ENV_DEV) { @@ -158,8 +170,7 @@ if (YII_ENV_DEV) { ``` > Note: あまり多くのコンポーネントを `bootstrap` に置くと、アプリケーションのパフォーマンスを劣化させます。 - なぜなら、リクエストごとに同じ一連のコンポーネントを走らせなければならないからです。 - ですから、ブートストラップ・コンポーネントは賢く使ってください。 + なぜなら、リクエストごとに同じ一連のコンポーネントを走らせなければならないからです。ですから、ブートストラップ・コンポーネントは賢く使ってください。 #### [[yii\web\Application::catchAll|catchAll]] @@ -169,8 +180,7 @@ if (YII_ENV_DEV) { これは主としてアプリケーションがメンテナンス・モードにあって、入ってくる全てのリクエストを単一のアクションで処理する必要があるときに使われます。 構成情報は配列の形を取り、最初の要素はアクションのルートを指定します。 -そして、配列の残りの要素 (キー・値のペア) は、アクションに渡されるパラメータを指定します。 -例えば、 +そして、配列の残りの要素 (キー・値のペア) は、アクションに渡されるパラメータを指定します。例えば、 ```php [ @@ -184,12 +194,10 @@ if (YII_ENV_DEV) { > Info: このプロパティを有効にすると、開発環境でデバッグ・パネルが動作しなくなります。 - #### [[yii\base\Application::components|components]] これこそが、唯一の最も重要なプロパティです。 -これによって、[アプリケーション・コンポーネント](structure-application-components.md) と呼ばれる一連の名前付きのコンポーネントを登録して、それらを他の場所で使うことが出来るようになります。 -例えば、 +これによって、[アプリケーション・コンポーネント](structure-application-components.md) と呼ばれる一連の名前付きのコンポーネントを登録して、それらを他の場所で使うことが出来るようになります。例えば、 ```php [ @@ -234,7 +242,8 @@ if (YII_ENV_DEV) { ] ``` -このプロパティの配列のキーはコントローラ ID を表し、配列の値は対応するコントローラ・クラスの名前または [構成情報](concept-configurations.md) を表します。 +このプロパティの配列のキーはコントローラ ID を表し、配列の値は対応するコントローラ・クラスの名前または +[構成情報](concept-configurations.md) を表します。 #### [[yii\base\Application::controllerNamespace|controllerNamespace]] @@ -244,12 +253,15 @@ if (YII_ENV_DEV) { コントローラ ID が `post` である場合、規約によって対応するコントローラの (名前空間を略した) クラス名は `PostController` となり、完全修飾クラス名は `app\controllers\PostController` となります。 コントローラ・クラスは、この名前空間に対応するディレクトリのサブ・ディレクトリに配置されても構いません。 -例えば、コントローラ ID として `admin/post` を仮定すると、対応するコントローラの完全修飾クラス名は `app\controllers\admin\PostController` となります。 +例えば、コントローラ ID として `admin/post` を仮定すると、対応するコントローラの完全修飾クラス名は +`app\controllers\admin\PostController` となります。 -重要なことは、完全修飾されたコントローラ・クラスが [オートロード可能](concept-autoloading.md) でなければならず、コントローラ・クラスの実際の名前空間がこのプロパティと合致していなければならない、ということです。 +重要なことは、完全修飾されたコントローラ・クラスが [オートロード可能](concept-autoloading.md) でなければならず、 +コントローラ・クラスの実際の名前空間がこのプロパティと合致していなければならない、ということです。 そうでないと、アプリケーションにアクセスしたときに "ページがみつかりません" というエラーを受け取ることになります。 -上で説明された規約を破りたい場合は、[controllerMap](#controllerMap) プロパティを構成することが出来ます。 +上で説明された規約を破りたい場合は、 +[controllerMap](#controllerMap) プロパティを構成することが出来ます。 #### [[yii\base\Application::language|language]] @@ -259,7 +271,9 @@ if (YII_ENV_DEV) { アプリケーションが多言語をサポートする必要があるときは、このプロパティを構成しなければなりません。 このプロパティの値が、メッセージの翻訳、日付の書式、数字の書式などを含む [国際化](tutorial-i18n.md) のさまざまな側面を決定します。 -例えば、[[yii\jui\DatePicker]] ウィジェットは、どの言語でカレンダーを表示すべきか、そして日付をどのように書式設定すべきかを、デフォルトでは、このプロパティを使用して決定します。 +例えば、[[yii\jui\DatePicker]] ウィジェットは、どの言語でカレンダーを表示すべきか、 +そして日付をどのように書式設定すべきかを、デフォルトでは、 +このプロパティを使用して決定します。 言語を指定するのには、[IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従うことが推奨されます。 例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。 @@ -295,7 +309,8 @@ if (YII_ENV_DEV) { #### [[yii\base\Application::name|name]] このプロパティは、エンド・ユーザに対して表示されるアプリケーション名を指定するものです。 -[[yii\base\Application::id|id]] プロパティがユニークな値を取らなければならないのとは違って、このプロパティの値は主として表示目的であり、ユニークである必要はありません。 +[[yii\base\Application::id|id]] プロパティがユニークな値を取らなければならないのとは違って、 +このプロパティの値は主として表示目的であり、ユニークである必要はありません。 コードのどこにも使わないのであれば、このプロパティは必ずしも構成する必要はありません。 @@ -303,7 +318,8 @@ if (YII_ENV_DEV) { #### [[yii\base\Application::params|params]] このプロパティは、グローバルにアクセス可能なアプリケーション・パラメータの配列を指定するものです。 -コードの中のいたる処でハードコードされた数値や文字列を使う代りに、それらをアプリケーション・パラメータとして一ヶ所で定義し、必要な場所ではそのパラメータを使うというのが良いプラクティスです。 +コードの中のいたる処でハードコードされた数値や文字列を使う代りに、それらをアプリケーション・パラメータとして一ヶ所で定義し、 +必要な場所ではそのパラメータを使うというのが良いプラクティスです。 例えば、次のように、サムネール画像のサイズをパラメータとして定義することが出来ます。 ```php @@ -321,16 +337,17 @@ $size = \Yii::$app->params['thumbnail.size']; $width = \Yii::$app->params['thumbnail.size'][0]; ``` -後でサムネールのサイズを変更すると決めたときは、アプリケーションの構成情報においてのみサイズを修正すればよく、これに依存するコードには少しも触れる必要がありません。 +後でサムネールのサイズを変更すると決めたときは、アプリケーションの構成情報においてのみサイズを修正すればよく、 +これに依存するコードには少しも触れる必要がありません。 #### [[yii\base\Application::sourceLanguage|sourceLanguage]] -このプロパティはアプリケーション・コードが書かれている言語を指定するものです。 -デフォルト値は `'en-US'`、アメリカ合衆国の英語です。 +このプロパティはアプリケーション・コードが書かれている言語を指定するものです。デフォルト値は `'en-US'`、アメリカ合衆国の英語です。 あなたのコードのテキストのコンテントが英語以外で書かれているときは、このプロパティを構成しなければなりません。 -[language](#language) プロパティと同様に、このプロパティは [IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従って構成しなければなりません。 +[language](#language) プロパティと同様に、このプロパティは +[IETF 言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従って構成しなければなりません。 例えば、`en` は英語を意味し、`en-US` はアメリカ合衆国の英語を意味します。 このプロパティに関する詳細は [国際化](tutorial-i18n.md) のセクションで読むことが出来ます。 @@ -357,14 +374,14 @@ $width = \Yii::$app->params['thumbnail.size'][0]; ### 有用なプロパティ -この項で説明されるプロパティは通常は構成されません。というのは、そのデフォルト値が通常の規約を指定しているからです。 +この項で説明されるプロパティは通常は構成されません。というのは、そのデフォルト値が通常の規約に由来するものであるからです。 しかしながら、規約を破る必要がある場合には、これらのプロパティを構成することが出来ます。 #### [[yii\base\Application::charset|charset]] このプロパティはアプリケーションが使う文字セットを指定するものです。 -デフォルト値は `'UTF-8'` であり、あなたのアプリケーションが多数の非ユニコード・データを使うレガシー・システムと連携するのでなければ、たいていのアプリケーションでは、そのままにしておくべきです。 +デフォルト値は `'UTF-8'` であり、多数の非ユニコード・データを使うレガシー・システムを扱っている場合を除けば、たいていのアプリケーションでは、そのままにしておくべきです。 #### [[yii\base\Application::defaultRoute|defaultRoute]] @@ -374,10 +391,12 @@ $width = \Yii::$app->params['thumbnail.size'][0]; 例えば、`help`、`post/create`、`admin/post/create` などです。 アクション ID が与えられていない場合は、[[yii\base\Controller::defaultAction]] で指定されるデフォルト値を取ります。 -[[yii\web\Application|ウェブ・アプリケーション]] では、このプロパティのデフォルト値は `'site'` であり、その意味するところは、`SiteController` コントローラとそのデフォルト・アクションが使用されるべきである、ということです。 +[[yii\web\Application|ウェブ・アプリケーション]] では、このプロパティのデフォルト値は `'site'` であり、 +その意味するところは、`SiteController` コントローラとそのデフォルト・アクションが使用されるべきである、ということです。 結果として、ルートを指定せずにアプリケーションにアクセスすると、`app\controllers\SiteController::actionIndex()` の結果が表示されます。 -[[yii\console\Application|コンソール・アプリケーション]] では、デフォルト値は `'help'` であり、コア・コマンドの [[yii\console\controllers\HelpController::actionIndex()]] が使用されるべきであるという意味です。 +[[yii\console\Application|コンソール・アプリケーション]] では、デフォルト値は `'help'` であり、 +コア・コマンドの [[yii\console\controllers\HelpController::actionIndex()]] が使用されるべきであるという意味です。 結果として、何も引数を与えずに `yii` というコマンドを実行すると、ヘルプ情報が表示されることになります。 @@ -419,7 +438,8 @@ $width = \Yii::$app->params['thumbnail.size'][0]; このプロパティは、[ビュー](structure-views.md) をレンダリングするときに使われるべきデフォルトのレイアウトを指定するものです。 デフォルト値は `'main'` であり、[レイアウト・パス](#layoutPath) の下にある `main.php` というファイルが使われるべきことを意味します。 -[レイアウト・パス](#layoutPath) と [ビュー・パス](#viewPath) の両方がデフォルト値を取る場合、デフォルトのレイアウト・ファイルは `@app/views/layouts/main.php` というパス・エイリアスとして表すことが出来ます。 +[レイアウト・パス](#layoutPath) と [ビュー・パス](#viewPath) の両方がデフォルト値を取る場合、デフォルトのレイアウト・ファイルは +`@app/views/layouts/main.php` というパス・エイリアスとして表すことが出来ます。 滅多には無いことですが、レイアウトをデフォルトで無効にしたい場合は、このプロパティを `false` として構成することが出来ます。 @@ -427,10 +447,10 @@ $width = \Yii::$app->params['thumbnail.size'][0]; #### [[yii\base\Application::layoutPath|layoutPath]] このプロパティは、レイアウト・ファイルが捜されるべきパスを指定するものです。 -デフォルト値は、[ビューパス](#viewPath) の下の `layouts` サブ・ディレクトリです。 +デフォルト値は、[ビュー・パス](#viewPath) の下の `layouts` サブ・ディレクトリです。 [ビュー・パス](#viewPath) がデフォルト値を取る場合、デフォルトのレイアウト・パスは `@app/views/layouts` というパス・エイリアスとして表すことが出来ます。 -このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。 +このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。 #### [[yii\base\Application::runtimePath|runtimePath]] @@ -438,7 +458,7 @@ $width = \Yii::$app->params['thumbnail.size'][0]; このプロパティは、ログ・ファイルやキャッシュ・ファイルなどの一時的ファイルを生成することが出来るパスを指定するものです。 デフォルト値は、`@app/runtime` というエイリアスで表現されるディレクトリです。 -このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。 +このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。 ランタイムパスは、アプリケーションを実行するプロセスによって書き込みが可能なものでなければならないことに注意してください。 そして、この下にある一時的ファイルは秘匿を要する情報を含みうるものですので、ランタイム・パスはエンド・ユーザによるアクセスから保護されなければなりません。 @@ -447,18 +467,17 @@ $width = \Yii::$app->params['thumbnail.size'][0]; #### [[yii\base\Application::viewPath|viewPath]] -このプロパティはビュー・ファイルが配置されるルート・ディレクトリを指定するものです。 -デフォルト値は、`@app/views` というエイリアスで表現されるディレクトリです。 +このプロパティはビュー・ファイルが配置されるルート・ディレクトリを指定するものです。デフォルト値は、`@app/views` というエイリアスで表現されるディレクトリです。 このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。 #### [[yii\base\Application::vendorPath|vendorPath]] このプロパティは、[Composer](https://getcomposer.org) によって管理される vendor ディレクトリを指定するものです。 -Yii フレームワークを含めて、あなたのアプリケーションによって使われる全てのサードパーティ・ライブラリを格納するディレクトリです。 +Yii フレームワークを含めて、あなたのアプリケーションによって使われる全てのサード・パーティ・ライブラリを格納するディレクトリです。 デフォルト値は、`@app/vendor` というエイリアスで表現されるディレクトリです。 -このプロパティはディレクトリまたはパス [エイリアス](concept-aliases.md) として構成することが出来ます。 +このプロパティはディレクトリまたはパス・[エイリアス](concept-aliases.md) として構成することが出来ます。 このプロパティを修正するときは、必ず、Composer の構成もそれに合せて修正してください。 このパスに簡単にアクセスできるように、Yii は `@vendor` というパス・エイリアスを事前に定義しています。 @@ -472,7 +491,7 @@ Yii リリースに含まれているコア・コマンドを有効にすべき ## アプリケーションのイベント -アプリケーションはリクエストを処理するライフ・サイクルの中でいくつかのイベントをトリガします。 +アプリケーションはリクエストを処理するライフサイクルの中でいくつかのイベントをトリガします。 これらのイベントに対して、下記のようにして、アプリケーションの構成情報の中でイベント・ハンドラをアタッチすることが出来ます。 ```php @@ -483,7 +502,8 @@ Yii リリースに含まれているコア・コマンドを有効にすべき ] ``` -`on eventName` という構文の使い方については、[構成情報](concept-configurations.md#configuration-format) のセクションで説明されています。 +`on eventName` という構文の使い方については、[構成情報](concept-configurations.md#configuration-format) +のセクションで説明されています。 別の方法として、アプリケーションのインスタンスが生成された後、[ブートストラップの過程](runtime-bootstrapping.md) の中でイベント・ハンドラをアタッチすることも出来ます。 例えば、 @@ -496,8 +516,7 @@ Yii リリースに含まれているコア・コマンドを有効にすべき ### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] -このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。 -実際のイベント名は `beforeRequest` です。 +このイベントは、アプリケーションがリクエストを処理する *前* にトリガされます。実際のイベント名は `beforeRequest` です。 このイベントがトリガされるときには、アプリケーションのインスタンスは既に構成されて初期化されています。 ですから、イベント・メカニズムを使って、リクエスト処理のプロセスに干渉するカスタム・コードを挿入するのには、ちょうど良い場所です。 @@ -509,7 +528,8 @@ Yii リリースに含まれているコア・コマンドを有効にすべき このイベントは、アプリケーションがリクエストの処理を完了した *後*、レスポンスを送信する *前* にトリガされます。 実際のイベント名は `afterRequest` です。 -このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。 +このイベントがトリガされるときにはリクエストの処理は完了していますので、この機をとらえて、 +リクエストに対する何らかの後処理をしたり、レスポンスをカスタマイズしたりすることが出来ます。 [[yii\web\Response|response]] コンポーネントも、エンド・ユーザにレスポンスのコンテントを送出する間にいくつかのイベントをトリガすることに注意してください。 それらのイベントは、このイベントの *後* にトリガされます。 @@ -536,8 +556,9 @@ Yii リリースに含まれているコア・コマンドを有効にすべき ``` 同じ `beforeAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) からもトリガされることに注意してください。 -アプリケーション・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にコントローラがこのイベントをトリガします。 -イベント・ハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。 +アプリケーション・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、 +そして最後にコントローラがこのイベントをトリガします。 +いずれかのイベント・ハンドラが [[yii\base\ActionEvent::isValid]] を `false` にセットすると、後続のイベントはトリガされません。 ### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] @@ -562,26 +583,29 @@ Yii リリースに含まれているコア・コマンドを有効にすべき 同じ `afterAction` イベントが、[モジュール](structure-modules.md) と [コントローラ](structure-controllers.md) からもトリガされることに注意してください。 これらのオブジェクトは、`beforeAction` の場合とは逆の順でイベントをトリガします。 -すなわち、コントローラ・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、そして最後にアプリケーションがこのイベントをトリガします。 +すなわち、コントローラ・オブジェクトが最初にこのイベントをトリガし、次に (もし有れば) モジュールが、 +そして最後にアプリケーションがこのイベントをトリガします。 -## アプリケーションのライフ・サイクル +## アプリケーションのライフサイクル -![アプリケーションのライフ・サイクル](images/application-lifecycle.png) +![アプリケーションのライフサイクル](images/application-lifecycle.png) -[エントリ・スクリプト](structure-entry-scripts.md) が実行されて、リクエストが処理されるとき、アプリケーションは次のようなライフ・サイクルを経ます。 +[エントリ・スクリプト](structure-entry-scripts.md) が実行されて、リクエストが処理されるとき、 +アプリケーションは次のようなライフサイクルを経ます。 1. エントリ・スクリプトがアプリケーションの構成情報を配列として読み出す。 2. エントリ・スクリプトがアプリケーションの新しいインスタンスを作成する。 - * [[yii\base\Application::preInit()|preInit()]] が呼び出されて、[[yii\base\Application::basePath|basePath]] のような、優先度の高いアプリケーション・プロパティを構成する。 + * [[yii\base\Application::preInit()|preInit()]] が呼び出されて、[[yii\base\Application::basePath|basePath]] のような、 + 優先度の高いアプリケーション・プロパティを構成する。 * [[yii\base\Application::errorHandler|エラー・ハンドラ]] を登録する。 * アプリケーションのプロパティを構成する。 - * [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップ・コンポーネントを走らせるために、[[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。 + * [[yii\base\Application::init()|init()]] が呼ばれ、そこから更に、ブートストラップ・コンポーネントを走らせるために、 + [[yii\base\Application::bootstrap()|bootstrap()]] が呼ばれる。 3. エントリ・スクリプトが [[yii\base\Application::run()]] を呼んで、アプリケーションを走らせる。 * [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] イベントをトリガする。 * リクエストを処理する: リクエストを [ルート](runtime-routing.md) とそれに結び付くパラメータとして解決する。 - ルートによって指定されたモジュール、コントローラ、および、アクションを作成する。 - そしてアクションを実行する。 + ルートによって指定されたモジュール、コントローラ、および、アクションを作成する。そしてアクションを実行する。 * [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] イベントをトリガする。 * エンド・ユーザにレスポンスを送信する。 4. エントリ・スクリプトがアプリケーションから終了ステータスを受け取り、リクエストの処理を完了する。 diff --git a/docs/guide-ja/structure-assets.md b/docs/guide-ja/structure-assets.md index 6ba031d6dcc..3f590854e9f 100644 --- a/docs/guide-ja/structure-assets.md +++ b/docs/guide-ja/structure-assets.md @@ -1,8 +1,7 @@ アセット ======== -Yii では、アセットは、ウェブ・ページで参照できるファイルを意味します。 -アセットは CSS ファイルであったり、JavaScript ファイルであったり、画像やビデオのファイルであったりします。 +Yii では、アセットは、ウェブ・ページで参照できるファイルを意味します。アセットは CSS ファイルであったり、JavaScript ファイルであったり、画像やビデオのファイルであったりします。 アセットはウェブでアクセス可能なディレクトリに配置され、ウェブ・サーバによって直接に提供されます。 たいていの場合、アセットはプログラム的に管理する方が望ましいものです。 @@ -14,7 +13,8 @@ Yii では、アセットは、ウェブ・ページで参照できるファイ ## アセット・バンドル -Yii はアセットを *アセット・バンドル* を単位として管理します。アセット・バンドルは、簡単に言えば、あるディレクトリの下に集められた一群のアセットです。 +Yii はアセットを *アセット・バンドル* を単位として管理します。アセット・バンドルは、簡単に言えば、 +あるディレクトリの下に集められた一群のアセットです。 [ビュー](structure-views.md) の中でアセット・バンドルを登録すると、バンドルの中の CSS や JavaScript のファイルがレンダリングされるウェブ・ページに挿入されます。 @@ -22,8 +22,8 @@ Yii はアセットを *アセット・バンドル* を単位として管理し アセット・バンドルは [[yii\web\AssetBundle]] から拡張された PHP クラスとして定義されます。 バンドルの名前は、対応する PHP クラスの完全修飾名 (先頭のバック・スラッシュを除く) です。 -アセット・バンドルクラスは [オートロード可能](concept-autoloading.md) でなければなりません。 -アセット・バンドルクラスは、通常、アセットがどこに置かれているか、バンドルがどういう CSS や JavaScript のファイルを含んでいるか、そして、バンドルが他のバンドルにどのように依存しているかを定義します。 +アセット・バンドル・クラスは [オートロード可能](concept-autoloading.md) でなければなりません。 +アセット・バンドル・クラスは、通常、アセットがどこに置かれているか、バンドルがどういう CSS や JavaScript のファイルを含んでいるか、そして、バンドルが他のバンドルにどのように依存しているかを定義します。 以下のコードは [ベーシック・プロジェクト・テンプレート](start-installation.md) によって使用されているメインのアセット・バンドルを定義するものです。 @@ -57,15 +57,17 @@ class AppAsset extends AssetBundle 以下、[[yii\web\AssetBundle]] のプロパティに関して、更に詳細に説明します。 * [[yii\web\AssetBundle::sourcePath|sourcePath]]: このバンドルのアセット・ファイルを含むルート・ディレクトリを指定します。 - ルート・ディレクトリがウェブからアクセス可能でない場合に、このプロパティをセットしなければなりません。 + ルート・ディレクトリがウェブ・アクセス可能でない場合に、このプロパティをセットしなければなりません。 そうでない場合は、代りに、[[yii\web\AssetBundle::basePath|basePath]] と [[yii\web\AssetBundle::baseUrl|baseUrl]] のプロパティをセットしなければなりません。 [パス・エイリアス](concept-aliases.md) をここで使うことが出来ます。 -* [[yii\web\AssetBundle::basePath|basePath]]: このバンドルのアセット・ファイルを含むウェブからアクセス可能なディレクトリを指定します。 - [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、[アセットマネージャ](#asset-manager) がバンドルに含まれるファイルをウェブからアクセス可能なディレクトリに発行して、その結果、このプロパティを上書きします。 - アセット・ファイルが既にウェブからアクセス可能なディレクトリにあり、アセットの発行が必要でない場合に、このプロパティをセットしなければなりません。 +* [[yii\web\AssetBundle::basePath|basePath]]: このバンドルのアセット・ファイルを含むウェブ・アクセス可能なディレクトリを指定します。 + [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、[アセット・マネージャ](#asset-manager) がバンドルに含まれるファイルをウェブ・アクセス可能なディレクトリに発行して、 + その結果、このプロパティを上書きします。 + アセット・ファイルが既にウェブ・アクセス可能なディレクトリにあり、アセットの発行が必要でない場合に、このプロパティをセットしなければなりません。 [パス・エイリアス](concept-aliases.md) をここで使うことが出来ます。 * [[yii\web\AssetBundle::baseUrl|baseUrl]]: [[yii\web\AssetBundle::basePath|basePath]] ディレクトリに対応する URL を指定します。 - [[yii\web\AssetBundle::basePath|basePath]] と同じように、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、[アセット・マネージャ](#asset-manager) がアセットを発行して、その結果、このプロパティを上書きします。 + [[yii\web\AssetBundle::basePath|basePath]] と同じように、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティをセットした場合は、 + [アセット・マネージャ](#asset-manager) がアセットを発行して、その結果、このプロパティを上書きします。 [パス・エイリアス](concept-aliases.md) をここで使うことが出来ます。 * [[yii\web\AssetBundle::css|css]]: このバンドルに含まれている CSS ファイルをリストする配列です。 ディレクトリの区切りとしてフォワード・スラッシュ "/" だけを使わなければならないことに注意してください。 @@ -77,11 +79,16 @@ class AppAsset extends AssetBundle 実際のファイルのパスは、この相対パスの前に [[yii\web\AssetManager::basePath]] を付けることによって決定されます。 また、実際の URL は、この相対パスの前に [[yii\web\AssetManager::baseUrl]] を付けることによって決定されます。 - 外部の JavaScript ファイルを表す絶対 URL。 - 例えば、`http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` や `//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` など。 + 例えば、`http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` や + `//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js` など。 * [[yii\web\AssetBundle::depends|depends]]: このバンドルが依存しているアセット・バンドルの名前をリストする配列です (バンドルの依存関係については、すぐ後で説明します)。 -* [[yii\web\AssetBundle::jsOptions|jsOptions]]: このバンドルにある *全て* の JavaScript ファイルについて、それを登録するときに呼ばれる [[yii\web\View::registerJsFile()]] メソッドに渡されるオプションを指定します。 -* [[yii\web\AssetBundle::publishOptions|publishOptions]]: ソースのアセット・ファイルをウェブ・ディレクトリに発行するときに呼ばれる [[yii\web\AssetManager::publish()]] メソッドに渡されるオプションを指定します。 +* [[yii\web\AssetBundle::jsOptions|jsOptions]]: このバンドルにある *全て* の JavaScript ファイルについて、 + それを登録するときに呼ばれる [[yii\web\View::registerJsFile()]] メソッドに渡されるオプションを指定します。 +* [[yii\web\AssetBundle::cssOptions|cssOptions]]: このバンドルにある *全て* の CSS ファイルについて、 + それを登録するときに呼ばれる [[yii\web\View::registerCssFile()]] メソッドに渡されるオプションを指定します。 +* [[yii\web\AssetBundle::publishOptions|publishOptions]]: ソースのアセット・ファイルをウェブ・ディレクトリに発行するときに呼ばれる + [[yii\web\AssetManager::publish()]] メソッドに渡されるオプションを指定します。 これは [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定した場合にだけ使用されます。 @@ -89,43 +96,53 @@ class AppAsset extends AssetBundle アセットは、配置場所を基準にして、次のように分類することが出来ます。 -* ソースアセット: アセット・ファイルは、ウェブ経由で直接にアクセスすることが出来ない PHP ソース・コードと一緒に配置されています。 - ページの中でソースアセットを使用するためには、ウェブ・ディレクトリにコピーして、いわゆる発行されたアセットに変換しなければなりません。 +* ソース・アセット: アセット・ファイルは、ウェブ経由で直接にアクセスすることが出来ない PHP ソース・コードと一緒に配置されています。 + ページの中でソース・アセットを使用するためには、ウェブ・ディレクトリにコピーして、いわゆる発行されたアセットに変換しなければなりません。 このプロセスは、すぐ後で詳しく説明しますが、*アセット発行* と呼ばれます。 * 発行されたアセット: アセット・ファイルはウェブ・ディレクトリに配置されており、したがってウェブ経由で直接にアクセスすることが出来ます。 -* 外部アセット: アセット・ファイルは、あなたのウェブ・アプリケーションをホストしているのとは別のウェブ・サーバ上に配置されています。 +* 外部アセット: アセット・ファイルは、あなたのウェブ・アプリケーションをホストしているのとは別のウェブ・サーバ上に + 配置されています。 -アセット・バンドル・クラスを定義するときに、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定した場合は、相対パスを使ってリストに挙げられたアセットは全てソースアセットであると見なされます。 +アセット・バンドル・クラスを定義するときに、[[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定した場合は、 +相対パスを使ってリストに挙げられたアセットは全てソース・アセットであると見なされます。 このプロパティを指定しなかった場合は、アセットは発行されたアセットであることになります (したがって、[[yii\web\AssetBundle::basePath|basePath]] と [[yii\web\AssetBundle::baseUrl|baseUrl]] を指定して、アセットがどこに配置されているかを Yii に知らせなければなりません)。 アプリケーションに属するアセットは、不要なアセット発行プロセスを避けるために、ウェブ・ディレクトリに置くことが推奨されます。 -前述の例において `AppAsset` が [[yii\web\AssetBundle::sourcePath|sourcePath]] ではなく [[yii\web\AssetBundle::basePath|basePath]] を指定しているのは、これが理由です。 +前述の例において `AppAsset` が [[yii\web\AssetBundle::sourcePath|sourcePath]] ではなく +[[yii\web\AssetBundle::basePath|basePath]] を指定しているのは、これが理由です。 -[エクステンション](structure-extensions.md) の場合は、アセットがソース・コードと一緒にウェブからアクセス出来ないディレクトリに配置されているため、アセット・バンドル・クラスを定義するときには [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定しなければなりません。 +[エクステンション](structure-extensions.md) の場合は、 +アセットがソース・コードと一緒にウェブからアクセス出来ないディレクトリに配置されているため、 +アセット・バンドル・クラスを定義するときには [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティを指定しなければなりません。 > Note: `@webroot/assets` を [[yii\web\AssetBundle::sourcePath|ソース・パス]] として使ってはいけません。 このディレクトリは、デフォルトでは、[[yii\web\AssetManager|アセット・マネージャ]] がソースの配置場所から発行されたアセット・ファイルを保存する場所として使われます。 - このディレクトリの中のファイルはすべて一時的なものと見なされており、削除されることがあります。 + このディレクトリの中のファイルはすべて一時的なものと見なされており、 + 削除されることがあります。 ### アセットの依存関係 ウェブ・ページに複数の CSS や JavaScript ファイルをインクルードするときは、オーバーライドの問題を避けるために、一定の順序に従わなければなりません。 -例えば、ウェブ・ページで jQuery UI ウィジェットを使おうとするときは、jQuery JavaScript ファイルが jQuery UI JavaScript ファイルより前にインクルードされることを保証しなければなりません。 +例えば、ウェブ・ページで jQuery UI ウィジェットを使おうとするときは、jQuery JavaScript ファイルが +jQuery UI JavaScript ファイルより前にインクルードされることを保証しなければなりません。 このような順序付けをアセット間の依存関係と呼びます。 アセットの依存関係は、主として、[[yii\web\AssetBundle::depends]] プロパティによって指定されます。 `AppAsset` の例では、このアセット・バンドルは他の二つのアセット・バンドル、すなわち、[[yii\web\YiiAsset]] と [[yii\bootstrap\BootstrapAsset]] に依存しています。 -このことは、`AppAsset` の CSS と JavaScript ファイルが、依存している二つのアセット・バンドルにあるファイルの *後に* インクルードされることを意味します。 +このことは、`AppAsset` の CSS と JavaScript ファイルが、依存している二つのアセット・バンドルにあるファイルの *後に* +インクルードされることを意味します。 アセットの依存関係は中継されます。つまり、バンドル A が B に依存し、B が C に依存していると、A は C にも依存していることになります。 ### アセットのオプション -[[yii\web\AssetBundle::cssOptions|cssOptions]] および [[yii\web\AssetBundle::jsOptions|jsOptions]] のプロパティを指定して、CSS と JavaScript ファイルがページにインクルードされる方法をカスタマイズすることが出来ます。 -これらのプロパティの値は、[ビュー](structure-views.md) が CSS と JavaScript ファイルをインクルードするために、[[yii\web\View::registerCssFile()]] および [[yii\web\View::registerJsFile()]] メソッドを呼ぶときに、それぞれ、オプションとして引き渡されます。 +[[yii\web\AssetBundle::cssOptions|cssOptions]] および [[yii\web\AssetBundle::jsOptions|jsOptions]] のプロパティを指定して、 +CSS と JavaScript ファイルがページにインクルードされる方法をカスタマイズすることが出来ます。 +これらのプロパティの値は、[ビュー](structure-views.md) が CSS と JavaScript ファイルをインクルードするために、[[yii\web\View::registerCssFile()]] および +[[yii\web\View::registerJsFile()]] メソッドを呼ぶときに、それぞれ、オプションとして引き渡されます。 > Note: バンドル・クラスでセットしたオプションは、バンドルの中の *全て* の CSS/JavaScript ファイルに適用されます。 いろいろなファイルに別々のオプションを使用したい場合は、上述した [[yii\web\AssetBundle::css|css] の形式を使うか、 @@ -158,7 +175,8 @@ JavaScript ファイルをページの head セクションにインクルード public $jsOptions = ['position' => \yii\web\View::POS_HEAD]; ``` -デフォルトでは、アセット・バンドルが発行されるときは、[[yii\web\AssetBundle::sourcePath]] で指定されたディレクトリの中にある全てのコンテントが発行されます。 +デフォルトでは、アセット・バンドルが発行されるときは、[[yii\web\AssetBundle::sourcePath]] +で指定されたディレクトリの中にある全てのコンテントが発行されます。 [[yii\web\AssetBundle::publishOptions|publishOptions]] プロパティを構成することによって、この振る舞いをカスタマイズすることが出来ます。 例えば、[[yii\web\AssetBundle::sourcePath]] の一個または数個のサブ・ディレクトリだけを発行するために、アセット・バンドル・クラスの中で下記のようにすることが出来ます。 @@ -202,8 +220,7 @@ ___ この方法は NPM または Bower のパッケージを必要とするプロジェクトの大半の要求を満たすことが出来ます。 > Note: 2.0.13 以降、ベーシック・アプリケーション・テンプレートとアドバンスト・アプリケーション・テンプレートはともに、 - デフォルトで asset-packagist を使うように前もって構成されていますので、 - このセクションは読み飛ばすことが出来ます。 + デフォルトで asset-packagist を使うように前もって構成されていますので、このセクションは読み飛ばすことが出来ます。 プロジェクトの `composer.json` に、下記を追加します。 @@ -256,16 +273,18 @@ Yii を使ってこれらのアセットを発行したい場合は、プロジ } ``` -> Note: `fxp/composer-asset-plugin` は、asset-packagist に比べて、`composer update` コマンドを著しく遅くします。 +> Note: `fxp/composer-asset-plugin` は、asset-packagist に比べて、`composer update` + コマンドを著しく遅くします。 ____ Composer で Bower と NPM をサポートできるように構成した後は: 1. アプリケーションまたはエクステンションの `composer.json` ファイルを修正して、パッケージを `require` のエントリに入れます。 - ライブラリを参照するのに、`bower-asset/PackageName` (Bower パッケージ) または `npm-asset/PackageName` (NPM パッケージ) を使わなければなりません。 + ライブラリを参照するのに、`bower-asset/PackageName` (Bower パッケージ) または `npm-asset/PackageName` (NPM パッケージ) + を使わなければなりません。 2. `composer update` を実行します。 -3. アセット・バンドルクラスを作成して、アプリケーションまたはエクステンションで使う予定の JavaScript/CSS ファイルをリストに挙げます。 +3. アセット・バンドル・クラスを作成して、アプリケーションまたはエクステンションで使う予定の JavaScript/CSS ファイルをリストに挙げます。 [[yii\web\AssetBundle::sourcePath|sourcePath]] プロパティは、`@bower/PackageName` または `@npm/PackageName` としなければなりません。 これは、Composer が Bower または NPM パッケージを、このエイリアスに対応するディレクトリにインストールするためです。 @@ -284,20 +303,23 @@ use app\assets\AppAsset; AppAsset::register($this); // $this はビュー・オブジェクトを表す ``` -> Info: [[yii\web\AssetBundle::register()]] メソッドは、[[yii\web\AssetBundle::basePath|basePath]] や [[yii\web\AssetBundle::baseUrl|baseUrl]] など、発行されたアセットに関する情報を含むアセット・バンドル・オブジェクトを返します。 +> Info: [[yii\web\AssetBundle::register()]] メソッドは、[[yii\web\AssetBundle::basePath|basePath]] や [[yii\web\AssetBundle::baseUrl|baseUrl]] など、 + 発行されたアセットに関する情報を含むアセット・バンドル・オブジェクトを返します。 他の場所でアセット・バンドルを登録しようとするときは、必要とされるビュー・オブジェクトを提供しなければなりません。 -例えば、[ウィジェット](structure-widgets.md) クラスの中でアセット・バンドルを登録するためには、`$this->view` によってビュー・オブジェクトを取得することが出来ます。 +例えば、[ウィジェット](structure-widgets.md)・クラスの中でアセット・バンドルを登録するためには、`$this->view` によってビュー・オブジェクトを取得することが出来ます。 アセット・バンドルがビューに登録されるとき、舞台裏では、依存している全てのアセット・バンドルが Yii によって登録されます。 -そして、アセット・バンドルがウェブからはアクセス出来ないディレクトリに配置されている場合は、アセット・バンドルがウェブ・ディレクトリに発行されます。 +そして、アセット・バンドルがウェブからはアクセス出来ないディレクトリに配置されている場合は、 +アセット・バンドルがウェブ・ディレクトリに発行されます。 その後、ビューがページをレンダリングするときに、登録されたバンドルのリストに挙げられている CSS と JavaScript ファイルのための `` タグと `` と入力した場合、ユーザ名をエスケープせずに出力している全てのページでは、JavaScript `alert('Hello!');` が実行されて、ブラウザにアラート・ボックスがポップアップ表示されます。 -ウェブ・サイト次第では、そのようなスクリプトを使って、無害なアラートではなく、あなたの名前を使ってメッセージを送信したり、さらには銀行取引を実行したりすることが可能です。 +例えば、ユーザ名を入力できるフォームで `Alexander` の代りに `` と入力した場合、 +ユーザ名をエスケープせずに出力している全てのページでは、JavaScript `alert('Hello!');` が実行されて、ブラウザにアラート・ボックスがポップアップ表示されます。 +ウェブ・サイト次第では、そのようなスクリプトを使って、無害なアラートではなく、あなたの名前を使ってメッセージを送信したり、 +さらには銀行取引を実行したりすることが可能です。 XSS の回避は、Yii においてはとても簡単です。一般に、二つのケースがあります。 -1. データを平文テキストとして出力したい。 +1. データをプレーン・テキストとして出力したい。 2. データを HTML として出力したい。 -平文テキストしか必要でない場合は、エスケープは次のようにとても簡単です。 +プレーン・テキストしか必要でない場合は、エスケープは次のようにとても簡単です。 ```php @@ -162,21 +165,14 @@ CSRF は、クロス・サイト・リクエスト・フォージェリ (cross-s ブラウザは画像のリクエストとページのリクエストの間に何ら区別を付けませんので、ユーザがそのような `img` タグを含むページを開くとブラウザはその URL に対して GET リクエストを送信します。 そして、ユーザが `an.example.com` からログアウトされてしまうことになる訳です。 -これは基本的な考え方です。ユーザがログアウトされるぐらいは大したことではない、と言うことも出来るでしょう。 -しかし、悪い奴は、この考え方を使って、もっとひどいことをすることも出来ます。 -例えば、`http://an.example.com/purse/transfer?to=anotherUser&amount=2000` という URL を持つウェブ・サイトがあると考えて見てください。 -この URL に GET リクエストを使ってアクセスすると、権限を持つユーザア・カウントから `anotherUser` に $2000 が送金されるのです。 -私たちは、ブラウザは画像をロードするのに常に GET リクエストを使う、ということを知っていますから、この URL が POST リクエストだけを受け入れるようにコードを修正することは出来ます。 -しかし残念なことに、それで問題が解決する訳ではありません。 -攻撃者は `` タグの代りに何らかの JavaScript コードを書いて、その URL に対する POST リクエストの送信を可能にすることが出来ます。 +これは基本的な考え方です。ユーザがログアウトされるぐらいは大したことではない、と言うことも出来るでしょう。しかし、悪い奴は、この考え方を使って、もっとひどいことをすることも出来ます。例えば、`http://an.example.com/purse/transfer?to=anotherUser&amount=2000` という URL を持つウェブ・サイトがあると考えて見てください。この URL に GET リクエストを使ってアクセスすると、権限を持つユーザア・カウントから `anotherUser` に $2000 が送金されるのです。私たちは、ブラウザは画像をロードするのに常に GET リクエストを使う、ということを知っていますから、この URL が POST リクエストだけを受け入れるようにコードを修正することは出来ます。しかし残念なことに、それで問題が解決する訳ではありません。攻撃者は `` タグの代りに何らかの JavaScript コードを書いて、その URL に対する POST リクエストの送信を可能にすることが出来ます。 CSRF を回避するためには、常に次のことを守らなければなりません。 1. HTTP の規格、すなわち、GET はアプリケーションの状態を変更すべきではない、という規則に従うこと。 2. Yii の CSRF 保護を有効にしておくこと。 -場合によっては、コントローラやアクションの単位で CSRF 検証を無効化する必要があることがあるでしょう。 -これは、そのプロパティを設定することによって達成することが出来ます。 +場合によっては、コントローラやアクションの単位で CSRF 検証を無効化する必要があることがあるでしょう。これは、そのプロパティを設定することによって達成することが出来ます。 ```php namespace app\controllers; @@ -196,6 +192,7 @@ class SiteController extends Controller ``` 特定のアクションに対して CSRF 検証を無効化したいときは、次のようにすることが出来ます。 + ```php namespace app\controllers; @@ -244,8 +241,7 @@ class ContactAction extends Action } ``` -> Warning: CSRF を無効化すると、あらゆるサイトから POST リクエストをあなたのサイトに送信することが出来るようになります。 - その場合には、IP アドレスや秘密のトークンをチェックするなど、追加の検証を実装することが重要です。 +> Warning: CSRF を無効化すると、あらゆるサイトから POST リクエストをあなたのサイトに送信することが出来るようになります。その場合には、IP アドレスや秘密のトークンをチェックするなど、追加の検証を実装することが重要です。 このトピックについて更に読むべき文書: @@ -260,6 +256,7 @@ class ContactAction extends Action そういう場合には、`web` 以外の全てに対してアクセスを拒否することを忘れないでください。 それも出来ない場合は、アプリケーションを別の場所でホストすることを検討してください。 + 本番環境ではデバッグ情報とデバッグ・ツールを無効にする ------------------------------------------------------ @@ -270,8 +267,7 @@ class ContactAction extends Action 本番環境では Gii やデバッグ・ツール・バーを決して有効にしてはいけません。 これらを有効にすると、データベース構造とコードに関する情報を得ることが出来るだけでなく、コードを Gii によって生成したもので書き換えることすら出来てしまいます。 -デバッグ・ツール・バーは本当に必要でない限り本番環境では使用を避けるべきです。 -これはアプリケーションと構成情報の全ての詳細を曝露することが出来ます。 +デバッグ・ツール・バーは本当に必要でない限り本番環境では使用を避けるべきです。これはアプリケーションと構成情報の全ての詳細を曝露することが出来ます。 どうしても必要な場合は、あなたの IP だけに適切にアクセス制限されていることを再度チェックしてください。 このトピックについて更に読むべき文書: @@ -283,10 +279,8 @@ class ContactAction extends Action TLS によるセキュアな接続を使う ------------------------------ -Yii が提供する機能には、クッキーや PHP セッションに依存するものがあります。 -これらのものは、接続が侵害された場合には、脆弱性となり得ます。 -アプリケーションが TLS (しばしば [SSL](https://ja.wikipedia.org/wiki/Transport_Layer_Security) と呼ばれます) -によるセキュアな接続を使用している場合は、この危険性を減少させることが出来ます。 +Yii が提供する機能には、クッキーや PHP セッションに依存するものがあります。これらのものは、接続が侵害された場合には、脆弱性となり得ます。 +アプリケーションが TLS (しばしば [SSL](https://ja.wikipedia.org/wiki/Transport_Layer_Security) と呼ばれます) によるセキュアな接続を使用している場合は、この危険性を減少させることが出来ます。 その設定の仕方については、あなたのウェブ・サーバのドキュメントの指示を参照してください。 H5BP プロジェクトが提供する構成例を参考にすることも出来ます。 @@ -296,6 +290,7 @@ H5BP プロジェクトが提供する構成例を参考にすることも出来 - [IIS](https://github.com/h5bp/server-configs-iis). - [Lighttpd](https://github.com/h5bp/server-configs-lighttpd). + サーバの構成をセキュアにする ---------------------------- @@ -307,19 +302,19 @@ H5BP プロジェクトが提供する構成例を参考にすることも出来 ### `Host` ヘッダ攻撃を避ける [[yii\web\UrlManager]] や [[yii\helpers\Url]] のクラスは、リンクを生成するために [[yii\web\Request::getHostInfo()|現在リクエストされているホスト名]] を使うことがあります。 -って ウェブ・サーバが `Host` ヘッダの値とは無関係に同じサイトとして応答するように構成されている場合は、 -この情報は [HTTP リクエストを送信するユーザによって偽装され](https://www.acunetix.com/vulnerabilities/web/host-header-attack) て、信頼できないものになっている可能性があります。 +この情報は信頼できないものになっており、[HTTP リクエストを送信するユーザによって偽装されている](https://www.acunetix.com/vulnerabilities/web/host-header-attack) 可能性があります。 そのような状況においては、ウェブ・サーバの構成を改修して、指定されたホスト名に対してのみ応答するようにするか、 -または、`request` アプリケーション・コンポーネントの [[yii\web\Request::setHostInfo()|hostInfo]] プロパティを設定して、ホスト名の値を設定ないしフィルタするか、 -どちらかの対策を取るべきです。 +または、`request` アプリケーション・コンポーネントの [[yii\web\Request::setHostInfo()|hostInfo]] プロパティを設定して、 +ホスト名の値を明示的に設定ないしフィルタするか、どちらかの対策を取るべきです。 サーバの構成についての詳細な情報は、ウェブ・サーバのドキュメントを参照して下さい。 - Apache 2: - Nginx: -サーバの構成にアクセスする権限がない場合は、このような攻撃に対して防御するために、[[yii\filters\HostControl]] フィルタを設定することが出来ます。 +サーバの構成にアクセスする権限がない場合は、このような攻撃に対して防御するために、[[yii\filters\HostControl]] +フィルタを設定することが出来ます。 ```php // ウェブ・アプリケーション構成ファイル diff --git a/docs/guide-ja/security-cryptography.md b/docs/guide-ja/security-cryptography.md index e782a92c991..9095fdce5aa 100644 --- a/docs/guide-ja/security-cryptography.md +++ b/docs/guide-ja/security-cryptography.md @@ -1,20 +1,18 @@ 暗号化 ====== -個のセクションでは、セキュリティの以下の側面について見ていきます。 +このセクションでは、セキュリティの以下の側面について見ていきます。 - 乱数データの生成 - 暗号化と複合化 - データの完全性の確認 - 擬似乱数データを生成する ------------------------ 擬似乱数データはさまざまな状況で役に立ちます。 例えば、メール経由でパスワードをリセットするときは、トークンを生成してデータベースに保存し、それをユーザにメールで送信します。 -そして、ユーザはこのトークンを自分がアカウントの所有者であることの証拠として使用します。 -このトークンがユニークかつ推測困難なものであることは非常に重要なことです。 +そして、ユーザはこのトークンを自分がアカウントの所有者であることの証拠として使用します。このトークンがユニークかつ推測困難なものであることは非常に重要なことです。 さもなくば、攻撃者がトークンの値を推測してユーザのパスワードをリセットする可能性があります。 Yii のセキュリティヘルパは擬似乱数データの生成を単純な作業にしてくれます。 @@ -27,10 +25,10 @@ $key = Yii::$app->getSecurity()->generateRandomString(); 暗号化と復号化 -------------- -Yii は秘密鍵を使ってデータを暗号化/復号化することを可能にする便利なヘルパ関数を提供しています。 -データを暗号化関数に渡して、秘密鍵を持つ者だけが復号化することが出来るようにすることが出来ます。 +Yii は秘密鍵を使ってデータを暗号化/復号化することを可能にする便利なヘルパ関数を提供しています。データを暗号化関数に渡して、秘密鍵を持つ者だけが復号化することが出来るようにすることが出来ます。 例えば、何らかの情報をデータベースに保存する必要があるけれども、(たとえアプリケーションのデータベースが第三者に漏洩した場合でも) 秘密鍵を持つユーザだけがそれを見ることが出来るようにする必要がある、という場合には次のようにします。 + ```php // $data と $secretKey はフォームから取得する $encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey); @@ -44,17 +42,17 @@ $encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey); $data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey); ``` -[[\yii\base\Security::encryptByKey()]] と [[\yii\base\Security::decryptByKey()]] によって、パスワードの代わりにキーを使うことも可能です。 - +[[\yii\base\Security::encryptByKey()]] と [[\yii\base\Security::decryptByKey()]] によって、 +パスワードの代わりにキーを使うことも可能です。 データの完全性を確認する ------------------------ -データが第三者によって改竄されたり、更には何らかの形で毀損されたりしていないことを確認する必要がある、という場合があります。 -Yii は二つのヘルパ関数の形で、データの完全性を確認するための簡単な方法を提供しています。 +データが第三者によって改竄されたり、更には何らかの形で毀損されたりしていないことを確認する必要がある、という場合があります。Yii は二つのヘルパ関数の形で、データの完全性を確認するための簡単な方法を提供しています。 秘密鍵とデータから生成されたハッシュをデータにプレフィクスします。 + ```php // $secretKey はアプリケーションまたはユーザの秘密、$genuineData は信頼できるソースから取得 $data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey); diff --git a/docs/guide-ja/security-passwords.md b/docs/guide-ja/security-passwords.md index d9c91a40e7e..69854134f2d 100644 --- a/docs/guide-ja/security-passwords.md +++ b/docs/guide-ja/security-passwords.md @@ -1,11 +1,12 @@ パスワードを扱う ================ -ほとんどの開発者はパスワードを平文テキストで保存してはいけないということを知っていますが、パスワードを `md5` や `sha1` でハッシュしてもまだ安全だと思っている開発者がたくさんいます。 -かつては、前述のハッシュ・アルゴリズムを使えば十分であった時もありましたが、現代のハードウェアをもってすれば、そのようなハッシュはブルート・フォース・アタックを使って非常に簡単に復元することが可能です。 +ほとんどの開発者はパスワードを平文テキストで保存してはいけないということを知っていますが、パスワードを `md5` や `sha1` +でハッシュしてもまだ安全だと思っている開発者がたくさんいます。かつては、前述のハッシュ・アルゴリズムを使えば十分であった時もありましたが、 +現代のハードウェアをもってすれば、そのようなハッシュはブルート・フォース・アタックを使って非常に簡単に復元することが可能です。 -最悪のシナリオ (アプリケーションに侵入された場合) であっても、ユーザのパスワードについて強化されたセキュリティを提供することが出来るように、ブルート・フォース・アタックに対する耐性が強いハッシュ・アルゴリズムを使う必要があります。 -現在、最善の選択は `bcrypt` です。 +最悪のシナリオ (アプリケーションに侵入された場合) であっても、ユーザのパスワードについて強化されたセキュリティを提供することが出来るように、 +ブルート・フォース・アタックに対する耐性が強いハッシュ・アルゴリズムを使う必要があります。現在、最善の選択は `bcrypt` です。 PHP では、[crypt 関数](http://php.net/manual/ja/function.crypt.php) を使って `bcrypt` ハッシュを生成することが出来ます。 Yii は `crypt` を使ってハッシュを安全に生成し検証することを容易にするために、二つのヘルパ関数を提供しています。 From 3fe65f908ffff7f8c75665f31df46e131350d6d0 Mon Sep 17 00:00:00 2001 From: Dmitry Naumenko Date: Sat, 28 Apr 2018 09:58:02 +0300 Subject: [PATCH 037/902] Update db-active-record.md --- docs/guide-ru/db-active-record.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/db-active-record.md b/docs/guide-ru/db-active-record.md index 7288416e1d7..19c697b785a 100644 --- a/docs/guide-ru/db-active-record.md +++ b/docs/guide-ru/db-active-record.md @@ -1640,7 +1640,7 @@ class Customer extends \yii\db\ActiveRecord ``` При такой реализации, в случае когда 'ordersCount' присутсвует в разделе 'select' - значение 'Customer::ordersCount' будет -заполнено из результатов запроса, в противном случае - оно будет вычислено по превому требованию на основании отношения `Customer::orders`. +заполнено из результатов запроса, в противном случае - оно будет вычислено по первому требованию на основании отношения `Customer::orders`. Этот подход также можно использовать для быстрого доступа к некоторым данным отношений, в особенности для агрегации. Например: From 1e4f91057d4cdb7bc86f25ad82f3134712ee2434 Mon Sep 17 00:00:00 2001 From: holinski Date: Sat, 28 Apr 2018 13:58:14 +0300 Subject: [PATCH 038/902] Fix a typo (#16186) [skip ci] --- docs/guide-ru/concept-di-container.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/concept-di-container.md b/docs/guide-ru/concept-di-container.md index a72e17d44d1..cc0707eb99b 100644 --- a/docs/guide-ru/concept-di-container.md +++ b/docs/guide-ru/concept-di-container.md @@ -157,7 +157,7 @@ $container->setDefinitions([ } ]); -$reader = $container->get('app\storage\DocumentsReader); +$reader = $container->get('app\storage\DocumentsReader'); // Создаст объект DocumentReader со всеми зависимостями ``` From 0f11286346350ba9c7cfe1a2fb57e53a5c5cc1ff Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sat, 28 Apr 2018 22:01:12 +0900 Subject: [PATCH 039/902] guide-ja/caching-* revised [ci skip] (#16187) --- docs/guide-ja/caching-data.md | 142 +++++++++++++++++++----------- docs/guide-ja/caching-fragment.md | 34 ++++--- docs/guide-ja/caching-http.md | 40 ++++++--- docs/guide-ja/caching-overview.md | 3 +- docs/guide-ja/caching-page.md | 7 +- 5 files changed, 149 insertions(+), 77 deletions(-) diff --git a/docs/guide-ja/caching-data.md b/docs/guide-ja/caching-data.md index 16f1792d0d5..3484ad5d729 100644 --- a/docs/guide-ja/caching-data.md +++ b/docs/guide-ja/caching-data.md @@ -2,16 +2,17 @@ ================== データ・キャッシュは PHP の変数をキャッシュに格納し、あとでキャッシュからそれらを読み込みます。 -これは、[クエリ・キャッシュ](#query-caching) や [ページ・キャッシュ](caching-page.md) などの、より高度なキャッシュ機能の基礎でもあります。 +これは、[クエリ・キャッシュ](#query-caching) や [ページ・キャッシュ](caching-page.md) など、 +より高度なキャッシュ機能の基礎でもあります。 -以下のコードが、データ・キャッシュの典型的な利用パターンです。ここで、`$cache` は [キャッシュ・コンポーネント](#cache-components) を指しています。 +以下のコードが、データ・キャッシュの典型的な利用パターンです。ここで、`$cache` は [キャッシュ・コンポーネント](#cache-components) +を指しています。 ```php // キャッシュから $data を取得しようと試みる $data = $cache->get($key); if ($data === false) { - // キャッシュの中に $data が見つからない場合は一から作る $data = $this->calculateSomething(); @@ -51,10 +52,13 @@ $data = $cache->getOrSet($key, function () use ($user_id) { ## キャッシュ・コンポーネント -データ・キャッシュはメモリ、ファイル、データベースなどさまざまなキャッシュ・ストレージを表す、いわゆる *キャッシュ・コンポーネント* に依存しています。 +データ・キャッシュはメモリ、ファイル、データベースなどさまざまなキャッシュ・ストレージを表す、 +いわゆる *キャッシュ・コンポーネント* に依存しています。 -キャッシュ・コンポーネントは通常グローバルに設定しアクセスできるように [アプリケーション・コンポーネント](structure-application-components.md) として登録されます。 -以下のコードは、二台のキャッシュ・サーバを用いる [Memcached](http://memcached.org/) を使うように `cache` アプリケーション・コンポーネントを構成する方法を示すものです。 +キャッシュ・コンポーネントは通常グローバルに設定しアクセスできるように +[アプリケーション・コンポーネント](structure-application-components.md) として登録されます。 +以下のコードは、二台のキャッシュ・サーバを用いる [Memcached](http://memcached.org/) を使うように +`cache` アプリケーション・コンポーネントを構成する方法を示すものです。 ```php 'components' => [ @@ -78,7 +82,8 @@ $data = $cache->getOrSet($key, function () use ($user_id) { こうすると、上記のキャッシュ・コンポーネントに `Yii::$app->cache` という式でアクセスできるようになります。 -すべてのキャッシュ・コンポーネントは同じ API をサポートしているので、アプリケーションの構成情報で設定しなおせば、キャッシュを使っているコードに変更を加えることなく、異なるキャッシュ・コンポーネントに入れ替えることができます。 +すべてのキャッシュ・コンポーネントは同じ API をサポートしているので、アプリケーションの構成情報で設定しなおせば、 +キャッシュを使っているコードに変更を加えることなく、異なるキャッシュ・コンポーネントに入れ替えることができます。 例えば上記の構成を [[yii\caching\ApcCache|APC キャッシュ]] を使うように変更する場合は以下のようにします: @@ -90,58 +95,79 @@ $data = $cache->getOrSet($key, function () use ($user_id) { ], ``` -> Tip: キャッシュ・コンポーネントは複数登録することができます。`cache` という名前のコンポーネントが、キャッシュに依存する多数のクラスによってデフォルトで使用されます (例えば [[yii\web\UrlManager]] など) 。 +> Tip: キャッシュ・コンポーネントは複数登録することができます。`cache` という名前のコンポーネントが、 + キャッシュに依存する多数のクラスによってデフォルトで使用されます (例えば [[yii\web\UrlManager]] など) 。 ### サポートされているキャッシュ・ストレージ -Yii はさまざまなキャッシュ・ストレージをサポートしています。以下は概要です: +Yii はさまざまなキャッシュ・ストレージをサポートしています。以下がその概要です: * [[yii\caching\ApcCache]]: PHP の [APC](http://php.net/manual/ja/book.apc.php) 拡張モジュールを使用します。 -集中型の重厚なアプリケーションのキャッシュを扱うときには最速の一つとして考えることができます -(例えば、サーバが一台で、専用のロード・バランサを持っていない、などの場合)。 -* [[yii\caching\DbCache]]: キャッシュされたデータを格納するためにデータベースのテーブルを使用します。このキャッシュを使用するには [[yii\caching\DbCache::cacheTable]] で指定したテーブルを作成する必要があります。 + 集中型の重厚なアプリケーションのキャッシュを扱うときには最速の一つとして考えることができます + (例えば、サーバが一台で、専用のロード・バランサを持っていない、などの場合)。 +* [[yii\caching\DbCache]]: キャッシュされたデータを格納するためにデータベースのテーブルを使用します。 + このキャッシュを使用するには [[yii\caching\DbCache::cacheTable]] で指定したテーブルを作成する必要があります。 +* [[yii\caching\ArrayCache]]: 配列に値を保存することによって、現在のリクエストのためだけのキャッシュを提供します。 + ArrayCache のパフォーマンスを高めるために、[[yii\caching\ArrayCache::$serializer]] を `false` に設定して、 + 保存するデータのシリアライズを無効にすることが出来ます。 . * [[yii\caching\DummyCache]]: 実際にはキャッシュを行わない、キャッシュのプレースホルダとして働きます。 -このコンポーネントの目的は、キャッシュの可用性をチェックする必要があるコードを簡略化することです。 -たとえば、開発中やサーバに実際のキャッシュ・サポートがない場合でも、このキャッシュを使用するようにキャッシュ・コンポーネントを構成することができます。 -そして、実際のキャッシュ・サポートが有効になったときに、対応するキャッシュ・コンポーネントに切替えて使用します。 -どちらの場合も、`Yii::$app->cache` が `null` かも知れないと心配せずに、データを取得するために同じコード `Yii::$app->cache->get($key)` を使用できます。 -* [[yii\caching\FileCache]]: キャッシュされたデータを保存するために通常のファイルを使用します。これはページ・コンテントなど大きなかたまりのデータに特に適しています。 -* [[yii\caching\MemCache]]: PHP の [Memcache](http://php.net/manual/ja/book.memcache.php) と [Memcached](http://php.net/manual/ja/book.memcached.php) 拡張モジュールを使用します。 -分散型のアプリケーションでキャッシュを扱うときには最速の一つとして考えることができます (例えば、複数台のサーバで、ロード・バランサがある、などの場合) 。 -* [[yii\redis\Cache]]: [Redis](http://redis.io/) の key-value ストアに基づいてキャッシュ・コンポーネントを実装しています。(Redis の バージョン 2.6.12 以降が必要とされます) 。 -* [[yii\caching\WinCache]]: PHP の [WinCache](http://iis.net/downloads/microsoft/wincache-extension) ([関連リンク](http://php.net/manual/ja/book.wincache.php)) 拡張モジュールを使用します。 + このコンポーネントの目的は、キャッシュの可用性をチェックする必要があるコードを簡略化することです。 + たとえば、開発中やサーバに実際のキャッシュ・サポートがない場合でも、 + このキャッシュを使用するようにキャッシュ・コンポーネントを構成することができます。 + そして、実際のキャッシュ・サポートが有効になったときに、対応するキャッシュ・コンポーネントに切替えて使用します。 + どちらの場合も、`Yii::$app->cache` が `null` かも知れないと心配せずに、 + データを取得するために同じコード `Yii::$app->cache->get($key)` を使用できます。 +* [[yii\caching\FileCache]]: キャッシュされたデータを保存するために通常のファイルを使用します。 + これはページ・コンテントなど大きなかたまりのデータに特に適しています。 +* [[yii\caching\MemCache]]: PHP の [Memcache](http://php.net/manual/ja/book.memcache.php) と + [Memcached](http://php.net/manual/ja/book.memcached.php) 拡張モジュールを使用します。 + 分散型のアプリケーションでキャッシュを扱うときには最速の一つとして考えることができます + (例えば、複数台のサーバで、ロード・バランサがある、などの場合) 。 +* [[yii\redis\Cache]]: [Redis](http://redis.io/) の key-value ストアに基づいてキャッシュ・コンポーネントを実装しています。 + (Redis の バージョン 2.6.12 以降が必要とされます) 。 +* [[yii\caching\WinCache]]: PHP の [WinCache](http://iis.net/downloads/microsoft/wincache-extension) エクステンションを使用します。 + ([参照リンク](http://php.net/manual/ja/book.wincache.php)) * [[yii\caching\XCache]] _(非推奨)_: PHP の [XCache](http://xcache.lighttpd.net/) 拡張モジュールを使用します。 -* [[yii\caching\ZendDataCache]] _(非推奨)_: キャッシュ・メディアして [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm) を使用します。 +* [[yii\caching\ZendDataCache]] _(非推奨)_: + キャッシュ・メディアとして [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm) + を使用します。 + -> Tip: 同じアプリケーション内で異なるキャッシュを使用することもできます。一般的なやり方として、小さくとも常に使用されるデータ (例えば、統計データ) を格納する場合はメモリ・ベースのキャッシュ・ストレージを使用し、大きくて使用頻度の低いデータ (例えば、ページ・コンテント) を格納する場合はファイル・ベース、またはデータベースのキャッシュ・ストレージを使用します 。 +> Tip: 同じアプリケーション内で異なるキャッシュを使用することもできます。 + 一般的なやり方として、小さくとも常に使用されるデータ (例えば、統計データ) を格納する場合はメモリ・ベースのキャッシュ・ストレージを使用し、 + 大きくて使用頻度の低いデータ (例えば、ページ・コンテント) を格納する場合はファイル・ベース、またはデータベースのキャッシュ・ストレージを使用します 。 ## キャッシュ API すべてのキャッシュ・コンポーネントが同じ基底クラス [[yii\caching\Cache]] を持っているので、以下の API をサポートしています。 -* [[yii\caching\Cache::get()|get()]]: 指定されたキーを用いてキャッシュからデータを取得します。データが見つからないか、もしくは有効期限が切れたり無効になったりしている場合は false を返します。 +* [[yii\caching\Cache::get()|get()]]: 指定されたキーを用いてキャッシュからデータを取得します。 + データが見つからないか、もしくは有効期限が切れたり無効になったりしている場合は false を返します。 * [[yii\caching\Cache::set()|set()]]: キーによって識別されるデータをキャッシュに格納します。 * [[yii\caching\Cache::add()|add()]]: キーがキャッシュ内で見つからない場合に、キーによって識別されるデータをキャッシュに格納します。 * [[yii\caching\Cache::getOrSet()|getOrSet()]]: 指定されたキーを用いてキャッシュからデータを取得します。 取得できなかった場合は、渡されたコールバック関数を実行し、関数の返り値をそのキーでキャッシュに保存し、そしてその値を返します。 * [[yii\caching\Cache::multiGet()|multiGet()]]: 指定されたキーを用いてキャッシュから複数のデータを取得します。 * [[yii\caching\Cache::multiSet()|multiSet()]]: キャッシュに複数のデータを格納します。各データはキーによって識別されます。 -* [[yii\caching\Cache::multiAdd()|multiAdd()]]: キャッシュに複数のデータを格納します。各データはキーによって識別されます。もしキャッシュ内にキーがすでに存在する場合はスキップされます。 +* [[yii\caching\Cache::multiAdd()|multiAdd()]]: キャッシュに複数のデータを格納します。 + 各データはキーによって識別されます。もしキャッシュ内にキーがすでに存在する場合はスキップされます。 * [[yii\caching\Cache::exists()|exists()]]: 指定されたキーがキャッシュ内で見つかったかどうかを示す値を返します。 * [[yii\caching\Cache::delete()|delete()]]: キャッシュからキーによって識別されるデータを削除します。 * [[yii\caching\Cache::flush()|flush()]]: キャッシュからすべてのデータを削除します。 > Note: boolean 型の `false` を直接にキャッシュしてはいけません。 -なぜなら、[[yii\caching\Cache::get()|get()]] メソッドは、データがキャッシュ内に見つからないことを示すために戻り値として `false` を使用しているからです。 -代りに、配列内に `false` を置いてキャッシュすることによって、この問題を回避して下さい。 + なぜなら、[[yii\caching\Cache::get()|get()]] メソッドは、データがキャッシュ内に見つからないことを示すために戻り値として `false` を使用しているからです。 + 代りに、配列内に `false` を置いてキャッシュすることによって、この問題を回避して下さい。 -キャッシュされたデータを取得する際に発生するオーバーヘッドを減らすために、MemCache, APC などのいくつかのキャッシュ・ストレージは、バッチ・モードで複数のキャッシュされた値を取得することをサポートしています。 +キャッシュされたデータを取得する際に発生するオーバーヘッドを減らすために、MemCache, APC などのいくつかのキャッシュ・ストレージは、 +バッチ・モードで複数のキャッシュされた値を取得することをサポートしています。 [[yii\caching\Cache::multiGet()|multiGet()]] や [[yii\caching\Cache::multiAdd()|multiAdd()]] などの API はこの機能を十分に引き出すために提供されています。 基礎となるキャッシュ・ストレージがこの機能をサポートしていない場合には、シミュレートされます。 -[[yii\caching\Cache]] は `ArrayAccess` インタフェイスを継承しているので、キャッシュ・コンポーネントは配列のように扱うことができます。以下はいくつかの例です: +[[yii\caching\Cache]] は `ArrayAccess` インタフェイスを継承しているので、キャッシュ・コンポーネントは配列のように扱うことができます。 +以下はいくつかの例です: ```php $cache['var1'] = $value1; // $cache->set('var1', $value1); と同等 @@ -155,7 +181,8 @@ $value2 = $cache['var2']; // $value2 = $cache->get('var2'); と同等 キャッシュ内にデータを格納するときはキーを指定する必要があります。 また、あとでキャッシュからデータを取得するときは、それに対応するキーを提供しなければなりません。 -キャッシュのキーとしては、文字列または任意の値を使用することができます。キーが文字列でない場合は、自動的に文字列にシリアライズされます。 +キャッシュのキーとしては、文字列または任意の値を使用することができます。 +キーが文字列でない場合は、自動的に文字列にシリアライズされます。 キャッシュのキーを定義する一般的なやり方として、全ての決定要素を配列の形で含めるという方方があります。 例えば [[yii\db\Schema]] はデータベース・テーブルのスキーマ情報を以下のキーを使用してキャッシュしています。 @@ -175,7 +202,8 @@ $value2 = $cache['var2']; // $value2 = $cache->get('var2'); と同等 文字列または整数のキーだけです。それらより複雑なキーを設定する必要がある場合は、 [[yii\caching\Cache::set()|set()]] または [[yii\caching\Cache::add()|add()]] によって、値を個別に保存してください。 -同じキャッシュ・ストレージが異なるアプリケーションによって使用されているときは、キャッシュのキーの競合を避けるために、各アプリケーションではユニークなキーの接頭辞を指定する必要があります。 +同じキャッシュ・ストレージが異なるアプリケーションによって使用されているときは、 +キャッシュのキーの競合を避けるために、各アプリケーションではユニークなキーの接頭辞を指定する必要があります。 これは [[yii\caching\Cache::keyPrefix]] プロパティを設定することで出来ます。例えば、アプリケーション構成情報で以下のように書くことができます: ```php @@ -192,10 +220,12 @@ $value2 = $cache['var2']; // $value2 = $cache->get('var2'); と同等 ### キャッシュの有効期限 -キャッシュに格納されたデータは、何らかのキャッシュ・ポリシー (例えば、キャッシュ・スペースがいっぱいになったときは最も古いデータが削除される、など) の執行によって除去されない限り、永遠に残り続けます。 +キャッシュに格納されたデータは、何らかのキャッシュ・ポリシー (例えば、キャッシュ・スペースがいっぱいになったときは最も古いデータが削除される、など) +の執行によって除去されない限り、永遠に残り続けます。 この動作を変えるために [[yii\caching\Cache::set()|set()]] を呼んでデータ・アイテムを保存するときに、有効期限パラメータを指定することができます。 このパラメータは、データ・アイテムが何秒間有効なものとしてキャッシュ内に残ることが出来るかを示します。 -[[yii\caching\Cache::get()|get()]] でデータ・アイテムを取得する際に有効期限が切れていた場合は、キャッシュ内にデータが見つからなかったことを示す `false` が返されます。例えば、 +[[yii\caching\Cache::get()|get()]] でデータ・アイテムを取得する際に有効期限が切れていた場合は、 +キャッシュ内にデータが見つからなかったことを示す `false` が返されます。例えば、 ```php // 最大で 45 秒間キャッシュ内にデータを保持する @@ -209,7 +239,8 @@ if ($data === false) { } ``` -バージョン 2.0.11 以降は、デフォルトの無限の有効期限に替えて特定の有効期限を指定したい場合には、キャッシュ・コンポーネントの構成で [[yii\caching\Cache::$defaultDuration|defaultDuration]] の値を指定することが出来ます。 +バージョン 2.0.11 以降は、デフォルトの無限の有効期限に替えて特定の有効期限を指定したい場合には、 +キャッシュ・コンポーネントの構成で [[yii\caching\Cache::$defaultDuration|defaultDuration]] の値を指定することが出来ます。 これによって、特定の `duration` パラメータを毎回 [[yii\caching\Cache::set()|set()]] に渡さなくてもよくなります。 @@ -218,10 +249,12 @@ if ($data === false) { 有効期限の設定に加えて、キャッシュされたデータは、いわゆる *キャッシュの依存* (キャッシュが依存している事物) の変化によって無効にすることもできます。 例えば [[yii\caching\FileDependency]] は、キャッシュがファイルの更新時刻に依存していることを表しています。 この依存が変化したときは、対応するファイルが更新されたことを意味します。 -その結果、キャッシュ内で見つかった古いファイルのコンテントは、無効とされるべきであり [[yii\caching\Cache::get()|get()]] は `false` を返さなければなりません。 +その結果、キャッシュ内で見つかった古いファイルのコンテントは、無効とされるべきであり +[[yii\caching\Cache::get()|get()]] は `false` を返さなければなりません。 キャッシュの依存は [[yii\caching\Dependency]] の子孫クラスのオブジェクトとして表現されます。 -[[yii\caching\Cache::set()|set()]] でキャッシュにデータ・アイテムを格納する際に、関連するキャッシュの依存のオブジェクトを一緒に渡すことができます。例えば、 +[[yii\caching\Cache::set()|set()]] でキャッシュにデータ・アイテムを格納する際に、 +関連するキャッシュの依存のオブジェクトを一緒に渡すことができます。例えば、 ```php // example.txt ファイルの更新日時への依存を作成します。 @@ -244,7 +277,7 @@ $data = $cache->get($key); - [[yii\caching\ExpressionDependency]]: 指定された PHP の式の結果が変更された場合、依存が変更されます。 - [[yii\caching\FileDependency]]: ファイルの最終更新日時が変更された場合、依存が変更されます。 - [[yii\caching\TagDependency]]: キャッシュされるデータ・アイテムに一つまたは複数のタグを関連付けます。 -[[yii\caching\TagDependency::invalidate()]] を呼び出すことによって、指定されたタグ (複数可) を持つキャッシュされたデータ・アイテムを無効にすることができます。 + [[yii\caching\TagDependency::invalidate()]] を呼び出すことによって、指定されたタグ (複数可) を持つキャッシュされたデータ・アイテムを無効にすることができます。 > Note: 依存を有するキャッシュについて [[yii\caching\Cache::exists()|exists()]] メソッドを使用することは避けてください。 このメソッドは、キャッシュされたデータに関連づけられた依存がある場合でも、依存が変化したかどうかをチェックしません。 @@ -253,7 +286,8 @@ $data = $cache->get($key); ## クエリ・キャッシュ -クエリ・キャッシュは、データ・キャッシュ上に構築された特別なキャッシュ機能で、データベースのクエリ結果をキャッシュするために提供されています。 +クエリ・キャッシュは、データ・キャッシュ上に構築された特別なキャッシュ機能で、 +データベースのクエリ結果をキャッシュするために提供されています。 クエリ・キャッシュは [[yii\db\Connection|データベース接続]] と有効な `cache` [アプリケーション・コンポーネント](#cache-components) を必要とします。 `$db` を [[yii\db\Connection]] のインスタンスと仮定した場合、クエリ・キャッシュの基本的な使い方は以下のようになります: @@ -267,6 +301,7 @@ $result = $db->cache(function ($db) { }); ``` + クエリ・キャッシュは [DAO](db-dao.md) だけではなく [アクティブ・レコード](db-active-record.md) でも使用することができます。 ```php @@ -275,7 +310,8 @@ $result = Customer::getDb()->cache(function ($db) { }); ``` -> Info: いくつかの DBMS (例えば [MySQL](http://dev.mysql.com/doc/refman/5.1/ja/query-cache.html)) もデータベース・サーバ・サイドのクエリ・キャッシュをサポートしています。 +> Info: いくつかの DBMS (例えば [MySQL](http://dev.mysql.com/doc/refman/5.1/ja/query-cache.html)) + もデータベース・サーバ・サイドのクエリ・キャッシュをサポートしています。 どちらのクエリ・キャッシュ・メカニズムを選んでも構いません。 前述した Yii のクエリ・キャッシュにはキャッシュの依存を柔軟に指定できるという利点があり、潜在的にはより効率的です。 @@ -293,8 +329,10 @@ User::find()->cache(7200)->all(); クエリ・キャッシュには [[yii\db\Connection]] を通して設定可能な三つのグローバルなオプションがあります: * [[yii\db\Connection::enableQueryCache|enableQueryCache]]: クエリ・キャッシュを可能にするかどうか。デフォルトは `true` です。 -実効的にクエリ・キャッシュをオンにするには [[yii\db\Connection::queryCache|queryCache]] によって指定される有効なキャッシュを持っている必要があることに注意してください。 -* [[yii\db\Connection::queryCacheDuration|queryCacheDuration]]: これはクエリ結果がキャッシュ内に有効な状態として持続できる秒数を表します。 + 実効的にクエリ・キャッシュをオンにするには [[yii\db\Connection::queryCache|queryCache]] + によって指定される有効なキャッシュを持っている必要があることに注意してください。 +* [[yii\db\Connection::queryCacheDuration|queryCacheDuration]]: これはクエリ結果がキャッシュ内に有効な状態として + 持続できる秒数を表します。 クエリ・キャッシュを永遠にキャッシュに残したい場合は 0 を指定することができます。 このプロパティは [[yii\db\Connection::cache()]] が持続時間を指定せず呼び出されたときに使用されるデフォルト値です。 * [[yii\db\Connection::queryCache|queryCache]]: これはキャッシュ・アプリケーション・コンポーネントの ID を表します。 @@ -303,7 +341,8 @@ User::find()->cache(7200)->all(); ### 使い方 -クエリ・キャッシュを使用する必要がある複数の SQL クエリを持っている場合は [[yii\db\Connection::cache()]] を使用することができます。使い方としては以下のように、 +クエリ・キャッシュを使用する必要がある複数の SQL クエリを持っている場合は [[yii\db\Connection::cache()]] +を使用することができます。使い方は以下のとおりです。 ```php $duration = 60; // クエリ結果を 60 秒間 キャッシュ @@ -320,10 +359,11 @@ $result = $db->cache(function ($db) { 無名関数内の任意の SQL クエリは、指定した依存とともに指定された期間キャッシュされます。 もしキャッシュ内に有効なクエリ結果が見つかった場合は、クエリはスキップされ、代りに結果がキャッシュから提供されます。 -`$duration` の指定がない場合 [[yii\db\Connection::queryCacheDuration|queryCacheDuration]] で指定されている値が代りに使用されます。 - -また、`cache()` 内でいくつかの特定のクエリに対してクエリ・キャッシュを無効にすることもできます。この場合 [[yii\db\Connection::noCache()]] を使用します。 +`$duration` の指定がない場合 [[yii\db\Connection::queryCacheDuration|queryCacheDuration]] +で指定されている値が代りに使用されます。 +場合によっては `cache()` 内でいくつかの特定のクエリに対してクエリ・キャッシュを無効にしたいことが有るでしょう。 +そのときは [[yii\db\Connection::noCache()]] を使用します。 ```php $result = $db->cache(function ($db) { @@ -342,7 +382,8 @@ $result = $db->cache(function ($db) { }); ``` -単一のクエリのためにクエリ・キャッシュを使用する場合は、コマンドを構築するときに [[yii\db\Command::cache()]] を呼び出すことができます。例えば、 +単一のクエリのためだけにクエリ・キャッシュを使用したい場合は、コマンドを構築するときに [[yii\db\Command::cache()]] +を呼び出すことができます。例えば、 ```php // クエリ・キャッシュを使い、期間を 60 秒にセットする @@ -369,9 +410,12 @@ $result = $db->cache(function ($db) { ### 制約 リソース・ハンドラを返すようなクエリにはクエリ・キャッシュは働きません。 -例えば、いくつかの DBMS において BLOB 型のカラムを用いる場合、クエリ結果はカラム・データに対するリソース・ハンドラを返します。 +例えば、いくつかの DBMS において BLOB 型のカラムを用いる場合、 +クエリ結果はカラム・データに対するリソース・ハンドラを返します。 -いくつかのキャッシュ・ストレージはサイズに制約があります。例えば Memcache では、各エントリのサイズは 1MB が上限値です。そのためクエリ結果のサイズがこの制約を越える場合、キャッシュは失敗します。 +いくつかのキャッシュ・ストレージはサイズに制約があります。 +例えば Memcache では、各エントリのサイズは 1MB が上限値です。 +そのためクエリ結果のサイズがこの制約を越える場合、キャッシュは失敗します。 ## キャッシュのフラッシュ @@ -381,7 +425,7 @@ $result = $db->cache(function ($db) { コンソールから `yii cache/flush` を呼ぶことによっても、キャッシュをフラッシュすることが出来ます。 - `yii cache`: アプリケーションで利用可能なキャッシュのリストを表示します。 - `yii cache/flush cache1 cache2`: キャッシュ・コンポーネント `cache1` と `cache2` をフラッシュします -(複数のコンポーネント名をスペースで区切って渡すことが出来ます) + (複数のコンポーネント名をスペースで区切って渡すことが出来ます) - `yii cache/flush-all`: アプリケーションの全てのキャッシュ・コンポーネントをフラッシュします。 > Info: デフォルトでは、コンソール・アプリケーションは独立した構成情報ファイルを使用します。 diff --git a/docs/guide-ja/caching-fragment.md b/docs/guide-ja/caching-fragment.md index e6b0e6b483f..4648769f0aa 100644 --- a/docs/guide-ja/caching-fragment.md +++ b/docs/guide-ja/caching-fragment.md @@ -17,21 +17,26 @@ if ($this->beginCache($id)) { ``` つまり、コンテント生成ロジックを [[yii\base\View::beginCache()|beginCache()]] と [[yii\base\View::endCache()|endCache()]] の呼び出しのペアで囲みます。 -コンテントがキャッシュ内で見つかった場合、[[yii\base\View::beginCache()|beginCache()]] はキャッシュされたコンテントをレンダリングして `false` を返し、結果として、コンテント生成ロジックがスキップされます。 -それ以外の場合はコンテント生成ロジックが呼ばれ、そして [[yii\base\View::endCache()|endCache()]] が呼ばれたときに、生成されたコンテントがキャプチャされ、キャッシュに格納されます。 +コンテントがキャッシュ内で見つかった場合、[[yii\base\View::beginCache()|beginCache()]] はキャッシュされたコンテントをレンダリングして +`false` を返し、結果として、コンテント生成ロジックがスキップされます。 +それ以外の場合はコンテント生成ロジックが呼ばれ、そして [[yii\base\View::endCache()|endCache()]] が呼ばれたときに、 +生成されたコンテントがキャプチャされ、キャッシュに格納されます。 [データ・キャッシュ](caching-data.md) と同様に、キャッシュされるコンテントを識別するためにユニークな `$id` が必要になります。 ## キャッシュのオプション -[[yii\base\View::beginCache()|beginCache()]] メソッドの 2 番目のパラメータとしてオプションの配列を渡すことによって、フラグメント・キャッシュに関する追加のオプションを指定することができます。 -舞台の裏側では、このオプションの配列が、実際のフラグメント・キャッシュ機能を実装する [[yii\widgets\FragmentCache]] ウィジェットを構成するために使用されます。 +[[yii\base\View::beginCache()|beginCache()]] メソッドの 2 番目のパラメータとしてオプションの配列を渡すことによって、 +フラグメント・キャッシュに関する追加のオプションを指定することができます。 +舞台の裏側では、このオプションの配列が、実際のフラグメント・キャッシュ機能を実装する +[[yii\widgets\FragmentCache]] ウィジェットを構成するために使用されます。 ### 持続時間 おそらくフラグメント・キャッシュで通常よく使われるであろうオプションは [[yii\widgets\FragmentCache::duration|duration]] でしょう。 -このオプションはコンテントがどれだけの時間キャッシュ内において有効であるかを指定します。以下のコードは最大で 1 時間コンテントの断片をキャッシュします: +このオプションはコンテントがどれだけの時間キャッシュ内において有効であるかを指定します。 +以下のコードは最大で 1 時間コンテントの断片をキャッシュします: ```php if ($this->beginCache($id, ['duration' => 3600])) { @@ -42,15 +47,16 @@ if ($this->beginCache($id, ['duration' => 3600])) { } ``` -このオプションがセットされていない場合は、デフォルトである 60 が使われます。 -すなわち、キャッシュされたコンテントの有効期限は 60 秒後に切れることになります。 +このオプションがセットされていない場合は、デフォルトである 60 が使われます。すなわち、キャッシュされたコンテントの有効期限は 60 秒後に切れることになります。 + ### 依存 [データ・キャッシュ](caching-data.md#cache-dependencies) と同様に、キャッシュされたコンテントの断片は依存を持つことができます。 例えば、表示されている投稿の内容は、投稿が変更されたか否かに依存します。 -依存を指定するには [[yii\widgets\FragmentCache::dependency|dependency]] オプションに [[yii\caching\Dependency]] オブジェクトを指定するか、または依存オブジェクトを作成するための構成情報配列を指定します。 +依存を指定するには [[yii\widgets\FragmentCache::dependency|dependency]] オプションに [[yii\caching\Dependency]] +オブジェクトを指定するか、または依存オブジェクトを作成するための構成情報配列を指定します。 以下のコードはコンテントの断片が `updated_at` カラムの値の変化に依存していることを指定しています: ```php @@ -107,8 +113,7 @@ if ($this->beginCache($id, ['enabled' => Yii::$app->request->isGet])) { ## キャッシュのネスト -フラグメント・キャッシュはネストすることができます。 -つまり、キャッシュされる断片を、それ自体もキャッシュされる別の断片に入れることができます。 +フラグメント・キャッシュはネストすることができます。つまり、キャッシュされる断片を、それ自体もキャッシュされる別の断片に入れることができます。 例えば、内側のフラグメント・キャッシュにはコメントがキャッシュされており、外側のフラグメント・キャッシュには記事内容と一緒にコメントもキャッシュされている、という形です。 以下のコードは 2 つのフラグメント・キャッシュをネストする方法を示すものです。 @@ -142,13 +147,16 @@ if ($this->beginCache($id1)) { フラグメント・キャッシュを使用する際、出力全体が比較的静的で、一ヶ所ないし数ヶ所だけが例外的に動的であるというような状況に遭遇するでしょう。 例えば、ページのヘッダがメイン・メニュー・バーと現在のユーザ名を一緒に表示している場合です。 -もう一つの問題は、キャッシュされるコンテントに、リクエスト毎に実行しなければいけない PHP のコード (例えば、アセット・バンドルを登録するためのコード) が含まれている場合です。 +もう一つの問題は、キャッシュされるコンテントに、リクエスト毎に実行しなければいけない PHP のコード +(例えば、アセット・バンドルを登録するためのコード) が含まれている場合です。 この両方の問題は、いわゆる *ダイナミック・コンテント* 機能によって解決することができます。 ダイナミック・コンテントは、それがフラグメント・キャッシュの中に含まれていても、キャッシュすべきではない出力の部分を意味します。 -このコンテントを常に動的にするためには、外側のコンテントがキャッシュから提供されている場合でも、すべてのリクエストに対して、何らかの PHP コードを実行することにより生成しなければいけません。 +このコンテントを常に動的にするためには、外側のコンテントがキャッシュから提供されている場合でも、 +すべてのリクエストに対して、何らかの PHP コードを実行することにより生成しなければいけません。 -ダイナミック・コンテントを目的の場所に挿入するには、以下のように、キャッシュされる断片内で [[yii\base\View::renderDynamic()]] を呼び出します。 +ダイナミック・コンテントを目的の場所に挿入するには、以下のように、キャッシュされる断片内で +[[yii\base\View::renderDynamic()]] を呼び出します。 ```php if ($this->beginCache($id1)) { diff --git a/docs/guide-ja/caching-http.md b/docs/guide-ja/caching-http.md index f29422a861a..fb466e742df 100644 --- a/docs/guide-ja/caching-http.md +++ b/docs/guide-ja/caching-http.md @@ -1,9 +1,11 @@ HTTP キャッシュ =============== -これまでのセクションで説明したサーバ・サイドのキャッシュに加えて、ウェブ・アプリケーションは、同じページ・コンテントを生成し送信する時間を節約するために、クライアント・サイドでもキャッシュを利用することができます。 +これまでのセクションで説明したサーバ・サイドのキャッシュに加えて、ウェブ・アプリケーションは、 +同じページ・コンテントを生成し送信する時間を節約するために、クライアント・サイドでもキャッシュを利用することができます。 -クライアント・サイドのキャッシュを使用するには、レンダリング結果をキャッシュできるように、コントローラ・アクションのフィルタとして [[yii\filters\HttpCache]] を設定します。 +クライアント・サイドのキャッシュを使用するには、レンダリング結果をキャッシュできるように、 +コントローラ・アクションのフィルタとして [[yii\filters\HttpCache]] を設定します。 [[yii\filters\HttpCache]] は `GET` と `HEAD` リクエストに対してのみ動作し、それらのリクエストに対する 3 種類のキャッシュ関連の HTTP ヘッダを扱うことができます: * [[yii\filters\HttpCache::lastModified|Last-Modified]] @@ -49,7 +51,8 @@ public function behaviors() 上記のコードは `index` アクションでのみ HTTP キャッシュを有効にすべきことを記述しています。 `Last-Modified` は、投稿の最終更新時刻に基づいて生成される必要があります。 ブラウザが初めて `index` ページにアクセスしたときは、ページはサーバ上で生成されブラウザに送信されます。 -もしブラウザが再度同じページにアクセスし、その期間中に投稿に変更がない場合は、サーバはページを再生成せず、ブラウザはクライアント・サイドにキャッシュしたものを使用します。 +もしブラウザが再度同じページにアクセスし、その期間中に投稿に変更がない場合は、サーバはページを再生成せず、 +ブラウザはクライアント・サイドにキャッシュしたものを使用します。 その結果、サーバ・サイドのレンダリング処理とページ・コンテントの送信は両方ともスキップされます。 @@ -60,7 +63,8 @@ public function behaviors() サーバ・サイドで生成されたハッシュとクライアント・サイドで保持しているハッシュを比較することによって、ページが変更されたかどうか、そして再送信するべきかどうかを決定します。 `ETag` ヘッダの送信を有効にするには [[yii\filters\HttpCache::etagSeed]] プロパティを設定します。 -プロパティは ETag のハッシュを生成するためのシードを返す PHP のコーラブルで、以下のようなシグネチャを持たなければなりません。 +プロパティは ETag のハッシュを生成するためのシードを返す PHP のコーラブルで、 +以下のようなシグネチャを持たなければなりません。 ```php /** @@ -92,20 +96,28 @@ public function behaviors() 上記のコードは `view` アクションでのみ HTTP キャッシュを有効にすべきことを記述しています。 `Etag` HTTP ヘッダは、リクエストされた投稿のタイトルとコンテントに基づいて生成されなければなりません。 ブラウザが初めて `view` ページにアクセスしたときは、ページがサーバ上で生成されブラウザに送信されます。 -ブラウザが再度同じページにアクセスし、投稿のタイトルやコンテントに変更がない場合には、サーバはページを再生成せず、ブラウザはクライアント・サイドにキャッシュしたものを使用します。 +ブラウザが再度同じページにアクセスし、投稿のタイトルやコンテントに変更がない場合には、 +サーバはページを再生成せず、ブラウザはクライアント・サイドにキャッシュしたものを使用します。 その結果、サーバ・サイドのレンダリング処理とページ・コンテント送信は両方ともスキップされます。 -ETag は `Last-Modified` ヘッダよりも複雑 かつ/または より正確なキャッシング方式を可能にします。例えば、サイトが別のテーマに切り替わった場合には ETag を無効化する、といったことができます。 +ETag は `Last-Modified` ヘッダよりも複雑 かつ/または より正確なキャッシング方式を可能にします。 +例えば、サイトが別のテーマに切り替わった場合には ETag を無効化する、といったことができます。 -ETag はリクエスト毎に再評価する必要があるため、負荷の高い生成方法を使うと `HttpCache` の本来の目的を損なって不必要なオーバーヘッドが生じる場合があります。 +ETag はリクエスト毎に再評価する必要があるため、負荷の高い生成方法を使うと `HttpCache` +の本来の目的を損なって不必要なオーバーヘッドが生じる場合があります。 ページのコンテントが変更されたときにキャッシュを無効化するための式は単純なものを指定するようにして下さい。 -> Note: [RFC 7232](http://tools.ietf.org/html/rfc7232#section-2.4) に準拠して `Etag` と `Last-Modified` ヘッダの両方を設定した場合、`HttpCache` はその両方とも送信します。また、もし `If-None-Match` ヘッダと `If-Modified-Since` ヘッダの両方を送信した場合は前者のみが尊重されます。 +> Note: [RFC 7232](http://tools.ietf.org/html/rfc7232#section-2.4) に準拠して + `Etag` と `Last-Modified` ヘッダの両方を設定した場合、 + `HttpCache` はその両方とも送信します。 また、もし `If-None-Match` ヘッダと + `If-Modified-Since` ヘッダの両方を送信した場合は前者のみが尊重されます。 + ## `Cache-Control` ヘッダ `Cache-Control` ヘッダはページのための一般的なキャッシュ・ポリシーを指定します。 -[[yii\filters\HttpCache::cacheControlHeader]] プロパティにヘッダの値を設定することで、それを送ることができます。デフォルトでは、以下のヘッダが送信されます: +[[yii\filters\HttpCache::cacheControlHeader]] プロパティにヘッダの値を設定することで、それを送ることができます。 +デフォルトでは、以下のヘッダが送信されます: ``` Cache-Control: public, max-age=3600 @@ -113,15 +125,19 @@ Cache-Control: public, max-age=3600 ## セッション・キャッシュ・リミッタ -ページでセッションを使用している場合、PHP はいくつかのキャッシュ関連の HTTP ヘッダ (PHP の INI 設定ファイル内で指定されている session.cache_limiter など) を自動的に送信します。 +ページでセッションを使用している場合、PHP はいくつかのキャッシュ関連の HTTP ヘッダ +(PHP の INI 設定ファイル内で指定されている session.cache_limiter など) を自動的に送信します。 これらのヘッダが `HttpCache` が実現しようとしているキャッシュ機能を妨害したり無効にしたりすることがあります。 この問題を防止するために、`HttpCache` はこれらのヘッダの送信をデフォルトで自動的に無効化します。 この動作を変更したい場合は [[yii\filters\HttpCache::sessionCacheLimiter]] プロパティを設定します。 このプロパティには `public`、`private`、`private_no_expire`、そして `nocache` などの文字列の値を使用することができます。 -これらの値についての説明は [session_cache_limiter()](http://www.php.net/manual/ja/function.session-cache-limiter.php) を参照してください。 +これらの値についての説明は [session_cache_limiter()](http://www.php.net/manual/ja/function.session-cache-limiter.php) +を参照してください。 ## SEO への影響 検索エンジンのボットはキャッシュ・ヘッダを尊重する傾向があります。 -クローラの中には、一定期間内に処理するドメインごとのページ数に制限を持っているものもあるため、キャッシュ・ヘッダを導入して、処理の必要があるページ数を減らしてやると、サイトのインデックスの作成を促進できるかも知れません。 +クローラの中には、一定期間内に処理するドメインごとのページ数に制限を持っているものもあるため、 +キャッシュ・ヘッダを導入して、処理の必要があるページ数を減らしてやると、サイトのインデックスの作成を促進できるかも知れません。 + diff --git a/docs/guide-ja/caching-overview.md b/docs/guide-ja/caching-overview.md index cb1a271bc2e..1ac0b53e331 100644 --- a/docs/guide-ja/caching-overview.md +++ b/docs/guide-ja/caching-overview.md @@ -6,7 +6,8 @@ これによって、アプリケーションは、毎回一からデータを生成した場合に必要になるであろう時間を節約することができます。 キャッシュはアプリケーション内のさまざまなレベルと場所で使用することができます。 -例えばサーバ・サイドでの低いレベルでは、データベースから取得した最新の記事情報リストのような基本的なデータを格納するためにキャッシュを使用することが出来ます。 +例えばサーバ・サイドでの低いレベルでは、データベースから取得した最新の記事情報リストのような +基本的なデータを格納するためにキャッシュを使用することが出来ます。 より高いレベルでは、ウェブ・ページの断片または全体、例えば、最新の記事のレンダリング結果を格納するためにキャッシュを使用することが出来ます。 クライアント・サイドでは、最近訪れたページの内容をブラウザのキャッシュに格納するために、HTTP キャッシュを使用することができます。 diff --git a/docs/guide-ja/caching-page.md b/docs/guide-ja/caching-page.md index 39e928df114..8d0afddc137 100644 --- a/docs/guide-ja/caching-page.md +++ b/docs/guide-ja/caching-page.md @@ -4,7 +4,8 @@ ページ・キャッシュはサーバ・サイドでページ全体のコンテントをキャッシュするものです。 後で再び同じページがリクエストされた場合に、その内容を一から生成するのではなく、キャッシュから提供します。 -ページ・キャッシュは [[yii\filters\PageCache]] という [アクション・フィルタ](structure-filters.md) によってサポートされています。これは、コントローラ・クラスで以下のように使用することができます: +ページ・キャッシュは [[yii\filters\PageCache]] という [アクション・フィルタ](structure-filters.md) によってサポートされています。 +これは、コントローラ・クラスで以下のように使用することができます: ```php public function behaviors() @@ -34,4 +35,6 @@ public function behaviors() それらは両方とも `duration`、`dependencies`、`variations`、そして `enabled` などのオプションをサポートしています。 主な違いとしては、ページ・キャッシュは [アクション・フィルタ](structure-filters.md) として、フラグメント・キャッシュは [ウィジェット](structure-widgets.md) として実装されているということです。 -[フラグメント・キャッシュ](caching-fragment.md) も、[ダイナミック・コンテント](caching-fragment.md#dynamic-content) も、ページ・キャッシュと併用することができます。 +[フラグメント・キャッシュ](caching-fragment.md) も、[ダイナミック・コンテント](caching-fragment.md#dynamic-content) も、 +ページ・キャッシュと併用することができます。 + From f5665a054466bafeaae3346e87792dee5a18ece4 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 29 Apr 2018 10:47:09 +0300 Subject: [PATCH 040/902] =?UTF-8?q?fix=20#15798=20(yii\grid\CheckboxColumn?= =?UTF-8?q?,=20yii\grid\RadioButtonColumn=20conte=E2=80=A6=20(#16021)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix #15798 (yii\grid\CheckboxColumn, yii\grid\RadioButtonColumn content option has no effect) * fix #15798 update pl, call parent method * add test for content options in checkboxcolumn and radiobuttoncolumn * update changelog by #15798 --- framework/CHANGELOG.md | 1 + framework/grid/CheckboxColumn.php | 4 ++++ framework/grid/RadioButtonColumn.php | 4 ++++ tests/framework/grid/CheckboxColumnTest.php | 20 +++++++++++++++++++ .../framework/grid/RadiobuttonColumnTest.php | 18 +++++++++++++++++ 5 files changed, 47 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 71f6839b2f1..e56e761aa3e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -8,6 +8,7 @@ Yii Framework 2 Change Log - Bug #16010: Fixed `yii\filters\ContentNegotiator` behavior when GET parameters contain an array (rugabarbo) - Bug #14660: Fixed `yii\caching\DbCache` concurrency issue when set values with the same key (rugabarbo) - Bug #15988: Fixed bash completion (alekciy) +- Bug #15798: Fixed render `yii\grid\RadioButtonColumn::$content` and `yii\grid\CheckboxColumn::$content` (lesha724) - Bug #15117: Fixed `yii\db\Schema::getTableMetadata` cache refreshing (boboldehampsink) - Bug #15875: afterSave for new models flushes unsaved data (shirase) - Bug #16073: Fixed regression in Oracle `IN` condition builder for more than 1000 items (cebe) diff --git a/framework/grid/CheckboxColumn.php b/framework/grid/CheckboxColumn.php index aec6df977ef..0ea6edca564 100644 --- a/framework/grid/CheckboxColumn.php +++ b/framework/grid/CheckboxColumn.php @@ -113,6 +113,10 @@ protected function renderHeaderCellContent() */ protected function renderDataCellContent($model, $key, $index) { + if ($this->content !== null) { + return parent::renderDataCellContent($model, $key, $index); + } + if ($this->checkboxOptions instanceof Closure) { $options = call_user_func($this->checkboxOptions, $model, $key, $index, $this); } else { diff --git a/framework/grid/RadioButtonColumn.php b/framework/grid/RadioButtonColumn.php index a021ae73471..898831ecc6e 100644 --- a/framework/grid/RadioButtonColumn.php +++ b/framework/grid/RadioButtonColumn.php @@ -80,6 +80,10 @@ public function init() */ protected function renderDataCellContent($model, $key, $index) { + if ($this->content !== null) { + return parent::renderDataCellContent($model, $key, $index); + } + if ($this->radioOptions instanceof Closure) { $options = call_user_func($this->radioOptions, $model, $key, $index, $this); } else { diff --git a/tests/framework/grid/CheckboxColumnTest.php b/tests/framework/grid/CheckboxColumnTest.php index 60a2c237257..273e870bbda 100644 --- a/tests/framework/grid/CheckboxColumnTest.php +++ b/tests/framework/grid/CheckboxColumnTest.php @@ -12,6 +12,7 @@ use yii\grid\CheckboxColumn; use yii\grid\GridView; use yii\helpers\FileHelper; +use yii\helpers\Html; use yiiunit\framework\i18n\IntlTestHelper; use yiiunit\TestCase; @@ -83,6 +84,25 @@ public function testInputValue() $this->assertContains('value="42"', $column->renderDataCell([], 1, 0)); } + public function testContent() + { + $column = new CheckboxColumn([ + 'content' => function ($model, $key, $index, $column) { + return null; + }, + 'grid' => $this->getGrid(), + ]); + $this->assertContains('', $column->renderDataCell([], 1, 0)); + + $column = new CheckboxColumn([ + 'content' => function ($model, $key, $index, $column) { + return Html::checkBox('checkBoxInput', false); + }, + 'grid' => $this->getGrid(), + ]); + $this->assertContains(Html::checkBox('checkBoxInput', false), $column->renderDataCell([], 1, 0)); + } + /** * @return GridView a mock gridview */ diff --git a/tests/framework/grid/RadiobuttonColumnTest.php b/tests/framework/grid/RadiobuttonColumnTest.php index 2e65a9aaee7..b0f27111a7e 100644 --- a/tests/framework/grid/RadiobuttonColumnTest.php +++ b/tests/framework/grid/RadiobuttonColumnTest.php @@ -11,6 +11,7 @@ use yii\data\ArrayDataProvider; use yii\grid\GridView; use yii\grid\RadioButtonColumn; +use yii\helpers\Html; use yii\web\Request; use yiiunit\TestCase; @@ -59,6 +60,23 @@ public function testOptionsByCallback() $this->assertEquals('', $actual); } + public function testContent() + { + $column = new RadioButtonColumn([ + 'content' => function ($model, $key, $index, $column) { + return null; + } + ]); + $this->assertContains('', $column->renderDataCell([], 1, 0)); + + $column = new RadioButtonColumn([ + 'content' => function ($model, $key, $index, $column) { + return Html::radio('radioButtonInput', false); + } + ]); + $this->assertContains(Html::radio('radioButtonInput', false), $column->renderDataCell([], 1, 0)); + } + public function testMultipleInGrid() { $this->mockApplication(); From cb15a413a79cee09f11408203fa2f32eb54f39bb Mon Sep 17 00:00:00 2001 From: vsivsivsi Date: Sun, 29 Apr 2018 11:05:11 +0300 Subject: [PATCH 041/902] Fix ODBC Driver 13 for SQL Server error on null (#16039) --- framework/db/mssql/QueryBuilder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/db/mssql/QueryBuilder.php b/framework/db/mssql/QueryBuilder.php index 993abe7d7e7..493e40a403e 100644 --- a/framework/db/mssql/QueryBuilder.php +++ b/framework/db/mssql/QueryBuilder.php @@ -334,7 +334,7 @@ private function normalizeTableRowData($table, $columns, &$params) $columnSchemas = $tableSchema->columns; foreach ($columns as $name => $value) { // @see https://github.com/yiisoft/yii2/issues/12599 - if (isset($columnSchemas[$name]) && $columnSchemas[$name]->type === Schema::TYPE_BINARY && $columnSchemas[$name]->dbType === 'varbinary' && is_string($value)) { + if (isset($columnSchemas[$name]) && $columnSchemas[$name]->type === Schema::TYPE_BINARY && $columnSchemas[$name]->dbType === 'varbinary' && (is_string($value) || $value === null)) { $exParams = []; $phName = $this->bindParam($value, $exParams); $columns[$name] = new Expression("CONVERT(VARBINARY, $phName)", $exParams); From 19b076d3fe9a9b6723bae6fdc0a5ca40753d9022 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Sun, 29 Apr 2018 11:07:55 +0300 Subject: [PATCH 042/902] Mentioned #16039 in CHANGELOG [skip ci] --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e56e761aa3e..90b1b08b370 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -14,6 +14,7 @@ Yii Framework 2 Change Log - Bug #16073: Fixed regression in Oracle `IN` condition builder for more than 1000 items (cebe) - Bug #16120: FileCache: rebuild cache file before touch when different file owner (Slamdunk) - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) +- Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) 2.0.15.1 March 21, 2018 From 9bf11efedf31e69a0e62cf360f108524b62d6ba6 Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Sun, 29 Apr 2018 11:15:45 +0300 Subject: [PATCH 043/902] Fixed IPv6 requirement check Closes #16035 --- framework/requirements/requirements.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/requirements/requirements.php b/framework/requirements/requirements.php index d515af77fe2..d38d7fe8853 100644 --- a/framework/requirements/requirements.php +++ b/framework/requirements/requirements.php @@ -106,7 +106,7 @@ array( 'name' => 'IPv6 support', 'mandatory' => false, - 'condition' => defined('AF_INET6'), + 'condition' => strlen(@inet_pton('2001:db8::1')) === 16, 'by' => 'IPv6 expansion in IpValidator', 'memo' => 'When IpValidator::expandIPv6 property is set to true, PHP must support IPv6 protocol stack. Currently PHP constant AF_INET6 is not defined From 2c997cdb8215255a0f749719cfed72779a1c2ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=9B=BD=E5=B8=85?= Date: Sun, 29 Apr 2018 17:36:10 +0800 Subject: [PATCH 044/902] Fixes #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` --- framework/CHANGELOG.md | 1 + framework/base/Widget.php | 6 +++--- tests/framework/base/WidgetTest.php | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 90b1b08b370..ea86aef55ba 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -14,6 +14,7 @@ Yii Framework 2 Change Log - Bug #16073: Fixed regression in Oracle `IN` condition builder for more than 1000 items (cebe) - Bug #16120: FileCache: rebuild cache file before touch when different file owner (Slamdunk) - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) +- Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) diff --git a/framework/base/Widget.php b/framework/base/Widget.php index b9d8187b7f4..d578ae485ae 100644 --- a/framework/base/Widget.php +++ b/framework/base/Widget.php @@ -87,7 +87,7 @@ public static function begin($config = []) $config['class'] = get_called_class(); /* @var $widget Widget */ $widget = Yii::createObject($config); - static::$stack[] = $widget; + self::$stack[] = $widget; return $widget; } @@ -101,8 +101,8 @@ public static function begin($config = []) */ public static function end() { - if (!empty(static::$stack)) { - $widget = array_pop(static::$stack); + if (!empty(self::$stack)) { + $widget = array_pop(self::$stack); if (get_class($widget) === get_called_class()) { /* @var $widget Widget */ if ($widget->beforeRun()) { diff --git a/tests/framework/base/WidgetTest.php b/tests/framework/base/WidgetTest.php index 54a5b50b0c9..33542a18b32 100644 --- a/tests/framework/base/WidgetTest.php +++ b/tests/framework/base/WidgetTest.php @@ -55,6 +55,19 @@ public function testStackTracking() TestWidget::end(); } + /** + * @depends testBeginEnd + */ + public function testStackTrackingDisorder() + { + $this->expectException('yii\base\InvalidCallException'); + TestWidgetA::begin(); + TestWidgetB::begin(); + TestWidgetA::end(); + TestWidgetB::end(); + } + + /** * @depends testWidget */ @@ -100,3 +113,12 @@ public function run() return 'id . '>'; } } + +class TestWidgetA extends Widget +{ + public static $stack = []; +} + +class TestWidgetB extends Widget +{ +} From b9aa0001b65400d5986488d2b64c64291dca1eeb Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Sun, 29 Apr 2018 13:13:56 +0300 Subject: [PATCH 045/902] Fixed `yii\helpers\Inflector::camel2words()` to work with UTF-8 --- framework/CHANGELOG.md | 1 + framework/helpers/BaseInflector.php | 6 +++--- tests/framework/helpers/InflectorTest.php | 1 + tests/framework/widgets/DetailViewTest.php | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ea86aef55ba..6ecc9eeadb6 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,6 +16,7 @@ Yii Framework 2 Change Log - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) - Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) +- Bug: Fixed `yii\helpers\Inflector::camel2words()` to work with UTF-8 (silverfire) 2.0.15.1 March 21, 2018 diff --git a/framework/helpers/BaseInflector.php b/framework/helpers/BaseInflector.php index 416f002c8f4..9524cc818c4 100644 --- a/framework/helpers/BaseInflector.php +++ b/framework/helpers/BaseInflector.php @@ -369,13 +369,13 @@ public static function camelize($word) */ public static function camel2words($name, $ucwords = true) { - $label = strtolower(trim(str_replace([ + $label = mb_strtolower(trim(str_replace([ '-', '_', '.', - ], ' ', preg_replace('/(?assertEquals('Camel Case', Inflector::camel2words('camelCase')); $this->assertEquals('Lower Case', Inflector::camel2words('lower_case')); $this->assertEquals('Tricky Stuff It Is Testing', Inflector::camel2words(' tricky_stuff.it-is testing... ')); + $this->assertEquals('І Це Дійсно Так!', Inflector::camel2words('ІЦеДійсноТак!')); } public function testCamel2id() diff --git a/tests/framework/widgets/DetailViewTest.php b/tests/framework/widgets/DetailViewTest.php index 910feceefc9..19ca733948e 100644 --- a/tests/framework/widgets/DetailViewTest.php +++ b/tests/framework/widgets/DetailViewTest.php @@ -85,11 +85,11 @@ public function testUnicodeAttributeNames() ]); $this->assertEquals( - 'ИдентификаторТовара:A00001', + 'Идентификатор Товара:A00001', $this->detailView->renderAttribute($this->detailView->attributes[0], 0) ); $this->assertEquals( - 'το αναγνωριστικό του:A00002', + 'Το Αναγνωριστικό Του:A00002', $this->detailView->renderAttribute($this->detailView->attributes[1], 1) ); } From ac1c42168e2845f6fbefeadbacb81f891bada8a9 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 29 Apr 2018 13:31:03 +0300 Subject: [PATCH 046/902] Added issue number [skip ci] --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 6ecc9eeadb6..a970267050b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,7 +16,7 @@ Yii Framework 2 Change Log - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) - Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) -- Bug: Fixed `yii\helpers\Inflector::camel2words()` to work with UTF-8 (silverfire) +- Bug #16191: Fixed `yii\helpers\Inflector::camel2words()` to work with UTF-8 (silverfire) 2.0.15.1 March 21, 2018 From 5a87dd2bfa91263b07a59b45ff07f05fe2b88144 Mon Sep 17 00:00:00 2001 From: Dmitry Naumenko Date: Sun, 29 Apr 2018 13:35:39 +0300 Subject: [PATCH 047/902] Added explicit encoding --- framework/helpers/BaseInflector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/helpers/BaseInflector.php b/framework/helpers/BaseInflector.php index 9524cc818c4..41d75153899 100644 --- a/framework/helpers/BaseInflector.php +++ b/framework/helpers/BaseInflector.php @@ -375,7 +375,7 @@ public static function camel2words($name, $ucwords = true) '.', ], ' ', preg_replace('/(\p{Lu})/u', ' \0', $name)))); - return $ucwords ? mb_convert_case($label, MB_CASE_TITLE) : $label; + return $ucwords ? mb_convert_case($label, MB_CASE_TITLE, 'UTF-8') : $label; } /** From 3a1165973aa6d8443dce7fe240de096c32cc8a2c Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Sun, 29 Apr 2018 23:58:04 +0900 Subject: [PATCH 048/902] guide-ja/rest-* revised [ci skip] (#16194) --- docs/guide-ja/rest-authentication.md | 35 +++++++++++++------ docs/guide-ja/rest-controllers.md | 28 +++++++++------ docs/guide-ja/rest-error-handling.md | 22 +++++++----- docs/guide-ja/rest-quick-start.md | 19 +++++----- docs/guide-ja/rest-resources.md | 52 ++++++++++++++++------------ docs/guide-ja/rest-routing.md | 19 +++++----- docs/guide-ja/rest-versioning.md | 33 ++++++++++-------- 7 files changed, 124 insertions(+), 84 deletions(-) diff --git a/docs/guide-ja/rest-authentication.md b/docs/guide-ja/rest-authentication.md index b14d885165d..4136aef146f 100644 --- a/docs/guide-ja/rest-authentication.md +++ b/docs/guide-ja/rest-authentication.md @@ -5,15 +5,21 @@ これは、セッションやクッキーは使用すべきでないことを意味します。 従って、ユーザの認証ステータスをセッションやクッキーで保持することが出来ないため、全てのリクエストに何らかの認証情報を付加する必要があります。 通常使われるのは、ユーザを認証するための秘密のアクセス・トークンを全てのリクエストとともに送信する方法です。 -アクセス・トークンはユーザを一意に特定して認証することが出来るものですので、**API リクエストは、中間者攻撃 (man-in-the-middle attack) を防止するために、常に HTTPS 経由で送信されなければなりません**。 +アクセス・トークンはユーザを一意に特定して認証することが出来るものですので、 +**API リクエストは、中間者攻撃 (man-in-the-middle attack) を防止するために、常に HTTPS 経由で送信されなければなりません**。 アクセス・トークンを送信するには、いくつかの異なる方法があります。 * [HTTP Basic 認証](http://ja.wikipedia.org/wiki/Basic%E8%AA%8D%E8%A8%BC): アクセス・トークンはユーザ名として送信されます。 - この方法は、アクセス・トークンを API コンシューマ側で安全に保存することが出来る場合、例えば API コンシューマがサーバ上で走るプログラムである場合などにのみ使用されるべきです。 -* クエリ・パラメータ: アクセス・トークンは API の URL、例えば、`https://example.com/users?access-token=xxxxxxxx` でクエリ・パラメータとして送信されます。 - ほとんどのウェブ・サーバはクエリ・パラメータをサーバのログに記録するため、この手法は、アクセス・トークンを HTTP ヘッダを使って送信することができない `JSONP` リクエストに応答するために主として使用されるべきです。 -* [OAuth 2](http://oauth.net/2/): OAuth2 プロトコルに従って、アクセス・トークンはコンシューマによって権限付与サーバから取得され、[HTTP Bearer Tokens](http://tools.ietf.org/html/rfc6750) 経由で API サーバに送信されます。 + この方法は、アクセス・トークンを API コンシューマ側で安全に保存することが出来る場合、 + 例えば API コンシューマがサーバ上で走るプログラムである場合などにのみ使用されるべきです。 +* クエリ・パラメータ: アクセス・トークンは API の URL、例えば、`https://example.com/users?access-token=xxxxxxxx` + でクエリ・パラメータとして送信されます。 + ほとんどのウェブ・サーバはクエリ・パラメータをサーバのログに記録するため、この手法は、 + アクセス・トークンを HTTP ヘッダを使って送信することができない `JSONP` リクエストに応答するために主として使用されるべきです。 +* [OAuth 2](http://oauth.net/2/): OAuth2 プロトコルに従って、 + アクセス・トークンはコンシューマによって権限付与サーバから取得され、[HTTP Bearer Tokens](http://tools.ietf.org/html/rfc6750) 経由で + API サーバに送信されます。 Yii は上記の全ての認証方法をサポートしています。新しい認証方法を作成することも簡単に出来ます。 @@ -22,15 +28,18 @@ Yii は上記の全ての認証方法をサポートしています。新しい 1. `user` [アプリケーション・コンポーネント](structure-application-components.md) を構成します。 - [[yii\web\User::enableSession|enableSession]] プロパティを `false` に設定します。 - [[yii\web\User::loginUrl|loginUrl]] プロパティを `null` に設定し、ログインページにリダイレクトする代りに HTTP 403 エラーを表示します。 -2. REST コントローラ・クラスにおいて、`authenticator` ビヘイビアを構成することによって、どの認証方法を使用するかを指定します。 +2. REST コントローラ・クラスにおいて、`authenticator` ビヘイビアを構成することによって、 + どの認証方法を使用するかを指定します。 3. [[yii\web\User::identityClass|ユーザ・アイデンティティ・クラス]] において [[yii\web\IdentityInterface::findIdentityByAccessToken()]] を実装します。 ステップ 1 は必須ではありませんが、ステート・レスであるべき RESTful API のために推奨されます。 [[yii\web\User::enableSession|enableSession]] が `false` である場合、ユーザの認証ステータスがセッションを使ってリクエストをまたいで存続することはありません。 その代りに、すべてのリクエストに対して認証が実行されます。このことは、ステップ 2 と 3 によって達成されます。 -> Tip: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーション・コンポーネント(structure-application-components.md) の [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。 +> Tip: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーション・コンポーネント(structure-application-components.md) +> [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。 > RESTful API をモジュールとして開発する場合は、次のように、モジュールの `init()` メソッドに一行を追加することが出来ます。 +> > ```php > public function init() > { @@ -97,18 +106,22 @@ class User extends ActiveRecord implements IdentityInterface } ``` -上記のように認証が有効化された後は、全ての API リクエストに対して、リクエストされたコントローラが `beforeAction()` の段階でユーザを認証することを試みます。 +上記のように認証が有効化された後は、全ての API リクエストに対して、リクエストされたコントローラ + `beforeAction()` の段階でユーザを認証することを試みます。 認証が成功すると、コントローラはその他のチェック (レート制限、権限付与など) をしてから、アクションを実行します。 認証されたユーザのアイデンティティは `Yii::$app->user->identity` によって取得することが出来ます。 -認証が失敗したときは、HTTP ステータス 401 およびその他の適切なヘッダ (HTTP Basic 認証に対する `WWW-Authenticate` ヘッダなど) を持つレスポンスが送り返されます。 +認証が失敗したときは、HTTP ステータス 401 およびその他の適切なヘッダ (HTTP Basic 認証に対する `WWW-Authenticate` ヘッダなど) +を持つレスポンスが送り返されます。 ## 権限付与 -ユーザが認証された後、おそらくは、リクエストされたリソースに対してリクエストされたアクションを実行する許可を彼または彼女が持っているかどうかをチェックしたいでしょう。 +ユーザが認証された後、おそらくは、リクエストされたリソースに対してリクエストされたアクションを実行する許可を +彼または彼女が持っているかどうかをチェックしたいでしょう。 *権限付与* と呼ばれるこのプロセスについては、[権限付与](security-authorization.md) のセクションで詳細に説明されています。 -あなたのコントローラが [[yii\rest\ActiveController]] から拡張したものである場合は、[[yii\rest\ActiveController::checkAccess()|checkAccess()]] メソッドをオーバーライドして権限付与のチェックを実行することが出来ます。 +あなたのコントローラが [[yii\rest\ActiveController]] から拡張したものである場合は、 +[[yii\rest\ActiveController::checkAccess()|checkAccess()]] メソッドをオーバーライドして権限付与のチェックを実行することが出来ます。 このメソッドが [[yii\rest\ActiveController]] によって提供されている内蔵のアクションから呼び出されます。 diff --git a/docs/guide-ja/rest-controllers.md b/docs/guide-ja/rest-controllers.md index 798e061bcd2..a17091ee302 100644 --- a/docs/guide-ja/rest-controllers.md +++ b/docs/guide-ja/rest-controllers.md @@ -1,12 +1,14 @@ コントローラ ============ -リソース・クラスを作成して、リソース・データをどのようにフォーマットすべきかを指定したら、次は、RESTful API を通じてエンド・ユーザにリソースを公開するコントローラ・アクションを作成します。 +リソース・クラスを作成して、リソース・データをどのようにフォーマットすべきかを指定したら、 +次は、RESTful API を通じてエンド・ユーザにリソースを公開するコントローラ・アクションを作成します。 Yii は、RESTful アクションを作成する仕事を簡単にするための二つの基底コントローラ・クラスを提供しています。 すなわち、[[yii\rest\Controller]] と [[yii\rest\ActiveController]] です。 二つのコントローラの違いは、後者は [アクティブ・レコード](db-active-record.md) として表現されるリソースの扱いに特化した一連のアクションをデフォルトで提供する、という点にあります。 -従って、あなたが [アクティブ・レコード](db-active-record.md) を使っていて、提供される組み込みのアクションに満足できるのであれば、コントローラ・クラスを [[yii\rest\ActiveController]] から拡張することを検討すると良いでしょう。 +従って、あなたが [アクティブ・レコード](db-active-record.md) を使っていて、提供される組み込みのアクションに満足できるのであれば、 +コントローラ・クラスを [[yii\rest\ActiveController]] から拡張することを検討すると良いでしょう。 そうすれば、最小限のコードで強力な RESTful API を作成することが出来ます。 [[yii\rest\Controller]] と [[yii\rest\ActiveController]] は、ともに、下記の機能を提供します。 @@ -25,12 +27,14 @@ Yii は、RESTful アクションを作成する仕事を簡単にするため ## コントローラ・クラスを作成する -新しいコントローラ・クラスを作成する場合、コントローラ・クラスの命名規約は、リソースの型の名前を単数形で使う、というものです。 +新しいコントローラ・クラスを作成する場合、コントローラ・クラスの命名規約は、 +リソースの型の名前を単数形で使う、というものです。 例えば、ユーザの情報を提供するコントローラは `UserController` と名付けることが出来ます。 新しいアクションを作成する仕方はウェブ・アプリケーションの場合とほぼ同じです。 唯一の違いは、`render()` メソッドを呼んでビューを使って結果を表示する代りに、RESTful アクションの場合はデータを直接に返す、という点です。 -[[yii\rest\Controller::serializer|シリアライザ]] と [[yii\web\Response|レスポンス・オブジェクト]] が、元のデータからリクエストされた形式への変換を処理します。 +[[yii\rest\Controller::serializer|シリアライザ]] と [[yii\web\Response|レスポンス・オブジェクト]] が、 +元のデータからリクエストされた形式への変換を処理します。 例えば、 ```php @@ -71,14 +75,15 @@ public function behaviors() } ``` - ### CORS コントローラに [CORS (クロス・オリジン・リソース共有)](structure-filters.md#cors) フィルタを追加するのは、上記の他のフィルタを追加するのより、若干複雑になります。 と言うのは、CORS フィルタは認証メソッドより前に適用されなければならないため、他のフィルタとは少し異なるアプローチが必要だからです。 また、ブラウザが認証クレデンシャルを送信する必要なく、リクエストが出来るかどうかを前もって安全に判断できるように、 -[CORS プリフライト・リクエスト](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) の認証を無効にする必要もあります。 -下記のコードは、[[yii\rest\ActiveController]] を拡張した既存のコントローラに [[yii\filters\Cors]] フィルタを追加するのに必要なコードを示しています。 +[CORS プリフライト・リクエスト](https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests) +の認証を無効にする必要もあります。 +下記のコードは、[[yii\rest\ActiveController]] を拡張した既存のコントローラに +[[yii\filters\Cors]] フィルタを追加するのに必要なコードを示しています。 ```php use yii\filters\auth\HttpBasicAuth; @@ -108,7 +113,8 @@ public function behaviors() ## `ActiveController` を拡張する -コントローラを [[yii\rest\ActiveController]] から拡張する場合は、このコントローラを通じて提供しようとしているリソース・クラスの名前を [[yii\rest\ActiveController::modelClass|modelClass]] プロパティにセットしなければなりません。 +コントローラを [[yii\rest\ActiveController]] から拡張する場合は、このコントローラを通じて提供しようとしているリソース・クラスの名前を +[[yii\rest\ActiveController::modelClass|modelClass]] プロパティにセットしなければなりません。 リソース・クラスは [[yii\db\ActiveRecord]] から拡張しなければなりません。 @@ -124,8 +130,7 @@ public function behaviors() * [[yii\rest\OptionsAction|options]]: サポートされている HTTP メソッドを返す。 これらのアクションは全て [[yii\rest\ActiveController::actions()|actions()]] メソッドによって宣言されます。 -`actions()` メソッドをオーバーライドすることによって、これらのアクションを構成したり、そのいくつかを無効化したりすることが出来ます。 -例えば、 +`actions()` メソッドをオーバーライドすることによって、これらのアクションを構成したり、そのいくつかを無効化したりすることが出来ます。例えば、 ```php public function actions() @@ -152,7 +157,8 @@ public function prepareDataProvider() ### アクセス・チェックを実行する -RESTful API によってリソースを公開するときには、たいてい、現在のユーザがリクエストしているリソースにアクセスしたり操作したりする許可を持っているか否かをチェックする必要があります。 +RESTful API によってリソースを公開するときには、たいてい、 +現在のユーザがリクエストしているリソースにアクセスしたり操作したりする許可を持っているか否かをチェックする必要があります。 これは、[[yii\rest\ActiveController]] を使う場合は、[[yii\rest\ActiveController::checkAccess()|checkAccess()]] メソッドを次のようにオーバーライドすることによって出来ます。 ```php diff --git a/docs/guide-ja/rest-error-handling.md b/docs/guide-ja/rest-error-handling.md index f9343665679..e355dd03b7f 100644 --- a/docs/guide-ja/rest-error-handling.md +++ b/docs/guide-ja/rest-error-handling.md @@ -1,11 +1,13 @@ エラー処理 ========== -RESTful API リクエストを処理していて、ユーザのリクエストにエラーがあったり、何か予期しないことがサーバ上で起ったりしたときには、単に例外を投げて、ユーザに何かがうまく行かなかったことを知らせることも出来ます。 -しかし、エラーの原因 (例えば、リクエストされたリソースが存在しない、など) を特定することが出来るなら、適切な HTTP ステータス・コード (例えば、404 ステータス・コードを表わす [[yii\web\NotFoundHttpException]]) と一緒に例外を投げることを検討すべきです。 +RESTful API リクエストを処理していて、ユーザのリクエストにエラーがあったり、何か予期しないことがサーバ上で起ったりしたときには、 +単に例外を投げて、ユーザに何かがうまく行かなかったことを知らせることも出来ます。 +しかし、エラーの原因 (例えば、リクエストされたリソースが存在しない、など) を特定することが出来るなら、 +適切な HTTP ステータス・コード (例えば、404 ステータス・コードを表わす [[yii\web\NotFoundHttpException]]) +と一緒に例外を投げることを検討すべきです。 そうすれば、Yii は対応する HTTP ステータスのコードとテキストをレスポンスとともに送信します。 -Yii はまた、レスポンス・ボディにも、シリアライズされた表現形式の例外を含めます。 -例えば、 +Yii はまた、レスポンス・ボディにも、シリアライズされた表現形式の例外を含めます。例えば、 ``` HTTP/1.1 404 Not Found @@ -29,14 +31,14 @@ Content-Type: application/json; charset=UTF-8 `Location` ヘッダが、新しく作成されたリソースを指し示す URL を含んでいます。 * `204`: リクエストは成功裡に処理されましたが、レスポンスはボディ・コンテントを含んでいません (`DELTE` リクエストなどの場合)。 * `304`: リソースは修正されていません。キャッシュしたバージョンを使うことが可能です。 -* `400`: 無効なリクエストです。これはユーザのさまざまな行為によって引き起こされます。例えば、リクエストのボディに無効な JSON データを入れたり、無効なアクションパラメータを指定したり、など。 +* `400`: 無効なリクエストです。これはユーザのさまざまな行為によって引き起こされます。 + 例えば、リクエストのボディに無効な JSON データを入れたり、無効なアクションパラメータを指定したり、など。 * `401`: 認証が失敗しました。 * `403`: 認証されたユーザは指定された API エンド・ボイントにアクセスすることを許可されていません。 * `404`: リクエストされたリソースは存在しません。 * `405`: メソッドが許可されていません。どの HTTP メソッドが許可されているか、`Allow` ヘッダをチェックしてください。 * `415`: サポートされていないメディア・タイプです。リクエストされたコンテント・タイプまたはバージョン番号が無効です。 -* `422`: データの検証が失敗しました (例えば `POST` リクエストに対するレスポンスで)。 - レスポンス・ボディで詳細なエラー・メッセージをチェックしてください。 +* `422`: データの検証が失敗しました (例えば `POST` リクエストに対するレスポンスで)。レスポンス・ボディで詳細なエラー・メッセージをチェックしてください。 * `429`: リクエストの数が多すぎます。レート制限のためにリクエストが拒絶されました。 * `500`: 内部的サーバエラー。これは内部的なプログラムエラーによって生じ得ます。 @@ -44,7 +46,8 @@ Content-Type: application/json; charset=UTF-8 ## エラー・レスポンスをカスタマイズする 場合によっては、デフォルトのエラー・レスポンス形式をカスタマイズしたいことがあるでしょう。 -例えば、さまざまな HTTP ステータスを使ってさまざまなエラーを示すという方法によるのではなく、次に示すように、HTTP ステータスとしては常に 200 を使い、実際の HTTP ステータス・コードはレスポンスの JSON 構造の一部として包み込む、という方式です。 +例えば、さまざまな HTTP ステータスを使ってさまざまなエラーを示すという方法によるのではなく、次に示すように、 +HTTP ステータスとしては常に 200 を使い、実際の HTTP ステータス・コードはレスポンスの JSON 構造の一部として包み込む、という方式です。 ``` HTTP/1.1 200 OK @@ -87,4 +90,5 @@ return [ ]; ``` -上記のコードは、`suppress_response_code` が `GET` のパラメータとして渡された場合に、レスポンスを (成功したものも、失敗したものも) 上記で説明したように再フォーマットします。 +上記のコードは、`suppress_response_code` が `GET` のパラメータとして渡された場合に、 +レスポンスを (成功したものも、失敗したものも) 上記で説明したように再フォーマットします。 diff --git a/docs/guide-ja/rest-quick-start.md b/docs/guide-ja/rest-quick-start.md index 16d4f17b674..4243daf545b 100644 --- a/docs/guide-ja/rest-quick-start.md +++ b/docs/guide-ja/rest-quick-start.md @@ -39,10 +39,8 @@ class UserController extends ActiveController ``` このコントローラ・クラスは、よく使用される一揃いの RESTful アクションを実装した [[yii\rest\ActiveController]] を拡張するものです。 -[[yii\rest\ActiveController::modelClass|modelClass]] を `app\models\User` と指定することによって、データの取得と操作にどのモデルが使用できるかをコントローラに教えてやります。 -The controller class extends from [[yii\rest\ActiveController]], which implements a common set of RESTful actions. -By specifying [[yii\rest\ActiveController::modelClass|modelClass]] -as `app\models\User`, the controller knows which model can be used for fetching and manipulating data. +[[yii\rest\ActiveController::modelClass|modelClass]] として `app\models\User` が指定されているため、 +コントローラがどのモデルを使用してデータの取得と操作が出来るかがわかります。 ## URL 規則を構成する @@ -60,8 +58,8 @@ as `app\models\User`, the controller knows which model can be used for fetching ] ``` -上記の構成情報は、主として、`user` コントローラの URL 規則を追加して、ユーザのデータが綺麗な URL と意味のある HTTP 動詞によってアクセスおよび操作できるようにするものです。 - +上記の構成情報は、主として、`user` コントローラの URL 規則を追加して、ユーザのデータが綺麗な URL と意味のある +HTTP 動詞によってアクセスおよび操作できるようにするものです。 > Info: Yii はコントローラの名前を自動的に複数形にしてエンド・ボイントとして使用します (下の「試してみる」(#trying-it-out) を参照してください)。 > この振る舞いは [[yii\rest\UrlRule::$pluralize]] プロパティを使って構成することが可能です。 @@ -69,7 +67,8 @@ as `app\models\User`, the controller knows which model can be used for fetching ## JSON の入力を可能にする -API が JSON 形式で入力データを受け取ることが出来るように、`request` [アプリケーション・コンポーネント](structure-application-components.md) の [[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。 +API が JSON 形式で入力データを受け取ることが出来るように、`request` [アプリケーション・コンポーネント](structure-application-components.md) の +[[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。 ```php 'request' => [ @@ -201,8 +200,10 @@ Yii の RESTful API フレームワークを使う場合は、API エンド・ そして、コントローラを使って、単一タイプのリソースに対するエンド・ボイントを実装するアクションを編成します。 リソースは [[yii\base\Model]] クラスを拡張するデータ・モデルとして表現されます。 -データベース (リレーショナルまたは NoSQL) を扱っている場合は、[[yii\db\ActiveRecord|ActiveRecord]] を使ってリソースを表現することが推奨されます。 +データベース (リレーショナルまたは NoSQL) を扱っている場合は、[[yii\db\ActiveRecord|ActiveRecord]] +を使ってリソースを表現することが推奨されます。 [[yii\rest\UrlRule]] を使って API エンド・ボイントへのルーティングを簡単にすることが出来ます。 -これは要求されてはいませんが、RESTful API は、保守を容易にするために、ウェブのフロントエンドやバックエンドとは別の独立したアプリケーションとして開発することが推奨されます。 +これは要求されてはいませんが、RESTful API は、保守を容易にするために、 +ウェブのフロントエンドやバックエンドとは別の独立したアプリケーションとして開発することが推奨されます。 diff --git a/docs/guide-ja/rest-resources.md b/docs/guide-ja/rest-resources.md index 74fba791824..a6fcb75f0df 100644 --- a/docs/guide-ja/rest-resources.md +++ b/docs/guide-ja/rest-resources.md @@ -4,7 +4,9 @@ RESTful API は、つまるところ、*リソース* にアクセスし、それを操作するものです。 MVC の枠組の中では、リソースは [モデル](structure-models.md) として見ることが出来ます。 -リソースをどのように表現すべきかについて制約がある訳ではありませんが、Yii においては、通常は、次のような理由によって、リソースを [[yii\base\Model]] またはその子クラス (例えば [[yii\db\ActiveRecord]]) のオブジェクトとして表現することになります。 +リソースをどのように表現すべきかについて制約がある訳ではありませんが、 +Yii においては、通常は、次のような理由によって、リソースを [[yii\base\Model]] またはその子クラス (例えば [[yii\db\ActiveRecord]]) +のオブジェクトとして表現することになります。 * [[yii\base\Model]] は [[yii\base\Arrayable]] インタフェイスを実装しています。 これによって、リソースのデータを RESTful API を通じて公開する仕方をカスタマイズすることが出来ます。 @@ -13,7 +15,8 @@ MVC の枠組の中では、リソースは [モデル](structure-models.md) と * [[yii\db\ActiveRecord]] は DB データのアクセスと操作に対する強力なサポートを提供しています。 リソース・データがデータベースに保存されているときは、アクティブ・レコードが最適の選択です。 -このセクションでは、主として、[[yii\base\Model]] クラス (またはその子クラス) から拡張したリソース・クラスにおいて、RESTful API を通じて返すことが出来るデータを指定する方法を説明します。 +このセクションでは、主として、[[yii\base\Model]] クラス (またはその子クラス) から拡張したリソース・クラスにおいて、 +RESTful API を通じて返すことが出来るデータを指定する方法を説明します。 リソース・クラスが [[yii\base\Model]] から拡張したものでない場合は、全てのパブリックなメンバ変数が返されます。 @@ -25,41 +28,41 @@ Yii はこのプロセスを二つのステップに分けます。 次に、その配列が [[yii\web\ResponseFormatterInterface|レスポンス・フォーマッタ]] によって、リクエストされた形式 (例えば JSON や XML) の文字列にシリアライズされます。 リソース・クラスを開発するときに主として力を注ぐべきなのは、最初のステップです。 -[[yii\base\Model::fields()|fields()]] および/または [[yii\base\Model::extraFields()|extraFields()]] をオーバーライドすることによって、リソースのどういうデータ (*フィールド* と呼ばれます) を配列表現に入れることが出来るかを指定することが出来ます。 -この二つのメソッドの違いは、前者が配列表現に含まれるべきフィールドのデフォルトのセットを指定するのに対して、後者はエンド・ユーザが `expand` クエリ・パラメータで要求したときに配列に含めることが出来る追加のフィールドを指定する、という点にあります。 -例えば、 +[[yii\base\Model::fields()|fields()]] および/または [[yii\base\Model::extraFields()|extraFields()]] をオーバーライドすることによって、 +リソースのどういうデータ (*フィールド* と呼ばれます) を配列表現に入れることが出来るかを指定することが出来ます。 +この二つのメソッドの違いは、前者が配列表現に含まれるべきフィールドのデフォルトのセットを指定するのに対して、 +後者はエンド・ユーザが `expand` クエリ・パラメータで要求したときに配列に含めることが出来る追加のフィールドを指定する、 +という点にあります。例えば、 ``` -// fields() に宣言されている全てのフィールドを返す。 +// fields() で宣言されている全てのフィールドを返す。 http://localhost/users -// "id" と "email" のフィールドだけを返す (ただし、fields() で宣言されているなら) 。 +// "id" と "email" のフィールドだけを返す (ただし、fields() で宣言されていれば) 。 http://localhost/users?fields=id,email -// fields() の全てのフィールドと "profile" のフィールドを返す (ただし、"profile" が extraFields() で宣言されているなら)。 +// fields() の全てのフィールドと "profile" のフィールドを返す (ただし、"profile" が extraFields() で宣言されていれば)。 http://localhost/users?expand=profile // fields() の全てのフィールドと post の "author" フィールドを返す // (ただし、"author" が post モデルの extraFields() にあれば)。 http://localhost/comments?expand=post.author -// "id"、"email"、"profile" のフィールドだけを返す -// (ただし、"id" と "email" が fields() で宣言されており、 -// "profile" が extraFields() で宣言されているなら)。 +// "id" と"email" (ただし、fileds() で宣言されていれば) と +// "profile" (ただし、extraFields() で宣言されていれば) を返す。 http://localhost/users?fields=id,email&expand=profile ``` - ### fields()` をオーバーライドする -デフォルトでは、[[yii\base\Model::fields()]] は、モデルの全ての属性をフィールドとして返し、[[yii\db\ActiveRecord::fields()]] は、DB から投入された属性だけを返します。 +デフォルトでは、[[yii\base\Model::fields()]] は、モデルの全ての属性をフィールドとして返し、 +[[yii\db\ActiveRecord::fields()]] は、DB から投入された属性だけを返します。 `fields()` をオーバーライドして、フィールドを追加、削除、名前変更、または再定義することが出来ます。 `fields()` の返り値は配列でなければなりません。 配列のキーはフィールド名であり、配列の値は対応するフィールドの定義です。 フィールドの定義は、プロパティ/属性の名前か、あるいは、対応するフィールドの値を返す無名関数とすることが出来ます。 -フィールド名がそれを定義する属性名と同一であるという特殊な場合においては、配列のキーを省略することが出来ます。 -例えば、 +フィールド名がそれを定義する属性名と同一であるという特殊な場合においては、配列のキーを省略することが出来ます。例えば、 ```php // 明示的に全てのフィールドをリストする方法。(API の後方互換性を保つために) DB テーブルやモデル属性の @@ -99,7 +102,8 @@ public function fields() ### `extraFields()` をオーバーライドする -デフォルトでは、[[yii\base\Model::extraFields()]] は空の配列を返し、[[yii\db\ActiveRecord::extraFields()]] は DB から取得されたリレーションの名前を返します。 +デフォルトでは、[[yii\base\Model::extraFields()]] は空の配列を返し、[[yii\db\ActiveRecord::extraFields()]] +は DB から取得されたリレーションの名前を返します。 `extraFields()` によって返されるデータの形式は `fields()` のそれと同じです。 通常、`extraFields()` は、主として、値がオブジェクトであるフィールドを指定するのに使用されます。 @@ -138,12 +142,12 @@ public function extraFields() [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS) は、Hypermedia as the Engine of Application State (アプリケーション状態のエンジンとしてのハイパーメディア) の略称です。 HATEOAS は、RESTful API は自分が返すリソースについて、どのようなアクションがサポートされているかをクライアントが発見できるような情報を返すべきである、という概念です。 -HATEOAS のキーポイントは、リソース・データが API によって提供されるときには、関連する情報を一群のハイパーリンクによって返すべきである、ということです。 +HATEOAS のキーポイントは、リソース・データが API によって提供されるときには、 +関連する情報を一群のハイパーリンクによって返すべきである、ということです。 あなたのリソース・クラスは、[[yii\web\Linkable]] インタフェイスを実装することによって、HATEOAS をサポートすることが出来ます。 このインタフェイスは、[[yii\web\Link|リンク]] のリストを返すべき [[yii\web\Linkable::getLinks()|getLinks()]] メソッド一つだけを含みます。 -典型的には、少なくとも、リソース・オブジェクトそのものへの URL を表現する `self` リンクを返さなければなりません。 -例えば、 +典型的には、少なくとも、リソース・オブジェクトそのものへの URL を表現する `self` リンクを返さなければなりません。例えば、 ```php use yii\base\Model; @@ -234,7 +238,8 @@ class PostController extends Controller } ``` -データ・プロバイダが RESTful API のレスポンスで送信される場合は、[[yii\rest\Serializer]] が現在のページのリソースを取り出して、リソース・オブジェクトの配列としてシリアライズします。 +データ・プロバイダが RESTful API のレスポンスで送信される場合は、[[yii\rest\Serializer]] +が現在のページのリソースを取り出して、リソース・オブジェクトの配列としてシリアライズします。 それだけでなく、[[yii\rest\Serializer]] は次の HTTP ヘッダを使ってページネーション情報もレスポンスに含めます。 * `X-Pagination-Total-Count`: リソースの総数 @@ -247,7 +252,10 @@ REST API におけるコレクションはデータ・プロバイダである その一例を [クイック・スタート](rest-quick-start.md#trying-it-out) のセクションで見ることが出来ます。 -バージョン 2.0.13 以降、Yii はコレクションをフィルターする便利な機能を提供しています。 +### コレクションをフィルタリングする + +バージョン 2.0.13 以降、Yii はコレクションをフィルタリングする便利な機能を提供しています。 その一例を [クイック・スタート](rest-quick-start.md#trying-it-out) のガイドに見ることが出来ます。 エンド・ボイントをあなた自身が実装しようとしている場合、フィルタリングは -データ・プロバイダのガイドの [データフィルタを使ってデータ・プロバイダをフィルタリングする](output-data-providers.md#filtering-data-providers-using-data-filters) のセクションで述べられている方法で行うことが出来ます。 +データ・プロバイダのガイドの [データ・フィルタを使ってデータ・プロバイダをフィルタリングする](output-data-providers.md#filtering-data-providers-using-data-filters + のセクションで述べられている方法で行うことが出来ます。 diff --git a/docs/guide-ja/rest-routing.md b/docs/guide-ja/rest-routing.md index b29a47b281f..32f50f59d1f 100644 --- a/docs/guide-ja/rest-routing.md +++ b/docs/guide-ja/rest-routing.md @@ -1,11 +1,13 @@ ルーティング ============ -リソースとコントローラのクラスが準備できたら、通常のウェブ・アプリケーションと同じように、`http://localhost/index.php?r=user/create` というような URL を使ってリソースにアクセスすることが出来ます。 +リソースとコントローラのクラスが準備できたら、通常のウェブ・アプリケーションと同じように、 +`http://localhost/index.php?r=user/create` というような URL を使ってリソースにアクセスすることが出来ます。 実際には、綺麗な URL を有効にして HTTP 動詞を利用したいというのが普通でしょう。 例えば、`POST /users` というリクエストが `user/create` アクションへのアクセスを意味するようにする訳です。 -これは、アプリケーションの構成情報で `urlManager` [アプリケーション・コンポーネント](structure-application-components.md) を次のように構成することによって容易に達成することが出来ます。 +これは、アプリケーションの構成情報で `urlManager` [アプリケーション・コンポーネント](structure-application-components.md) +を次のように構成することによって容易に達成することが出来ます。 ```php 'urlManager' => [ @@ -18,7 +20,8 @@ ] ``` -ウェブ・アプリケーションの URL 管理と比べたときに、上記で目に付く新しいことは、RESTful API リクエストのルーティングに [[yii\rest\UrlRule]] を使用していることです。 +ウェブ・アプリケーションの URL 管理と比べたときに、上記で目に付く新しいことは、 +RESTful API リクエストのルーティングに [[yii\rest\UrlRule]] を使用していることです。 この特殊な URL 規則クラスが、一揃いの子 URL 規則を作成して、指定されたコントローラのルーティングと URL 生成をサポートします。 例えば、上記のコードは、おおむね下記の規則と等価です。 @@ -46,8 +49,8 @@ * `OPTIONS /users`: エンド・ボイント `/users` に関してサポートされる動詞を示す。 * `OPTIONS /users/123`: エンド・ボイント `/users/123` に関してサポートされる動詞を示す。 -`only` および `except` オプションを構成すると、それぞれ、どのアクションをサポートするか、また、どのアクションを無効にするかを明示的に指定することが出来ます。 -例えば、 +`only` および `except` オプションを構成すると、それぞれ、どのアクションをサポートするか、 +また、どのアクションを無効にするかを明示的に指定することが出来ます。例えば、 ```php [ @@ -75,10 +78,10 @@ この振舞いは [[yii\rest\UrlRule::pluralize]] を `false` に設定することで無効にすることが出来ます。 > Info: コントローラ ID の複数形化は [[yii\helpers\Inflector::pluralize()]] によって行われます。 - このメソッドは特殊な複数形の規則を考慮します。 - 例えば、`box` という単語の複数形は `boxs` ではなく `boxes` になります。 + このメソッドは特殊な複数形の規則を考慮します。例えば、`box` という単語の複数形は `boxs` ではなく `boxes` になります。 -自動的な複数形化があなたの要求を満たさない場合は、[[yii\rest\UrlRule::controller]] プロパティを構成して、エンド・ボイント URL で使用される名前とコントローラ ID の対応を明示的に指定することも可能です。 +自動的な複数形化があなたの要求を満たさない場合は、[[yii\rest\UrlRule::controller]] プロパティを構成して、 +エンド・ボイント URL で使用される名前とコントローラ ID の対応を明示的に指定することも可能です。 例えば、次のコードはエンド・ボイント名 `u` をコントローラ ID `user` に割り当てます。 ```php diff --git a/docs/guide-ja/rest-versioning.md b/docs/guide-ja/rest-versioning.md index f8bb162f9ec..bfebad959b7 100644 --- a/docs/guide-ja/rest-versioning.md +++ b/docs/guide-ja/rest-versioning.md @@ -1,14 +1,12 @@ バージョン管理 ============== -良い API は*バージョン管理* されています。 -すなわち、一つのバージョンを絶え間なく変更するのではなく、変更と新機能は API の新しいバージョンにおいて実装されます。 -クライアント・サイドとサーバ・サイドの両方のコードを完全に制御できるウェブ・アプリケーションとは違って、API はあなたの制御が及ばないクライアントによって使用されることを想定したものです。 -このため、API の後方互換性 (BC) は、可能な限り保たれなければなりません。 -BC を損なうかも知れない変更が必要な場合は、それを API の新しいバージョンにおいて導入し、バージョン番号を上げるべきです。 -そうすれば、既存のクライアントは、API の古いけれども動作するバージョンを使い続けることが出来ますし、新しいまたはアップグレードされたクライアントは、新しい API バージョンで新しい機能を使うことが出来ます。 +良い API は*バージョン管理* されています。すなわち、一つのバージョンを絶え間なく変更するのではなく、変更と新機能は API の新しいバージョンにおいて実装されます。 +クライアント・サイドとサーバ・サイドの両方のコードを完全に制御できるウェブ・アプリケーションとは違って、API はあなたの制御が及ばないクライアントによって使用されることを想定したものです。このため、API の後方互換性 (BC) は、可能な限り保たれなければなりません。 +BC を損なうかも知れない変更が必要な場合は、それを API の新しいバージョンにおいて導入し、バージョン番号を上げるべきです。そうすれば、既存のクライアントは、API の古いけれども動作するバージョンを使い続けることが出来ますし、新しいまたはアップグレードされたクライアントは、新しい API バージョンで新しい機能を使うことが出来ます。 -> Tip: API のバージョン番号の設計に関する詳細情報は [Semantic Versioning](http://semver.org/) を参照してください。 +> Tip: API のバージョン番号の設計に関する詳細情報は + [Semantic Versioning](http://semver.org/) を参照してください。 API のバージョン管理を実装する方法としてよく使われるのは、バージョン番号を API の URL に埋め込む方法です。 例えば、`http://example.com/v1/users` が API バージョン 1 の `/users` エンド・ボイントを指す、というものです。 @@ -28,10 +26,12 @@ Accept: application/vnd.company.myapp-v1+json * API 実装の各メジャー・バージョンを独立したモジュールに置き、モジュールの ID はメジャー・バージョン番号 (例えば `v1` や `v2`) とします。 当然ながら、API の URL はメジャー・バージョン番号を含むことになります。 -* 各メジャー・バージョンの中では (従って対応するモジュールの中では) `Accept` HTTP リクエスト・ヘッダを使ってマイナー・バージョン番号を決定し、マイナー・バージョンに応じたレスポンスのための条件分岐コードを書きます。 +* 各メジャー・バージョンの中では (従って対応するモジュールの中では) `Accept` HTTP リクエスト・ヘッダを使ってマイナー・バージョン番号を決定し、 + マイナー・バージョンに応じたレスポンスのための条件分岐コードを書きます。 メジャー・バージョンを提供する各モジュールは、それぞれ、指定されたバージョンのためのリソースとコントローラのクラスを含んでいなければなりません。 -コードの責任範囲をより良く分離するために、共通の基底のリソースとコントローラのクラスを保持して、それをバージョンごとの個別のモジュールでサブ・クラス化することが出来ます。 +コードの責任範囲をより良く分離するために、共通の基底のリソースとコントローラのクラスを保持して、 +それをバージョンごとの個別のモジュールでサブ・クラス化することが出来ます。 サブ・クラスの中で、`Model::fields()` のような具体的なコードを実装します。 あなたのコードを次のように編成することが出来ます。 @@ -90,17 +90,22 @@ return [ ]; ``` -上記のコードの結果として、`http://example.com/v1/users` はバージョン 1 のユーザ一覧を返し、`http://example.com/v2/users` はバージョン 2 のユーザ一覧を返すことになります。 +上記のコードの結果として、`http://example.com/v1/users` はバージョン 1 のユーザ一覧を返し、 +`http://example.com/v2/users` はバージョン 2 のユーザ一覧を返すことになります。 モジュール化のおかげで、異なるメジャー・バージョンのためのコードを綺麗に分離することが出来ます。 しかし、モジュール化しても、共通の基底クラスやその他の共有リソースを通じて、モジュール間でコードを再利用することは引き続いて可能です。 -マイナー・バージョン番号を扱うためには、[[yii\filters\ContentNegotiator|contentNegotiator]] ビヘイビアによって提供されるコンテント・ネゴシエーションの機能を利用することが出来ます。 -`contentNegotiator` ビヘイビアは、どのコンテント・タイプをサポートするかを決定するときに、[[yii\web\Response::acceptParams]] プロパティをセットします。 +マイナー・バージョン番号を扱うためには、[[yii\filters\ContentNegotiator|contentNegotiator]] +ビヘイビアによって提供されるコンテント・ネゴシエーションの機能を利用することが出来ます。 +`contentNegotiator` ビヘイビアは、どのコンテント・タイプをサポートするかを決定するときに、 +[[yii\web\Response::acceptParams]] プロパティをセットします。 -例えば、リクエストが HTTP ヘッダ `Accept: application/json; version=v1` を伴って送信された場合、コンテント・ネゴシエーションの後では、[[yii\web\Response::acceptParams]] に `['version' => 'v1']` という値が含まれています。 +例えば、リクエストが HTTP ヘッダ `Accept: application/json; version=v1` を伴って送信された場合、 +コンテント・ネゴシエーションの後では、[[yii\web\Response::acceptParams]] に `['version' => 'v1']` という値が含まれています。 -`acceptParams` のバージョン情報に基づいて、アクション、リソース・クラス、シリアライザなどの個所で条件付きのコードを書いて、適切な機能を提供することが出来ます。 +`acceptParams` のバージョン情報に基づいて、アクション、リソース・クラス、シリアライザなどの個所で条件付きのコードを書いて、 +適切な機能を提供することが出来ます。 マイナー・バージョンは、定義上、後方互換性を保つことを要求するものですので、コードの中でバージョンチェックをする個所はそれほど多くないものと期待されます。 そうでない場合は、たいていは、新しいメジャー・バージョンを作成する必要がある、ということです。 From d339f6df223a39536a5dfb6cf94ae42c94ce6651 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 30 Apr 2018 07:42:07 +0900 Subject: [PATCH 049/902] guide-ja/test-* revised [ci skip] --- docs/guide-ja/rest-rate-limiting.md | 15 ++++--- docs/guide-ja/test-acceptance.md | 3 +- docs/guide-ja/test-environment-setup.md | 10 +++-- docs/guide-ja/test-fixtures.md | 56 ++++++++++--------------- docs/guide-ja/test-functional.md | 3 +- docs/guide-ja/test-overview.md | 15 ++++--- docs/guide-ja/test-unit.md | 9 ++-- 7 files changed, 54 insertions(+), 57 deletions(-) diff --git a/docs/guide-ja/rest-rate-limiting.md b/docs/guide-ja/rest-rate-limiting.md index 491046a4326..b15380a20b9 100644 --- a/docs/guide-ja/rest-rate-limiting.md +++ b/docs/guide-ja/rest-rate-limiting.md @@ -14,7 +14,8 @@ * `saveAllowance()`: 許可されているリクエストの残り数と現在の UNIX タイムスタンプの両方を保存します。 ユーザ・テーブルに二つのカラムを追加して、許容されているリクエスト数とタイムスタンプの情報を記録するのが良いでしょう。 -それらを定義すれば、`loadAllowance()` と `saveAllowance()` は、認証された現在のユーザに対応する二つのカラムの値を読み書きするものとして実装することが出来ます。 +それらを定義すれば、`loadAllowance()` と `saveAllowance()` は、 +認証された現在のユーザに対応する二つのカラムの値を読み書きするものとして実装することが出来ます。 パフォーマンスを向上させるために、これらの情報をキャッシュや NoSQL ストレージに保存することを検討しても構いません。 `User` モデルにおける実装は次のようなものになります。 @@ -38,10 +39,12 @@ public function saveAllowance($request, $action, $allowance, $timestamp) } ``` -アイデンティティのクラスに必要なインタフェイスを実装すると、Yii は [[yii\rest\Controller]] のアクション・フィルタとして構成された [[yii\filters\RateLimiter]] を使って、自動的にレート制限のチェックを行うようになります。 +アイデンティティのクラスに必要なインタフェイスを実装すると、Yii は [[yii\rest\Controller]] のアクション・フィルタとして構成された +[[yii\filters\RateLimiter]] を使って、自動的にレート制限のチェックを行うようになります。 レート制限を超えると、レート・リミッタが [[yii\web\TooManyRequestsHttpException]] を投げます。 -レート・リミッタは、REST コントローラ・クラスの中で、次のようにして構成することが出来ます。 +レート・リミッタは、REST コントローラ・クラスの中で、 +次のようにして構成することが出来ます。 ```php public function behaviors() @@ -52,10 +55,12 @@ public function behaviors() } ``` -レート制限が有効にされると、デフォルトでは、送信される全てのレスポンスに、現在のレート制限の情報を含む次の HTTP ヘッダが付加されます。 +レート制限が有効にされると、デフォルトでは、送信される全てのレスポンスに、 +現在のレート制限の情報を含む次の HTTP ヘッダが付加されます。 * `X-Rate-Limit-Limit` - 一定期間内に許可されるリクエストの最大数 * `X-Rate-Limit-Remaining` - 現在の期間において残っている許可されているリクエスト数 * `X-Rate-Limit-Reset` - 許可されているリクエストの最大数にリセットされるまで待たなければならない秒数 -これらのヘッダは、上記のコード例で示されているように、[[yii\filters\RateLimiter::enableRateLimitHeaders]] を `false` に設定することで無効にすることが出来ます。 +これらのヘッダは、上記のコード例で示されているように、[[yii\filters\RateLimiter::enableRateLimitHeaders]] を +`false` に設定することで無効にすることが出来ます。 diff --git a/docs/guide-ja/test-acceptance.md b/docs/guide-ja/test-acceptance.md index 875fc534cbd..0ca8ea241fe 100644 --- a/docs/guide-ja/test-acceptance.md +++ b/docs/guide-ja/test-acceptance.md @@ -1,8 +1,7 @@ 受入テスト ========== -受入テストはユーザの視点からシナリオを検証するものです。 -テストされるアプリケーションは PhpBrowser または実際のブラウザによってアクセスされます。 +受入テストはユーザの視点からシナリオを検証するものです。テストされるアプリケーションは PhpBrowser または実際のブラウザによってアクセスされます。 どちらの場合でも、ブラウザは HTTP によって通信しますので、アプリケーションはウェブ・サーバによってホストされる必要があります。 受入テストは Codeception フレームワークの助けを借りて実装されています。Codeception フレームワークには優れたドキュメントがありますので、参照して下さい。 diff --git a/docs/guide-ja/test-environment-setup.md b/docs/guide-ja/test-environment-setup.md index 73874c821ca..c999bc0f664 100644 --- a/docs/guide-ja/test-environment-setup.md +++ b/docs/guide-ja/test-environment-setup.md @@ -1,16 +1,20 @@ テスト環境の構築 ================ -Yii 2 は [`Codeception`](https://github.com/Codeception/Codeception) テスト・フレームワークとの統合を公式にサポートしており、次のタイプのテストを作成することを可能にしています。 +Yii 2 は [`Codeception`](https://github.com/Codeception/Codeception) テスト・フレームワークとの統合を公式にサポートしており、 +次のタイプのテストを作成することを可能にしています。 - [単体テスト](test-unit.md) - 一かたまりのコードが期待通りに動くことを検証する。 - [機能テスト](test-functional.md) - ブラウザのエミュレーションによって、ユーザの視点からシナリオを検証する。 - [受入テスト](test-acceptance.md) - ブラウザの中で、ユーザの視点からシナリオを検証する。 -これら三つのタイプのテスト全てについて、Yii は、[`yii2-basic`](https://github.com/yiisoft/yii2-app-basic) と [`yii2-advanced`](https://github.com/yiisoft/yii2-app-advanced) の両方のプロジェクト・テンプレートで、そのまま使えるテストセットを提供しています。 +これら三つのタイプのテスト全てについて、Yii は、[`yii2-basic`](https://github.com/yiisoft/yii2-app-basic) と +[`yii2-advanced`](https://github.com/yiisoft/yii2-app-advanced) の両方のプロジェクト・テンプレートで、 +そのまま使えるテストセットを提供しています。 ベーシック・テンプレート、アドバンスト・テンプレートの両方とも、Codeception がプリ・インストールされて付いて来ます。 -これらのテンプレートの一つを使っていない場合は、下記のコンソールコマンドを発行することで Codeception をインストールすることが出来ます。 +これらのテンプレートの一つを使っていない場合は、下記のコンソールコマンドを発行することで +Codeception をインストールすることが出来ます。 ``` composer require codeception/codeception diff --git a/docs/guide-ja/test-fixtures.md b/docs/guide-ja/test-fixtures.md index 4c8711910cc..a764003ef2b 100644 --- a/docs/guide-ja/test-fixtures.md +++ b/docs/guide-ja/test-fixtures.md @@ -101,7 +101,8 @@ class UserProfileFixture extends ActiveFixture また、同じ理由によって、`UserFixture` は常に `UserProfileFixture` がアンロードされた後でアンロードされます。 上記では、DB テーブルに関してフィクスチャを定義する方法を示しました。 -DB と関係しないフィクスチャ (例えば、何らかのファイルやディレクトリに関するフィクスチャ) を定義するためには、より汎用的な基底クラス [[yii\test\Fixture]] から拡張して、[[yii\test\Fixture::load()|load()]] と [[yii\test\Fixture::unload()|unload()]] のメソッドをオーバーライドすることが出来ます。 +DB と関係しないフィクスチャ (例えば、何らかのファイルやディレクトリに関するフィクスチャ) を定義するためには、より汎用的な基底クラス [[yii\test\Fixture]] から拡張して、 +[[yii\test\Fixture::load()|load()]] と [[yii\test\Fixture::unload()|unload()]] のメソッドをオーバーライドすることが出来ます。 ## フィクスチャを使用する @@ -109,13 +110,13 @@ DB と関係しないフィクスチャ (例えば、何らかのファイルや [Codeception](http://codeception.com/) を使ってコードをテストしている場合は、フィクスチャのローディングとアクセスについては、 内蔵されているサポートを使用することが出来ます。 -その他のテスト・フレームワークを使っている場合は、テスト・ケースで [[yii\test\FixtureTrait]] を使って同じ目的を達することが出来ます。 +その他のテスト・フレームワークを使っている場合は、テスト・ケースで [[yii\test\FixtureTrait]] +を使って同じ目的を達することが出来ます。 次に、Codeception を使って `UserProfile` 単体テストクラスを書く方法を説明します。 `\Codeception\Test\Unit` を拡張するあなたの単体テスト・クラスにおいて、 `_fixtures()` メソッドの中で使いたいフィクスチャを宣言するか、 -または、アクターの `haveFixtures()` メソッドを直接に使用します。 -例えば、 +または、アクターの `haveFixtures()` メソッドを直接に使用します。例えば、 ```php namespace app\tests\unit\models; @@ -149,17 +150,17 @@ class UserProfileTest extends \Codeception\Test\Unit クラス名あるいはフィクスチャを指す構成情報配列を使うことが出来ます。 構成情報配列を使うと、フィクスチャがロードされるときのフィクスチャのプロパティをカスタマイズすることが出来ます。 -また、フィクスチャにエイリアスを割り当てることも出来ます。 -上記の例では、`UserProfileFixture` に `profiles` というエイリアスが与えられています。 -そうすると、テスト・メソッドの中でエイリアスを使ってフィクスチャ・オブジェクトにアクセスすることが出来るようになります。 -例えば、 +また、フィクスチャにエイリアスを割り当てることも出来ます。上記の例では、`UserProfileFixture` に `profiles` というエイリアスが与えられています。 +そうすると、テスト・メソッドの中でエイリアスを使ってフィクスチャ・オブジェクトにアクセスすることが出来るようになります。例えば、 ```php $profile = $I->grabFixture('profiles', 'user1'); ``` + は `UserProfileFixture` オブジェクトを返します。 -さらには、`UserProfileFixture` は `ActiveFixture` を拡張するものですので、フィクスチャによって提供されたデータに対して、次の構文を使ってアクセスすることも出来ます。 +さらには、`UserProfileFixture` は `ActiveFixture` を拡張するものですので、フィクスチャによって提供されたデータに対して、 +次の構文を使ってアクセスすることも出来ます。 ```php // 'user1' というエイリアスのデータ行に対応する UserProfileModel を返す @@ -195,7 +196,6 @@ data\ このようにして、テスト間でフィクスチャのデータ・ファイルが衝突するのを回避し、必要に応じてデータ・ファイルを使い分けます。 - > Note: 上の例では、フィクスチャ・ファイルには例示目的だけの名前が付けられています。 > 実際の仕事では、フィクスチャ・クラスがどのフィクスチャ・クラスを拡張したものであるかに従って名前を付けるべきです。 > 例えば、DB フィクスチャを [[yii\test\ActiveFixture]] から拡張している場合は、DB テーブルの名前をフィクスチャのデータ・ファイル名として使うべきです。 @@ -217,8 +217,7 @@ Yii は `yii fixture` コマンドライン・ツールでフィクスチャを 次のようなフィクスチャ・データをロードするとしましょう。 ``` -# users.php ファイル -# フィクスチャ・データ・パス (デフォルトでは @tests\unit\fixtures\data) に保存されている +# users.php ファイル - フィクスチャ・データ・パス (デフォルトでは @tests\unit\fixtures\data) に保存 return [ [ @@ -237,33 +236,26 @@ return [ ], ]; ``` - -データベースにデータをロードするフィクチャを使う場合は、これらの行が `users` テーブルに対して適用されます。 -NoSQL フィクスチャ、例えば `mongodb` フィクチャを使う場合は、このデータは `users` コレクションに対して適用されます。 +データベースにデータをロードするフィクチャを使う場合は、これらの行が `users` テーブルに対して適用されます。NoSQL フィクスチャ、例えば `mongodb` フィクチャを使う場合は、このデータは `users` コレクションに対して適用されます。 さまざまなロード戦略を実装する方法などについて公式 [ドキュメント](https://github.com/yiisoft/yii2/blob/master/docs/guide/test-fixtures.md)を参照して下さい。 上記のフィクスチャのサンプルは `yii2-faker` エクステンションによって生成されました。これについての詳細は、[自動生成のセクション](#auto-generating-fixtures) を参照して下さい。 - フィクスチャ・クラスの名前は複数形であってはいけません。 ### フィクスチャをロードする -フィクスチャ・クラスは `Fixture` という接尾辞を持たなければいけません。 -デフォルトでは、フィクスチャは `tests\unit\fixtures` 名前空間の下で探されます。 -この挙動は構成またはコマンド・オプションによって変更することが出来ます。 -`-User` のように名前の前に `-` を指定することで、ロードまたはアンロードから除外するフィクスチャを指定することが出来ます。 +フィクスチャ・クラスは `Fixture` という接尾辞を持たなければいけません。デフォルトでは、フィクスチャは `tests\unit\fixtures` 名前空間の下で探されます。 +この挙動は構成またはコマンド・オプションによって変更することが出来ます。`-User` のように名前の前に `-` を指定することで、ロードまたはアンロードから除外するフィクスチャを指定することが出来ます。 フィクスチャをロードするためには、次のコマンドを実行します。 -> Note: データをロードする前に、アンロードのシーケンスが実行されます。これによって、通常は、前に実行されたフィクスチャによって挿入された - 既存のデータが全てクリーンアップされることになります。 +> Note: データをロードする前に、アンロードのシーケンスが実行されます。これによって、通常は、前に実行されたフィクスチャによって挿入された 既存のデータが全てクリーンアップされることになります。 ``` yii fixture/load ``` 要求される `fixture_name` パラメータが、データがロードされるフィクスチャの名前を指定するものです。 -いくつかのフィクスチャを一度にロードすることが出来ます。 -下記はこのコマンドの正しい形式です。 +いくつかのフィクスチャを一度にロードすることが出来ます。下記はこのコマンドの正しい形式です。 ``` // `User` フィクスチャをロードする @@ -284,14 +276,11 @@ yii fixture "*" // 一つを除いて全てのフィクスチャをロードする yii fixture "*, -DoNotLoadThisOne" -// 異なる名前空間からフィクスチャをロードする -// デフォルトの名前空間は tests\unit\fixtures +// 異なる名前空間からフィクスチャをロードする (デフォルトの名前空間は tests\unit\fixtures) yii fixture User --namespace='alias\my\custom\namespace' -// 他のフィクスチャをロードする前に、グローバルフィクスチャ -// `some\name\space\CustomFixture` をロードする。 -// デフォルトでは、このオプションが `InitDbFixture` について適用され、 -// 整合性チェックが無効化/有効化されます。 +// 他のフィクスチャをロードする前に、グローバルフィクスチャ `some\name\space\CustomFixture` をロードする。 +// デフォルトでは、このオプションが `InitDbFixture` について適用され、整合性チェックが無効化/有効化されます。 // カンマで区切って複数のグローバル・フィクスチャを指定することが出来ます。 yii fixture User --globalFixtures='some\name\space\Custom' ``` @@ -301,9 +290,7 @@ yii fixture User --globalFixtures='some\name\space\Custom' フィクスチャをアンロードするためには、次のコマンドを実行します。 ``` -// Users フィクスチャをアンロードする。 -// デフォルトではフィクスチャのストレージをクリアします。 -// 例えば、"users" テーブル、または、mongodb フィクスチャなら "users" コレクションがクリアされます。 +// Users フィクスチャをアンロードする。デフォルトではフィクスチャのストレージをクリアします。(例えば、"users" テーブル、または、mongodb フィクスチャなら "users" コレクションがクリアされます。) yii fixture/unload User // いくつかのフィクスチャをアンロードする @@ -340,8 +327,7 @@ yii fixture/unload "*, -DoNotUnloadThisOne" ### フィクスチャを自動生成する -Yii は、あなたの代りに、何らかのテンプレートに従ってフィクスチャを自動生成することが出来ます。 -さまざまなデータで、また、いろいろな言語と形式で、フィクスチャを生成することが出来ます。 +Yii は、あなたの代りに、何らかのテンプレートに従ってフィクスチャを自動生成することが出来ます。さまざまなデータで、また、いろいろな言語と形式で、フィクスチャを生成することが出来ます。 この機能は、[Faker](https://github.com/fzaninotto/Faker) ライブラリと `yii2-faker` エクステンションによって実現されています。 詳細については、エクステンションの [ガイド](https://github.com/yiisoft/yii2-faker/tree/master/docs/guide-ja) を参照して下さい。. diff --git a/docs/guide-ja/test-functional.md b/docs/guide-ja/test-functional.md index 1eeb9454921..2d889108bda 100644 --- a/docs/guide-ja/test-functional.md +++ b/docs/guide-ja/test-functional.md @@ -6,7 +6,8 @@ POST や GET のパラメータなどの環境変数を設定しておいてから、アプリケーションのインスタンスをコードから直接に実行します。 機能テストは一般的に受入テストより高速であり、失敗した場合に詳細なスタックトレースを提供してくれます。 -経験則から言うと、特別なウェブ・サーバ設定や JavaScript による複雑な UI を持たない場合は、機能テストの方を選ぶべきです。 +経験則から言うと、特別なウェブ・サーバ設定や JavaScript による複雑な UI を持たない場合は、 +機能テストの方を選ぶべきです。 機能テストは Codeception フレームワークの助けを借りて実装されています。これにつては、優れたドキュメントがあります。 diff --git a/docs/guide-ja/test-overview.md b/docs/guide-ja/test-overview.md index b14f8abffe9..41b75812154 100644 --- a/docs/guide-ja/test-overview.md +++ b/docs/guide-ja/test-overview.md @@ -6,21 +6,23 @@ 例えば、PHP でクラスを書くとき、私たちはステップごとにデバッグしたり、または単純に `echo` 文や `die` 文を使ったりして、実装が最初の計画通りに動作することを検証します。 ウェブ・アプリケーションの場合は、何らかのテスト・データをフォームに入力して、ページが期待通りにユーザと相互作用をすることを確認します。 -テストを実行するプロセスを自動化して、何かを検証する必要があるときは、いつでも、それを代行してくれるコードを呼び出すだけでよいようにすることが出来ます。 +テストを実行するプロセスを自動化して、何かを検証する必要があるときは、いつでも、 +それを代行してくれるコードを呼び出すだけでよいようにすることが出来ます。 結果が計画したものと合致することを検証するコードが *テスト* と呼ばれ、それを作成して更に実行するプロセスが *テスト自動化* として知られています。 このテストの章の主題は、このテストの自動化です。 ## テストとともに開発する -テスト駆動開発 (TDD) とビヘイビア駆動開発 (BDD) のソフトウェア開発手法においては、実際のコードを書く前に、コードの断片または全体の機能の振る舞いを一連のシナリオまたはテストとして記述します。 -そして、その後で初めて、テストに合格するように実装を作成して、意図された振る舞いが達成されていることを検証します。 +テスト駆動開発 (TDD) とビヘイビア駆動開発 (BDD) のソフトウェア開発手法においては、実際のコードを書く前に、 +コードの断片または全体の機能の振る舞いを一連のシナリオまたはテストとして記述します。 +そして、その後で初めて、テストに合格するように実装を作成して、 +意図された振る舞いが達成されていることを検証します。 一つの機能を開発するプロセスは以下のようになります。 - 実装されるべき機能を記述するテストを作成する。 -- 新しいテストを走らせて、失敗することを確認する。 - まだ実装がないので、これは予期された結果です。 +- 新しいテストを走らせて、失敗することを確認する。まだ実装がないので、これは予期された結果です。 - 新しいテストに合格するための単純なコードを書く。 - 全てのテストを走らせて、全てが合格することを確認する。 - コードを改良して、それでも全てのテストが OK であることを確認する。 @@ -31,7 +33,8 @@ > Tip: 多数の小さくて単純なイテレーションを繰り返すために時間を取られていると感じる場合は、テスト・シナリオのカバー範囲を広くして、テストを再度実行するまでの作業量を増やしてみてください。 > デバッグばかりやっている場合は、逆に範囲を狭めてみてください。 -全ての実装作業の前にテストを作成する理由は、そうすれば、その後で、達成したい事柄に集中して「どのようにするか」に没頭することが出来るからです。 +全ての実装作業の前にテストを作成する理由は、そうすれば、その後で、 +達成したい事柄に集中して「どのようにするか」に没頭することが出来るからです。 通常、そのようにすることは、良い抽象化、機能修正時の容易なテスト保守、また、結合度の低いコンポーネントにつながります。 ですから、このような手法の長所を要約すると次のようになります。 diff --git a/docs/guide-ja/test-unit.md b/docs/guide-ja/test-unit.md index 16531aa3282..6b0ba8c805a 100644 --- a/docs/guide-ja/test-unit.md +++ b/docs/guide-ja/test-unit.md @@ -5,8 +5,7 @@ すなわち、さまざまな入力パラメータを与えて、クラスのメソッドが期待通りの結果を返すかどうかを検証します。 単体テストは、通常は、テストされるクラスを書く人によって開発されます。 -Yii における単体テストは、PHPUnit と Codeception (こちらはオプションです) の上に構築されます。 -従って、それらのドキュメントを通読することが推奨されます。 +Yii における単体テストは、PHPUnit と Codeception (こちらはオプションです) の上に構築されます。従って、それらのドキュメントを通読することが推奨されます。 - [Codeception for Yii framework](http://codeception.com/for/yii) - [Codeception Unit Tests](http://codeception.com/docs/05-UnitTests) @@ -17,9 +16,9 @@ Yii における単体テストは、PHPUnit と Codeception (こちらはオプ アドバンスト・テンプレートでプロジェクトを開始した場合、テストの実行については、 ["テスト" のガイド](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide-ja/start-testing.md) を参照して下さい。 -ベーシック・テンプレートでプロジェクトを開始した場合は、 -check its [README の "testing" のセクション](https://github.com/yiisoft/yii2-app-basic/blob/master/README.md#testing) を参照して下さい。 +ベーシック・テンプレートでプロジェクトを開始した場合は、[README の "testing" のセクション](https://github.com/yiisoft/yii2-app-basic/blob/master/README.md#testing) を参照して下さい。 ## フレームワークの単体テスト -Yii フレームワーク自体に対する単体テストを走らせたい場合は、"[Yii 2 の開発を始めよう](https://github.com/yiisoft/yii2/blob/master/docs/internals-ja/getting-started.md)" の説明に従ってください。 +Yii フレームワーク自体に対する単体テストを走らせたい場合は、"[Yii 2 の開発を始めよう](https://github.com/yiisoft/yii2/blob/master/docs/internals-ja/getting-started.md)" +の説明に従ってください。 From ff83a13d57a74edc9fc19ba244ba5fcc52dd1a74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Va=C5=A1=C3=AD=C4=8Dek?= Date: Mon, 30 Apr 2018 12:07:36 +0200 Subject: [PATCH 050/902] Fixes #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' --- framework/CHANGELOG.md | 1 + framework/web/CookieCollection.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index ea86aef55ba..1c2703985b2 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ +- Bug #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' (OndrejVasicek) - Bug #16006: Handle case when `X-Forwarded-Host` header have multiple hosts separated with a comma (pgaultier) - Bug #16010: Fixed `yii\filters\ContentNegotiator` behavior when GET parameters contain an array (rugabarbo) - Bug #14660: Fixed `yii\caching\DbCache` concurrency issue when set values with the same key (rugabarbo) diff --git a/framework/web/CookieCollection.php b/framework/web/CookieCollection.php index 9000fc88ab1..e5b2b688f16 100644 --- a/framework/web/CookieCollection.php +++ b/framework/web/CookieCollection.php @@ -113,7 +113,7 @@ public function getValue($name, $defaultValue = null) public function has($name) { return isset($this->_cookies[$name]) && $this->_cookies[$name]->value !== '' - && ($this->_cookies[$name]->expire === null || $this->_cookies[$name]->expire >= time()); + && ($this->_cookies[$name]->expire === null || $this->_cookies[$name]->expire === 0 || $this->_cookies[$name]->expire >= time()); } /** From 2b6d1818783b103993873661c7736431b0a07604 Mon Sep 17 00:00:00 2001 From: Jianjun Chen Date: Tue, 1 May 2018 00:01:25 +0800 Subject: [PATCH 051/902] Fix #16193 to not reflect origin header for wildcard origins --- framework/CHANGELOG.md | 2 +- framework/filters/Cors.php | 15 ++++++++++++++- tests/framework/filters/CorsTest.php | 22 ++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 1c2703985b2..9e26ee60fca 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ - +- Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins. (Jianjun Chen) - Bug #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' (OndrejVasicek) - Bug #16006: Handle case when `X-Forwarded-Host` header have multiple hosts separated with a comma (pgaultier) - Bug #16010: Fixed `yii\filters\ContentNegotiator` behavior when GET parameters contain an array (rugabarbo) diff --git a/framework/filters/Cors.php b/framework/filters/Cors.php index f00da60305f..1a62d930520 100644 --- a/framework/filters/Cors.php +++ b/framework/filters/Cors.php @@ -160,9 +160,22 @@ public function prepareHeaders($requestHeaders) $responseHeaders = []; // handle Origin if (isset($requestHeaders['Origin'], $this->cors['Origin'])) { - if (in_array('*', $this->cors['Origin']) || in_array($requestHeaders['Origin'], $this->cors['Origin'])) { + if (in_array($requestHeaders['Origin'], $this->cors['Origin'])) { $responseHeaders['Access-Control-Allow-Origin'] = $requestHeaders['Origin']; } + + if (in_array('*', $this->cors['Origin'])) { + // Per CORS standard(https://fetch.spec.whatwg.org), wildcard origins shouldn't be used together with credentails. + if (isset($this->cors['Access-Control-Allow-Credentials']) && $this->cors['Access-Control-Allow-Credentials']) { + if (YII_DEBUG) { + throw new Exception("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration."); + } else { + Yii::error("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration.", __METHOD__); + } + } else { + $responseHeaders['Access-Control-Allow-Origin'] = "*"; + } + } } $this->prepareAllowHeaders('Headers', $requestHeaders, $responseHeaders); diff --git a/tests/framework/filters/CorsTest.php b/tests/framework/filters/CorsTest.php index 5fb1f948dda..c0bc7395762 100644 --- a/tests/framework/filters/CorsTest.php +++ b/tests/framework/filters/CorsTest.php @@ -42,4 +42,26 @@ public function testPreflight() $request->headers->remove('Access-Control-Request-Method'); $this->assertTrue($cors->beforeAction($action)); } + + public function testWildcardOrigin() + { + $this->mockWebApplication(); + $controller = new Controller('id', Yii::$app); + $action = new Action('test', $controller); + $request = new Request(); + + $cors = new Cors([ + 'cors' => [ + 'Origin' => ['*',], + 'Access-Control-Allow-Credentials' => false, + ], + ]); + $cors->request = $request; + + $_SERVER['REQUEST_METHOD'] = 'GET'; + $_SERVER['HTTP_ORIGIN'] = 'http://foo.com/'; + $this->assertTrue($cors->beforeAction($action)); + $this->assertEquals('*', $cors->response->getHeaders()->get('access-control-allow-origin')); + } + } From f65361e47de9d0397100691f22a39f001f6fce5c Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 1 May 2018 01:13:50 +0300 Subject: [PATCH 052/902] Fixed changelog format --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9e26ee60fca..18c9c2be619 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ -- Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins. (Jianjun Chen) +- Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins (Jianjun Chen) - Bug #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' (OndrejVasicek) - Bug #16006: Handle case when `X-Forwarded-Host` header have multiple hosts separated with a comma (pgaultier) - Bug #16010: Fixed `yii\filters\ContentNegotiator` behavior when GET parameters contain an array (rugabarbo) From a1f52ef118897535e2287afb545d28fac25b7fcd Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 1 May 2018 01:16:03 +0300 Subject: [PATCH 053/902] Adjusted code style, fixed typo --- framework/filters/Cors.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/filters/Cors.php b/framework/filters/Cors.php index 1a62d930520..169c1e7eaad 100644 --- a/framework/filters/Cors.php +++ b/framework/filters/Cors.php @@ -160,12 +160,12 @@ public function prepareHeaders($requestHeaders) $responseHeaders = []; // handle Origin if (isset($requestHeaders['Origin'], $this->cors['Origin'])) { - if (in_array($requestHeaders['Origin'], $this->cors['Origin'])) { + if (in_array($requestHeaders['Origin'], $this->cors['Origin'], true)) { $responseHeaders['Access-Control-Allow-Origin'] = $requestHeaders['Origin']; } - if (in_array('*', $this->cors['Origin'])) { - // Per CORS standard(https://fetch.spec.whatwg.org), wildcard origins shouldn't be used together with credentails. + if (in_array('*', $this->cors['Origin'], true)) { + // Per CORS standard(https://fetch.spec.whatwg.org), wildcard origins shouldn't be used together with credentials if (isset($this->cors['Access-Control-Allow-Credentials']) && $this->cors['Access-Control-Allow-Credentials']) { if (YII_DEBUG) { throw new Exception("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration."); From 4b00d3ab8af74211142b821f9221c2bdbf3ea440 Mon Sep 17 00:00:00 2001 From: Dmitry Naumenko Date: Tue, 1 May 2018 10:38:57 +0300 Subject: [PATCH 054/902] Updated CHANGELOG [ci skip] --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 18c9c2be619..9be6928be8e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,6 +3,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ + - Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins (Jianjun Chen) - Bug #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' (OndrejVasicek) - Bug #16006: Handle case when `X-Forwarded-Host` header have multiple hosts separated with a comma (pgaultier) From 0c3b3f79d51646a55a6c3f98f5236663589a4117 Mon Sep 17 00:00:00 2001 From: Dmitry Naumenko Date: Tue, 1 May 2018 11:00:32 +0300 Subject: [PATCH 055/902] Minor [ci skip] --- framework/filters/Cors.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/filters/Cors.php b/framework/filters/Cors.php index 169c1e7eaad..d3a3079e758 100644 --- a/framework/filters/Cors.php +++ b/framework/filters/Cors.php @@ -165,7 +165,7 @@ public function prepareHeaders($requestHeaders) } if (in_array('*', $this->cors['Origin'], true)) { - // Per CORS standard(https://fetch.spec.whatwg.org), wildcard origins shouldn't be used together with credentials + // Per CORS standard (https://fetch.spec.whatwg.org), wildcard origins shouldn't be used together with credentials if (isset($this->cors['Access-Control-Allow-Credentials']) && $this->cors['Access-Control-Allow-Credentials']) { if (YII_DEBUG) { throw new Exception("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration."); @@ -173,7 +173,7 @@ public function prepareHeaders($requestHeaders) Yii::error("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration.", __METHOD__); } } else { - $responseHeaders['Access-Control-Allow-Origin'] = "*"; + $responseHeaders['Access-Control-Allow-Origin'] = '*'; } } } From 629a33fd0e2f469eef29de7d30f0f23c66e5791f Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Tue, 1 May 2018 12:32:16 +0300 Subject: [PATCH 056/902] Made Inclector unicode-safe --- framework/helpers/BaseInflector.php | 46 +++++++++++++++++------ tests/framework/helpers/InflectorTest.php | 14 ++++++- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/framework/helpers/BaseInflector.php b/framework/helpers/BaseInflector.php index 41d75153899..ab822815552 100644 --- a/framework/helpers/BaseInflector.php +++ b/framework/helpers/BaseInflector.php @@ -342,7 +342,7 @@ public static function titleize($words, $ucAll = false) { $words = static::humanize(static::underscore($words), $ucAll); - return $ucAll ? ucwords($words) : ucfirst($words); + return $ucAll ? mb_convert_case($words, MB_CASE_TITLE, self::encoding()) : self::mb_ucfirst($words, self::encoding()); } /** @@ -357,7 +357,7 @@ public static function titleize($words, $ucAll = false) */ public static function camelize($word) { - return str_replace(' ', '', ucwords(preg_replace('/[^A-Za-z0-9]+/', ' ', $word))); + return str_replace(' ', '', mb_convert_case(preg_replace('/[^\pL\pN]+/u', ' ', $word), MB_CASE_TITLE, self::encoding())); } /** @@ -373,9 +373,9 @@ public static function camel2words($name, $ucwords = true) '-', '_', '.', - ], ' ', preg_replace('/(\p{Lu})/u', ' \0', $name)))); + ], ' ', preg_replace('/(\p{Lu})/u', ' \0', $name))), self::encoding()); - return $ucwords ? mb_convert_case($label, MB_CASE_TITLE, 'UTF-8') : $label; + return $ucwords ? mb_convert_case($label, MB_CASE_TITLE, self::encoding()) : $label; } /** @@ -389,12 +389,12 @@ public static function camel2words($name, $ucwords = true) */ public static function camel2id($name, $separator = '-', $strict = false) { - $regex = $strict ? '/[A-Z]/' : '/(?charset : 'UTF-8'; + } + + /** + * The same as built-in `ucfirst`, but unicode-safe + * + * @param $string + * @param $encoding + * @return string + */ + private static function mb_ucfirst($string, $encoding) + { + $firstChar = mb_substr($string, 0, 1, $encoding); + $rest = mb_substr($string, 1, null, $encoding); + + return mb_strtoupper($firstChar, $encoding) . $rest; + } } diff --git a/tests/framework/helpers/InflectorTest.php b/tests/framework/helpers/InflectorTest.php index 9e80ab49238..728b92119a5 100644 --- a/tests/framework/helpers/InflectorTest.php +++ b/tests/framework/helpers/InflectorTest.php @@ -84,17 +84,20 @@ public function testTitleize() { $this->assertEquals('Me my self and i', Inflector::titleize('MeMySelfAndI')); $this->assertEquals('Me My Self And I', Inflector::titleize('MeMySelfAndI', true)); + $this->assertEquals('Треба Більше Тестів!', Inflector::titleize('ТребаБільшеТестів!', true)); } public function testCamelize() { - $this->assertEquals('MeMySelfAndI', Inflector::camelize('me my_self-andI')); + $this->assertEquals('MeMySelfAndi', Inflector::camelize('me my_self-andI')); $this->assertEquals('QweQweEwq', Inflector::camelize('qwe qwe^ewq')); + $this->assertEquals('ВідомоЩоТестиЗберігатьНашіНерви', Inflector::camelize('Відомо, що тести зберігать наші НЕРВИ! 🙃')); } public function testUnderscore() { $this->assertEquals('me_my_self_and_i', Inflector::underscore('MeMySelfAndI')); + $this->assertEquals('кожний_тест_особливий', Inflector::underscore('КожнийТестОсобливий')); } public function testCamel2words() @@ -109,24 +112,31 @@ public function testCamel2id() { $this->assertEquals('post-tag', Inflector::camel2id('PostTag')); $this->assertEquals('post_tag', Inflector::camel2id('PostTag', '_')); + $this->assertEquals('єдиний_код', Inflector::camel2id('ЄдинийКод', '_')); $this->assertEquals('post-tag', Inflector::camel2id('postTag')); $this->assertEquals('post_tag', Inflector::camel2id('postTag', '_')); + $this->assertEquals('єдиний_код', Inflector::camel2id('єдинийКод', '_')); $this->assertEquals('foo-ybar', Inflector::camel2id('FooYBar', '-', false)); $this->assertEquals('foo_ybar', Inflector::camel2id('fooYBar', '_', false)); + $this->assertEquals('невже_іце_працює', Inflector::camel2id('НевжеІЦеПрацює', '_', false)); $this->assertEquals('foo-y-bar', Inflector::camel2id('FooYBar', '-', true)); $this->assertEquals('foo_y_bar', Inflector::camel2id('fooYBar', '_', true)); + $this->assertEquals('foo_y_bar', Inflector::camel2id('fooYBar', '_', true)); + $this->assertEquals('невже_і_це_працює', Inflector::camel2id('НевжеІЦеПрацює', '_', true)); } public function testId2camel() { $this->assertEquals('PostTag', Inflector::id2camel('post-tag')); $this->assertEquals('PostTag', Inflector::id2camel('post_tag', '_')); + $this->assertEquals('ЄдинийСвіт', Inflector::id2camel('єдиний_світ', '_')); $this->assertEquals('PostTag', Inflector::id2camel('post-tag')); $this->assertEquals('PostTag', Inflector::id2camel('post_tag', '_')); + $this->assertEquals('НевжеІЦеПрацює', Inflector::id2camel('невже_і_це_працює', '_')); $this->assertEquals('FooYBar', Inflector::id2camel('foo-y-bar')); $this->assertEquals('FooYBar', Inflector::id2camel('foo_y_bar', '_')); @@ -136,11 +146,13 @@ public function testHumanize() { $this->assertEquals('Me my self and i', Inflector::humanize('me_my_self_and_i')); $this->assertEquals('Me My Self And I', Inflector::humanize('me_my_self_and_i', true)); + $this->assertEquals('Але й веселі ці ваші тести', Inflector::humanize('але_й_веселі_ці_ваші_тести')); } public function testVariablize() { $this->assertEquals('customerTable', Inflector::variablize('customer_table')); + $this->assertEquals('ひらがなHepimiz', Inflector::variablize('ひらがな_hepimiz')); } public function testTableize() From 951bfed56208d6986b3dc3040112c54a1ede58f9 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Tue, 1 May 2018 18:38:59 +0530 Subject: [PATCH 057/902] Fixed typo in db-query-builder.md (#16201) [skip ci] --- docs/guide/db-query-builder.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/db-query-builder.md b/docs/guide/db-query-builder.md index c00efbf666b..8633442aa00 100644 --- a/docs/guide/db-query-builder.md +++ b/docs/guide/db-query-builder.md @@ -237,7 +237,7 @@ guide article. For example the following code is vulnerable: ```php // Vulnerable code: $column = $request->get('column'); -$value = $request->get('value); +$value = $request->get('value'); $query->where([$column => $value]); // $value is safe, but $column name won't be encoded! ``` From 7d20e11b00bbdf8759307fa565354485b05d3c7b Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 1 May 2018 20:37:37 +0200 Subject: [PATCH 058/902] fix typo in russian guide https://github.com/yiisoft/yii2/pull/16113#issuecomment-385107708 --- docs/guide-ru/tutorial-yii-as-micro-framework.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ru/tutorial-yii-as-micro-framework.md b/docs/guide-ru/tutorial-yii-as-micro-framework.md index 575e3441f87..a4e5f2f6609 100644 --- a/docs/guide-ru/tutorial-yii-as-micro-framework.md +++ b/docs/guide-ru/tutorial-yii-as-micro-framework.md @@ -194,8 +194,8 @@ class PostController extends ActiveController - `/index.php?r=post` - список всех сообщений - `/index.php?r=post/view&id=1` - просмотр сообщения с ID 1 - `/index.php?r=post/create` - создание сообщения -- `/index.php?r=post/update&id=1` - обновление сообщения with ID 1 -- `/index.php?r=post/delete&id=1` - удаление сообщения with ID 1 +- `/index.php?r=post/update&id=1` - обновление сообщения с ID 1 +- `/index.php?r=post/delete&id=1` - удаление сообщения с ID 1 Начиная с этого момента Вы можете посмотреть следующие руководства для дальнейшего развития своего приложения: From bb232d91ad59cdb7a428cc3f85b12a75e10772db Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 3 May 2018 09:05:40 +0900 Subject: [PATCH 059/902] link fix in docs/guide/README.md [ci skip] --- docs/guide-ja/README.md | 16 ++++++++-------- docs/guide-ja/input-forms.md | 2 +- docs/guide/README.md | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/guide-ja/README.md b/docs/guide-ja/README.md index d7756d06338..fcc77e6156a 100644 --- a/docs/guide-ja/README.md +++ b/docs/guide-ja/README.md @@ -182,14 +182,14 @@ RESTful ウェブ・サービス ウィジェット ------------ -* [[yii\grid\GridView|GridView]] -* [[yii\widgets\ListView|ListView]] -* [[yii\widgets\DetailView|DetailView]] -* [[yii\widgets\ActiveForm|ActiveForm]] -* [[yii\widgets\Pjax|Pjax]] -* [[yii\widgets\Menu|Menu]] -* [[yii\widgets\LinkPager|LinkPager]] -* [[yii\widgets\LinkSorter|LinkSorter]] +* [GridView](https://www.yiiframework.com/doc-2.0/yii-grid-gridview.html) +* [ListView](https://www.yiiframework.com/doc-2.0/yii-widgets-listview.html) +* [DetailView](https://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html) +* [ActiveForm](https://www.yiiframework.com/doc/guide/2.0/ja/input-forms#activerecord-based-forms-activeform) +* [Pjax](https://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html) +* [Menu](https://www.yiiframework.com/doc-2.0/yii-widgets-menu.html) +* [LinkPager](https://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html) +* [LinkSorter](https://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html) * [Bootstrap ウィジェット](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide) * [jQuery UI ウィジェット](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide) diff --git a/docs/guide-ja/input-forms.md b/docs/guide-ja/input-forms.md index bbca24c6e87..2e3f8ab96cf 100644 --- a/docs/guide-ja/input-forms.md +++ b/docs/guide-ja/input-forms.md @@ -1,7 +1,7 @@ フォームを作成する ================== -アクティブ・レコードに基づくフォーム : ActiveForm +アクティブ・レコードに基づくフォーム : ActiveForm ----------------------------------------------- Yii においてフォームを使用するときは、主として [[yii\widgets\ActiveForm]] による方法を使います。 フォームがモデルに基づくものである場合はこの方法を選ぶべきです。 diff --git a/docs/guide/README.md b/docs/guide/README.md index 04972e6a87b..a802d3024e3 100644 --- a/docs/guide/README.md +++ b/docs/guide/README.md @@ -183,14 +183,14 @@ Special Topics Widgets ------- -* [[yii\grid\GridView|GridView]] -* [[yii\widgets\ListView|ListView]] -* [[yii\widgets\DetailView|DetailView]] -* [[yii\widgets\ActiveForm|ActiveForm]] -* [[yii\widgets\Pjax|Pjax]] -* [[yii\widgets\Menu|Menu]] -* [[yii\widgets\LinkPager|LinkPager]] -* [[yii\widgets\LinkSorter|LinkSorter]] +* [GridView](https://www.yiiframework.com/doc-2.0/yii-grid-gridview.html) +* [ListView](https://www.yiiframework.com/doc-2.0/yii-widgets-listview.html) +* [DetailView](https://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html) +* [ActiveForm](https://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform) +* [Pjax](https://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html) +* [Menu](https://www.yiiframework.com/doc-2.0/yii-widgets-menu.html) +* [LinkPager](https://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html) +* [LinkSorter](https://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html) * [Bootstrap Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide) * [jQuery UI Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide) From c78a290fedabe986fe04919e4a08a4887c45851f Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 3 May 2018 10:39:36 +0900 Subject: [PATCH 060/902] guide/tutorial-template-engines.md link fixed [ci skip] --- docs/guide/tutorial-template-engines.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/tutorial-template-engines.md b/docs/guide/tutorial-template-engines.md index 3c6b56e4be7..70f35619195 100644 --- a/docs/guide/tutorial-template-engines.md +++ b/docs/guide/tutorial-template-engines.md @@ -45,5 +45,5 @@ That code would be added to the `require` section of `composer.json`. After maki For details about using concrete template engine please refer to its documentation: -- [Twig guide](https://github.com/yiisoft/yii2-twig/tree/master/docs/guide) -- [Smarty guide](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide) +- [Twig guide](https://www.yiiframework.com/extension/yiisoft/yii2-twig/doc/guide/) +- [Smarty guide](https://www.yiiframework.com/extension/yiisoft/yii2-smarty/doc/guide/) From 221dc878f672df2e10ad96b3f0fb7023f22f536e Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 4 May 2018 02:05:37 +0900 Subject: [PATCH 061/902] guide-ja/tutorial-* revised [ci skip] (#16213) * guide-ja/tutorial-* revising WIP [ci skip] * guide-ja/tutorial-* revising WIP [ci skip] * guide-ja/tutorial-* revised [ci skip] * guide-ja/db-query-builder.md typo fixed [ci skip] --- docs/guide-ja/db-query-builder.md | 2 +- docs/guide-ja/tutorial-console.md | 58 +++--- docs/guide-ja/tutorial-core-validators.md | 189 +++++++++--------- docs/guide-ja/tutorial-docker.md | 7 +- docs/guide-ja/tutorial-i18n.md | 132 ++++++------ docs/guide-ja/tutorial-mailing.md | 9 +- docs/guide-ja/tutorial-performance-tuning.md | 56 ++++-- docs/guide-ja/tutorial-shared-hosting.md | 13 +- docs/guide-ja/tutorial-start-from-scratch.md | 11 +- docs/guide-ja/tutorial-template-engines.md | 11 +- .../tutorial-yii-as-micro-framework.md | 26 +-- docs/guide-ja/tutorial-yii-integration.md | 66 +++--- 12 files changed, 296 insertions(+), 284 deletions(-) diff --git a/docs/guide-ja/db-query-builder.md b/docs/guide-ja/db-query-builder.md index 5c3c8846d8e..f16c768a208 100644 --- a/docs/guide-ja/db-query-builder.md +++ b/docs/guide-ja/db-query-builder.md @@ -237,7 +237,7 @@ $query->where(['id' => $userQuery]); ```php // 脆弱なコード: $column = $request->get('column'); -$value = $request->get('value); +$value = $request->get('value'); $query->where([$column => $value]); // $value は安全です。しかし、$column の名前はエンコードされません。 ``` diff --git a/docs/guide-ja/tutorial-console.md b/docs/guide-ja/tutorial-console.md index 3d39e09809b..46fc1f5bafd 100644 --- a/docs/guide-ja/tutorial-console.md +++ b/docs/guide-ja/tutorial-console.md @@ -5,8 +5,7 @@ コンソール・アプリケーションは、主として、ウェブ・サイトのために実行する必要のあるバックグラウンドのタスクやメンテナンスのタスクを作成するために使われるものです。 コンソール・アプリケーションの構造は Yii のウェブ・アプリケーションのそれと非常に良く似ています。 -コンソール・アプリケーションは一つまたは複数の [[yii\console\Controller]] クラスから構成されます。 -コントローラはコンソール環境ではしばしば「コマンド」と呼ばれます。 +コンソール・アプリケーションは一つまたは複数の [[yii\console\Controller]] クラスから構成されます。コントローラはコンソール環境ではしばしば「コマンド」と呼ばれます。 また、各コントローラは、ウェブのコントローラと全く同じように、一つまたは複数のアクションを持つことが出来ます。 プロジェクト・テンプレートは、両方とも、既にコンソール・アプリケーションを持っています。 @@ -43,7 +42,9 @@ yii [--option1=value1 --option2=value2 ... argument1 argument2 ...] 上記において、`` はコントローラ・アクションへのルートを示すものです。 オプション (options) はクラスのプロパティに代入され、引数 (arguments) はアクション・メソッドのパラメータとなります。 -例えば、[[yii\console\controllers\MigrateController::$migrationTable|MigrateController::$migrationTable]] として `migrations` を指定し、マイグレーションの上限を 5 と指定して [[yii\console\controllers\MigrateController::actionUp()|MigrateController::actionUp()]] を呼び出すためには、次のようにします。 +例えば、[[yii\console\controllers\MigrateController::$migrationTable|MigrateController::$migrationTable]] として `migrations` を指定し、 +マイグレーションの上限を 5 と指定して [[yii\console\controllers\MigrateController::actionUp()|MigrateController::actionUp()]] +を呼び出すためには、次のようにします。 ``` yii migrate/up 5 --migrationTable=migrations @@ -68,6 +69,7 @@ yii migrate/up 5 --migrationTable=migrations */ defined('YII_DEBUG') or define('YII_DEBUG', true); +defined('YII_ENV') or define('YII_ENV', 'dev'); require __DIR__ . '/vendor/autoload.php'; require __DIR__ . '/vendor/yiisoft/yii2/Yii.php'; @@ -79,8 +81,7 @@ $exitCode = $application->run(); exit($exitCode); ``` -このスクリプトはアプリケーションの一部として生成されるものです。 -あなたの必要を満たすように、自由に編集して構いません。 +このスクリプトはアプリケーションの一部として生成されるものです。あなたの必要を満たすように、自由に編集して構いません。 エラー発生時にスタック・トレースを見たくない、または、全体のパフォーマンスを上げたい、という場合は、`YII_DEBUG` 定数を `false` に設定することが出来ます。 ベーシック・プロジェクト・テンプレートでも、アドバンスト・プロジェクト・テンプレートでも、コンソール・アプリケーションのエントリ・スクリプトは、開発者に優しい環境を提供するために、デフォルトでデバッグを有効にしています。 @@ -91,17 +92,21 @@ exit($exitCode); 上記のコードで見るように、コンソール・アプリケーションは、`console.php` という名前のそれ自身の構成情報ファイルを使用します。 このファイルの中で、さまざまな [アプリケーション・コンポーネント](structure-application-components.md)、取り分け、コンソール・アプリケーションのためのプロパティを構成しなければなりません。 -ウェブ・アプリケーションとコンソール・アプリケーションが構成情報のパラメータと値を数多く共有する場合は、共通の部分を独立したファイルに移動して、そのファイルを両方のアプリケーション (ウェブとコンソール) の構成情報にインクルードすることを検討しても良いでしょう。 +ウェブ・アプリケーションとコンソール・アプリケーションが構成情報のパラメータと値を数多く共有する場合は、共通の部分を独立したファイルに移動して、 +そのファイルを両方のアプリケーション (ウェブとコンソール) の構成情報にインクルードすることを検討しても良いでしょう。 その例をアドバンスト・プロジェクト・テンプレートの中で見ることが出来ます。 -> Tip: 場合によっては、エントリ・スクリプトで指定されているのとは異なるアプリケーション構成情報を使ってコンソール・コマンドを実行したいことがあります。 -> 例えば、`yii migrate` コマンドを使ってテストのデータベースをアップグレードするとき、データベースが個々のテストスイートの中で構成されているような場合です。 +> Tip: 場合によっては、エントリ・スクリプトで指定されているのとは異なるアプリケーション構成情報を使って +> コンソール・コマンドを実行したいことがあります。 +> 例えば、`yii migrate` コマンドを使ってテストのデータベースをアップグレードするとき、 +> データベースが個々のテストスイートの中で構成されているような場合です。 > 構成情報を動的に変更するためには、コマンドを実行するときに `appconfig` オプションを使ってカスタムの構成情報ファイルを指定するだけで大丈夫です。 > > ``` > yii --appconfig=path/to/config.php ... > ``` + コンソール・コマンドの補完 -------------------------- @@ -110,8 +115,7 @@ exit($exitCode); ### Bash の補完 -bash completion がインストールされていることを確認して下さい。 -ほとんどの bash のインストレーションでは、デフォルトで利用可能になっています。 +bash completion がインストールされていることを確認して下さい。ほとんどの bash のインストレーションでは、デフォルトで利用可能になっています。 補完スクリプトを `/etc/bash_completion.d/` に置いて下さい。 @@ -150,34 +154,35 @@ autoload -Uz compinit && compinit -i exec $SHELL -l ``` - あなた自身のコンソール・コマンドを作成する ------------------------------------------ ### コンソールのコントローラとアクション コンソール・コマンドは、[[yii\console\Controller]] を拡張するコントローラ・クラスとして定義することが出来ます。 -コントローラ・クラスの中で、コントローラのサブ・コマンドに対応する一つまたは複数のアクションを定義します。 -各アクションの中で、その特定のサブ・コマンドのための適切なタスクを実装するコードを書きます。 +コントローラ・クラスの中で、コントローラのサブ・コマンドに対応する一つまたは複数のアクションを定義します。各アクションの中で、その特定のサブ・コマンドのための適切なタスクを実装するコードを書きます。 コマンドを実行するときは、コントローラのアクションに対するルートを指定する必要があります。 -例えば、ルート `migrate/create` は、[[yii\console\controllers\MigrateController::actionCreate()|MigrateController::actionCreate()]] アクション・メソッドに対応するサブコマンドを呼び出します。 +例えば、ルート `migrate/create` は、[[yii\console\controllers\MigrateController::actionCreate()|MigrateController::actionCreate()]] +アクション・メソッドに対応するサブコマンドを呼び出します。 実行時に提供されたルートにアクション ID が含まれない場合は、(ウェブのコントローラの場合と同じように) デフォルトのアクションが実行されます。 ### オプション [[yii\console\Controller::options()]] メソッドをオーバーライドすることによって、コンソール・コマンド (controller/actionID) で利用できるオプションを指定することが出来ます。 このメソッドはコントローラ・クラスのパブリックなプロパティのリストを返さなければなりません。 -コマンドを実行するときは、`--OptionName=OptionValue` という構文を使ってオプションの値を指定することが出来ます。これはコントローラ・クラスの `OptionName` プロパティに `OptionValue` を割り当てるものです。 +コマンドを実行するときは、`--OptionName=OptionValue` という構文を使ってオプションの値を指定することが出来ます。 +これはコントローラ・クラスの `OptionName` プロパティに `OptionValue` を割り当てるものです。 -オプションのデフォルト値が配列型である場合、実行時にこのオプションをセットすると、オプションの値は、入力文字列をカンマで分離することによって、配列に変換されます。 +オプションのデフォルト値が配列型である場合、実行時にこのオプションをセットすると、 +オプションの値は、入力文字列をカンマで分離することによって、配列に変換されます。 ### オプションのエイリアス -バージョン 2.0.8 以降、コンソールコマンドは、オプションにエイリアスを追加するための [[yii\console\Controller::optionAliases()]] メソッドを提供しています。 +バージョン 2.0.8 以降、コンソールコマンドは、オプションにエイリアスを追加するための +[[yii\console\Controller::optionAliases()]] メソッドを提供しています。 -エイリアスを定義するためには、コントローラで [[yii\console\Controller::optionAliases()]] をオーバーライドします。 -例えば、 +エイリアスを定義するためには、コントローラで [[yii\console\Controller::optionAliases()]] をオーバーライドします。例えば、 ```php namespace app\commands; @@ -213,8 +218,7 @@ class HelloController extends Controller ### 引数 -オプションに加えてに、コマンドは引数を取ることも出来ます。 -引数は、リクエストされたサブ・コマンドに対応するアクション・メソッドへのパラメータとして渡されます。 +オプションに加えてに、コマンドは引数を取ることも出来ます。引数は、リクエストされたサブ・コマンドに対応するアクション・メソッドへのパラメータとして渡されます。 最初の引数は最初のパラメータに対応し、二番目の引数は二番目のパラメータに対応し、以下同様です。 コマンドが呼び出されたときに十分な数の引数が提供されなかったときは、対応するパラメータは、定義されていれば、宣言されているデフォルト値をとります。 デフォルト値が設定されておらず、実行時に値が提供されなかった場合は、コマンドはエラーで終了します。 @@ -244,12 +248,12 @@ class ExampleController extends \yii\console\Controller ### 終了コード 終了コードを使うことはコンソール・アプリケーション開発のベスト・プラクティスです。 -コマンドは何も問題が無かったことを示すために `0` を返すのが慣例です。 -コマンドが 1 以上の値を返したときは、何かエラーを示唆するものとみなされます。 +コマンドは何も問題が無かったことを示すために `0` を返すのが慣例です。コマンドが 1 以上の値を返したときは、何かエラーを示唆するものとみなされます。 返される数値がエラーコードであり、それによってエラーに関する詳細を見出すことが出来る場合もあります。 例えば、`1` は一般的な未知のエラーを示すものとし、`2` 以上の全てのコードは特定のエラー、例えば、入力エラー、ファイルが見つからない、等々を示すものとすることが出来ます。 -コンソール・コマンドに終了コードを返させるためには、単にコントローラのアクション・メソッドで整数を返すようにします。 +コンソール・コマンドに終了コードを返させるためには、 +単にコントローラのアクション・メソッドで整数を返すようにします。 ```php public function actionIndex() @@ -284,8 +288,7 @@ public function actionIndex() Yii のコンソール・コマンドは出力の書式設定をサポートしています。 これは、コマンドを走らせている端末がサポートしていない場合は、自動的に書式設定の無い出力にグレードダウンされます。 -書式設定された文字列を出力することは簡単です。 -ボールドのテキストを出力するには、次のようにします。 +書式設定された文字列を出力することは簡単です。ボールドのテキストを出力するには、次のようにします。 ```php $this->stdout("Hello?\n", Console::BOLD); @@ -300,8 +303,7 @@ echo "Hello, my name is $name."; ### 表形式 -バージョン 2.0.13 以降、表形式のデータをコンソールに表示するウィジェットが追加されています。 -次のようにして使うことが出来ます。 +バージョン 2.0.13 以降、表形式のデータをコンソールに表示するウィジェットが追加されています。次のようにして使うことが出来ます。 ```php echo Table::widget([ diff --git a/docs/guide-ja/tutorial-core-validators.md b/docs/guide-ja/tutorial-core-validators.md index 570b6fc2563..51d08943e7c 100644 --- a/docs/guide-ja/tutorial-core-validators.md +++ b/docs/guide-ja/tutorial-core-validators.md @@ -1,8 +1,7 @@ コア・バリデータ ================ -Yii は、一般的に使われる一連のコア・バリデータを提供しています。 -コア・バリデータは、主として、`yii\validators` 名前空間の下にあります。 +Yii は、一般的に使われる一連のコア・バリデータを提供しています。コア・バリデータは、主として、`yii\validators` 名前空間の下にあります。 長ったらしいバリデータ・クラス名を使う代りに、*エイリアス* を使って使用するコア・バリデータを指定することが出来ます。 例えば、[[yii\validators\RequiredValidator]] クラスを参照するのに `required` というエイリアスを使うことが出来ます。 @@ -39,7 +38,8 @@ public function rules() - `strict`: 入力値の型が `trueValue` と `falseValue` の型と一致しなければならないかどうか。デフォルト値は `false`。 -> Note: HTML フォームで送信されたデータ入力値は全て文字列であるため、通常は、[[yii\validators\BooleanValidator::strict|strict]] プロパティは `false` のままにすべきです。 +> Note: HTML フォームで送信されたデータ入力値は全て文字列であるため、通常は、 + [[yii\validators\BooleanValidator::strict|strict]] プロパティは `false` のままにすべきです。 ## [[yii\captcha\CaptchaValidator|captcha]] @@ -50,11 +50,14 @@ public function rules() ] ``` -このバリデータは、通常、[[yii\captcha\CaptchaAction]] および [[yii\captcha\Captcha]] と一緒に使われ、入力値が [[yii\captcha\Captcha|CAPTCHA]] ウィジェットによって表示された検証コードと同じであることを確認します。 +このバリデータは、通常、[[yii\captcha\CaptchaAction]] および [[yii\captcha\Captcha]] と一緒に使われ、 +入力値が [[yii\captcha\Captcha|CAPTCHA]] ウィジェットによって表示された検証コードと同じであることを確認します。 - `caseSensitive`: 検証コードの比較で大文字と小文字を区別するかどうか。デフォルト値は `false`。 -- `captchaAction`: CAPTCHA 画像を表示する [[yii\captcha\CaptchaAction|CAPTCHA アクション]] に対応する [ルート](structure-controllers.md#routes)。デフォルト値は `'site/captcha'`。 -- `skipOnEmpty`: 入力値が空のときに検証をスキップできるかどうか。デフォルト値は `false` で、入力が必須であることを意味します。 +- `captchaAction`: CAPTCHA 画像を表示する [[yii\captcha\CaptchaAction|CAPTCHA アクション]] に対応する + [ルート](structure-controllers.md#routes)。デフォルト値は `'site/captcha'`。 +- `skipOnEmpty`: 入力値が空のときに検証をスキップできるかどうか。デフォルト値は `false` で、 + 入力が必須であることを意味します。 ## [[yii\validators\CompareValidator|compare]] @@ -72,10 +75,12 @@ public function rules() ] ``` -このバリデータは指定された入力値を他の値と比較し、両者の関係が `operator` プロパティで指定されたものであることを確認します。 +このバリデータは指定された入力値を他の値と比較し、両者の関係が +`operator` プロパティで指定されたものであることを確認します。 - `compareAttribute`: その値が比較対象となる属性の名前。 - このバリデータが属性を検証するのに使用されるとき、このプロパティのデフォルト値はその属性の名前に接尾辞 `_repeat` を付けた名前になります。 + このバリデータが属性を検証するのに使用されるとき、このプロパティのデフォルト値はその属性の名前に接尾辞 + `_repeat` を付けた名前になります。 例えば、検証される属性が `password` であれば、このプロパティのデフォルト値は `password_repeat` となります。 - `compareValue`: 入力値が比較される定数値。 このプロパティと `compareAttribute` の両方が指定された場合は、このプロパティが優先されます。 @@ -90,14 +95,15 @@ public function rules() * `<`: 検証される値が比較される値よりも小さいことを検証する。 * `<=`: 検証される値が比較される値よりも小さいか等しいことを検証する。 - `type`: デフォルトの比較タイプは '[[yii\validators\CompareValidator::TYPE_STRING|string]]' (文字列) であり、その場合、値は 1 バイトごとに比較されます。 -数値を比較する場合は、必ず [[yii\validators\CompareValidator::$type|$type]] を '[[yii\validators\CompareValidator::TYPE_NUMBER|number]]' に設定して、数値としての比較を有効にして下さい。 - + 数値を比較する場合は、必ず [[yii\validators\CompareValidator::$type|$type]] を '[[yii\validators\CompareValidator::TYPE_NUMBER|number]]' に設定して、 + 数値としての比較を有効にして下さい。 ### 日付の値を比較する compare バリデータは、文字列や数値を比較するためにしか使えません。 日付のような値を比較する必要がある場合は、二つの選択肢があります。 -日付をある固定値と比較するときは、単に [[yii\validators\DateValidator|date]] バリデータを使って、その [[yii\validators\DateValidator::$min|$min]] や [[yii\validators\DateValidator::$max|$max]] のプロパティを指定すれば良いでしょう。 +日付をある固定値と比較するときは、単に [[yii\validators\DateValidator|date]] バリデータを使って、 +その [[yii\validators\DateValidator::$min|$min]] や [[yii\validators\DateValidator::$max|$max]] のプロパティを指定すれば良いでしょう。 フォームに入力された二つの日付、例えば、`fromDate` と `toDate` のフィールドを比較する必要がある場合は、 次のように、compare バリデータと date バリデータを組み合わせて使うことが出来ます。 @@ -111,13 +117,14 @@ compare バリデータは、文字列や数値を比較するためにしか使 そして、有効な日付であった場合は、機械が読める形式に変換されます。 その後に、これらの二つの値が compare バリデータによって比較されます。 現在、date バリデータはクライアント・サイドのバリデーションを提供していませんので、これはサーバ・サイドでのみ動作します。 -そのため、compare バリデータについても、[[yii\validators\CompareValidator::$enableClientValidation|$enableClientValidation]] は `false` に設定されています。 +そのため、compare バリデータについても、[[yii\validators\CompareValidator::$enableClientValidation|$enableClientValidation]] は +`false` に設定されています。 ## [[yii\validators\DateValidator|date]] -[[yii\validators\DateValidator|date]] バリデータには 3 つの異なるショートカットがあります。 - +[[yii\validators\DateValidator|date]] バリデータには三つの異なる +ショートカットがあります。 ```php [ @@ -128,10 +135,12 @@ compare バリデータは、文字列や数値を比較するためにしか使 ``` このバリデータは、入力値が正しい書式の date、time、または datetime であるかどうかをチェックします。 -オプションとして、入力値を UNIX タイムスタンプ (または、その他、機械による読み取りが可能な形式) に変換して、[[yii\validators\DateValidator::timestampAttribute|timestampAttribute]] によって指定された属性に保存することも出来ます。 +オプションとして、入力値を UNIX タイムスタンプ (または、その他、機械による読み取りが可能な形式) に変換して、 +[[yii\validators\DateValidator::timestampAttribute|timestampAttribute]] によって指定された属性に保存することも出来ます。 - `format`: 検証される値が従っているべき日付/時刻の書式。 - これには [ICU manual](http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax) で記述されている日付/時刻のパターンを使うことが出来ます。 + これには [ICU manual](http://userguide.icu-project.org/formatparse/datetime#TOC-Date-Time-Format-Syntax) + で記述されている日付/時刻のパターンを使うことが出来ます。 あるいは、PHP の `Datetime` クラスによって認識される書式に接頭辞 `php:` を付けた文字列でも構いません。 サポートされている書式については、 を参照してください。 このプロパティが設定されていないときは、`Yii::$app->formatter->dateFormat` の値を取ります。 @@ -141,19 +150,25 @@ compare バリデータは、文字列や数値を比較するためにしか使 その場合は、元の値は検証実行後にタイムスタンプで上書きされます。 [DatePicker で日付の入力を扱う](https://github.com/yiisoft/yii2-jui/blob/master/docs/guide-ja/topics-date-picker.md) に使用例がありますので、参照してください。 - バージョン 2.0.4 以降では、[[yii\validators\DateValidator::$timestampAttributeFormat|$timestampAttributeFormat]] と [[yii\validators\DateValidator::$timestampAttributeTimeZone|$timestampAttributeTimeZone]] を使って、この属性に対するフォーマットとタイム・ゾーンを指定することが出来ます。 + バージョン 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|最大値]] を指定することも出来ます。 +- バージョン 2.0.4 以降では、タイムスタンプの [[yii\validators\DateValidator::$min|最小値]] または + [[yii\validators\DateValidator::$max|最大値]] を指定することも出来ます。 -入力が必須でない場合には、date バリデータに加えて、default バリデータ (デフォルト値フィルタ) を追加すれば、空の入力値が `null` として保存されることを保証することが出来ます。 -そうしないと、データベースに `0000-00-00` という日付が保存されたり、デート・ピッカーの入力フィールドが `1970-01-01` になったりしてしまいます。 +入力が必須でない場合には、date バリデータに加えて、default バリデータ (デフォルト値フィルタ) を追加すれば、 +空の入力値が `null` として保存されることを保証することが出来ます。そうしないと、データベースに `0000-00-00` という日付が保存されたり、 +デート・ピッカーの入力フィールドが `1970-01-01` になったりしてしまいます。 ```php +[ [['from_date', 'to_date'], 'default', 'value' => null], [['from_date', 'to_date'], 'date'], +] ``` ## [[yii\validators\DefaultValueValidator|default]] @@ -177,8 +192,7 @@ compare バリデータは、文字列や数値を比較するためにしか使 その代りに、検証される属性が空のときに、その属性にデフォルト値を割り当てます。 - `value`: デフォルト値、または、デフォルト値を返す PHP コーラブル。 - 検証される属性が空のときにこのデフォルト値が割り当てられます。 - PHP コーラブルのシグニチャは、次のものでなければなりません。 + 検証される属性が空のときにこのデフォルト値が割り当てられます。PHP コーラブルのシグニチャは、次のものでなければなりません。 ```php function foo($model, $attribute) { @@ -191,6 +205,7 @@ function foo($model, $attribute) { データベース・スキーマによるデフォルト値は、モデルの [loadDefaultValues()](db-active-record.md#default-attribute-values) によってロードすることが出来ます。 + ## [[yii\validators\NumberValidator|double]] ```php @@ -200,13 +215,10 @@ function foo($model, $attribute) { ] ``` -このバリデータは、入力値が実数値であるかどうかをチェックします。 -[number](#number) バリデータと等価です。 +このバリデータは、入力値が実数値であるかどうかをチェックします。[number](#number) バリデータと等価です。 -- `max`: 上限値 (その値を含む)。 - 設定されていない場合は、バリデータが上限値をチェックしないことを意味します。 -- `min`: 下限値 (その値を含む)。 - 設定されていない場合は、バリデータが下限値をチェックしないことを意味します。 +- `max`: 上限値 (その値を含む)。設定されていない場合は、バリデータが上限値をチェックしないことを意味します。 +- `min`: 下限値 (その値を含む)。設定されていない場合は、バリデータが下限値をチェックしないことを意味します。 ## [[yii\validators\EachValidator|each]] @@ -224,13 +236,13 @@ function foo($model, $attribute) { これは、配列の *全ての* 要素が指定された検証規則による検証に成功するかどうかを調べるものです。 上の例では、`categoryIDs` 属性は配列を値として取らなければならず、配列の各要素は `integer` の検証規則によって検証されることになります。 -- `rule`: 検証規則を指定する配列。 - 配列の最初の要素がバリデータのクラス名かエイリアスを指定します。 +- `rule`: 検証規則を指定する配列。配列の最初の要素がバリデータのクラス名かエイリアスを指定します。 配列の残りの「名前・値」のペアが、バリデータ・オブジェクトを構成するのに使われます。 - `allowMessageFromRule`: 埋め込まれた検証規則によって返されるエラー・メッセージを使うかどうか。 デフォルト値は `true` です。これが `false` の場合は、`message` をエラー・メッセージとして使います。 -> Note: 属性が配列でない場合は、検証が失敗したと見なされ、`message` がエラー・メッセージとして返されます。 +> Note: 属性が配列でない場合は、検証が失敗したと見なされ、 + `message` がエラー・メッセージとして返されます。 ## [[yii\validators\EmailValidator|email]] @@ -257,33 +269,36 @@ function foo($model, $attribute) { ```php [ - // a1 の値が属性 "a1" で表されるカラムに存在する必要がある + // a1 の入力値が a1 のカラムに存在する必要がある ['a1', 'exist'], - // a1 の値が属性 "a2" で表されるカラムに存在する必要がある + // a1 の入力値が a2 のカラムに存在する必要がある ['a1', 'exist', 'targetAttribute' => 'a2'], - // a1 の値が "a1" のカラム、a2 の値が "a2" のカラムに存在する必要がある - // 両者はともにエラー・メッセージを受け取る + // a1 と a2 の両方が存在する必要がある。両者はともにエラー・メッセージを受け取る [['a1', 'a2'], 'exist', 'targetAttribute' => ['a1', 'a2']], - // a1 の値が "a1" のカラム、a2 の値が "a2" のカラムに存在する必要がある - // a1 のみがエラー・メッセージを受け取る + // a1 と a2 の両方が存在する必要がある。a1 のみがエラー・メッセージを受け取る ['a1', 'exist', 'targetAttribute' => ['a1', 'a2']], - // a2 の値が "a2" のカラム、a1 の値が "a3" のカラムに存在する必要がある - // a1 がエラー・メッセージを受け取る + // a2 の値が a2 のカラム、a1 の値が a3 のカラムに存在する必要がある。a1 がエラー・メッセージを受け取る ['a1', 'exist', 'targetAttribute' => ['a2', 'a1' => 'a3']], - // a1 の値が "a1" のカラムに存在する必要がある - // a1 が配列である場合は、その全ての要素が "a1" のカラムに存在する必要がある + // a1 が存在する必要がある。a1 が配列である場合は、その全ての要素が存在する必要がある ['a1', 'exist', 'allowArray' => true], + + // type_id が ProductType クラスで定義されているテーブルの id カラムに存在する必要がある + ['type_id', 'exist', 'targetClass' => ProductType::class, 'targetAttribute' => ['type_id' => 'id']], + + // 同上。定義済みの "type" リレーションを使用。 + ['type_id', 'exist', 'targetRelation' => 'type'], ] ``` このバリデータは、入力値が [アクティブ・レコード](db-active-record.md) の属性によって表されるテーブルのカラムに存在するかどうかをチェックします。 -`targetAttribute` を使って [アクティブ・レコード](db-active-record.md) の属性を指定し、`targetClass` によって対応するクラスを指定することが出来ます。 -これらを指定しない場合は、検証されるモデルの属性とクラスの値が使用されます。 +`targetAttribute` を使って [アクティブ・レコード](db-active-record.md) の属性を指定し、 +`targetClass` によって対応するクラスを指定することが出来ます。 +これらを指定しない場合は、検証されるモデルの属性とクラスが使用されます。 このバリデータは、一つまたは複数のカラムに対する検証に使用することが出来ます (複数のカラムに対する検証の場合は、それらの属性の組み合せが存在しなければならないことを意味します)。 @@ -293,15 +308,14 @@ function foo($model, $attribute) { - `targetAttribute`: `targetClass` において、入力値の存在を検証するために使用される属性の名前。 設定されていない場合は、現在検証されている属性の名前が使用されます。 複数のカラムの存在を同時に検証するために配列を使うことが出来ます。 - 配列の値は存在を検証するのに使用される属性であり、配列のキーはその値が検証される属性です。 + 配列の値は存在を検証するのに使用される属性であり、配列のキーは入力値が検証される属性です。 キーと値が同じ場合は、値だけを指定することが出来ます。 - `filter`: 入力値の存在をチェックするのに使用される DB クエリに適用される追加のフィルタ。 これには、文字列、または、追加のクエリ条件を表現する配列を使うことが出来ます (クエリ条件の書式については、[[yii\db\Query::where()]] を参照してください)。 または、`function ($query)` というシグニチャを持つ無名関数でも構いません。 `$query` は関数の中で修正できる [[yii\db\Query|Query]] オブジェクトです。 -- `allowArray`: 入力値が配列であることを許容するか否か。 - デフォルト値は `false`。 +- `allowArray`: 入力値が配列であることを許容するか否か。デフォルト値は `false`。 このプロパティが `true` で入力値が配列であった場合は、配列の全ての要素がターゲットのカラムに存在しなければなりません。 `targetAttribute` を配列で指定して複数のカラムに対して検証しようとしている場合は、このプロパティを `true` に設定することが出来ないことに注意してください。 @@ -326,13 +340,10 @@ function foo($model, $attribute) { リストは、配列、または、空白かカンマで区切られたファイルの MIME タイプからなる文字列 (例えば、"image/jpeg, image/png") で指定することが出来ます。 特殊文字 `*` によるワイルドカードのマスクを使って、一群の MIME タイプに一致させることも出来ます。 例えば `image/*` は、`image/` で始まる全ての MIME タイプ (`image/jpeg`, `image/png` など) を通します。 - MIME タイプ名は大文字と小文字を区別しません。 - デフォルト値は `null` であり、すべての MIME タイプが許可されることを意味します。 + MIME タイプ名は大文字と小文字を区別しません。デフォルト値は `null` であり、すべての MIME タイプが許可されることを意味します。 MIME タイプの詳細については、[一般的なメディア・タイプ](http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types) を参照してください。 -- `minSize`: アップロードされるファイルに要求される最小限のバイト数。 - デフォルト値は `null` であり、下限値が無いことを意味します。 -- `maxSize`: アップロードされるファイルに許可される最大限のバイト数。 - デフォルト値は `null` であり、上限値が無いことを意味します。 +- `minSize`: アップロードされるファイルに要求される最小限のバイト数。デフォルト値は `null` であり、下限値が無いことを意味します。 +- `maxSize`: アップロードされるファイルに許可される最大限のバイト数。デフォルト値は `null` であり、上限値が無いことを意味します。 - `maxFiles`: 指定された属性が保持しうる最大限のファイル数。 デフォルト値は 1 であり、入力値がアップロードされた一つだけのファイルでなければならないことを意味します。 この値が 2 以上である場合は、入力値は最大で `maxFiles` 数のアップロードされたファイルからなる配列でなければなりません。 @@ -362,19 +373,18 @@ function foo($model, $attribute) { このバリデータはデータを検証しません。 代りに、入力値にフィルタを適用して、それを検証される属性に書き戻します。 -- `filter`: フィルタを定義する PHP コールバック。 - これには、グローバル関数の名前、無名関数などを指定することが出来ます。 - 関数のシグニチャは ``function ($value) { return $newValue; }` でなければなりません。 - このプロパティは必須項目です。 -- `skipOnArray`: 入力値が配列である場合にフィルタをスキップするか否か。 - デフォルト値は `false`。 +- `filter`: フィルタを定義する PHP コールバック。これには、グローバル関数の名前、無名関数などを指定することが出来ます。 + 関数のシグニチャは ``function ($value) { return $newValue; }` でなければなりません。このプロパティは必須項目です。 +- `skipOnArray`: 入力値が配列である場合にフィルタをスキップするか否か。デフォルト値は `false`。 フィルタが配列の入力を処理できない場合は、このプロパティを `true` に設定しなければなりません。 そうしないと、何らかの PHP エラーが生じ得ます。 > Tip: 入力値をトリムしたい場合は、[trim](#trim) バリデータを直接使うことが出来ます。 > Tip: `filter` のコールバックに期待されるシグニチャを持つ PHP 関数が多数存在します。 -> 例えば、([intval](http://php.net/manual/ja/function.intval.php) や [boolval](http://php.net/manual/ja/function.boolval.php) などを使って) 型キャストを適用し、属性が特定の型になるように保証したい場合は、それらの関数をクロージャで包む必要はなく、単にフィルタの関数名を指定するだけで十分です。 +> 例えば、([intval](http://php.net/manual/ja/function.intval.php) や [boolval](http://php.net/manual/ja/function.boolval.php) +> などを使って) 型キャストを適用し、属性が特定の型になるように保証したい場合は、 +> それらの関数をクロージャで包む必要はなく、単にフィルタの関数名を指定するだけで十分です。 > > ```php > ['property', 'filter', 'filter' => 'boolval'], @@ -403,7 +413,6 @@ function foo($model, $attribute) { - `minHeight`: 画像の高さの最小値。デフォルト値は `null` であり、下限値がないことを意味します。 - `maxHeight`: 画像の高さの最大値。デフォルト値は `null` であり、上限値がないことを意味します。 - ## [[yii\validators\IpValidator|ip]] ```php [ @@ -434,17 +443,14 @@ function foo($model, $attribute) { デフォルト値は `false`。 - `normalize`: CIDR を持たないアドレスに、最も短い (IPv4 では 32、IPv6 では 128) CIDR プレフィクスを追加するか否か。 -`subnet` が `false` 以外の場合にのみ動作します。 -例えば、 + `subnet` が `false` 以外の場合にのみ動作します。例えば、 * `10.0.1.5` は `10.0.1.5/32` に正規化され、 * `2008:db0::1` は `2008:db0::1/128` に正規化されます デフォルト値は `false`。 -- `negation`: 検証の対象となるアドレスが先頭に否定文字 `!` を持つことが出来るか否か。 -デフォルト値は `false`。 +- `negation`: 検証の対象となるアドレスが先頭に否定文字 `!` を持つことが出来るか否か。デフォルト値は `false`。 - `expandIPv6`: IPv6 アドレスを完全な記法に展開するか否か。 -例えば、`2008:db0::1` は `2008:0db0:0000:0000:0000:0000:0000:0001` に展開されます。 -デフォルト値は `false`。 + 例えば、`2008:db0::1` は `2008:0db0:0000:0000:0000:0000:0000:0001` に展開されます。デフォルト値は `false`。 - `ranges`: 許容または禁止される IPv4 または IPv6 の範囲の配列。 配列が空の場合、またはこのオプションが設定されていない場合は、全ての IP アドレスが許容されます。 @@ -463,11 +469,10 @@ function foo($model, $attribute) { ``` この例では、`192.168.10.0/24` のサブネットを除いて、全ての IPv4 および IPv6 アドレスが許容されます。 IPv4 アドレス `192.168.10.128` も、制約の前にリストされているため、同様に許容されます。 -- `networks`: `ranges` で使用する事が出来るネットワークのエイリアスの配列。 -配列の形式は、 +- `networks`: `ranges` で使用する事が出来るネットワークのエイリアスの配列。配列の形式は、 * キー - エイリアス名 * 値 - 文字列の配列。文字列は、範囲、IP アドレス、または、他のエイリアスとすることが出来ます。 -また、文字列は (`negation` オプションとは独立に) `!` によって否定することが出来ます。 + また、文字列は (`negation` オプションとは独立に) `!` によって否定することが出来ます。 デフォルトで、次のエイリアスが定義されています。 @@ -482,7 +487,6 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている > Info: このバリデータは、バージョン 2.0.7 以降で利用することが出来ます。 - ## [[yii\validators\RangeValidator|in]] ```php @@ -529,7 +533,8 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている このバリデータは、入力値が指定された正規表現に一致するかどうかをチェックします。 -- `pattern`: 入力値が一致すべき正規表現。このプロパティを設定することは必須です。そうしないと、例外が投げられます。 +- `pattern`: 入力値が一致すべき正規表現。このプロパティを設定することは必須です。 + そうしないと、例外が投げられます。 - `not`: 検証結果を反転すべきかどうか。 デフォルト値は false で、入力値がパターンに一致したときにだけ検証が成功することを意味します。 このプロパティが true に設定されているときは、入力値がパターンに一致しない場合にだけ検証が成功したと見なされます。 @@ -561,14 +566,15 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている このバリデータは、入力値が提供されており、空ではないことをチェックします。 -- `requiredValue`: 入力値として要求される値。 - このプロパティが設定されていない場合は、入力値が空ではいけないことを意味します。 +- `requiredValue`: 入力値として要求される値。このプロパティが設定されていない場合は、入力値が空ではいけないことを意味します。 - `strict`: 値を検証するときに、データ型をチェックするかどうか。デフォルト値は `false`。 `requiredValue` が設定されていない場合、このプロパティが `true` であるときは、バリデータは入力値が厳密な意味で `null` であるかどうかをチェックします。 一方、このプロパティが `false` であるときは、値が空か否かの判断に緩い規則を使います。 - `requiredValue` が設定されている場合、このプロパティが `true` であるときは、入力値と `requiredValue` を比較するときに型のチェックを行います。 + `requiredValue` が設定されている場合、このプロパティが `true` であるときは、 +入力値と `requiredValue` を比較するときに型のチェックを行います。 -> Info: 値が空であるか否かを決定する方法については、独立したトピックとして、[空の入力値を扱う](input-validation.md#handling-empty-inputs) のセクションでカバーされています。 +> Info: 値が空であるか否かを決定する方法については、独立したトピックとして、 +> [空の入力値を扱う](input-validation.md#handling-empty-inputs) のセクションでカバーされています。 ## [[yii\validators\SafeValidator|safe]] @@ -599,10 +605,12 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている これは、次のいずれかの形式で指定することが出来ます。 * 一つの整数: 文字列がちょうどその長さでなければならない、その長さ。 * 一つの要素を持つ配列: 入力文字列の長さの最小値 (例えば、`[8]`)。これは `min` を上書きします。 - * 二つの要素を持つ配列: 入力文字列の長さの最小値と最大値 (例えば、`[8, 128]`)。これは `min` と `max` の両方を上書きします。 + * 二つの要素を持つ配列: 入力文字列の長さの最小値と最大値 (例えば、`[8, 128]`)。 + これは `min` と `max` の両方を上書きします。 - `min`: 入力文字列の長さの最小値。設定されていない時は、長さの下限値がないことを意味します。 - `max`: 入力文字列の長さの最大値。設定されていない時は、長さの上限値がないことを意味します。 -- `encoding`: 検証される入力文字列の文字エンコーディング。設定されていない時は、アプリケーションの [[yii\base\Application::charset|charset]] の値が使われ、デフォルトでは `UTF-8` となります。 +- `encoding`: 検証される入力文字列の文字エンコーディング。設定されていない時は、 + アプリケーションの [[yii\base\Application::charset|charset]] の値が使われ、デフォルトでは `UTF-8` となります。 ## [[yii\validators\FilterValidator|trim]] @@ -614,8 +622,7 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている ] ``` -このバリデータはデータの検証を実行しません。 -その代りに、入力値の前後にあるホワイト・スペースをトリムします。 +このバリデータはデータの検証を実行しません。その代りに、入力値の前後にあるホワイト・スペースをトリムします。 入力値が配列であるときは、このバリデータによって無視されることに注意してください。 @@ -623,22 +630,19 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている ```php [ - // a1 の値が属性 "a1" で表されるカラムにおいてユニークである必要がある + // a1 の入力値が a1 のカラムにおいてユニークである必要がある ['a1', 'unique'], - // a1 の値が属性 "a2" で表されるカラムにおいてユニークである必要がある + // a1 の入力値が a2 のカラムにおいてユニークである必要がある ['a1', 'unique', 'targetAttribute' => 'a2'], - // a1 の値が "a1" のカラム、a2 の値が "a2" のカラムにおいてユニークである必要がある - // 両者はともにエラー・メッセージを受け取る + // a1 と a2 の両方がユニークである必要がある。両者がともにエラー・メッセージを受け取る [['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']], - // a1 の値が "a1" のカラム、a2 の値が "a2" のカラムにおいてユニークである必要がある - // a1 のみがエラー・メッセージを受け取る + // a1 と a2 の両方がユニークである必要がある。a1 のみがエラー・メッセージを受け取る ['a1', 'unique', 'targetAttribute' => ['a1', 'a2']], - // a2 の値が "a2" のカラム、a1 の値が "a3" のカラムにおいてユニークである必要がある - // a1 がエラー・メッセージを受け取る + // a2 の値が a2 のカラム、a1 の値が a3 のカラムにおいてユニークである必要がある。a1 がエラー・メッセージを受け取る ['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']], ] ``` @@ -652,13 +656,12 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている - `targetAttribute`: `targetClass` において、入力値がユニークであることを検証するために使用される属性の名前。 設定されていない場合は、現在検証されている属性の名前が使用されます。 複数のカラムのユニーク性を同時に検証するために配列を使うことが出来ます。 - 配列の値はユニーク性を検証するのに使用される属性であり、配列のキーはその値が検証される属性です。 + 配列の値はユニーク性を検証するのに使用される属性であり、配列のキーはその入力値が検証される属性です。 キーと値が同じ場合は、値だけを指定することが出来ます。 - `filter`: 入力値のユニーク性をチェックするのに使用される DB クエリに適用される追加のフィルタ。 これには、文字列、または、追加のクエリ条件を表現する配列を使うことが出来ます (クエリ条件の書式については、[[yii\db\Query::where()]] を参照してください)。 - または、`function ($query)` というシグニチャを持つ無名関数でも構いません。 - `$query` は関数の中で修正できる [[yii\db\Query|Query]] オブジェクトです。 + または、`function ($query)` というシグニチャを持つ無名関数でも構いません。`$query` は関数の中で修正できる [[yii\db\Query|Query]] オブジェクトです。 ## [[yii\validators\UrlValidator|url]] @@ -677,12 +680,10 @@ IPv4 アドレス `192.168.10.128` も、制約の前にリストされている デフォルト値は `['http', 'https']` であり、`http` と `https` の URL がともに有効と見なされることを意味します。 - `defaultScheme`: 入力値がスキームの部分を持たないときに前置されるデフォルトの URI スキーム。 デフォルト値は `null` であり、入力値を修正しないことを意味します。 -- `enableIDN`: バリデータが IDN (国際化ドメイン名) を考慮すべきか否か。 - デフォルト値は `false`。 +- `enableIDN`: バリデータが IDN (国際化ドメイン名) を考慮すべきか否か。デフォルト値は `false`。 IDN の検証を使用するためには、`intl` PHP 拡張をインストールして有効化する必要があることに注意してください。 そうしないと、例外が投げられます。 > Note: このバリデータは URL スキームとホスト部分が正しいものであることを検証します。 URL の残りの部分はチェックしません。また、XSS や他の攻撃に対して防御するように設計されてもいません。 - アプリケーション開発における脅威に対する防御について更に学習するために -[セキュリティのベスト・プラクティス](security-best-practices.md) を参照して下さい。 + アプリケーション開発における脅威に対する防御について更に学習するために[セキュリティのベスト・プラクティス](security-best-practices.md) を参照して下さい。 diff --git a/docs/guide-ja/tutorial-docker.md b/docs/guide-ja/tutorial-docker.md index 3fc6ff368d5..5225d8eba7a 100644 --- a/docs/guide-ja/tutorial-docker.md +++ b/docs/guide-ja/tutorial-docker.md @@ -1,9 +1,7 @@ Yii と Docker ============= -開発および配備の際に Yii アプリケーションを Docker コンテナとして実行することが出来ます。 -コンテナは隔絶された軽量の仮想マシンのようなもので、そのサービスをホストのポートにマップします。 -例えば、コンテナ内の 80 番ポートにあるウェブ・サーバが(ローカル)ホストの 8888 番で利用できます。 +開発および配備の際に Yii アプリケーションを Docker コンテナとして実行することが出来ます。コンテナは隔絶された軽量の仮想マシンのようなもので、そのサービスをホストのポートにマップします。例えば、コンテナ内の 80 番ポートにあるウェブ・サーバが(ローカル)ホストの 8888 番で利用できます。 コンテナによって、開発用コンピュータと実運用サーバでソフトウェアのバージョンを全く同一にすること、迅速な配備、開発時におけるマルチ・サーバ・アーキテクチャのシミュレーションなど、数多くの問題を解決することが出来ます。 @@ -82,7 +80,7 @@ Docker の基本的なコマンド: *実行中の* `php` サービスの中で bash を実行 -## Advanced topics +## 高度なトピック ### Yii フレームワークのテスト @@ -91,6 +89,7 @@ Docker の基本的なコマンド: ### データベース管理ツール MySQL を (`mysql`) として実行するときは、以下のようにして phpMyAdmin コンテナをスタックに追加することが出来ます。 + ``` phpmyadmin: image: phpmyadmin/phpmyadmin diff --git a/docs/guide-ja/tutorial-i18n.md b/docs/guide-ja/tutorial-i18n.md index e996a0a3d45..4e5b609f575 100644 --- a/docs/guide-ja/tutorial-i18n.md +++ b/docs/guide-ja/tutorial-i18n.md @@ -1,7 +1,8 @@ 国際化 ====== -国際化 (I18N) とは、工学的な変更を伴わずにさまざまな言語と地域に順応できるように、ソフトウェア・アプリケーションを設計するプロセスを指します。 +国際化 (I18N) とは、工学的な変更を伴わずにさまざまな言語と地域に順応できるように、 +ソフトウェア・アプリケーションを設計するプロセスを指します。 潜在的なユーザが世界中にいるウェブ・アプリケーションにとっては、このことは特に重要な意味を持ちます。 Yii は、全ての領域にわたる国際化機能を提供し、メッセージの翻訳、ビューの翻訳、日付と数字の書式設定をサポートします。 @@ -10,14 +11,18 @@ Yii は、全ての領域にわたる国際化機能を提供し、メッセー ### ロケール -ロケールとは、ユーザの言語、国、そして、ユーザが彼らのユーザ・インタフェイスにおいて目にすることを期待するすべての変異形式を定義する一連のパラメータです。 +ロケールとは、ユーザの言語、国、そして、ユーザが彼らのユーザ・インタフェイスにおいて目にすることを期待する +すべての変異形式を定義する一連のパラメータです。 ロケールは、通常、言語 ID と地域 ID から成るロケール ID によって定義されます。 例えば、`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 プロジェクトのドキュメント](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept) に述べられています。 +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 プロジェクトのドキュメント](http://userguide.icu-project.org/locale#TOC-The-Locale-Concept) +に述べられています。 ### 言語 @@ -30,7 +35,6 @@ Yii のアプリケーションでは二つの言語を使用します。すな いわゆるメッセージ翻訳サービスは、主として、テキスト・メッセージをソース言語からターゲット言語に翻訳するものです。 ### 構成 - アプリケーションの言語は、アプリケーションの構成情報で次のように構成することが出来ます。 ```php @@ -49,7 +53,8 @@ return [ このデフォルト値は変えないことが **推奨** されます。 なぜなら、通常は、英語から他の言語への翻訳者を見つける方が、非英語から非英語への翻訳者を見つけるより、はるかに簡単だからです。 -[[yii\base\Application::$language|ターゲット言語]] は、エンド・ユーザの言語選択など、さまざまな要因に基づいて、動的に設定しなければならないことがよくあります。 +[[yii\base\Application::$language|ターゲット言語]] は、エンド・ユーザの言語選択など、 +さまざまな要因に基づいて、動的に設定しなければならないことがよくあります。 アプリケーションの構成情報で構成するかわりに、次の文を使ってターゲット言語を変更することが出来ます。 ```php @@ -60,37 +65,34 @@ return [ > Tip: ソース言語がコードの部分によって異なる場合は、メッセージ・ソースごとにソース言語をオーバーライドすることが出来ます。 > これについては、次の説で説明します。 - ## メッセージ翻訳 ### ソース言語からターゲット言語へ - -メッセージ翻訳サービスは、テキスト・メッセージをある言語 (通常は [[yii\base\Application::$sourceLanguage|ソース言語]]) から別の言語 (通常は [[yii\base\Application::$language|ターゲット言語]]) に翻訳するものです。 +メッセージ翻訳サービスは、テキスト・メッセージをある言語 (通常は [[yii\base\Application::$sourceLanguage|ソース言語]]) +から別の言語 (通常は [[yii\base\Application::$language|ターゲット言語]]) に翻訳するものです。 翻訳は、元のメッセージと翻訳されたメッセージを格納するメッセージ・ソースの中から、翻訳対象となったメッセージを探すことにより行われます。 -メッセージが見つかれば、対応する翻訳されたメッセージが返されます。 -メッセージが見つからなければ、元のメッセージが翻訳されずに返されます。 +メッセージが見つかれば、対応する翻訳されたメッセージが返されます。メッセージが見つからなければ、元のメッセージが翻訳されずに返されます。 ### 実装の仕方 - メッセージ翻訳サービスを使用するためには、主として次の作業をする必要があります。 1. 翻訳する必要のある全てのテキスト・メッセージを [[Yii::t()]] メソッドの呼び出しの中に包む。 2. メッセージ翻訳サービスが翻訳されたメッセージを探すことが出来る一つまたは複数のメッセージ・ソースを構成する。 3. 翻訳者にメッセージを翻訳させて、それをメッセージ・ソースに格納する。 -#### 1. テキスト・メッセージを包む +#### 1. テキスト・メッセージを包む [[Yii::t()]] メソッドは次のように使います。 ```php echo \Yii::t('app', 'This is a string to translate!'); ``` -ここで、二番目のパラメータが翻訳されるべきテキスト・メッセージを示し、最初のパラメータはメッセージを分類するのに使用されるカテゴリ名を示します。 +ここで、二番目のパラメータが翻訳されるべきテキスト・メッセージを示し、 +最初のパラメータはメッセージを分類するのに使用されるカテゴリ名を示します。 #### 2. 一つまたは複数のメッセージ・ソースを構成する - [[Yii::t()]] メソッドは `i18n` [アプリケーション・コンポーネント](structure-application-components.md) の `translate` メソッドを呼んで実際の翻訳作業を実行します。 このコンポーネントはアプリケーションの構成情報の中で次のようにして構成することが出来ます。 @@ -117,7 +119,8 @@ echo \Yii::t('app', 'This is a string to translate!'); ##### シンボル `*` によるカテゴリのワイルドカード -`app*` は、`app` で始まる全てのメッセージ・カテゴリがこのメッセージ・ソースを使って翻訳されるべきであることを示しています。 +`app*` は、`app` で始まる全てのメッセージ・カテゴリが +このメッセージ・ソースを使って翻訳されるべきであることを示しています。 #### 3. 翻訳者にメッセージを翻訳させて、それをメッセージ・ソースに格納する @@ -128,8 +131,7 @@ echo \Yii::t('app', 'This is a string to translate!'); > このセクションで後で紹介します。 PHP ファイルは、それぞれ、一つのカテゴリのメッセージに対応します。 -デフォルトでは、ファイル名はカテゴリ名と同じでなければなりません。 -`app/messages/nl-NL/main.ph` の例を示します。 +デフォルトでは、ファイル名はカテゴリ名と同じでなければなりません。`app/messages/nl-NL/main.ph` の例を示します。 ```php -翻訳対象となるメッセージには、一つまたは複数のパラメータ (プレースホルダとも呼びます) を埋め込んで、与えられたパラメータ値で置き換えられるようにすることが出来ます。 +翻訳対象となるメッセージには、一つまたは複数のパラメータ (プレースホルダとも呼びます) を埋め込んで、 +与えられたパラメータ値で置き換えられるようにすることが出来ます。 様々なパラメータ値のセットを与えることによって、翻訳されるメッセージを動的に変化させることが出来ます。 次の例では、`'Hello, {username}!'` というメッセージの中のプレースホルダ `{username}` が `'Alexander'` と `'Qiang'` にそれぞれ置き換えられます。 @@ -193,11 +199,11 @@ echo \Yii::t('app', 'Hello, {username}!', [ // 日本語翻訳: '{username} さん、こんにちは!' ``` -プレースホルダには、*名前付きプレースホルダ* と *序数プレースホルダ* のどちらかを使用する事が出来ます。 -ただし、一つのメッセージに両方を使うことは出来ません。 +プレースホルダには、*名前付きプレースホルダ* と *序数プレースホルダ* のどちらかを使用する事が出来ます。ただし、一つのメッセージに両方を使うことは出来ません。 上記の例は名前付きプレースホルダの使い方を示すものです。 -すなわち、各プレースホルダは `{name}` という形式で書かれていますが、それに対して、キーが(波括弧なしの)プレースホルダ名であり、値がそのプレースホルダを置き換える値である連想配列を渡す訳です。 +すなわち、各プレースホルダは `{name}` という形式で書かれていますが、それに対して、キーが(波括弧なしの)プレースホルダ名であり、 +値がそのプレースホルダを置き換える値である連想配列を渡す訳です。 序数プレースホルダは、0 ベースの整数の序数をプレースホルダ名として使います。 このプレースホルダは、`Yii::t()` の呼び出しに出現する順序に従って、パラメータ値によって置き換えられます。 @@ -226,7 +232,8 @@ echo \Yii::t('app', 'Price: {0}', $price); ### パラメータのフォーマット -メッセージのプレースホルダにフォーマットの規則を追加して指定し、パラメータ値がプレースホルダを置き換える前に適切にフォーマットされるようにすることが出来ます。 +メッセージのプレースホルダにフォーマットの規則を追加して指定し、 +パラメータ値がプレースホルダを置き換える前に適切にフォーマットされるようにすることが出来ます。 次の例では、`price` のパラメータ値の型は数値として扱われ、通貨の形式でフォーマットされます。 ```php @@ -249,9 +256,8 @@ echo \Yii::t('app', 'Price: {0,number,currency}', $price); echo Yii::t('app', "Example of string with ''-escaped characters'': '{' '}' '{test}' {count,plural,other{''count'' value is # '#{}'}}", ['count' => 3]); +``` -このようなプレースホルダを指定する方法についての完全な説明は、[ICU ドキュメント](http://icu-project.org/apiref/icu4c/classMessageFormat.html) を参照してください。 +このようなプレースホルダを指定する方法についての完全な説明は、[ICU ドキュメント](http://icu-project.org/apiref/icu4c/classMessageFormat.html)を参照してください。以下では、よくある使用方法をいくつか示します。 -以下では、よくある使用方法をいくつか示します。 #### 数値 @@ -283,7 +289,9 @@ echo \Yii::t('app', 'Balance: {0,number,,000,000000}', $sum); // 日本語出力: '差引残高: 000,012345' ``` -カスタムフォーマットで使用される文字については、[ICU API リファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html) の "Special Pattern Characters" のセクションに記述されています。 +カスタムフォーマットで使用される文字については、 +[ICU API リファレンス](http://icu-project.org/apiref/icu4c/classicu_1_1DecimalFormat.html) の "Special Pattern Characters" +のセクションに記述されています。 数値は常に翻訳先のロケールに従ってフォーマットされます。 つまり、ロケールを変更せずに、小数点や桁区切りを変更することは出来ません。 @@ -376,7 +384,8 @@ echo \Yii::t('app', 'I am {n,spellout,%spellout-ordinal} agent', ['n' => 47]); 'spellout,' と '%' の間に空白を入れてはならないことに注意してください。 -あなたが使用しているロケールで利用可能なオプションのリストについては、[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Numbering schemas, Spellout" を参照してください。 +あなたが使用しているロケールで利用可能なオプションのリストについては、 +[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Numbering schemas, Spellout" を参照してください。 #### 序数 @@ -397,7 +406,8 @@ echo \Yii::t('app', '{n,ordinal,%digits-ordinal-feminine}', ['n' => 471]); 'ordinal,' と '%' の間に空白を入れてはならないことに注意してください。 -あなたが使用しているロケールで利用可能なオプションのリストについては、[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Numbering schemas, Ordinal" を参照してください。 +あなたが使用しているロケールで利用可能なオプションのリストについては、 +[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Numbering schemas, Ordinal" を参照してください。 > Note: 上記のソース・メッセージを、プレースホルダのスタイルを守って日本語に翻訳すると、'あなたはこのサイトの{n,ordinal}の訪問者です' となります。 > しかし、その出力結果は、'あなたはこのサイトの第42の訪問者です' となり、意味は通じますが、日本語としては若干不自然なものになります。 @@ -424,7 +434,8 @@ echo \Yii::t('app', '{n,duration,%in-numerals}', ['n' => 471227]); 'duration,' と '%' の間に空白を入れてはならないことに注意してください。 -あなたが使用しているロケールで利用可能なオプションのリストについては、[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Numbering schemas, Duration" を参照してください。 +あなたが使用しているロケールで利用可能なオプションのリストについては、 +[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Numbering schemas, Duration" を参照してください。 > Note: このソース・メッセージを 'あなたはこのサイトに既に{n,duration}の間滞在しています' と翻訳した場合の出力結果は、'あなたはこのサイトに既に47の間滞在しています' となります。 > これも、プレースホルダのスタイルも含めて全体を翻訳し直す方が良いでしょう。 @@ -433,8 +444,7 @@ echo \Yii::t('app', '{n,duration,%in-numerals}', ['n' => 471227]); #### 複数形 -言語によって、複数形の語形変化はさまざまに異なります。 -Yii は、さまざまな形式の複数形語形変化に対応したメッセージ翻訳のための便利な方法を提供しています。 +言語によって、複数形の語形変化はさまざまに異なります。Yii は、さまざまな形式の複数形語形変化に対応したメッセージ翻訳のための便利な方法を提供しています。 それは、非常に複雑な規則に対しても、十分に機能するものです。 語形変化の規則を直接に処理する代りに、特定の状況における語形変化した言葉の翻訳を提供するだけで十分です。 @@ -445,10 +455,8 @@ Yii は、さまざまな形式の複数形語形変化に対応したメッセ echo \Yii::t('app', 'There {n,plural,=0{are no cats} =1{is one cat} other{are # cats}}!', ['n' => $n]); ``` -上記の複数形規則の引数において、`=` はぴったりその値であることを意味します。 -従って、`=0` はぴったりゼロ、`=1` はぴったり 1 を表します。 -`other` はそれ以外の数を表します。 -`#` は ターゲット言語に従ってフォーマットされた `n` の値によって置き換えられます。 +上記の複数形規則の引数において、`=` はぴったりその値であることを意味します。従って、`=0` はぴったりゼロ、`=1` はぴったり 1 を表します。 +`other` はそれ以外の数を表します。`#` は ターゲット言語に従ってフォーマットされた `n` の値によって置き換えられます。 複数形の規則が非常に複雑な言語もあります。 例えば、次のロシア語の例では、`=1` が `n = 1` にぴったりと一致するのに対して、`one` が `21` や `101` などに一致します。 @@ -461,11 +469,11 @@ echo \Yii::t('app', 'There {n,plural,=0{are no cats} =1{is one cat} other{are # 特定のロケールに対してどんな引数を指定すべきかを学ぶためには、[http://intl.rmcreative.ru/](http://intl.rmcreative.ru/) の "Plural Rules, Cardinal" を参照してください。 あるいは、その代りに、[unicode.org の規則のリファレンス](http://cldr.unicode.org/index/cldr-spec/plural-rules) を参照することも出来ます。 - > Note: 上記のロシア語のメッセージのサンプルは、主として翻訳メッセージとして使用されるものです。 > アプリケーションの [[yii\base\Application::$sourceLanguage|ソース言語]] を `ru-RU` にしてロシア語から他の言語に翻訳するという設定にしない限り、オリジナルのメッセージとしては使用されることはありません。 > -> `Yii::t()` の呼び出しにおいて、オリジナルのメッセージに対する翻訳が見つからない場合は、[[yii\base\Application::$sourceLanguage|ソース言語]] の複数形規則がオリジナルのメッセージに対して適用されます。 +> `Yii::t()` の呼び出しにおいて、オリジナルのメッセージに対する翻訳が見つからない場合は、 +> [[yii\base\Application::$sourceLanguage|ソース言語]] の複数形規則がオリジナルのメッセージに対して適用されます。 文字列が以下のようなものである場合のために `offset` というパラメータがあります。 @@ -662,8 +670,7 @@ class Menu extends Widget ### フレームワーク・メッセージを翻訳する -Yii には、検証エラーとその他いくつかの文字列に対するデフォルトの翻訳メッセージが付属しています。 -これらのメッセージは、全て 'yii' というカテゴリの中にあります。 +Yii には、検証エラーとその他いくつかの文字列に対するデフォルトの翻訳メッセージが付属しています。これらのメッセージは、全て 'yii' というカテゴリの中にあります。 場合によっては、あなたのアプリケーションのために、デフォルトのフレームワーク・メッセージの翻訳を修正したいことがあるでしょう。 そうするためには、`i18n` [アプリケーション・コンポーネント](structure-application-components.md) を以下のように構成してください。 @@ -684,8 +691,7 @@ Yii には、検証エラーとその他いくつかの文字列に対するデ ### 欠落している翻訳の処理 ソースに翻訳が欠落している場合でも、Yii はリクエストされたメッセージの内容を表示します。 -この振舞いは、原文のメッセージが正当かつ詳細なテキストである場合には、非常に好都合です。 -しかし、場合によっては、それだけでは十分ではありません。 +この振舞いは、原文のメッセージが正当かつ詳細なテキストである場合には、非常に好都合です。しかし、場合によっては、それだけでは十分ではありません。 リクエストされた翻訳がソースに欠落しているときに、何らかの特別な処理を実行する必要がある場合もあります。 そういう処理は、[[yii\i18n\MessageSource]] の [[yii\i18n\MessageSource::EVENT_MISSING_TRANSLATION|missingTranslation]] イベントを使うことによって達成できます。 @@ -735,8 +741,7 @@ class TranslationEventHandler ### `message` コマンドを使う -翻訳は [[yii\i18n\PhpMessageSource|php ファイル]]、[[yii\i18n\GettextMessageSource|.po ファイル]]、または [[yii\i18n\DbMessageSource|database]] に保存することが出来ます。 -追加のオプションについてはそれぞれのクラスを参照してください。 +翻訳は [[yii\i18n\PhpMessageSource|php ファイル]]、[[yii\i18n\GettextMessageSource|.po ファイル]]、または [[yii\i18n\DbMessageSource|database]] に保存することが出来ます。追加のオプションについてはそれぞれのクラスを参照してください。 まず最初に、構成情報ファイルを作成する必要があります。 どこに保存したいかを決めて、次のコマンドを発行してください。 @@ -745,12 +750,10 @@ class TranslationEventHandler ./yii message/config-template path/to/config.php ``` -作成されたファイルを開いて、あなたの要求に合わせてパラメータを修正します。 -特に、下記の項目に注意を払ってください。 +作成されたファイルを開いて、あなたの要求に合わせてパラメータを修正します。特に、下記の項目に注意を払ってください。 * `languages`: あなたのアプリケーションが翻訳されるべき言語を表す配列。 -* `messagePath`: メッセージファイルを保存するパス。 - これは、アプリケーションの構成情報で記述されている `i18n` の `basePath` と合致しなければなりません。 +* `messagePath`: メッセージファイルを保存するパス。これは、アプリケーションの構成情報で記述されている `i18n` の `basePath` と合致しなければなりません。 './yii message/config' コマンドを使って、CLI 経由で、指定したオプションを持つ設定ファイルを動的に生成することも可能です。 例えば、`languages` と `messagePath` のパラメータは、次のようにして設定することが出来ます。 @@ -771,6 +774,8 @@ class TranslationEventHandler ./yii message path/to/config.php ``` +また、オプションを指定して、抽出のパラメータを動的に変更することも出来ます。 + これで、(あなたがファイル・ベースの翻訳を選択していた場合は) `messagePath` ディレクトリにファイルが出現します。 @@ -779,9 +784,12 @@ class TranslationEventHandler 個々のテキスト・メッセージを翻訳する代りに、ビュー・スクリプト全体を翻訳したい場合があるでしょう。 この目的を達するためには、ビューを翻訳して、ターゲット言語と同じ名前のサブ・ディレクトリに保存するだけで大丈夫です。 例えば、`views/site/index.php` というビューをターゲット言語 `ru-RU` に翻訳したい場合は、翻訳したビューを `views/site/ru-RU/index.php` というファイルとして保存します。 -このようにすると、[[yii\base\View::renderFile()]] メソッド、または、このメソッドを呼び出す他のメソッド (例えば [[yii\base\Controller::render()]]) を呼んで `views/site/index.php` をレンダリングするたびに、翻訳された `views/site/ru-RU/index.php` が代りにレンダリングされるようになります。 +このようにすると、[[yii\base\View::renderFile()]] メソッド、または、このメソッドを呼び出す他のメソッド +(例えば [[yii\base\Controller::render()]]) を呼んで `views/site/index.php` をレンダリングするたびに、 +翻訳された `views/site/ru-RU/index.php` が代りにレンダリングされるようになります。 -> Note: [[yii\base\Application::$language|ターゲット言語]] が [[yii\base\Application::$sourceLanguage|ソース言語]] と同じ場合は、翻訳されたビューの有無にかかわらず、オリジナルのビューがレンダリングされます。 +> Note: [[yii\base\Application::$language|ターゲット言語]] が [[yii\base\Application::$sourceLanguage|ソース言語]] と同じ場合は、 +> 翻訳されたビューの有無にかかわらず、オリジナルのビューがレンダリングされます。 ## 数値と日付の値を書式設定する @@ -789,6 +797,11 @@ class TranslationEventHandler 詳細は [データ・フォーマッタ](output-formatting.md) のセクションを参照してください。 +## 日付と数値をフォーマットする + +詳細は [データのフォーマット](output-formatting.md) のセクションを参照して下さい。 + + ## PHP 環境をセットアップする Yii は、[[yii\i18n\Formatter]] クラスの数値や日付の書式設定や、[[yii\i18n\MessageFormatter]] を使うメッセージのフォーマッティングなど、ほとんどの国際化機能を提供するために [PHP intl 拡張](http://php.net/manual/ja/book.intl.php) を使います。 @@ -796,12 +809,13 @@ Yii は、[[yii\i18n\Formatter]] クラスの数値や日付の書式設定や だだし、このフォールバックの実装は、英語がターゲット言語である場合にのみ十分に機能するものす。 従って、国際化機能が必要とされる場合は、`intl` をインストールすることが強く推奨されます。 -[PHP intl 拡張](http://php.net/manual/ja/book.intl.php) は、さまざまに異なる全てのロケールについて知識と書式の規則を提供する [ICU ライブラリ](http://site.icu-project.org/) に基礎を置いています。 +[PHP intl 拡張](http://php.net/manual/ja/book.intl.php) は、さまざまに異なる全てのロケールについて知識と書式の規則を提供する +[ICU ライブラリ](http://site.icu-project.org/) に基礎を置いています。 ICU のバージョンが異なると、日付や数値のフォーマットの結果も異なる場合があります。 -あなたのウェブ・サイトが全ての環境で同じ出力をすることを保証するためには、全ての環境において同じバージョンの PHP intl 拡張 (従って同じバージョンの ICU) をインストールすることが推奨されます。 +あなたのウェブ・サイトが全ての環境で同じ出力をすることを保証するためには、 +全ての環境において同じバージョンの PHP intl 拡張 (従って同じバージョンの ICU) をインストールすることが推奨されます。 -どのバージョンの ICU が PHP によって使われているかを知るために、次のスクリプトを走らせることが出来ます。 -このスクリプトは、使用されている PHP と ICU のバージョンを出力します。 +どのバージョンの ICU が PHP によって使われているかを知るために、次のスクリプトを走らせることが出来ます。このスクリプトは、使用されている PHP と ICU のバージョンを出力します。 ```php を参照してください。 -バージョン番号の採番方式が 4.8 リリースの後に変更されたことに注意してください -(すなわち、ICU 4.8、ICU 49、ICU 50、等々となっています)。 +バージョン番号の採番方式が 4.8 リリースの後に変更されたことに注意してください (すなわち、ICU 4.8、ICU 49、ICU 50、等々となっています)。 これに加えて、ICU ライブラリとともに出荷されるタイム・ゾーン・データベースの情報も古くなっている可能性があります。 タイム・ゾーン・データベースの更新に関する詳細は [ICU マニュアル](http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data) を参照してください。 diff --git a/docs/guide-ja/tutorial-mailing.md b/docs/guide-ja/tutorial-mailing.md index bf8e9729ca6..42e381ff89f 100644 --- a/docs/guide-ja/tutorial-mailing.md +++ b/docs/guide-ja/tutorial-mailing.md @@ -131,8 +131,7 @@ Yii::$app->mailer->compose([ ビュー名をスカラーの文字列として渡した場合は、そのレンダリング結果は HTML ボディとして使われます。 そして、平文テキストのボディは HTML のボディから全ての HTML 要素を削除することによって作成されます。 -ビューのレンダリング結果はレイアウトで包むことが出来ます。 -レイアウトは、[[yii\mail\BaseMailer::htmlLayout]] と [[yii\mail\BaseMailer::textLayout]] を使ってセットアップすることが可能です。 +ビューのレンダリング結果はレイアウトで包むことが出来ます。レイアウトは、[[yii\mail\BaseMailer::htmlLayout]] と [[yii\mail\BaseMailer::textLayout]] を使ってセットアップすることが可能です。 レイアウトは、通常のウェブ・アプリケーションのレイアウトと同じように働きます。 レイアウトは、メールの CSS スタイルや、その他の共有されるコンテントをセットアップするために使うことが出来ます。 @@ -216,7 +215,8 @@ Yii は、そのようなチェックが出来ることを `yii\mail\BaseMailer: メール・メッセージのファイルは通常のテキストエディタで開くことが出来ますので、実際のメッセージ・ヘッダやコンテントなどを閲覧することが出来ます。 このメカニズムは、アプリケーションのデバッグや単体テストを実行する際に、真価を発揮するでしょう。 -> Note: メール・メッセージのファイルの内容は `\yii\mail\MessageInterface::toString()` によって作成されますので、あなたのアプリケーションで使用している実際のメール・エクステンションに依存したものになります。 +> Note: メール・メッセージのファイルの内容は `\yii\mail\MessageInterface::toString()` によって作成されますので、 + あなたのアプリケーションで使用している実際のメール・エクステンションに依存したものになります。 あなた自身のメール・ソリューションを作成する @@ -225,7 +225,6 @@ Yii は、そのようなチェックが出来ることを `yii\mail\BaseMailer: あなた自身のカスタム・メール・ソリューションを作成するためには、二つのクラスを作成する必要があります。 すなわち、一つは `Mailer` であり、もう一つは `Message` です。 `yii\mail\BaseMailer` と `yii\mail\BaseMessage` をあなたのソリューションの基底クラスとして使うことが出来ます。 -これらのクラスが、このガイドで説明された基本的なロジックを既に持っています。 -しかし、それを使用することは強制されていません。 +これらのクラスが、このガイドで説明された基本的なロジックを既に持っています。しかし、それを使用することは強制されていません。 `yii\mail\MailerInterface` と `yii\mail\MessageInterface` のインタフェイスを実装すれば十分です。 そして、あなたのソリューションをビルドするために、全ての抽象メソッドを実装しなければなりません。 diff --git a/docs/guide-ja/tutorial-performance-tuning.md b/docs/guide-ja/tutorial-performance-tuning.md index 4f7d6a366b2..a7fb1ab01e8 100644 --- a/docs/guide-ja/tutorial-performance-tuning.md +++ b/docs/guide-ja/tutorial-performance-tuning.md @@ -2,28 +2,29 @@ ============================ あなたのウェブ・アプリケーションのパフォーマンスに影響を及ぼす要因は数多くあります。 -環境の要因もありますし、あなたのコードに関係する要因もあります。 -また、Yii そのものに関係する要因もあります。 +環境の要因もありますし、あなたのコードに関係する要因もあります。また、Yii そのものに関係する要因もあります。 このセクションでは要因のほとんどを列挙して、どのようにそれらを修正すればあなたのアプリケーションのパフォーマンスを向上させることが出来るかを説明します。 + ## PHP 環境を最適化する -PHP 環境を正しく構成することは非常に重要です。 -最大のパフォーマンスを得るためには、 +PHP 環境を正しく構成することは非常に重要です。最大のパフォーマンスを得るためには、 -- 最新の安定した PHP バージョンを使うこと。 -使用する PHP のメジャー・リリースを上げると、顕著なパフォーマンスの改善がもたらされることがあります。 -- [Opcache](http://php.net/opcache) (PHP 5.5 以降) または [APC](http://php.net/apc) (PHP 5.4) を使って、バイト・コード・キャッシュを有効にすること。 +- 最新の安定した PHP バージョンを使うこと。使用する PHP のメジャー・リリースを上げると、顕著なパフォーマンスの改善がもたらされることがあります。 +- [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). + ## デバッグ・モードを無効にする 本番環境でアプリケーションを実行するときには、デバッグ・モードを無効にしなければなりません。 Yii は、`YII_DEBUG` という名前の定数の値を使って、デバッグ・モードを有効にすべきか否かを示します。 デバッグ・モードが有効になっているときは、Yii はデバッグ情報の生成と記録のために時間を余計に費やします。 -[エントリ・スクリプト](structure-entry-scripts.md) の冒頭に次のコード行を置くことによってデバッグ・モードを無効にすることが出来ます。 +[エントリ・スクリプト](structure-entry-scripts.md) の冒頭に次のコード行を置くことによってデ +バッグ・モードを無効にすることが出来ます。 ```php defined('YII_DEBUG') or define('YII_DEBUG', false); @@ -32,6 +33,7 @@ defined('YII_DEBUG') or define('YII_DEBUG', false); > Info: `YII_DEBUG` のデフォルト値は `false` です。 従って、アプリケーション・コードの他のどこかでこのデフォルト値を変更していないと確信できるなら、単に上記の行を削除してデバッグ・モードを無効にしても構いません。 + ## キャッシュのテクニックを使う さまざまなキャッシュのテクニックを使うと、あなたのアプリケーションのパフォーマンスを目に見えて改善することが出来ます。 @@ -39,14 +41,17 @@ defined('YII_DEBUG') or define('YII_DEBUG', false); そうすれば、リクエストごとに毎回同じ Markdown テキストの解析を繰り返すことを回避できるでしょう。 Yii によって提供されているキャッシュのサポートについて学ぶためには [キャッシュ](caching-overview.md) のセクションを参照してください。 + ## スキーマ・キャッシュを有効にする スキーマ・キャッシュは、[アクティブ・レコード](db-active-record.md) を使おうとする場合には、いつでも有効にすべき特別なキャッシュ機能です。 -ご存じのように、アクティブ・レコードは、賢いことに、あなたがわざわざ記述しなくても、DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。 +ご存じのように、アクティブ・レコードは、賢いことに、あなたがわざわざ記述しなくても、 +DB テーブルに関するスキーマ情報 (カラムの名前、カラムのタイプ、外部キー制約など) を自動的に検出します。 アクティブ・レコードはこの情報を取得するために追加の SQL クエリを実行しています。 スキーマ・キャッシュを有効にすると、取得されたスキーマ情報はキャッシュに保存されて将来のクエリで再利用されるようになります。 -スキーマ・キャッシュを有効にするためには、[アプリケーションの構成情報](concept-configurations.md) の中で、`cache` [アプリケーション・コンポーネント](structure-application-components.md) にスキーマ情報を保存するように構成し、[[yii\db\Connection::enableSchemaCache]] を `true` に設定します。 +スキーマ・キャッシュを有効にするためには、[アプリケーションの構成情報](concept-configurations.md) の中で、 +`cache` [アプリケーション・コンポーネント](structure-application-components.md) にスキーマ情報を保存するように構成し、[[yii\db\Connection::enableSchemaCache]] を `true` に設定します。 ```php return [ @@ -73,6 +78,7 @@ return [ ]; ``` + ## アセットを結合して最小化する 複雑なウェブ・ページでは、多数の CSS や JavaScript のアセット・ファイルをインクルードすることがよくあります。 @@ -80,6 +86,7 @@ HTTP リクエストの回数、および、これらのアセットの全体と これによって、ページのロードにかかる時間とサーバの負荷を大きく削減することが出来ます。 詳細については、[アセット](structure-assets.md) のセクションを参照してください。 + ## セッションのストレージを最適化する デフォルトでは、セッションのデータはファイルに保存されます。 @@ -101,8 +108,7 @@ return [ // 以下を設定する // 'db' => 'mydb', - // デフォルトの session テーブルをオーバーライドするためには - // 以下を設定する + // デフォルトの session テーブルをオーバーライドするためには以下を設定する // 'sessionTable' => 'my_session', ], ], @@ -126,26 +132,32 @@ CREATE TABLE session ( ただし、キャッシュ・ストレージの中には、容量の上限に達したときにキャッシュされたデータをフラッシュするものがあることに注意してください。 この理由により、主として容量の上限が無い種類のキャッシュ・ストレージを使用すべきです。 -あなたのサーバに [Redis](http://redis.io/) がある場合は、[[yii\redis\Session]] によって redis をセッション・ストレージとして使用することを強く推奨します。 +あなたのサーバに [Redis](http://redis.io/) がある場合は、[[yii\redis\Session]] によって redis +をセッション・ストレージとして使用することを強く推奨します。 ## データベースを最適化する DB クエリの実行とデータベースからのデータ取得がウェブ・アプリケーションのパフォーマンスの主たるボトルネックになることがよくあります。 [データ・キャッシュ](caching-data.md) の使用によってパフォーマンスの劣化を緩和することは出来ますが、問題を完全に解決することは出来ません。 -データベースが膨大なデータを抱えている場合、キャッシュされたデータが無効化されたときに最新のデータを取得するためのコストは、データベースとクエリが適切に設計されていないと、法外なものになり得ます。 +データベースが膨大なデータを抱えている場合、キャッシュされたデータが無効化されたときに最新のデータを取得するためのコストは、 +データベースとクエリが適切に設計されていないと、法外なものになり得ます。 DB クエリのパフォーマンスを向上させるための一般的なテクニックは、フィルタの対象になるテーブル・カラムにインデックスを作成することです。 例えば、`username` によってユーザのレコードを検索する必要があるなら、`username` に対してインデックスを作成するべきです。 ただし、インデックスを付けると SELECT クエリを非常に速くすることが出来る代りに、INSERT、UPDATE、または DELTE のクエリが遅くなることに注意してください。 +複雑な DB クエリについては、クエリの解析と準備の時間を節約するために、データベース・ビューを作成することが推奨されます。 + 最後にもう一つ大事なことですが、SELECT クエリで LIMIT を使ってください。 こうすることで、大量のデータが返されて、PHP のために確保されたメモリを使い尽くすということがなくなります。 + ## プレーンな配列を使う [アクティブ・レコード](db-active-record.md) は非常に使い勝手のよいものですが、データベースから大量のデータを取得する必要がある場合は、プレーンな配列を使うほどには効率的ではありません。 -そういう場合は、アクティブ・レコードを使ってデータを取得する際に `asArray()` を呼んで、取得したデータがかさばるアクティブ・レコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。 +そういう場合は、アクティブ・レコードを使ってデータを取得する際に `asArray()` を呼んで、 +取得したデータがかさばるアクティブ・レコードのオブジェクトではなく配列として表現されるようにすることを考慮するのが良いでしょう。 例えば、 ```php @@ -160,8 +172,7 @@ class PostController extends Controller } ``` -上記において、`$posts` は、テーブル行の配列としてデータを代入されることになります。 -各行はプレーンな配列になります。 +上記において、`$posts` は、テーブル行の配列としてデータを代入されることになります。各行はプレーンな配列になります。 `$i` 番目の行の `title` カラムにアクセスするためには、`$posts[$i]['title']` という式を使うことが出来ます。 クエリを構築するのに [DAO](db-dao.md) を使って、データをプレーンな配列に取得することも出来ます。 @@ -169,7 +180,8 @@ class PostController extends Controller ## Composer オートローダを最適化する -Composer のオートローダは、ほとんどのサードパーティのクラス・ファイルをインクルードするのに使われますので、次のコマンドを実行して Composer のオートローダを最適化することを考慮すべきです。 +Composer のオートローダは、ほとんどのサードパーティのクラス・ファイルをインクルードするのに使われますので、 +次のコマンドを実行して Composer のオートローダを最適化することを考慮すべきです。 ``` composer dumpautoload -o @@ -183,10 +195,10 @@ composer dumpautoload -o ## オフラインでデータを処理する -リクエストが何らかのリソース集約的な操作を必要とするものである場合は、そういう操作が終るまでユーザを待たせずに、オフラインモードで操作を実行する方策を考えるべきです。 +リクエストが何らかのリソース集約的な操作を必要とするものである場合は、そういう操作が終るまでユーザを待たせずに、 +オフラインモードで操作を実行する方策を考えるべきです。 -オフラインでデータを処理するための方法が二つあります。 -すなわち、プルとプッシュです。 +オフラインでデータを処理するための方法が二つあります。すなわち、プルとプッシュです。 プルの方法では、リクエストが何らかの複雑な操作を必要とするたびに、タスクを作成してデータベースなどの持続的ストレージに保存します。 そうしておいて、別の独立したプロセス (例えばクロンジョブ) を使い、タスクを引き出して処理します。 @@ -203,7 +215,7 @@ composer dumpautoload -o あなたは、あなたのコードをプロファイルして、パフォーマンスのボトルネックを発見し、それに応じた適切な手段を講じるべきです。 次のプロファイリング・ツールが役に立つでしょう。 -- [Yii のデバッグ・ツール・バーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) +- [Yii のデバッグ・ツールバーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide-ja/README.md) - [Blackfire](https://blackfire.io/) - [XHProf](http://www.php.net/manual/ja/book.xhprof.php) - [XDebug プロファイラ](http://xdebug.org/docs/profiler) diff --git a/docs/guide-ja/tutorial-shared-hosting.md b/docs/guide-ja/tutorial-shared-hosting.md index 2b887a19a13..e5dcaf94159 100644 --- a/docs/guide-ja/tutorial-shared-hosting.md +++ b/docs/guide-ja/tutorial-shared-hosting.md @@ -7,7 +7,8 @@ ## ベーシック・プロジェクト・テンプレートを配備する 通例、共有ホスティング環境では、一つのウェブ・ルートしかありませんので、可能であればベーシック・プロジェクト・テンプレートを使用して下さい。 -まず、[Yii をインストールする](start-installation.md) のセクションを参照して、プロジェクト・テンプレートをローカル環境にインストールします。 +まず、[Yii をインストールする](start-installation.md) のセクションを参照して、 +プロジェクト・テンプレートをローカル環境にインストールします。 そして、ローカル環境でアプリケーションが動くようにした後で、共有ホスティング環境でホスト出来るようにいくつかの修正を行います。 ### ウェブ・ルートの名前を変える @@ -34,7 +35,8 @@ www ### ウェブ・サーバのための追加設定 -使用されているウェブ・サーバが Apache である場合は、次の内容を持つ `.htaccess` ファイルを `web` (または `public_html` など、要するに、`index.php` があるディレクトリ) に追加する必要があります。 +使用されているウェブ・サーバが Apache である場合は、次の内容を持つ `.htaccess` ファイルを `web` +(または `public_html` など、要するに、`index.php` があるディレクトリ) に追加する必要があります。 ``` Options +FollowSymLinks @@ -54,12 +56,9 @@ nginx の場合は、追加の構成ファイルは必要がない筈です。 ### 必要条件をチェックする -Yii を走らせるためには、あなたのウェブ・サーバは Yii の必要条件を満たさなければなりません。 -最低限の必要条件は PHP 5.4 です。 +Yii を走らせるためには、あなたのウェブ・サーバは Yii の必要条件を満たさなければなりません。最低限の必要条件は PHP 5.4 です。 必要条件をチェックするために、`requirements.php` をルート・ディレクトリからウェブ・ルート・ディレクトリにコピーして、 -`http://example.com/requirements.php` という URL を使ってブラウザ経由で走らせます。 -後でファイルを削除するのを忘れないでください。 - +`http://example.com/requirements.php` という URL を使ってブラウザ経由で走らせます。後でファイルを削除するのを忘れないでください。 ## アドバンスト・プロジェクト・テンプレートを配備する diff --git a/docs/guide-ja/tutorial-start-from-scratch.md b/docs/guide-ja/tutorial-start-from-scratch.md index 0e0f717aedc..6f55e4fb474 100644 --- a/docs/guide-ja/tutorial-start-from-scratch.md +++ b/docs/guide-ja/tutorial-start-from-scratch.md @@ -3,7 +3,9 @@ > Note: このセクションはまだ執筆中です。 -[ベーシック](https://github.com/yiisoft/yii2-app-basic) と [アドバンスト](https://github.com/yiisoft/yii2-app-advanced) のプロジェクト・テンプレートは、あなたの要求をほとんどカバーする優れたものですが、あなたのプロジェクトを開始するためのあなた自身のテンプレートを作成したいこともあるでしょう。 +[ベーシック](https://github.com/yiisoft/yii2-app-basic) と [アドバンスト](https://github.com/yiisoft/yii2-app-advanced) +のプロジェクト・テンプレートは、あなたの要求をほとんどカバーする優れたものですが、 +あなたのプロジェクトを開始するためのあなた自身のテンプレートを作成したいこともあるでしょう。 Yii におけるプロジェクト・テンプレートは、`composer.json` ファイルを含み、Composer パッケージとして登録されたレポジトリであるに過ぎません。 どのようなレポジトリでも、Composer パッケージとして特定し、`create-project` Composer コマンドによってインストール可能なものにすることが出来ます。 @@ -30,7 +32,8 @@ git clone git@github.com:yiisoft/yii2-app-basic.git `name`、`description`、`keywords`、`homepage`、`license` および `support` の値を、あなたの新しいテンプレートを説明するものに変更します。 また、`require`、`require-dev`、`suggest` や、その他のオプションも、あなたのテンプレートの要求に合うように調整します。 -> Note: `composer.json` ファイルで、`extra` の下の `writable` パラメータを使って、アプリケーションがテンプレートを使って作成された後に設定されるべきファイル単位のアクセス権限を指定してください。 +> Note: `composer.json` ファイルで、`extra` の下の `writable` パラメータを使って、 +> アプリケーションがテンプレートを使って作成された後に設定されるべきファイル単位のアクセス権限を指定してください。 次に、あなたが好むデフォルトの状態に合うように、アプリケーションの構造と内容を実際に修正します。 最後に、あなたのテンプレートに適用できるように、README ファイルを更新します。 @@ -42,8 +45,7 @@ git clone git@github.com:yiisoft/yii2-app-basic.git あなたのテンプレートをオープンソース化するつもりなら、レポジトリをホストするのには [Github](http://github.com) が最適の場所です。 テンプレートを共同作業に使わないつもりであれば、どんな Git レポジトリサイトでも構いません。 -次に、Composer のためにパッケージを登録する必要があります。 -パブリックなテンプレートであれば、パッケージは [Packagist](https://packagist.org/) に登録すべきです。 +次に、Composer のためにパッケージを登録する必要があります。パブリックなテンプレートであれば、パッケージは [Packagist](https://packagist.org/) に登録すべきです。 プライベートなテンプレートは、パッケージの登録が少々トリッキーです。 その説明については [Composer ドキュメント](https://getcomposer.org/doc/05-repositories.md#hosting-your-own) を参照してください。 @@ -54,6 +56,5 @@ Yii の新しいプロジェクト・テンプレートを作成するのに必 これで、あなたのテンプレートを使ってプロジェクトを作成することが出来ます。 ``` -composer global require "fxp/composer-asset-plugin:^1.4.1" composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project ``` diff --git a/docs/guide-ja/tutorial-template-engines.md b/docs/guide-ja/tutorial-template-engines.md index 76dbf68010f..9f7dd9e042d 100644 --- a/docs/guide-ja/tutorial-template-engines.md +++ b/docs/guide-ja/tutorial-template-engines.md @@ -1,7 +1,8 @@ テンプレートエンジンを使う ========================== -デフォルトでは、Yii は PHP をテンプレート言語として使いますが、[Twig](http://twig.sensiolabs.org/) や [Smarty](http://www.smarty.net/) などの他のレンダリング・エンジンをサポートするように Yii を構成することが出来ます。 +デフォルトでは、Yii は PHP をテンプレート言語として使いますが、[Twig](http://twig.sensiolabs.org/) や +[Smarty](http://www.smarty.net/) などの他のレンダリング・エンジンをサポートするように Yii を構成することが出来ます。 `view` コンポーネントがビューのレンダリングに責任を持っています。 このコンポーネントのビヘイビアを構成することによって、カスタム・テンプレート・エンジンを追加することが出来ます。 @@ -40,11 +41,9 @@ "yiisoft/yii2-smarty": "~2.0.0", "yiisoft/yii2-twig": "~2.0.0", ``` - -上のコードを `composer.json` の `require` セクションに追加します。 -変更をファイルに保存した後、コマンドラインで `composer update --prefer-dist` を実行することによってエクステンションをインストールすることが出来ます。 +上のコードを `composer.json` の `require` セクションに追加します。変更をファイルに保存した後、コマンドラインで `composer update --prefer-dist` を実行することによってエクステンションをインストールすることが出来ます。 具体的にテンプレート・エンジンを使用する方法については、それぞれのドキュメントで詳細を参照してください。 -- [Twig ガイド](https://github.com/yiisoft/yii2-twig/tree/master/docs/guide-ja) -- [Smarty ガイド](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide-ja) +- [Twig ガイド](https://www.yiiframework.com/extension/yiisoft/yii2-twig/doc/guide/) +- [Smarty ガイド](https://www.yiiframework.com/extension/yiisoft/yii2-smarty/doc/guide/) diff --git a/docs/guide-ja/tutorial-yii-as-micro-framework.md b/docs/guide-ja/tutorial-yii-as-micro-framework.md index c14220d1d3e..74738310bc6 100644 --- a/docs/guide-ja/tutorial-yii-as-micro-framework.md +++ b/docs/guide-ja/tutorial-yii-as-micro-framework.md @@ -1,24 +1,19 @@ # Yii をマイクロ・フレームワークとして使う -Yii はベーシック・テンプレートやアドバンスト・テンプレートに含まれる機能なしで使うことが簡単にできます。 -言葉を換えれば、Yii は既にマイクロ・フレームワークです。 -Yii を使うためにテンプレートによって提供されているディレクトリ構造を持つことは要求されていません。 +Yii はベーシック・テンプレートやアドバンスト・テンプレートに含まれる機能なしで使うことが簡単にできます。言葉を換えれば、Yii は既にマイクロ・フレームワークです。Yii を使うためにテンプレートによって提供されているディレクトリ構造を持つことは要求されていません。 -このことは、アセットやビューなどの事前定義されたテンプレート・コードを必要としない場合には、特に好都合です。 -そのような場合の一つが JSON API です。以下に続くセクションで、どのようにしてそれを実現するかを示します。 +このことは、アセットやビューなどの事前定義されたテンプレート・コードを必要としない場合には、特に好都合です。そのような場合の一つが JSON API です。以下に続くセクションで、どのようにしてそれを実現するかを示します。 ## Yii をインストールする -プロジェクト・ファイルのためのディレクトリを作成し、ワーキング・ディレクトリをそのパスに変更します。 -例で使用されているコマンドは UNIX ベースのものですが、同様のコマンドが Windows にもあります。 +プロジェクト・ファイルのためのディレクトリを作成し、ワーキング・ディレクトリをそのパスに変更します。例で使用されているコマンドは UNIX ベースのものですが、同様のコマンドが Windows にもあります。 ```bash mkdir micro-app cd micro-app ``` -> Note: 続けるためには Composer についての知識が多少必要です。 - Composer の使い方をまだ知らない場合は、時間を取って、[Composer Guide](https://getcomposer.org/doc/00-intro.md) を読んでください。 +> Note: 続けるためには Composer についての知識が多少必要です。Composer の使い方をまだ知らない場合は、時間を取って、[Composer Guide](https://getcomposer.org/doc/00-intro.md) を読んでください。 `micro-app` ディレクトリの下に `composer.json` ファイルを作成し、あなたの好みのエディタを使って、下記を追加します。 @@ -40,9 +35,7 @@ cd micro-app ## プロジェクトの構造を作成する -フレームワークをインストールしたら、次は、アプリケーションの [エントリ・ポイント](structure-entry-scripts.md) を作成します。 -エントリ・ポイントは、アプリケーションを開こうとしたときに、一番最初に実行されるファイルです。 -セキュリティ上の理由により、エントリ・ポイントを置くディレクトリは別にして、それをウェブ・ルートとします。 +フレームワークをインストールしたら、次は、アプリケーションの [エントリ・ポイント](structure-entry-scripts.md) を作成します。エントリ・ポイントは、アプリケーションを開こうとしたときに、一番最初に実行されるファイルです。セキュリティ上の理由により、エントリ・ポイントを置くディレクトリは別にして、それをウェブ・ルートとします。 `web` ディレクトリを作成して、下記の内容を持つ `index.php` をそこに置きます。 @@ -80,8 +73,7 @@ return [ > Info: 構成情報を `index.php` ファイルに持つことも出来ますが、別のファイルに持つことを推奨します。 > そうすれば、後で示しているように、同じ構成情報をコンソール・アプリケーションから使うことが出来ます。 -これであなたのプロジェクトはコーディングの準備が出来ました。 -プロジェクトのディレクトリ構造を決定するのは、名前空間に注意する限り、あなた次第です。 +これであなたのプロジェクトはコーディングの準備が出来ました。プロジェクトのディレクトリ構造を決定するのは、名前空間に注意する限り、あなた次第です。 ## 最初のコントローラを作成する @@ -120,7 +112,8 @@ micro-app/ ``` まだウェブ・サーバをセットアップしていない場合は、[ウェブ・サーバの構成ファイル例](start-installation.md#configuring-web-servers) を参照すると良いでしょう。 -もう一つのオプションは、PHP の内蔵ウェブ・サーバを利用する `yii serve` コマンドを使うことです。`micro-app/` ディレクトリから、次のコマンドを実行します。 +もう一つのオプションは、PHP の内蔵ウェブ・サーバを利用する `yii serve` コマンドを使うことです。 +`micro-app/` ディレクトリから、次のコマンドを実行します。 vendor/bin/yii serve --docroot=./web @@ -150,7 +143,8 @@ micro-app/ > Info: ここでは話を簡単にするために sqlite データベースを使用します。他のオプションについては [データベースのガイド](db-dao.md) を参照してください。 次に、[データベース・マイグレーション](db-migrations.md) を作成して、記事のテーブルを作成します。 -既に述べたように、独立した構成情報ファイルがあることを確認してください。下記のコンソール・コマンドを実行するためには、それが必要です。 +既に述べたように、独立した構成情報ファイルがあることを確認してください。 +下記のコンソール・コマンドを実行するためには、それが必要です。 次のコマンドを実行すると、データベース・マイグレーション・ファイルが作成され、そして、マイグレーションがデータベースに適用されます。 vendor/bin/yii migrate/create --appconfig=config.php create_post_table --fields="title:string,body:text" diff --git a/docs/guide-ja/tutorial-yii-integration.md b/docs/guide-ja/tutorial-yii-integration.md index ac6d0e83584..8a8b44fb3ca 100644 --- a/docs/guide-ja/tutorial-yii-integration.md +++ b/docs/guide-ja/tutorial-yii-integration.md @@ -2,14 +2,14 @@ ============================ 時々、Yii アプリケーションの中でサードパーティのコードを使用する必要があることがあります。 -あるいは、サードパーティのシステムの中で Yii をライブラリとして使用したいこともあるでしょう。 -このセクションでは、こういう目的をどうやって達成するかを説明します。 +あるいは、サードパーティのシステムの中で Yii をライブラリとして使用したいこともあるでしょう。このセクションでは、こういう目的をどうやって達成するかを説明します。 Yii の中でサードパーティのライブラリを使う ------------------------------------------ -Yii アプリケーションの中でサードパーティのライブラリを使うために主として必要なことは、そのライブラリのクラスが適切にインクルードされること、または、オートロード可能であることを保証することです。 +Yii アプリケーションの中でサードパーティのライブラリを使うために主として必要なことは、 +そのライブラリのクラスが適切にインクルードされること、または、オートロード可能であることを保証することです。 ### Composer パッケージを使う @@ -20,7 +20,8 @@ Yii アプリケーションの中でサードパーティのライブラリを 2. `composer install` を実行して、指定したパッケージをインストールする。 インストールされた Composer パッケージ内のクラスは、Composer のオートローダを使ってオートロードすることが出来ます。 -アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) に、Composer のオートローダをインストールするための下記の行があることを確認してください。 +アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) に、 +Composer のオートローダをインストールするための下記の行があることを確認してください。 ```php // Composer のオートローダをインストール @@ -37,7 +38,8 @@ require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; ここで `BasePath` は、アプリケーションの [base path](structure-applications.md#basePath) を表すものです。 ライブラリがそれ自身のオートローダを持っている場合は、それをアプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) でインストールすることが出来ます。 -複数のオートローダ・クラスの中で Yii のクラス・オートローダが優先されるように、ライブラリのオートローダは `Yii.php` ファイルをインクルードする前にインストールすることを推奨します。 +複数のオートローダ・クラスの中で Yii のクラス・オートローダが優先されるように、 +ライブラリのオートローダは `Yii.php` ファイルをインクルードする前にインストールすることを推奨します。 ライブラリがクラスオートローダを提供していない場合でも、クラスの命名規約が [PSR-4](http://www.php-fig.org/psr/psr-4/) に従っている場合は、ライブラリのクラスをオートロードするのに Yii のクラス・オートローダを使うことが出来ます。 必要なことは、ライブラリのクラスによって使われている全てのルート名前空間に対して [ルート・エイリアス](concept-aliases.md#defining-aliases) を宣言することだけです。 @@ -56,11 +58,12 @@ require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; 上記のどちらにも当てはまらない場合、おそらくそのライブラリは、クラス・ファイルを探して適切にインクルードするために、PHP の include path 設定に依存しているのでしょう。 この場合は、PHP include path の設定に関するライブラリの指示に従うしかありません。 -最悪の場合として、ライブラリが全てのクラス・ファイルを明示的にインクルードすることを要求している場合は、次の方法を使ってクラスを必要に応じてインクルードすることが出来るようになります。 +最悪の場合として、ライブラリが全てのクラス・ファイルを明示的にインクルードすることを要求している場合は、 +次の方法を使ってクラスを必要に応じてインクルードすることが出来るようになります。 * ライブラリに含まれるクラスを特定する。 -* アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) において、クラスと対応するファイル・パスを `Yii::$classMap` としてリストアップする。 -例えば、 +* アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) において、 + クラスと対応するファイル・パスを `Yii::$classMap` としてリストアップする。例えば、 ```php Yii::$classMap['Class1'] = 'path/to/Class1.php'; Yii::$classMap['Class2'] = 'path/to/Class2.php'; @@ -70,41 +73,30 @@ Yii::$classMap['Class2'] = 'path/to/Class2.php'; サードパーティのシステムで Yii を使う ------------------------------------- -Yii は数多くの優れた機能を提供していますので、サードパーティのシステム (例えば、WordPress、Joomla、または、他の PHP フレームワークを使って開発されるアプリケーション) を開発したり機能拡張したりするのをサポートするために Yii の機能のいくつかを使用したいことがあるでしょう。 +Yii は数多くの優れた機能を提供していますので、サードパーティのシステム (例えば、WordPress、Joomla、または、他の PHP フレームワークを使って開発されるアプリケーション) +を開発したり機能拡張したりするのをサポートするために Yii の機能のいくつかを使用したいことがあるでしょう。 例えば、[[yii\helpers\ArrayHelper]] クラスや [アクティブ・レコード](db-active-record.md) をサードパーティのシステムで使いたいことがあるでしょう。 この目的を達するためには、主として、二つのステップを踏む必要があります。 すなわち、Yii のインストールと、Yii のブートストラップです。 -サードパーティのシステムが Composer を使って依存を管理している場合は、単に下記のコマンドを実行すれば Yii をインストールすることが出来ます。 +サードパーティのシステムが Composer を使って依存を管理している場合は、 +単に下記のコマンドを実行すれば Yii をインストールすることが出来ます。 - composer global require "fxp/composer-asset-plugin:~1.3.1" - composer require yiisoft/yii2 - composer install - -最初のコマンドは [composer アセット・プラグイン](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。 -これは、Composer によって bower と npm の依存パッケージを管理できるようにするものです。 -このことは、データベースなど、アセットに関係しない Yii の機能を使いたいだけの場合でも、Yii の Composer パッケージをインストールするために必要とされます。 - -[Yii のアセット発行の機能](structure-assets.md) を使いたい場合は、あなたの `composer.json` の `extra` セクションに次の構成も追加しなければなりません。 - -```json -{ - ... - "extra": { - "asset-installer-paths": { - "npm-asset-library": "vendor/npm", - "bower-asset-library": "vendor/bower" - } - } -} +```bash +composer require yiisoft/yii2 ``` -Composer に関する更なる情報や、インストールの過程で出現しうる問題に対する解決方法については、一般的な [Composer によるインストール](start-installation.md#installing-via-composer) のセクションを参照してください。 +データベース抽象レイヤなど、アセットに関係しない Yii の機能だけを使用したい場合は、 +Bower および NPM のパッケージのインストールを阻止する特別な composer パッケージが必要になります。 +詳細については [cebe/assetfree-yii2](https://github.com/cebe/assetfree-yii2) を参照して下さい。 + +Composer に関する更なる情報や、インストールの過程で出現しうる問題に対する解決方法については、 +一般的な [Composer によるインストール](start-installation.md#installing-via-composer) のセクションを参照してください。 -そうでない場合は、Yii のリリースを [ダウンロード](http://www.yiiframework.com/download/) して、`BasePath/vendor` ディレクトリに解凍してください。 +そうでない場合は、Yii のリリースを [ダウンロード](http://www.yiiframework.com/download/) して、 +`BasePath/vendor` ディレクトリに解凍してください。 -次に、サードパーティのシステムのエントリ・スクリプトを修正します。 -次のコードをエントリ・スクリプトの先頭に追加してください。 +次に、サードパーティのシステムのエントリ・スクリプトを修正します。次のコードをエントリ・スクリプトの先頭に追加してください。 ```php require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; @@ -115,10 +107,12 @@ new yii\web\Application($yiiConfig); // ここで run() を呼ばない ごらんのように、上記のコードは典型的な Yii アプリケーションの [エントリ・スクリプト](structure-entry-scripts.md) と非常に良く似ています。 唯一の違いは、アプリケーションのインスタンスが作成された後に `run()` メソッドが呼ばれない、という点です。 -`run()` を呼ぶと Yii がリクエスト処理のワークフローを制御するようになりますが、この場合はリクエストを処理する別のアプリケーションが既に存在していますので、これは必要ではないからです。 +`run()` を呼ぶと Yii がリクエスト処理のワークフローを制御するようになりますが、 +この場合はリクエストを処理する別のアプリケーションが既に存在していますので、これは必要ではないからです。 Yii アプリケーションでの場合と同じように、サードパーティ・システムが走っている環境に基づいて Yii のアプリケーション・インスタンスを構成する必要があります。 -例えば、[アクティブ・レコード](db-active-record.md) の機能を使うためには、サードパーティ・システムによって使用されている DB 接続の設定を使って `db` [アプリケーション・コンポーネント](structure-application-components.md) を構成しなければなりません。 +例えば、[アクティブ・レコード](db-active-record.md) の機能を使うためには、サードパーティ・システムによって使用されている DB 接続の設定を使って +`db` [アプリケーション・コンポーネント](structure-application-components.md) を構成しなければなりません。 これで、Yii によって提供されているほとんどの機能を使うことが出来ます。 例えば、アクティブ・レコード・クラスを作成して、それを使ってデータベースを扱うことが出来ます。 From 7b8fef4b1c27476ff36f7aa763699c760a360924 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 4 May 2018 07:58:43 +0900 Subject: [PATCH 062/902] guide-ja/helper-* revised [ci skip] (#16216) --- docs/guide-ja/helper-array.md | 55 ++++++++++++++++---------------- docs/guide-ja/helper-html.md | 52 +++++++++++++----------------- docs/guide-ja/helper-overview.md | 23 +++++++------ docs/guide-ja/helper-url.md | 33 +++++++++---------- 4 files changed, 82 insertions(+), 81 deletions(-) diff --git a/docs/guide-ja/helper-array.md b/docs/guide-ja/helper-array.md index d606c4c4f71..066d655ece5 100644 --- a/docs/guide-ja/helper-array.md +++ b/docs/guide-ja/helper-array.md @@ -1,13 +1,15 @@ 配列ヘルパ ========== -[PHP の充実した配列関数](http://php.net/manual/ja/book.array.php) への追加として、Yii の配列ヘルパは、配列をさらに効率的に扱うことを可能にするスタティックなメソッドを提供しています。 +[PHP の充実した配列関数](http://php.net/manual/ja/book.array.php) への追加として、 +Yii の配列ヘルパは、配列をさらに効率的に扱うことを可能にするスタティックなメソッドを提供しています。 ## 値を取得する 配列、オブジェクト、またはその両方から成る複雑な構造から標準的な PHP を使って値を取得することは、非常に面倒くさい仕事です。 -最初に `isset` でキーの存在をチェックしなければならず、次に、キーが存在していれば値を取得し、存在していなければ、デフォルト値を提供しなければなりません。 +最初に `isset` でキーの存在をチェックしなければならず、次に、キーが存在していれば値を取得し、存在していなければ、 +デフォルト値を提供しなければなりません。 ```php class User @@ -45,13 +47,13 @@ $fullName = ArrayHelper::getValue($user, function ($user, $defaultValue) { }); ``` -三番目のオプションの引数はデフォルト値であり、指定されない場合は `null` となります。 -以下のようにして使用します。 +三番目のオプションの引数はデフォルト値であり、指定されない場合は `null` となります。以下のようにして使用します。 ```php $username = ArrayHelper::getValue($comment, 'user.username', 'Unknown'); ``` + ## 値を設定する ```php @@ -115,8 +117,8 @@ $type = ArrayHelper::remove($array, 'type'); ## キーの存在をチェックする -`ArrayHelper::keyExists` は、大文字と小文字を区別しないキーの比較をサポートすることを除いて、[array_key_exists](http://php.net/manual/ja/function.array-key-exists.php) と同じ動作をします。 -例えば、 +`ArrayHelper::keyExists` は、大文字と小文字を区別しないキーの比較をサポートすることを除いて、 +[array_key_exists](http://php.net/manual/ja/function.array-key-exists.php) と同じ動作をします。例えば、 ```php $data1 = [ @@ -134,8 +136,7 @@ if (!ArrayHelper::keyExists('username', $data1, false) || !ArrayHelper::keyExist ## カラムを取得する -データ行またはオブジェクトの配列から、あるカラムの値を取得する必要があることがよくあります。 -良くある例は、ID のリストの取得です。 +データ行またはオブジェクトの配列から、あるカラムの値を取得する必要があることがよくあります。良くある例は、ID のリストの取得です。 ```php $array = [ @@ -147,7 +148,8 @@ $ids = ArrayHelper::getColumn($array, 'id'); 結果は `['123', '345']` となります。 -追加の変形が要求されたり、値の取得方法が複雑であったりする場合は、無名関数を二番目の引数として指定することが出来ます。 +追加の変形が要求されたり、値の取得方法が複雑であったりする場合は、 +無名関数を二番目の引数として指定することが出来ます。 ```php $result = ArrayHelper::getColumn($array, function ($element) { @@ -162,10 +164,12 @@ $result = ArrayHelper::getColumn($array, function ($element) { 入力値は、多次元配列であるか、オブジェクトの配列でなければなりません。 `$key` は、サブ配列のキーの名前、オブジェクトのプロパティの名前、または、キーとして使用される値を返す無名関数とすることが出来ます。 -`$groups` 属性はキーの配列であり、入力値の配列を一つまたは複数のサブ配列にグループ化するために使用されます。 +`$groups` 属性はキーの配列であす。これは、入力値の配列を一つまたは複数のサブ配列にグループ化するために +キーとして使用されます。 特定の要素の `$key` 属性またはその値が `null` であるとき、`$groups` が定義されていない場合は、その要素は破棄されて、結果には入りません。 -そうではなく、`$groups` が指定されている場合は、配列の要素はキー無しで結果の配列に追加されます。 +そうではなく、`$groups` が指定されている場合は、 +配列の要素はキー無しで結果の配列に追加されます。 例えば、 @@ -224,7 +228,8 @@ $result = ArrayHelper::index($array, 'data', [function ($element) { }, 'device']); ``` -結果は、最初のレベルが `id` でグループ化され、第2のレベルが `device` でグループ化され、第3のレベルが `data` でインデックスされた連想配列になります。 +結果は、最初のレベルが `id` でグループ化され、第2のレベルが `device` でグループ化され、 +第3のレベルが `data` でインデックスされた連想配列になります。 ```php [ @@ -244,13 +249,11 @@ $result = ArrayHelper::index($array, 'data', [function ($element) { ] ``` - ## マップを作成する 多次元配列またはオブジェクトの配列からマップ (キー・値 のペア) を作成するためには `map` メソッドを使うことが出来ます。 `$from` と `$to` のパラメータで、マップを構成するキー名またはプロパティ名を指定します。 -オプションで、グループ化のためのフィールド `$group` に従って、マップをグループ化することも出来ます。 -例えば、 +オプションで、グループ化のためのフィールド `$group` に従って、マップをグループ化することも出来ます。例えば、 ```php $array = [ @@ -283,8 +286,7 @@ $result = ArrayHelper::map($array, 'id', 'name', 'class'); ## 多次元配列の並べ替え -`multisort` メソッドは、オブジェクトの配列または入れ子にされた配列を、一つまたは複数のキーによって並べ替えることを手助けします。 -例えば、 +`multisort` メソッドは、オブジェクトの配列または入れ子にされた配列を、一つまたは複数のキーによって並べ替えることを手助けします。例えば、 ```php $data = [ @@ -318,7 +320,8 @@ ArrayHelper::multisort($data, function($item) { 一つのキーによる並べ替えの場合は、`SORT_ASC` か `SORT_DESC` のいずれかです。 複数の値による並べ替えの場合は、並べ替えの順序の配列を渡して、値ごとに違う順序で並べ替えることが出来ます。 -最後の引数は並べ替えのフラグで、PHP の [sort()](http://php.net/manual/ja/function.sort.php) 関数に渡されるのと同じ値を取ることが出来ます。 +最後の引数は並べ替えのフラグで、 +PHP の [sort()](http://php.net/manual/ja/function.sort.php) 関数に渡されるのと同じ値を取ることが出来ます。 ## 配列の型を検出する @@ -345,15 +348,15 @@ $encoded = ArrayHelper::htmlEncode($data); $decoded = ArrayHelper::htmlDecode($data); ``` -デフォルトでは、値だけがエンコードされます。 -二番目の引数を `false` として渡すことによって、配列のキーもエンコードすることが出来ます。 +デフォルトでは、値だけがエンコードされます。二番目の引数を `false` として渡すことによって、配列のキーもエンコードすることが出来ます。 エンコードにはアプリケーションの文字セットが使用されますが、三番目の引数によってそれを変更することも出来ます。 ## 配列をマージする [[yii\helpers\ArrayHelper::merge()|ArrayHelper::merge()]] を使って、二つまたはそれ以上の配列を再帰的に一つの配列にマージすることが出来ます。 -各配列に同じ文字列のキー値を持つ要素がある場合は、([array_merge_recursive()](http://php.net/manual/ja/function.array-merge-recursive.php) とは違って)後のものが前のものを上書きします。 +各配列に同じ文字列のキー値を持つ要素がある場合は、 +([array_merge_recursive()](http://php.net/manual/ja/function.array-merge-recursive.php) とは違って)後のものが前のものを上書きします。 両方の配列が、同じキーを持つ配列型の要素を持っている場合は、再帰的なマージが実行されます。 添字型の要素については、後の配列の要素が前の配列の要素の後に追加されます。 [[yii\helpers\UnsetArrayValue]] オブジェクトを使って前の配列にある値を非設定に指定したり、 @@ -419,8 +422,7 @@ $result = ArrayHelper::merge($array1, $array2); ## オブジェクトを配列に変換する オブジェクトまたはオブジェクトの配列を配列に変換する必要があることがよくあります。 -最もよくあるのは、REST API によってデータ配列を提供するなどの目的で、アクティブ・レコード・モデルを変換する場合です。 -そうするために、次のコードを使うことが出来ます。 +最もよくあるのは、REST API によってデータ配列を提供するなどの目的で、アクティブ・レコード・モデルを変換する場合です。そうするために、次のコードを使うことが出来ます。 ```php $posts = Post::find()->limit(10)->all(); @@ -440,8 +442,7 @@ $data = ArrayHelper::toArray($posts, [ 最初の引数が変換したいデータです。この例では、`Post` AR モデルを変換しようとしています。 -二番目の引数は、クラスごとの変換マップです。 -ここでは、`Post` モデルの変換マップを設定しています。 +二番目の引数は、クラスごとの変換マップです。ここでは、`Post` モデルの変換マップを設定しています。 変換マップの配列が、一連のマップを含んでいます。各マップは以下のいずれかの形式を取ります。 - フィールド名 - そのままインクルードされる。 @@ -460,7 +461,8 @@ $data = ArrayHelper::toArray($posts, [ ] ``` -特定のクラスについて、配列に変換するデフォルトの方法を提供するためには、そのクラスの [[yii\base\Arrayable|Arrayable]] インタフェイスを実装することが出来ます。 +特定のクラスについて、配列に変換するデフォルトの方法を提供するためには、 +そのクラスの [[yii\base\Arrayable|Arrayable]] インタフェイスを実装することが出来ます。 ## 配列の中にあるかどうか調べる @@ -479,5 +481,4 @@ ArrayHelper::isIn('a', new ArrayObject(['a'])); // true ArrayHelper::isSubset(new ArrayObject(['a', 'c']), new ArrayObject(['a', 'b', 'c'])); - ``` diff --git a/docs/guide-ja/helper-html.md b/docs/guide-ja/helper-html.md index 39e350d8433..4c60d6d80dc 100644 --- a/docs/guide-ja/helper-html.md +++ b/docs/guide-ja/helper-html.md @@ -24,12 +24,10 @@ Yii はそのような手助けを Html ヘルパの形式で提供します。 name), ['class' => 'username']) ?> ``` -最初の引数はタグの名前です。 -二番目の引数は、開始タグと終了タグの間に囲まれることになるコンテントです。 +最初の引数はタグの名前です。二番目の引数は、開始タグと終了タグの間に囲まれることになるコンテントです。 `Html::encode` を使っていることに注目してください。 これは、必要な場合には HTML を使うことが出来るように、コンテントが自動的にはエンコードされないからです。 -三番目の引数は HTML のオプション、言い換えると、タグの属性です。 -この配列で、キーは `class`、`href`、`target` などの属性の名前であり、値は属性の値です。 +三番目の引数は HTML のオプション、言い換えると、タグの属性です。この配列で、キーは `class`、`href`、`target` などの属性の名前であり、値は属性の値です。 上記のコードは次の HTML を生成します。 @@ -43,13 +41,16 @@ Yii はそのような手助けを Html ヘルパの形式で提供します。 その全ての場合において、いくつか追加の処理がなされることを知っておいてください。 - 値が `null` である場合は、対応する属性はレンダリングされません。 -- 値が真偽値である属性は、[真偽値属性 (boolean attributes)](http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes) として扱われます。 +- 値が真偽値である属性は、[真偽値属性 (boolean attributes)](http://www.w3.org/TR/html5/infrastructure.html#boolean-attributes) + として扱われます。 - 属性の値は [[yii\helpers\Html::encode()|Html::encode()]] を使って HTML エンコードされます。 - 属性の値が配列である場合は、次のように処理されます。 - * 属性が [[yii\helpers\Html::$dataAttributes]] にリストされているデータ属性である場合、例えば `data` や `ng` である場合は、値の配列にある要素の一つ一つについて、属性のリストがレンダリングされます。 + * 属性が [[yii\helpers\Html::$dataAttributes]] にリストされているデータ属性である場合、例えば `data` や `ng` である場合は、 + 値の配列にある要素の一つ一つについて、属性のリストがレンダリングされます。 例えば、`'data' => ['id' => 1, 'name' => 'yii']` は `data-id="1" data-name="yii"` を生成します。 - また、`'data' => ['params' => ['id' => 1, 'name' => 'yii'], 'status' => 'ok']` は `data-params='{"id":1,"name":"yii"}' data-status="ok"` を生成します。 + また、`'data' => ['params' => ['id' => 1, 'name' => 'yii'], 'status' => 'ok']` は + `data-params='{"id":1,"name":"yii"}' data-status="ok"` を生成します。 後者の例において、下位の配列に対して JSON 形式が使用されていることに注意してください。 * 属性がデータ属性でない場合は、値は JSON エンコードされます。 例えば、`['params' => ['id' => 1, 'name' => 'yii']` は `params='{"id":1,"name":"yii"}'` を生成します。 @@ -136,7 +137,8 @@ Html::addCssStyle($options, 'height: 200px; position: absolute;'); Html::removeCssStyle($options, ['width', 'height']); ``` -[[yii\helpers\Html::addCssStyle()|addCssStyle()]] を使うときには、CSS プロパティの名前と値に対応する「キー-値」ペアの配列か、または、`width: 100px; height: 200px;` のような文字列を指定することが出来ます。 +[[yii\helpers\Html::addCssStyle()|addCssStyle()]] を使うときには、CSS プロパティの名前と値に対応する「キー-値」ペアの配列か、 +または、`width: 100px; height: 200px;` のような文字列を指定することが出来ます。 この二つの形式は、[[yii\helpers\Html::cssStyleFromArray()|cssStyleFromArray()]] と [[yii\helpers\Html::cssStyleToArray()|cssStyleToArray()]] を使って、双方向に変換することが出来ます。 [[yii\helpers\Html::removeCssStyle()|removeCssStyle()]] メソッドは、削除すべきプロパティの配列を受け取ります。 プロパティが一つだけである場合は、文字列で指定することも出来ます。 @@ -145,9 +147,11 @@ Html::removeCssStyle($options, ['width', 'height']); ### コンテントをエンコードおよびデコードする コンテントが適切かつ安全に HTML として表示されるためには、コンテント内の特殊文字がエンコードされなければなりません。 -特殊文字のエンコードとデコードは、PHP では [htmlspecialchars](http://www.php.net/manual/ja/function.htmlspecialchars.php) と [htmlspecialchars_decode](http://www.php.net/manual/ja/function.htmlspecialchars-decode.php) によって行われます。 +特殊文字のエンコードとデコードは、PHP では [htmlspecialchars](http://www.php.net/manual/ja/function.htmlspecialchars.php) と +[htmlspecialchars_decode](http://www.php.net/manual/ja/function.htmlspecialchars-decode.php) によって行われます。 これらのメソッドを直接使用する場合の問題は、文字エンコーディングと追加のフラグを毎回指定しなければならないことです。 -フラグは毎回同じものであり、文字エンコーディングはセキュリティ問題を防止するためにアプリケーションのそれと一致すべきものですから、Yii は二つのコンパクトかつ使いやすいメソッドを用意しました。 +フラグは毎回同じものであり、文字エンコーディングはセキュリティ問題を防止するためにアプリケーションのそれと一致すべきものですから、 +Yii は二つのコンパクトかつ使いやすいメソッドを用意しました。 ```php $userName = Html::encode($user->name); @@ -173,10 +177,8 @@ $decodedUserName = Html::decode($userName); $id], 'post', ['enctype' => 'multipart/form-data']) ?> ``` -最初の引数は、フォームが送信されることになる URL です。 -これは [[yii\helpers\Url::to()|Url::to()]] によって受け入れられる Yii のルートおよびパラメータの形式で指定することが出来ます。 -第二の引数は使われるメソッドです。`post` がデフォルトです。 -第三の引数はフォームタグのオプションの配列です。 +最初の引数は、フォームが送信されることになる URL です。これは [[yii\helpers\Url::to()|Url::to()]] によって受け入れられる Yii のルートおよびパラメータの形式で指定することが出来ます。 +第二の引数は使われるメソッドです。`post` がデフォルトです。第三の引数はフォームタグのオプションの配列です。 上記の場合では、POST リクエストにおけるフォーム・データのエンコーディング方法を `multipart/form-data` に変更しています。 これはファイルをアップロードするために必要とされます。 @@ -248,8 +250,7 @@ $decodedUserName = Html::decode($userName); ``` -最初の引数はインプットの名前、第二の引数は現在選択されている値です。 -そして第三の引数は「キー-値」のペアであり、配列のキーはリストの値、配列の値はリストのラベルです。 +最初の引数はインプットの名前、第二の引数は現在選択されている値です。そして第三の引数は「キー-値」のペアであり、配列のキーはリストの値、配列の値はリストのラベルです。 複数の選択肢を選択できるようにしたい場合は、チェックボックス・リストが最適です。 @@ -268,8 +269,7 @@ $decodedUserName = Html::decode($userName); ### ラベルとエラー -インプットと同じように、ラベルを生成するメソッドが二つあります。 -モデルからデータを取るアクティブなラベルと、データを直接受け入れるアクティブでないラベルです。 +インプットと同じように、ラベルを生成するメソッドが二つあります。モデルからデータを取るアクティブなラベルと、データを直接受け入れるアクティブでないラベルです。 ```php 'label username']) ?> @@ -308,9 +308,7 @@ echo Html::getAttributeValue($post, 'title'); echo Html::getAttributeValue($post, '[0]authors[0]'); ``` -上記において、最初の引数はモデルであり、第二の引数は属性を示す式です。 -これは最も単純な形式においては属性名ですが、配列の添字を前 および/または 後に付けた属性名とすることも出来ます。 -配列の添字は主として表形式データ入力のために使用されます。 +上記において、最初の引数はモデルであり、第二の引数は属性を示す式です。これは最も単純な形式においては属性名ですが、配列の添字を前 および/または 後に付けた属性名とすることも出来ます。配列の添字は主として表形式データ入力のために使用されます。 - `[0]content` は、表形式データ入力で使われます。表形式入力の最初のモデルの "content" 属性を表します。 - `dates[0]` は、"dates" 属性の最初の配列要素を表します。 @@ -355,8 +353,7 @@ CSS ファイルの外部スタイルをリンクしたい場合は、次のよ ``` -最初の引数は URL であり、第二の引数はオプションの配列です。 -通常のオプションに加えて、次のものを指定することが出来ます。 +最初の引数は URL であり、第二の引数はオプションの配列です。通常のオプションに加えて、次のものを指定することが出来ます。 - `condition` - 指定された条件を使って ` ``` -CSS と同じように、最初の引数はインクルードされるファイルへのリンクを指定するものです。 -オプションを第二の引数として渡すことが出来ます。 +CSS と同じように、最初の引数はインクルードされるファイルへのリンクを指定するものです。オプションを第二の引数として渡すことが出来ます。 オプションに置いて、`cssFile` のオプションと同じように、`condition` を指定することが出来ます。 @@ -382,8 +378,7 @@ CSS と同じように、最初の引数はインクルードされるファイ $id], ['class' => 'profile-link']) ?> ``` -最初の引数はタイトルです。 -これはエンコードされませんので、エンド・ユーザから取得したデータを使う場合は、`Html::encode()` でエンコードする必要があります。 +最初の引数はタイトルです。これはエンコードされませんので、エンド・ユーザから取得したデータを使う場合は、`Html::encode()` でエンコードする必要があります。 第二の引数が、` ``` -最初の引数は、[エイリアス](concept-aliases.md) 以外にも、ルートとパラメータ、または URL を受け入れることが出来ます。 -[Url::to()](helper-url.md) と同様です。 +最初の引数は、[エイリアス](concept-aliases.md) 以外にも、ルートとパラメータ、または URL を受け入れることが出来ます。[Url::to()](helper-url.md) と同様です。 ## リスト diff --git a/docs/guide-ja/helper-overview.md b/docs/guide-ja/helper-overview.md index 42a92b5cf0f..9ae4e7df994 100644 --- a/docs/guide-ja/helper-overview.md +++ b/docs/guide-ja/helper-overview.md @@ -4,10 +4,10 @@ > Note: このセクションはまだ執筆中です。 Yii は、一般的なコーディングのタスク、例えば、文字列や配列の操作、HTML コードの生成などを手助けする多くのクラスを提供しています。 -これらのヘルパ・クラスは `yii\helpers` 名前空間の下に編成されており、すべてスタティックなクラス (すなわち、スタティックなプロパティとメソッドのみを含み、インスタンス化すべきでないクラス) です。 +これらのヘルパ・クラスは `yii\helpers` 名前空間の下に編成されており、すべてスタティックなクラス +(すなわち、スタティックなプロパティとメソッドのみを含み、インスタンス化すべきでないクラス) です。 -ヘルパ・クラスは、そのスタティックなメソッドの一つを直接に呼び出すことによって使用します。 -例えば、 +ヘルパ・クラスは、そのスタティックなメソッドの一つを直接に呼び出すことによって使用します。例えば、 ```php use yii\helpers\Html; @@ -43,10 +43,13 @@ echo Html::encode('Test > test'); ヘルパ・クラスをカスタマイズする ------------------------------ -コア・ヘルパ・クラス (例えば [[yii\helpers\ArrayHelper]]) をカスタマイズするためには、そのヘルパに対応する基底クラス (例えば [[yii\helpers\BaseArrayHelper]]) を拡張するクラスを作成して、名前空間も含めて、対応する具象クラス (例えば [[yii\helpers\ArrayHelper]]) と同じ名前を付けます。 +コア・ヘルパ・クラス (例えば [[yii\helpers\ArrayHelper]]) をカスタマイズするためには、 +そのヘルパに対応する基底クラス (例えば [[yii\helpers\BaseArrayHelper]]) を拡張するクラスを作成して、名前空間も含めて、 +対応する具象クラス (例えば [[yii\helpers\ArrayHelper]]) と同じ名前を付けます。 このクラスが、フレームワークのオリジナルの実装を置き換えるものとしてセットアップされます。 -次の例は、[[yii\helpers\ArrayHelper]] クラスの [[yii\helpers\ArrayHelper::merge()|merge()]] メソッドをカスタマイズする方法を示すものです。 +次の例は、[[yii\helpers\ArrayHelper]] クラスの [[yii\helpers\ArrayHelper::merge()|merge()]] +メソッドをカスタマイズする方法を示すものです。 ```php -よく使う URL を取得するために使うことが出来るメソッドが二つあります。 -すなわち、ホーム URL と、現在のリクエストのベース URL を取得するメソッドです。 +よく使う URL を取得するために使うことが出来るメソッドが二つあります。すなわち、ホーム URL と、現在のリクエストのベース URL を取得するメソッドです。 ホーム URL を取得するためには、次のようにします。 ```php @@ -17,8 +16,7 @@ $httpsAbsoluteHomeUrl = Url::home('https'); ``` パラメータが渡されない場合は、生成される URL は相対 URL になります。 -パラメータとして `true` を渡せば、現在のスキーマの絶対 URL を取得することが出来ます。 -または、スキーマ (`http`, `https`) を明示的に指定しても構いません。 +パラメータとして `true` を渡せば、現在のスキーマの絶対 URL を取得することが出来ます。または、スキーマ (`http`, `https`) を明示的に指定しても構いません。 現在のリクエストのベース URL を取得するためには、次のようにします。 @@ -41,8 +39,7 @@ $url = Url::toRoute(['product/view', 'id' => 42]); ``` ルートは、文字列として指定することが出来ます (例えば、`site/index`)。 -または、生成される URL に追加のクエリ・パラメータを指定したい場合は、配列を使うことも出来ます。 -配列の形式は、以下のようにしなければなりません。 +または、生成される URL に追加のクエリ・パラメータを指定したい場合は、配列を使うことも出来ます。配列の形式は、以下のようにしなければなりません。 ```php // /index.php?r=site%2Findex¶m1=value1¶m2=value2 を生成 @@ -56,16 +53,18 @@ $url = Url::toRoute(['product/view', 'id' => 42]); ['site/index', 'param1' => 'value1', '#' => 'name'] ``` -ルートは、絶対ルートか相対ルートかのどちらかです。 -絶対ルートは先頭にスラッシュを持ち (例えば `/site/index`)、相対ルートは持ちません (例えば `site/index` または `index`)。 +ルートは、絶対ルートか相対ルートかのどちらかです。絶対ルートは先頭にスラッシュを持ち (例えば `/site/index`)、相対ルートは持ちません (例えば `site/index` または `index`)。 相対ルートは次の規則に従って絶対ルートに変換されます。 - ルートが空文字列である場合は、現在の [[yii\web\Controller::route|ルート]] が使用されます。 -- ルートがスラッシュを全く含まない場合は (例えば `index`)、カレント・コントローラのアクション ID であると見なされて、カレント・コントローラの [[\yii\web\Controller::uniqueId|uniqueId]] が前置されます。 -- ルートが先頭にスラッシュを含まない場合は (例えば `site/index`)、カレント・モジュールに対する相対ルートと見なされて、カレント・モジュールの [[\yii\base\Module::uniqueId|uniqueId]] が前置されます。 +- ルートがスラッシュを全く含まない場合は (例えば `index`)、カレント・コントローラのアクション ID であると見なされて、 + カレント・コントローラの [[\yii\web\Controller::uniqueId|uniqueId]] が前置されます。 +- ルートが先頭にスラッシュを含まない場合は (例えば `site/index`)、カレント・モジュールに対する相対ルートと見なされて、 + カレント・モジュールの [[\yii\base\Module::uniqueId|uniqueId]] が前置されます。 バージョン 2.0.2 以降では、[エイリアス](concept-aliases.md) の形式でルートを指定することが出来ます。 -その場合は、エイリアスが最初に実際のルートに変換され、そのルートが上記の規則に従って絶対ルートに変換されます。 +その場合は、エイリアスが最初に実際のルートに変換され、 +そのルートが上記の規則に従って絶対ルートに変換されます。 以下に、このメソッドの使用例をいくつか挙げます。 @@ -87,18 +86,20 @@ echo Url::toRoute('site/index', 'https'); ``` もうひとつ、[[toRoute()]] と非常によく似た `Url::to()` というメソッドがあります。 -唯一の違いは、このメソッドはルートを配列として指定することを要求する、という点です。 -文字列が与えられた場合は、URL として扱われます。 +唯一の違いは、このメソッドはルートを配列として指定することを要求する、という点です。文字列が与えられた場合は、URL として扱われます。 最初の引数は、次のいずれかを取り得ます。 -- 配列: URL を生成するために [[toRoute()]] が呼び出されます。例えば、`['site/index']`、`['post/index', 'page' => 2]`。 +- 配列: URL を生成するために [[toRoute()]] が呼び出されます。 + 例えば、`['site/index']`、`['post/index', 'page' => 2]`。 ルートの指定方法の詳細については [[toRoute()]] を参照してください。 -- `@` で始まる文字列: これはエイリアスとして扱われ、エイリアスに対応する文字列が返されます。 +- `@` で始まる文字列: これはエイリアスとして扱われ、 + エイリアスに対応する文字列が返されます。 - 空文字列: 現在リクエストされている URL が返されます。 - 通常の文字列: その通りのものとして扱われます。 -`$scheme` (文字列または `true`) が指定された場合は、ホスト情報 ([[\yii\web\UrlManager::hostInfo]] から取得されます) を伴う絶対 URL が返されます。 +`$scheme` (文字列または `true`) が指定された場合は、ホスト情報 ([[\yii\web\UrlManager::hostInfo]] から取得されます) +を伴う絶対 URL が返されます。 `$url` が既に絶対 URL であった場合には、スキームが指定されたものに置き換えられます。 下記にいくつかの用例を挙げます。 From df4989324a4e6c2993b8229aa4eacdc867869544 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 4 May 2018 17:38:12 +0900 Subject: [PATCH 063/902] gods/internals-ja revised [ci skip] --- docs/internals-ja/README.md | 5 +- docs/internals-ja/automation.md | 3 +- docs/internals-ja/core-code-style.md | 85 ++++++++++++----------- docs/internals-ja/design-decisions.md | 7 +- docs/internals-ja/git-workflow.md | 56 +++++++-------- docs/internals-ja/project-organization.md | 15 ++-- docs/internals-ja/pull-request-qa.md | 3 +- docs/internals-ja/release.md | 16 +++-- docs/internals-ja/report-an-issue.md | 3 +- docs/internals-ja/translation-workflow.md | 9 +-- docs/internals-ja/versions.md | 13 ++-- docs/internals-ja/view-code-style.md | 5 +- 12 files changed, 110 insertions(+), 110 deletions(-) diff --git a/docs/internals-ja/README.md b/docs/internals-ja/README.md index 4e2459a1ee6..ac6ac04a7bf 100644 --- a/docs/internals-ja/README.md +++ b/docs/internals-ja/README.md @@ -24,7 +24,7 @@ Yii 開発者ドキュメント フレームワーク開発 ------------------ -- [プルリクエストの品質保証](pull-request-qa.md) +- [プル・リクエストの品質保証](pull-request-qa.md) - [自動化されるタスク](automation.md) コード・スタイルの修正、ドキュメントやファイルの自動生成など。 - [設計上の決定](design-decisions.md) - よく議論される事柄についての FAQ 形式の声明リスト。 @@ -45,5 +45,4 @@ Yii 開発者ドキュメント ### データベースのテスト -[こちら](https://gist.github.com/sergeymakinen/0696a5952f160ea28d7b64c3adfecf6f) に、 -Yii がサポートする全てのデータベースのためのテスト環境構成があります。 +[こちら](https://gist.github.com/sergeymakinen/0696a5952f160ea28d7b64c3adfecf6f) に、Yii がサポートする全てのデータベースのためのテスト環境構成があります。 diff --git a/docs/internals-ja/automation.md b/docs/internals-ja/automation.md index 4019b9fd9c1..3b4cf52fac3 100644 --- a/docs/internals-ja/automation.md +++ b/docs/internals-ja/automation.md @@ -17,7 +17,6 @@ Yii の開発に取り組む際に、自動化できるタスクがいくつか - Mime タイプ・マジック・ファイル (`framework/helpers/mimeTypes.php`) の Apache HTTPd レポジトリによる更新。 `./build/build mime-type` を実行してファイルを更新して下さい。 -- CHANGELOG ファイルのエントリの出現順序は、`./build/build release/sort-changelog framework` -を実行することで更新することが出来ます。 +- CHANGELOG ファイルのエントリの出現順序は、`./build/build release/sort-changelog framework` を実行することで更新することが出来ます。 上記のコマンドの全てが [リリースの工程]() に含まれています。これらをリリースとリリースの間に実行しても構いませんが、必要ではありません。 diff --git a/docs/internals-ja/core-code-style.md b/docs/internals-ja/core-code-style.md index a2d58bd45db..fa1a2a3cec1 100644 --- a/docs/internals-ja/core-code-style.md +++ b/docs/internals-ja/core-code-style.md @@ -3,19 +3,16 @@ Yii 2 コア・フレームワーク・コード・スタイル 下記のコード・スタイルが Yii 2.x コアと公式エクステンションの開発に用いられています。 コアに対してコードをプル・リクエストをしたいときは、これを使用することを考慮してください。 -私たちは、あなたが自分のアプリケーションにこのコード・スタイルを使うことを強制するものではありません。 -あなたにとってより良いコード・スタイルを自由に選んでください。 +私たちは、あなたが自分のアプリケーションにこのコード・スタイルを使うことを強制するものではありません。あなたにとってより良いコード・スタイルを自由に選んでください。 なお、CodeSniffer のための設定をここで入手できます: https://github.com/yiisoft/yii2-coding-standards -> Note: 以下では、説明のために、サンプル・コードのドキュメントやコメントを日本語に翻訳しています。 - しかし、コア・コードや公式エクステンションに対して実際に寄稿する場合には、それらを英語で書く必要があります。 - - ## 1. 概要 -全体として、私たちは [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) 互換のスタイルを使っていますので、 -[PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) に適用されることは、すべて私たちのコード・スタイルにも適用されます。 +全体として、私たちは [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) +互換のスタイルを使っていますので、 +[PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) に適用されることは、 +すべて私たちのコード・スタイルにも適用されます。 - ファイルは `getEventHandlers($eventName)->insertAt(0, $eventHandler); * ``` * - * @param string $name イベントの名前 - * @return Vector イベントにアタッチされたハンドラのリスト - * @throws Exception イベントが定義されていない場合 + * @param string $name the event name + * @return Vector list of attached event handlers for the event + * @throws Exception if the event is not defined */ public function getEventHandlers($name) { if (!isset($this->_e[$name])) { $this->_e[$name] = new Vector; } + $this->ensureBehaviors(); + return $this->_e[$name]; } ``` @@ -453,7 +456,7 @@ public function getEventHandlers($name) 上記のリンクにクラス名やメソッド名以外のラベルを付けるためには、次の例で示されている文法を使うことが出来ます。 ``` -... [[header|ヘッダ・セル]] に表示されているように +... as displayed in the [[header|header cell]]. ``` `|` の前の部分がメソッド、プロパティ、クラスへの参照であり、`|` の後ろの部分がリンクのラベルです。 @@ -461,8 +464,8 @@ public function getEventHandlers($name) 下記の文法を使ってガイドにリンクすることも可能です。 ```markdown -[ガイドへのリンク](guide:file-name.md) -[ガイドへのリンク](guide:file-name.md#subsection) +[link to guide](guide:file-name.md) +[link to guide](guide:file-name.md#subsection) ``` @@ -492,8 +495,7 @@ public function getEventHandlers($name) ### 「何かをするな」を示す値 -コンポーネントに対して「何かをしない」という設定を許可するプロパティは `false` の値を受け入れるべきです。 -`null`、`''`、または `[]` がそういう値であると見なされるべきではありません。 +コンポーネントに対して「何かをしない」という設定を許可するプロパティは `false` の値を受け入れるべきです。`null`、`''`、または `[]` がそういう値であると見なされるべきではありません。 ### ディレクトリ/名前空間の名前 @@ -502,3 +504,4 @@ public function getEventHandlers($name) - 機能や特徴を表す名前には単数形を使います (例えば、web)。 - 出来れば単一の語の名前空間にします。 - 単一の語が適切でない場合は、camelCase を使います。 + diff --git a/docs/internals-ja/design-decisions.md b/docs/internals-ja/design-decisions.md index ac93554032f..72682b4a985 100644 --- a/docs/internals-ja/design-decisions.md +++ b/docs/internals-ja/design-decisions.md @@ -25,8 +25,5 @@ 6. [ヘルパか、独立した非スタティックなクラスか](https://github.com/yiisoft/yii2/pull/12661#issuecomment-251599463) 7. **セッター・メソッド・チェイニング** は、意味のある値を返すメソッドがそのクラスに存在する場合は、避けるべきである。 - チェイニングは、クラスがビルダーであり、全てのセッターが内部状態を修正するものである場合にサポートされうる。 - https://github.com/yiisoft/yii2/issues/13026 -8. ローカルな try-catch の替りに **グローバルな例外/エラーハンドラ** が使われる。 - なぜなら、その方が、ブートストラップなどのように `run()` メソッドのスコープ外で発生するデストラクタなど全てのものをキャッチする点において信頼性が高いからである。 - [#14348](https://github.com/yiisoft/yii2/issues/14348) を参照。 + チェイニングは、クラスがビルダーであり、全てのセッターが内部状態を修正するものである場合にサポートされうる。https://github.com/yiisoft/yii2/issues/13026 +8. ローカルな try-catch の替りに **グローバルな例外/エラーハンドラ** が使われる。なぜなら、その方が、ブートストラップなどのように `run()` メソッドのスコープ外で発生するデストラクタなど全てのものをキャッチする点において信頼性が高いからである。[#14348](https://github.com/yiisoft/yii2/issues/14348) を参照。 diff --git a/docs/internals-ja/git-workflow.md b/docs/internals-ja/git-workflow.md index a33f4e75af7..6f63fdf69f6 100644 --- a/docs/internals-ja/git-workflow.md +++ b/docs/internals-ja/git-workflow.md @@ -3,7 +3,8 @@ Yii 2 寄稿者のための Git ワークフロー で、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) についていくらか学習したりする必要があるかもしれません。 +あなたが 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) についていくらか学習したりする必要があるかもしれません。 あなたの開発環境を準備する -------------------------- @@ -17,7 +18,8 @@ Yii 2 寄稿者のための Git ワークフロー 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/) に従ってください。 +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) を読むことをお勧めします。 @@ -37,16 +39,14 @@ git remote add upstream git://github.com/yiisoft/yii2.git JavaScript を扱おうとしている場合は、 -- `npm install` を実行して JavaScript テスト・ツール群とその依存ライブラリをインストールします -([Node.js と NPM のインストール](https://nodejs.org/en/download/package-manager/) は完了しているものとします)。 +- `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 ` を実行し、ベーシック・アプリケーションをクローンし、ベーシック・アプリケーションのための composer 依存パッケージをインストールします +- `php build/build dev/app basic ` を実行し、ベーシック・アプリケーションをクローンし、ベーシック・アプリケーションのための composer 依存パッケージをインストールします ここで `` は、`git@github.com:my_nickname/yii2-app-basic.git` のような、あなたのレポジトリのフォークの URL です。 - あなたがコア・フレームワークの貢献者である場合は、フォークの指定を省略しても構いません。 - このコマンドは外部 composer パッケージは通常どおりインストールしますが、yii2 レポジトリは現在チェックアウトされているものをリンクします。 + あなたがコア・フレームワークの貢献者である場合は、フォークの指定を省略しても構いません。このコマンドは外部 composer パッケージは通常どおりインストールしますが、yii2 レポジトリは現在チェックアウトされているものをリンクします。 これで、インストールされる全てのコードについて、一つのインスタンスを持つことになります。 必要であれば、アドバンスト・アプリケーションについても同様にします: `php build/build dev/app advanced `。 @@ -68,24 +68,20 @@ phpunit をグローバルにインストールしていない場合は、代り テストによっては、データベースの設定と構成が必要なものがあります。 `tests/data/config.local.php` を作成して、`tests/data/config.php` において構成されている設定を上書きすることが出来ます。 -取り組んでいるグループのものだけにテストを限定することが出来ます。 -例えば、バリデータと redis のためのテストだけを走らせるためには、`phpunit --group=validators,redis` とします。 +取り組んでいるグループのものだけにテストを限定することが出来ます。例えば、バリデータと redis のためのテストだけを走らせるためには、`phpunit --group=validators,redis` とします。 利用できるグループのリストを取得するためには、`phpunit --list-groups` を実行してください。 JavaScript の単体テストは、レポジトリのルート・ディレクトリで `npm test` を走らせることによって実行することが出来ます。 ### エクステンション -エクステンションに取り組むためには、エクステンションのレポジトリをクローンする必要があります。 -私たちは、あなたに代ってそれをするコマンドを作っています。 +エクステンションに取り組むためには、エクステンションのレポジトリをクローンする必要があります。私たちは、あなたに代ってそれをするコマンドを作っています。 ``` php build/build dev/ext ``` -ここで `` がエクステンションの名前、例えば `redis` です。 -そして `` は、`git@github.com:my_nickname/yii2-redis.git` のような、あなたのエクステンションのフォークの URL です。 -あなたがコア・フレームワークの貢献者である場合は、フォークの指定を省略しても構いません。 +ここで `` がエクステンションの名前、例えば `redis` です。そして `` は、`git@github.com:my_nickname/yii2-redis.git` のような、あなたのエクステンションのフォークの URL です。あなたがコア・フレームワークの貢献者である場合は、フォークの指定を省略しても構いません。 エクステンションをアプリケーション・テンプレートのどちらかでテストしたい場合は、通常そうするように、アプリケーションの `composer.json` にそれを追加するだけです。 例えば、ベーシック・アプリケーションの `require` セクションに `"yiisoft/yii2-redis": "~2.0.0"` を追加します。 @@ -95,6 +91,7 @@ php build/build dev/ext > Note: デフォルトの git レポジトリの Url を使うため、SSH 経由で github からクローンすることになります。 > `build` コマンドに `--useHttp` フラグを追加すれば、代りに HTTP を使うことが出来ます。 + バグ修正と機能改良に取り組む ---------------------------- @@ -109,8 +106,7 @@ php build/build dev/ext 単純な修正であれば、直接にプル・リクエストをしてください。 こうすることで、開発チームはあなたの提案をレビューし、将来にわたって適切なフィードバックを提供することが可能になります。 -> 小さな変更や、ドキュメントの問題、または単純な修正については、課題を作成する必要はありません。 - それらについては、プル・リクエストだけで十分です。 +> 小さな変更や、ドキュメントの問題、または単純な修正については、課題を作成する必要はありません。それらについては、プル・リクエストだけで十分です。 ### 2. メインの Yii ブランチから最新のコードをプルする @@ -122,12 +118,12 @@ git pull upstream ### 3. 現在の Yii のマスター・ブランチに基いて、あなたの寄稿のための新しいブランチを作成する -> これは非常に重要です。なぜなら、master ブランチを使うと、あなたのアカウントからは一つ以上のプル・リクエストを送信することが出来なくなるからです。 +> これは非常に重要です。なぜなら、master ブランチを使うと、 + あなたのアカウントからは一つ以上のプル・リクエストを送信することが出来なくなるからです。 独立したバグ修正や変更は、各々、それ自身のブランチに入れるべきです。 ブランチの名前は説明的なものにし、あなたのコードが関係する課題の番号で始まるようにしてください。 -特定の課題を修正するものでない場合は、番号を省略してください。 -例えば、 +特定の課題を修正するものでない場合は、番号を省略してください。例えば、 ``` git checkout upstream/master @@ -143,8 +139,7 @@ git checkout -b 999-name-of-your-branch-goes-here ### 5. CHANGELOG を更新する -CHANGELOG ファイルを編集して、あなたの修正を追加します。 -新しい行は、ファイル冒頭の最初の見出し (現在開発中のバージョン) の下に挿入してください。 +CHANGELOG ファイルを編集して、あなたの修正を追加します。新しい行は、ファイル冒頭の最初の見出し (現在開発中のバージョン) の下に挿入してください。 チェンジログの行は、下記のどちらかのように書いてください。 ``` @@ -196,7 +191,8 @@ git push -u origin 999-name-of-your-branch-goes-here ### 9. upstream に対して [プルリクエスト](https://help.github.com/articles/creating-a-pull-request-from-a-fork/) を発行する -github 上のあなたのリポジトリに入って、"Pull Request" をクリックし、右側にあるブランチを選び、コメント・ボックスにもう少し詳細を記述します。 +github 上のあなたのリポジトリに入って、"Pull Request" をクリックし、右側にあるブランチを選び、 +コメント・ボックスにもう少し詳細を記述します。 プル・リクエストを課題とリンクさせるために、プル・コメントのどこかに `#999` という書式で課題番号を記載します。 > 全てのプル・リクエストはそれぞれ一つの課題を解決すべきものであることに注意してください。 @@ -204,15 +200,14 @@ github 上のあなたのリポジトリに入って、"Pull Request" をクリ ### 10. 誰かがあなたのコードをレビューする 誰かがあなたのコードをレビューします。あなたは修正を求められるかも知れません。その場合は、ステップ #6 に戻ってください -(現在のプル・リクエストが open である限りは、別の新しいプル・リクエストをする必要はありません)。 -あなたのコードが受け入れられた場合は、コードはメイン・ブランチにマージされて、次回の Yii のリリースの一部となります。 -受け入れられなくても、落胆しないでください。 -必要とする機能は人によってさまざまに異なりますし、Yii は全ての人に対して全てを提供することは出来ません。 +(現在のプル・リクエストが open である限りは、別の新しいプル・リクエストをする必要はありません)。あなたのコードが受け入れられた場合は、コードはメイン・ブランチにマージされて、次回の Yii のリリースの一部となります。 +受け入れられなくても、落胆しないでください。必要とする機能は人によってさまざまに異なりますし、Yii は全ての人に対して全てを提供することは出来ません。 また、却下された場合でも、あなたのコードはそれを必要とする人々から参照されるように github 上で公開され続けます。 ### 11. クリーンアップする -あなたのコードが受け入れられるか却下されるかした後、あなたが作業してきたブランチをローカル・レポジトリおよび `origin` から削除することが出来ます。 +あなたのコードが受け入れられるか却下されるかした後、あなたが作業してきたブランチをローカル・レポジトリおよび +`origin` から削除することが出来ます。 ``` git checkout master @@ -223,15 +218,14 @@ git push origin --delete 999-name-of-your-branch-goes-here ### 注意: 退行 (regression) を早期に発見するために、github 上の Yii コード・ベースへのマージは、すべて [Travis CI](http://travis-ci.org) に取り上げられて、自動化されたテストにかけられます。 -コア・チームとしては、このサービスに過大な負担をかけたくないために、以下の場合にはマージの説明に [`[ci skip]`](https://docs.travis-ci.com/user/customizing-the-build/#Skipping-a-build) が含まれるようにしてください。 -すなわち、プル・リクエストが、 +コア・チームとしては、このサービスに過大な負担をかけたくないために、以下の場合にはマージの説明に +[`[ci skip]`](https://docs.travis-ci.com/user/customizing-the-build/#Skipping-a-build) が含まれるようにしてください。 +すなわち、プル・リクエストが下記のものである場合がそうです。 * javascript、css または画像ファイルだけに影響する場合 * ドキュメントを更新する場合 * 固定の文字列だけを修正する (例えば、翻訳をアップデートする) 場合 -がそうです。 - このようにすることによって、そもそもテストによってカバーされない変更に対しては、travis がテスト・ランを開始しないようにすることが出来ます。 ### コマンド概要 (上級の寄稿者向け) diff --git a/docs/internals-ja/project-organization.md b/docs/internals-ja/project-organization.md index 85985d926cd..ea40adb9e61 100644 --- a/docs/internals-ja/project-organization.md +++ b/docs/internals-ja/project-organization.md @@ -3,18 +3,19 @@ このドキュメントは Yii 2 開発レポジトリの編成を説明するものです。 -1. 個々のコア・エクステンションとアプリケーション・テンプレートは、[yiisoft](https://github.com/yiisoft) Github オーガニゼーションの下の *独立した* 別の Github プロジェクトとして保守されます。 +1. 個々のコア・エクステンションとアプリケーション・テンプレートは、[yiisoft](https://github.com/yiisoft) Github オーガニゼーションの下の +*独立した* 別の Github プロジェクトとして保守されます。 - エクステンションのプロジェクト名は、先頭に `yii2-` を付けます。例えば、`gii` エクステンションは `yii2-gii` です。 + エクステンションのレポジトリ名は、先頭に `yii2-` を付けます。例えば、`gii` エクステンションは `yii2-gii` です。 Composer のパッケージ名は Github レポジトリ名と同じで、例えば `yiisoft/yii2-gii` です。 - アプリケーション・テンプレートのプロジェクト名は、先頭に `yii2-app-` を付けます。例えば、`basic` アプリケーション・テンプレートは `yii2-app-basici` です。 + アプリケーション・テンプレートのレポジトリ名は、先頭に `yii2-app-` を付けます。例えば、`basic` アプリケーション・テンプレートは `yii2-app-basici` です。 Composer のパッケージ名は Github レポジトリ名と同じで、例えば `yiisoft/yii2-app-basic` です。 各々のエクステンション/アプリケーションのプロジェクトは、 * "docs" フォルダにおいてそのチュートリアル・ドキュメントを保守します。API ドキュメントは、エクステンション/アプリケーションがリリースされるときにその場で生成されます。 - * "tests" フォルダにおいてそれ自身のテストコードを保守します。 + * "tests" フォルダにおいてそれ自身のテスト・コードを保守します。 * それ自身のメッセージ翻訳やその他全ての関係するメタコードを保守します。 * 対応する Github プロジェクトによって、課題 (issue) を追跡します。 @@ -28,6 +29,8 @@ コア・フレームワークのバグと機能要望は、この Github プロジェクトのイッシュー・トラッカーによって追跡されます。 3. `yiisoft/yii2-framework` レポジトリは、開発プロジェクト・レポジトリの `framework` ディレクトリのリード・オンリーな git subsplit です。 - このレポジトリが、フレームワークのインストールに使用される Composer 公式パッケージである [yiisoft/yii2](https://packagist.org/packages/yiisoft/yii2) を提供します。 + このレポジトリが、フレームワークのインストールに使用される Composer 公式パッケージである + [yiisoft/yii2](https://packagist.org/packages/yiisoft/yii2) を提供します。 -4. 開発するときには、[build dev/app](git-workflow.md#prepare-the-test-environment) コマンドを使って、アプリケーションとエクステンションを開発プロジェクトの構成に含めることが出来ます。 +4. 開発するときには、[build dev/app](git-workflow.md#prepare-the-test-environment) コマンドを使って、 + アプリケーションとエクステンションを開発プロジェクトの構成に含めることが出来ます。 diff --git a/docs/internals-ja/pull-request-qa.md b/docs/internals-ja/pull-request-qa.md index 6750a046c44..5526ef9bdc0 100644 --- a/docs/internals-ja/pull-request-qa.md +++ b/docs/internals-ja/pull-request-qa.md @@ -7,4 +7,5 @@ PR をマージできるか否かをチェックするときには、特に以 - 単体テスト。必須ではありませんが、大いに歓迎されます。PR によって修正されるコードが無ければ失敗する、というテストであること。 - CHANGELOG のエントリがあること。エントリは次のリリースのセクションに、課題のタイプと番号の順に書き入れます。 担当した者のニックネームがあること。 -- [コード・スタイル](core-code-style.md) および [ビュー・コード・スタイル](view-code-style.md) が OK であること。これらは、マージされる際に、マージする者の判断に従って修正される場合があります。 +- [コード・スタイル](core-code-style.md) および [ビュー・コード・スタイル](view-code-style.md) が OK であること。 + これらは、マージされる際に、マージする者の判断に従って修正される場合があります。 diff --git a/docs/internals-ja/release.md b/docs/internals-ja/release.md index 70acc9b5feb..c2bad015975 100644 --- a/docs/internals-ja/release.md +++ b/docs/internals-ja/release.md @@ -12,9 +12,11 @@ リリース・コマンド ------------------ -リリースの手順は、フレームワークの開発レポジトリに含まれている [release コンソール・コマンド](../../build/controllers/ReleaseController.php) によって自動化されています。 +リリースの手順は、フレームワークの開発レポジトリに含まれている [release コンソール・コマンド](../../build/controllers/ReleaseController.php) +によって自動化されています。 -リリース・コマンドは、フレームワークの `build` ディレクトリに含まれている Yii アプリケーションを使って呼び出すことが出来ます。 +リリース・コマンドは、フレームワークの `build` ディレクトリに含まれている Yii +アプリケーションを使って呼び出すことが出来ます。 ./build/build help release # このコマンドをフレームワークのレポジトリのルートで実行します @@ -36,7 +38,8 @@ ./build/build dev/app basic -このインストール方法によって、エクステンションが現在のレポジトリの状態と同じフレームワーク・コードを使用する事を保証することが出来ます。 +このインストール方法によって、エクステンションが現在のレポジトリの状態と同じフレームワーク・コードを使用する事を +保証することが出来ます。 ### バージョンの概要 @@ -65,8 +68,10 @@ #### 新しいメジャー・バージョン、例えば 2.1.0 をリリースする -新しいメジャー・バージョンのリリースは、[バージョン規約](versions.md) で説明されているように、ブランチの変更を伴います。 -以下は、`master` から派生した `2.1` ブランチ上で開発されている `2.1.0` バージョンをリリースする例を示すものです。 +新しいメジャー・バージョンのリリースは、[バージョン規約](versions.md) で説明されているように、 +ブランチの変更を伴います。 +以下は、`master` から派生した `2.1` ブランチ上で開発されている +`2.1.0` バージョンをリリースする例を示すものです。 リリース前においては `master` は `2.0.x` の諸バージョンを含んでいます。 - `master` から新しいブランチ `2.0` を作成する @@ -77,3 +82,4 @@ - `2.1` ブランチを削除する `master` をチェックアウトし、`--version=2.1.0` オプションを付けて、リリース・コマンドを実行する。 + diff --git a/docs/internals-ja/report-an-issue.md b/docs/internals-ja/report-an-issue.md index 1e1be411540..6b2a41a068a 100644 --- a/docs/internals-ja/report-an-issue.md +++ b/docs/internals-ja/report-an-issue.md @@ -18,5 +18,4 @@ **課題の重複を避ける** -課題を報告する前に、[既存の課題](https://github.com/yiisoft/yii2/issues) を検索して、あなたが報告しようとしている課題が既に報告されていたり解決されていたりしないかを確かめ、重複した課題を報告しないようにしてください。 -さらにまた、Yii の最新のバージョンを使ってみて、それでもまだ問題が残っているかどうかを確かめてください。 +課題を報告する前に、[既存の課題](https://github.com/yiisoft/yii2/issues) を検索して、あなたが報告しようとしている課題が既に報告されていたり解決されていたりしないかを確かめ、重複した課題を報告しないようにしてください。さらにまた、Yii の最新のバージョンを使ってみて、それでもまだ問題が残っているかどうかを確かめてください。 diff --git a/docs/internals-ja/translation-workflow.md b/docs/internals-ja/translation-workflow.md index 5c2a37a9b0e..fdeecb73c3e 100644 --- a/docs/internals-ja/translation-workflow.md +++ b/docs/internals-ja/translation-workflow.md @@ -14,7 +14,8 @@ Yii は国際的なアプリケーションと開発者にとって役に立つ 1. `framework/messages/config.php` をチェックして、あなたの言語が `languages` のリストに載っていることを確認してください。 もし無ければ、あなたの言語をそこに追加します (リストをアルファベット順に保つことを忘れないでください)。 - 言語コードの形式は、例えば `ru` や `zh-CN` のように、[IETF言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従うべきです。 + 言語コードの形式は、例えば `ru` や `zh-CN` のように、 + [IETF言語タグ](http://ja.wikipedia.org/wiki/IETF%E8%A8%80%E8%AA%9E%E3%82%BF%E3%82%B0) に従うべきです。 2. `framework` に入って、`./yii message/extract @yii/messages/config.php --languages=` を走らせます。 3. `framework/messages/your_language/yii.php` のメッセージを翻訳します。ファイルは必ず UTF-8 エンコーディングを使って保存してください。 4. [プル・リクエスト](git-workflow.md) をします。 @@ -25,8 +26,7 @@ Yii は国際的なアプリケーションと開発者にとって役に立つ 翻訳ファイルの中で、配列の各要素は、メッセージ(キー)と翻訳(値)をあらわします。 値が空文字列の場合は、メッセージは翻訳されないものと見なされます。 翻訳が不要になったメッセージは、翻訳が一組の '@@' マークで囲まれます。 -メッセージ文字列は複数形書式とともに使うことが出来ます。 -詳細はガイドの [国際化](../guide-ja/tutorial-i18n.md) の節を参照してください。 +メッセージ文字列は複数形書式とともに使うことが出来ます。詳細はガイドの [国際化](../guide-ja/tutorial-i18n.md) の節を参照してください。 ドキュメント ------------ @@ -35,7 +35,8 @@ Yii は国際的なアプリケーションと開発者にとって役に立つ ここで `` は、`guide` や `internals` などの元の文書の名前であり、`` は文書の翻訳先の言語コードです。 例えば、ロシア語のガイドの翻訳は `docs/guide-ru` です。 -初期の仕事が完了した後は、最新の翻訳以後に変更されたソース文書の箇所を取得するために、`build` ディレクトリにある専用のコマンドを使うことが出来ます。 +初期の仕事が完了した後は、最新の翻訳以後に変更されたソース文書の箇所を取得するために、 +`build` ディレクトリにある専用のコマンドを使うことが出来ます。 ``` php build translation "../docs/guide" "../docs/guide-ru" "Russian guide translation report" > report_guide_ru.html diff --git a/docs/internals-ja/versions.md b/docs/internals-ja/versions.md index 133d3a1467a..2a85d5d47cb 100644 --- a/docs/internals-ja/versions.md +++ b/docs/internals-ja/versions.md @@ -29,6 +29,7 @@ Yii バージョン規約 * プレ・リリースが必要: `2.X.0-alpha`, `2.X.0-beta`, `2.X.0-rc` * 大きなニュース・リリースとマーケティング努力を必要とする。 + ## `2.x.Y`: マイナー・リリース ほぼ後方互換であるマイナー・リリースです。 @@ -36,14 +37,15 @@ Yii バージョン規約 しかし、すべてを 100% 後方互換に保つことが常に可能である訳ではありませんので、アップグレードに関するノートが `UPGRADE.md` に記録されます。 実際の運用では、2.0.x はより頻繁にリリースされるので、小さな機能改良の追加も行って、ユーザが新機能をより早く享受できるようにしています。 -* 主としてバグ修正と小さな機能強化を含む。 -* 大きな機能拡張や修正はしない。 -* 不安無しのアップグレードを保証するために、100% 後方互換でなければならない。ごく少数の例外は許容されるが、その場合は `UPGRADE.md` に記録される。 +* 主としてバグ修正と機能強化を含む。 +* 不安無しのアップグレードを保証するために、ほぼ後方互換でなければならない。 + ごく少数の例外は許容されるが、その場合は `UPGRADE.md` に記録される。 * リリースのサイクルは1~2ヶ月程度。 * プレ・リリース (alpha, beta, RC) は不要。 * 継続的に (少なくとも週に一回は手作業で) マスター・ブランチにマージ・バックされるべき。 * ニュースによる広報を伴う。プロジェクト・サイトがアップデートされる。 + ### `2.x.y.Z`: パッチ・リリース バグ修正のみを含む、100% 後方互換であるべき、パッチ・リリースです。 @@ -62,7 +64,7 @@ Yii バージョン規約 * `master` ブランチは、現在の安定版メジャー・リリースの開発ブランチで、現在は `2.0.x` バージョンです。 * 各メジャー・リリースは、そのバージョン番号の名前を持つブランチ上で開発されます。例えば、`2.1`。 * メジャー・リリース `2.n` の準備が出来たら、`master` から `2.(n-1).x` と名付けられた保守ブランチを作成します。 -例えば、バージョン `2.1.0` が安定版としてリリースされ、`master` 上で開発されるようになると、`2.0` ブランチが作成されます。 + 例えば、バージョン `2.1.0` が安定版としてリリースされ、`master` 上で開発されるようになると、`2.0` ブランチが作成されます。 ([composer branch naming schema](https://getcomposer.org/doc/02-libraries.md#branches) を参照). * パッチ・リリースをマークするために `2.x.y.z` というタグと `2.x.y` ブランチを作成します。`0` は省略されます。 * `2.n.x` 保守ブランチ上の変更は、継続的に `master` ブランチにマージ・バックされます。 @@ -74,8 +76,7 @@ Yii バージョン規約 ## リリース -フレームワークと公式エクステンションのプロジェクトは、お互いに独立にリリースされます。 -すなわち、すなわち、フレームワークとエクステンションの間で、バージョン番号が異なることが予想されます。 +フレームワークと公式エクステンションのプロジェクトは、お互いに独立にリリースされます。すなわち、フレームワークとエクステンションの間で、バージョン番号が異なることが予想されます。 アプリケーション・テンプレートは、常に、フレームワークと同時にリリースされます。 上記で説明されたリリース・サイクルは、コア・フレームワークにのみ適用されます。 diff --git a/docs/internals-ja/view-code-style.md b/docs/internals-ja/view-code-style.md index 81800863e61..3c39c56b924 100644 --- a/docs/internals-ja/view-code-style.md +++ b/docs/internals-ja/view-code-style.md @@ -1,10 +1,7 @@ Yii 2 ビュー・コード・スタイル ============================== -下記のコード・スタイルが Yii 2.x コアと公式エクステンションのビュー・ファイルに用いられています。 -私たちは、あなたが自分のアプリケーションにこのコード・スタイルを使うことを強制するものではありません。 -あなたにとってより良いコード・スタイルを自由に選んでください。 - +下記のコード・スタイルが Yii 2.x コアと公式エクステンションのビュー・ファイルに用いられています。私たちは、あなたが自分のアプリケーションにこのコード・スタイルを使うことを強制するものではありません。あなたにとってより良いコード・スタイルを自由に選んでください。 ```php Date: Fri, 4 May 2018 19:42:13 +0300 Subject: [PATCH 064/902] Russian translation: improvements of concept-di-container (#16225) --- docs/guide-ru/concept-di-container.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guide-ru/concept-di-container.md b/docs/guide-ru/concept-di-container.md index cc0707eb99b..e4106ce090b 100644 --- a/docs/guide-ru/concept-di-container.md +++ b/docs/guide-ru/concept-di-container.md @@ -206,7 +206,7 @@ $reader = $container->get('app\storage\DocumentsReader'); доступны с версии 2.0.11. Ещё один шаг по оптимизации конфигурации — регистрировать некоторые зависимости как синглтоны. Зависимость, регистрируемая -через метод [[yii\di\Container::set()|set()]] будет созаваться каждый раз при обращении к ней. Некоторые классы не меняют +через метод [[yii\di\Container::set()|set()]], будет создаваться каждый раз при обращении к ней. Некоторые классы не меняют своего состояния на протяжении всей работы приложения, поэтому могут быть зарегистрированы как синглтоны. Это увеличит производительность приложения. @@ -283,7 +283,7 @@ $foo = $container->get('Foo'); ```php $container = new \yii\di\Container; -// регистрация имени класса, как есть. это может быть пропущено. +// регистрация имени класса, как есть. Это может быть пропущено. $container->set('yii\db\Connection'); // регистрация интерфейса @@ -295,7 +295,7 @@ $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); // для создания экземпляра Connection $container->set('foo', 'yii\db\Connection'); -// Регистрация класса с конфигурацией. Конфигурация +// регистрация класса с конфигурацией. Конфигурация // будет применена при создании экземпляра класса через get() $container->set('yii\db\Connection', [ 'dsn' => 'mysql:host=127.0.0.1;dbname=demo', @@ -445,13 +445,13 @@ Yii создаёт контейнер внедрения зависимосте \Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]); ``` -Теперь, если вы вызовете в представлении виджет, используя следующий код, то свойство `maxButtonCount` будет инициализировано, как 5, вместо значения по умолчанию 10, как это определено в классе. +Теперь, если вы вызовете в представлении виджет, используя следующий код, то свойство `maxButtonCount` будет инициализировано как 5 вместо значения по умолчанию 10, как это определено в классе. ```php echo \yii\widgets\LinkPager::widget(); ``` -Хотя, вы всё ещё можете переопределить установленное значение через контейнер внедрения зависимостей: +Хотя вы всё ещё можете переопределить установленное значение через контейнер внедрения зависимостей: ```php echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); From 59f5ef86e5c6def9ce36f5d26689fb281b9dd8d2 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 00:09:41 +0300 Subject: [PATCH 065/902] Russian translation: improvements of rest-authentication (#16228) [skip ci] --- docs/guide-ru/rest-authentication.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/guide-ru/rest-authentication.md b/docs/guide-ru/rest-authentication.md index eef25c27a52..b4ef119e8de 100644 --- a/docs/guide-ru/rest-authentication.md +++ b/docs/guide-ru/rest-authentication.md @@ -1,7 +1,7 @@ Аутентификация ============== -В отличие от Web-приложений, RESTful API обычно не сохраняют информацию о состоянии, а это означает, что сессии и куки +В отличие от веб-приложений, RESTful API обычно не сохраняют информацию о состоянии, а это означает, что сессии и куки использовать не следует. Следовательно, раз состояние аутентификации пользователя не может быть сохранено в сессиях или куках, каждый запрос должен приходить вместе с определенным видом параметров аутентификации. Общепринятая практика состоит в том, что для аутентификации пользователя с каждым запросом отправляется секретный токен доступа. Так как токен доступа @@ -12,12 +12,12 @@ * [HTTP Basic Auth](http://en.wikipedia.org/wiki/Basic_access_authentication): токен доступа отправляется как имя пользователя. Такой подход следует использовать только в том случае, когда токен доступа может быть безопасно сохранен - на стороне абонента API. Например, если API используется программой, запущенной на сервере. + на стороне пользователя API. Например, если API используется программой, запущенной на сервере. * Параметр запроса: токен доступа отправляется как параметр запроса в URL-адресе API, т.е. примерно таким образом: - `https://example.com/users?access-token=xxxxxxxx`. Так как большинство Web-серверов сохраняют параметры запроса в своих логах, + `https://example.com/users?access-token=xxxxxxxx`. Так как большинство веб-серверов сохраняют параметры запроса в своих логах, такой подход следует применять только при работе с `JSONP`-запросами, которые не могут отправлять токены доступа в HTTP-заголовках. -* [OAuth 2](http://oauth.net/2/): токен доступа выдается абоненту API сервером авторизации +* [OAuth 2](http://oauth.net/2/): токен доступа выдается пользователю API сервером авторизации и отправляется API-серверу через [HTTP Bearer Tokens](http://tools.ietf.org/html/rfc6750), в соответствии с протоколом OAuth2. @@ -39,6 +39,7 @@ Yii поддерживает все выше перечисленные мето > Tip: если вы разрабатываете RESTful API в пределах приложения, вы можете настроить свойство > [[yii\web\User::enableSession|enableSession]] компонента приложения `user` в конфигурации приложения. Если вы > разрабатываете RESTful API как модуль, можете добавить следующую строчку в метод `init()` модуля: +> > ```php > public function init() > { From 23959e752fb0af612e8d802807033f48b9dd19d2 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 00:10:15 +0300 Subject: [PATCH 066/902] Russian translation: improvements of concept-service-locator (#16227) [skip ci] --- docs/guide-ru/concept-service-locator.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide-ru/concept-service-locator.md b/docs/guide-ru/concept-service-locator.md index 1c6ab96f762..ce48c191608 100644 --- a/docs/guide-ru/concept-service-locator.md +++ b/docs/guide-ru/concept-service-locator.md @@ -2,7 +2,7 @@ Service Locator ============= Service Locator является объектом, предоставляющим всевозможные сервисы (или компоненты), которые могут понадобиться -приложению. В Service Locator, каждый компонент представлен единственным экземпляром, имеющим уникальный ID. +приложению. В Service Locator каждый компонент представлен единственным экземпляром, имеющим уникальный ID. Уникальный идентификатор (ID) может быть использован для получения компонента из Service Locator. В Yii Service Locator является экземпляром класса [[yii\di\ServiceLocator]] или его дочернего класса. @@ -50,7 +50,7 @@ $cache = $locator->get('cache'); $cache = $locator->cache; ``` -Как видно выше, [[yii\di\ServiceLocator]] позволяет обратиться к компоненту как к свойству используя его ID. +Как видно выше, [[yii\di\ServiceLocator]] позволяет обратиться к компоненту как к свойству, используя его ID. При первом обращении к компоненту, [[yii\di\ServiceLocator]] создаст новый экземпляр компонента на основе регистрационной информации и вернёт его. При повторном обращении к компоненту Service Locator вернёт тот же экземпляр. @@ -88,7 +88,7 @@ return [ ``` Есть альтернативный приведённому выше способ настройки компонента `search`. Вместо анонимной функции, которая -отдаёт экземпляр `SolrService` можно использовать статический метод, возвращающий такую анонимную функцию: +отдаёт экземпляр `SolrService`, можно использовать статический метод, возвращающий такую анонимную функцию: ```php class SolrServiceBuilder @@ -112,7 +112,7 @@ return [ ]; ``` -Это особенно полезно если вы создаёте компонент для Yii, являющийся обёрткой над какой-либо сторонней библиотекой. +Это особенно полезно, если вы создаёте компонент для Yii, являющийся обёрткой над какой-либо сторонней библиотекой. Подобный приведённому выше статический метод позволяет скрыть от конечного пользователя сложную логику настройки сторонней библиотеки. Пользователю будет достаточно вызвать статический метод. From 498b4aa38ebb552a3ea185d2dfc5d4b378966455 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 00:10:34 +0300 Subject: [PATCH 067/902] Russian translation: improvements of test-fixtures (#16226) [skip ci] --- docs/guide-ru/test-fixtures.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/guide-ru/test-fixtures.md b/docs/guide-ru/test-fixtures.md index 0d4f36d49f8..01e32ff5857 100644 --- a/docs/guide-ru/test-fixtures.md +++ b/docs/guide-ru/test-fixtures.md @@ -41,14 +41,14 @@ class UserFixture extends ActiveFixture > таблицу как через свойство [[yii\test\ActiveFixture::tableName]], так и через свойство [[yii\test\ActiveFixture::modelClass]]. > Если последнее, то в этом случае имя таблицы будет взято из модели `ActiveRecord`, указанной в `modelClass`. -> Note: [[yii\test\ActiveFixture]] используется только для реляционных баз данных. Для NoSQL решений Yii +> Note: [[yii\test\ActiveFixture]] используется только для реляционных баз данных. Для NoSQL-решений Yii > предоставляет следующие классы `ActiveFixture`: > -> - Mongo DB: [[yii\mongodb\ActiveFixture]] +> - MongoDB: [[yii\mongodb\ActiveFixture]] > - Elasticsearch: [[yii\elasticsearch\ActiveFixture]] (начиная с версии 2.0.2) -Данные для фикстуры `ActiveFixture` как правило находятся в файле `FixturePath/data/TableName.php`, -где `FixturePath` указывает на директорию в которой располагается файл класса фикстуры, а `TableName` имя таблицы +Данные для фикстуры `ActiveFixture`, как правило, находятся в файле `FixturePath/data/TableName.php`, +где `FixturePath` указывает на директорию, в которой располагается файл класса фикстуры, а `TableName` на имя таблицы, с которой она ассоциируется. Для примера выше, данные должны должны быть в файле `@app/tests/fixtures/data/user.php`. Данный файл должен вернуть массив данных для строк, которые будут вставлены в таблицу пользователей. Например @@ -73,7 +73,7 @@ return [ Вы можете задать псевдоним строке для того, чтобы в будущем вы могли ссылаться на нее в ваших тестах. В примере выше 2 строки имеют псевдонимы `user1` и `user2`, соответственно. -Также вам не нужно указывать данные для столбцов с авто-инкрементом. Yii автоматически заполнит значения данных столбцов +Также вам не нужно указывать данные для столбцов с автоинкрементом. Yii автоматически заполнит значения данных столбцов в момент загрузки фикстуры. > Tip: вы можете указать свой путь до файла данных через свойство [[yii\test\ActiveFixture::dataFile]]. @@ -99,7 +99,7 @@ class UserProfileFixture extends ActiveFixture будет автоматически загружена до `UserProfileFixture`, тем самым гарантируя существование всех внешних ключей, и будет выгружена после того как выгрузится `UserProfileFixture` по тем же причинам. -Выше мы показали как объявить фикстуру для таблицы базы данных. Для объявления фикстуры не связанной с базой данных (например, +Выше мы показали как объявить фикстуру для таблицы базы данных. Для объявления фикстуры, не связанной с базой данных (например, фикстуры для определенных файлов и директорий), вам следует унаследовать ее от класса [[yii\test\Fixture]] и переопределить методы [[yii\test\Fixture::load()|load()]] и [[yii\test\Fixture::unload()|unload()]]. @@ -179,7 +179,7 @@ foreach ($this->profiles as $row) ... фикстуры в методе [[yii\codeception\TestCase::globalFixtures()]], а не `fixtures()`. Когда тест-кейс загружает фикстуры, сначала загружаются глобальные фикстуры, затем все остальные. -По умолчанию, фикстура `InitDbFixture` уже обяъвлена в методе `globalFixtures()` класса [[yii\codeception\DbTestCase]]. +По умолчанию фикстура `InitDbFixture` уже обяъвлена в методе `globalFixtures()` класса [[yii\codeception\DbTestCase]]. Это означает, что вы должны работать только с файлом `@app/tests/fixtures/initdb.php`, если вы хотите чтобы перед каждым тестом выполнялись определенные подготовительные работы. В противном случае вы просто можете сфокусироваться на разработке конкретных тест-кейсов и соответствующих фикстур. @@ -188,7 +188,7 @@ foreach ($this->profiles as $row) ... Организация классов фикстур и файлов с данными ---------------------------------------------- -По умолчанию, классы фикстур ищут соответствующие файлы данных в директории `data`, которая является подпапкой папки, содержащей +По умолчанию классы фикстур ищут соответствующие файлы данных в директории `data`, которая является подпапкой папки, содержащей файлы классов фикстур. Вы можете следовать этому соглашению при работе над простыми проектами. Есть вероятность, что на больших проектах вам потребуется менять набор данных для одного и того же класса фикстур в разных тестах. Таким образом, мы рекомендуем вам организовать файлы данных иерархически, подобно пространству имен ваших классов. Например, @@ -230,7 +230,7 @@ data\ 1. Используйте команду `yii migrate` для обновления тестовой БД до последней версии; 2. Выполнить тест-кейс: - - Загрузка фикстур: очищение соответствующих таблиц БД и заполнение их данными фикстур; + - Загрузка фикстур: очистка соответствующих таблиц БД и заполнение их данными фикстур; - Выполнение теста; - Выгрузка фикстур. 3. Повторение шага 2 до тех пор, пока не выполнятся все тесты. @@ -308,7 +308,7 @@ yii fixture/load // загрузить фикстуру `User` yii fixture/load User -// тоже что и выше, т.к. "load" является действие по умолчанию для команды "fixture" +// то же что и выше, т.к. "load" является действие по умолчанию для команды "fixture" yii fixture User // загрузить нескольких фикстур @@ -317,7 +317,7 @@ yii fixture "User, UserProfile" // загрузить все фикстуры yii fixture/load "*" -// тоже что и выше +// то же что и выше yii fixture "*" // загрузить все фикстуры кроме указанной @@ -338,7 +338,7 @@ yii fixture User --globalFixtures='some\name\space\Custom' Для выгрузки фикстур выполните следующую команду: ``` -// выгрузить фикстуру `Users`, по умолчанию будут удалены все данные из таблицы "users", или из коллекции "users" если это фикстура mongodb +// выгрузить фикстуру `Users`, по умолчанию будут удалены все данные из таблицы "users" или из коллекции "users", если это фикстура mongodb yii fixture/unload User // выгрузить несколько фикстур From be189c35e9d8a06f3c87286595a5adbf4f13dbce Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 01:43:39 +0300 Subject: [PATCH 068/902] Russian translation: improvements of runtime-logging (#16230) [skip ci] --- docs/guide-ru/runtime-logging.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/guide-ru/runtime-logging.md b/docs/guide-ru/runtime-logging.md index 84390daff66..f6c45aa2467 100644 --- a/docs/guide-ru/runtime-logging.md +++ b/docs/guide-ru/runtime-logging.md @@ -1,14 +1,14 @@ Логгирование ============ -Yii предоставляет мощную, гибко настраиваемую и легко расширяемую систему логгирования. Эта система логгирования позволяет удобным способом сохранять сообщения разных типов и фильтровать их. Сообщения могут быть сохранены в файлы, базы данных или отправлены на email. +Yii предоставляет мощную, гибко настраиваемую и легко расширяемую систему логирования. Эта система логирования позволяет удобным способом сохранять сообщения разных типов и фильтровать их. Сообщения могут быть сохранены в файлы, базы данных или отправлены на email. -Использование Системы логгирования Yii включает следующие шаги: +Использование Системы логирования Yii включает следующие шаги: * Запись [сообщений лога](#log-messages) в различных частях кода приложения; * Настройка [целей лога](#log-targets) в конфигурации приложения; * Изучение отфильтрованных сообщений лога, например, при помощи [Отладчика Yii](tool-debugger.md). -В данном разделе, будем рассматривать первые два шага. +В данном разделе будем рассматривать первые два шага. ## Сообщения лога @@ -25,9 +25,9 @@ Yii предоставляет мощную, гибко настраиваему Yii::debug('start calculating average revenue'); ``` -> Note: Сообщение может быть как строкой так и объектом или массивом. За корректную работу с содержимым сообщения отвечают [цели лога](#log-targets). По умолчанию, если сообщение не является строкой, оно будет приведено к строковому типу при помощи [[yii\helpers\VarDumper::export()]]. +> Note: Сообщение может быть как строкой, так и объектом или массивом. За корректную работу с содержимым сообщения отвечают [цели лога](#log-targets). По умолчанию, если сообщение не является строкой, оно будет приведено к строковому типу при помощи [[yii\helpers\VarDumper::export()]]. -Для упрощения работы с сообщениями лога и их фильтрации, рекомендуется явно указывать подходящую категорию для каждого сообщения. Возможно использование иерархической системы именования категорий, что значительно упростит [целям лога](#log-targets) фильтрацию сообщений по категориям. Простым и эффективным способом именования категорий является использование магической PHP константы `__METHOD__`. Такой подход используется в ядре фреймворка Yii. Например, +Для упрощения работы с сообщениями лога и их фильтрации, рекомендуется явно указывать подходящую категорию для каждого сообщения. Возможно использование иерархической системы именования категорий, что значительно упростит [целям лога](#log-targets) фильтрацию сообщений по категориям. Простым и эффективным способом именования категорий является использование магической PHP-константы `__METHOD__`. Такой подход используется в ядре фреймворка Yii. Например, ```php Yii::debug('начало вычисления среднего дохода', __METHOD__); @@ -35,7 +35,7 @@ Yii::debug('начало вычисления среднего дохода', __ Константа `__METHOD__` вычисляется как имя метода (включая полное имя класса), в котором она использована. Например, её значение будет вычислено как `'app\controllers\RevenueController::calculate'`, если показанный выше код вызывается в соответствующем методе. -> Info: методы логгирования, описанные выше являются, на самом деле, ярлыками для метода [[yii\log\Logger::log()|log()]] [[yii\log\Logger|объекта логгера]], который доступен как синглтон `Yii::getLogger()`. +> Info: методы логирования, описанные выше являются, на самом деле, ярлыками для метода [[yii\log\Logger::log()|log()]] [[yii\log\Logger|объекта логгера]], который доступен как синглтон `Yii::getLogger()`. При определенном количестве записанных сообщений или завершении приложения, объект логгера вызывает [[yii\log\Dispatcher|message dispatcher]] для отправки записанных сообщений зарегистрированным [целям логов](#log-targets). @@ -129,7 +129,7 @@ return [ ] ``` -> Note: При обработке HTTP исключения [обработчиком ошибок](runtime-handling-errors.md), сообщение будет сохранено с категорией вида `yii\web\HttpException:ErrorCode`. Например, исключение [[yii\web\NotFoundHttpException]] вызовет сообщение об ошибке с категорией `yii\web\HttpException:404`. +> Note: При обработке HTTP-исключения [обработчиком ошибок](runtime-handling-errors.md), сообщение будет сохранено с категорией вида `yii\web\HttpException:ErrorCode`. Например, исключение [[yii\web\NotFoundHttpException]] вызовет сообщение об ошибке с категорией `yii\web\HttpException:404`. ### Форматирование сообщений @@ -160,7 +160,7 @@ return [ ``` Кроме префиксов сообщений, также возможно добавление общей информации для каждого набора сообщений лога. -По умолчанию, включаются значения следующих глобальных PHP переменных: `$_GET`, `$_POST`, `$_FILES`, `$_COOKIE`, +По умолчанию включаются значения следующих глобальных PHP-переменных: `$_GET`, `$_POST`, `$_FILES`, `$_COOKIE`, `$_SESSION` и `$_SERVER`. Эта возможность настраивается при помощи свойства [[yii\log\Target::logVars]], содержащего массив имен переменных, которые необходимо включить в лог. Например, следующий код позволяет настроить цель логов так, чтобы к сообщениям присоединялось только содержимое переменной `$_SERVER`. ```php @@ -222,7 +222,7 @@ return [ ] ``` -Из-за того, что значения максимального количества сообщений для передачи и выгрузки по умолчанию достаточно велико, при вызове метода `Yii::debug()`, или любого другого метода логгирования, сообщение не появится сразу в файле или таблице базы данных. Такое поведение может стать проблемой, например, в консольных приложениях с большим временем исполнения. Для того, чтобы все сообщения логов сразу же попадали в лог, необходимо установить значения свойств [[yii\log\Dispatcher::flushInterval|flushInterval]] и [[yii\log\Target::exportInterval|exportInterval]] равными 1, например так: +Из-за того, что значения максимального количества сообщений для передачи и выгрузки по умолчанию достаточно велико, при вызове метода `Yii::debug()` или любого другого метода логирования, сообщение не появится сразу в файле или таблице базы данных. Такое поведение может стать проблемой, например, в консольных приложениях с большим временем исполнения. Для того, чтобы все сообщения логов сразу же попадали в лог, необходимо установить значения свойств [[yii\log\Dispatcher::flushInterval|flushInterval]] и [[yii\log\Target::exportInterval|exportInterval]] равными 1, например так: ```php return [ @@ -246,7 +246,7 @@ return [ ### Переключение целей логов -Свойство [[yii\log\Target::enabled|enabled]] отвечает за включение или отключение цели логов. Возможно управлением этим свойством как в конфигурации приложения, так и при помощи следующего PHP кода: +Свойство [[yii\log\Target::enabled|enabled]] отвечает за включение или отключение цели логов. Возможно управлением этим свойством как в конфигурации приложения, так и при помощи следующего PHP-кода: ```php Yii::$app->log->targets['file']->enabled = false; @@ -275,7 +275,7 @@ return [ ### Создание новых целей -Создание новой цели логов не является сложной задачей. В общем случае, нужно реализовать метод [[yii\log\Target::export()]], выгружающий массив [[yii\log\Target::messages]] в место хранения логов. Возможно использование метода [[yii\log\Target::formatMessage()]] для форматирования сообщения. Детали реализации можно подсмотреть в исходном коде любого из классов целей логов, включенных в состав Yii. +Создание новой цели логов не является сложной задачей. В общем случае нужно реализовать метод [[yii\log\Target::export()]], выгружающий массив [[yii\log\Target::messages]] в место хранения логов. Возможно использование метода [[yii\log\Target::formatMessage()]] для форматирования сообщения. Детали реализации можно подсмотреть в исходном коде любого из классов целей логов, включенных в состав Yii. ## Профилирование производительности From 2f78baff6ce6cb84ccc646d587fed4bcb4ac3c84 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 01:44:09 +0300 Subject: [PATCH 069/902] Russian translation: improvements of runtime-routing (#16229) [skip ci] --- docs/guide-ru/runtime-routing.md | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/guide-ru/runtime-routing.md b/docs/guide-ru/runtime-routing.md index 83ad2f12e20..846bd8f7152 100644 --- a/docs/guide-ru/runtime-routing.md +++ b/docs/guide-ru/runtime-routing.md @@ -39,7 +39,7 @@ $url = Url::to(['post/view', 'id' => 100]); - Обычный. - Человекопонятные URL. -Обычный формат URL использует параметр `r` для передачи маршрута и любые другие параметры для передачи остальных параметров запроса. Например, URL `/index.php?r=post/view&id=100` задает маршрут `post/view` и параметр `id`, равный 100. Данный формат не требует специальной конфигурации [[yii\web\UrlManager|URL manager]] и работает с любыми настройками Веб сервера. +Обычный формат URL использует параметр `r` для передачи маршрута и любые другие параметры для передачи остальных параметров запроса. Например, URL `/index.php?r=post/view&id=100` задает маршрут `post/view` и параметр `id`, равный 100. Данный формат не требует специальной конфигурации [[yii\web\UrlManager|URL manager]] и работает с любыми настройками веб-сервера. Человекопонятный формат URL представляет собой дополнительный путь, следующий за именем входного скрипта, описывающий маршрут и остальные параметров запроса. Например, дополнительный путь в URL `/index.php/post/100` - это `/post/100`, который может представлять маршрут `post/view` и параметр `id` со значением равным 100, при наличии соответствующего [[yii\web\UrlManager::rules|правила]]. Для использования ЧПУ, необходимо создать набор правил, соответствующих требованиям к URL. @@ -128,7 +128,7 @@ echo Url::to(['post/index'], 'https'); Обратите внимание, что в последнем примере подразумевается использование обычного формата URL. При использовании ЧПУ, будут созданы другие URL, соответствующие [[yii\web\UrlManager::rules|правилам создания URL]]. -Маршрут, переданный методу [[yii\helpers\Url::to()]], является контекстно зависимым. Он может быть *относительным* или *абсолютным*, в зависимости от следующих правил: +Маршрут, переданный методу [[yii\helpers\Url::to()]], является контекстно-зависимым. Он может быть *относительным* или *абсолютным*, в зависимости от следующих правил: - Если маршрут является пустой строкой, будет использован текущий [[yii\web\Controller::route|маршрут]]; - Если маршрут не содержит слешей вообще, он рассматривается как *идентификатор* действия текущего контроллера и будет дополнен значением [[\yii\web\Controller::uniqueId|uniqueId]] текущего контроллера в качестве префикса; @@ -159,7 +159,7 @@ echo Url::to(['@posts']); В основе реализации метода [[yii\helpers\Url::to()]] лежит использование двух методов компонента [[yii\web\UrlManager|URL manager]]: [[yii\web\UrlManager::createUrl()|createUrl()]] и [[yii\web\UrlManager::createAbsoluteUrl()|createAbsoluteUrl()]]. Ниже будут рассмотрены способы конфигурации [[yii\web\UrlManager|URL manager]] для создания URL в различных форматах. -Метод [[yii\helpers\Url::to()]], так же, поддерживает создание URL не связанных с маршрутами приложения. +Метод [[yii\helpers\Url::to()]] также поддерживает создание URL, не связанных с маршрутами приложения. В данном случае, нужно передать в качестве первого параметра строку, а не массив. Например, ```php @@ -185,7 +185,7 @@ use yii\helpers\Url; echo Url::home(); // базовый URL, удобно использовать в случае, когда приложение расположено в подкаталоге -// относительно корневого каталога Веб сервера +// относительно корневого каталога веб-сервера echo Url::base(); // канонический URL запрошенного URL @@ -217,13 +217,13 @@ echo Url::previous(); ``` Свойство [[yii\web\UrlManager::enablePrettyUrl|enablePrettyUrl]] является ключевым, активирует формат ЧПУ. -Остальные свойства не обязательные. Однако, в примере выше, показан самый популярный вариант конфигурации ЧПУ. +Остальные свойства необязательные. Однако в примере выше показан самый популярный вариант конфигурации ЧПУ. * [[yii\web\UrlManager::showScriptName|showScriptName]]: это свойство определяет необходимость включения имени входного скрипта в создаваемый URL. Например, при его значении `false`, вместо `/index.php/post/100`, будет сгенерирован URL `/post/100`. * [[yii\web\UrlManager::enableStrictParsing|enableStrictParsing]]: это свойство позволяет включить строгий разбор URL. Если строгий разбор URL включен, запрошенный URL должен соответствовать хотя бы одному из [[yii\web\UrlManager::rules|правил]], иначе будет вызвано исключение [[yii\web\NotFoundHttpException]]. Если строгий разбор URL отключен и ни одно из [[yii\web\UrlManager::rules|правил]] не подходит для разбора запрошенного URL, часть этого URL, представляющая путь, будет использована как маршрут. -* [[yii\web\UrlManager::rules|rules]]: это свойство содержит набор правил для разбора и создания URL. Это основное свойство, с которым нужно работать, что бы URL создавались в формате, соответствующем требованиям приложения. +* [[yii\web\UrlManager::rules|rules]]: это свойство содержит набор правил для разбора и создания URL. Это основное свойство, с которым нужно работать, чтобы URL создавались в формате, соответствующем требованиям приложения. -> Note: Для того, чтобы скрыть имя входного скрипта в создаваемых URL, кроме установки значения свойства [[yii\web\UrlManager::showScriptName|showScriptName]] в `false`, необходимо настроить Веб сервер, чтобы он мог правильно определять PHP скрипт, который должен быть запущен, если в запрошенном URL он не указан явно. Рекомендованные настройки для Apache и Nginx описаны в разделе [Установка Yii](start-installation.md#rekomenduemye-nastrojki-apache). +> Note: Для того, чтобы скрыть имя входного скрипта в создаваемых URL, кроме установки значения свойства [[yii\web\UrlManager::showScriptName|showScriptName]] в `false`, необходимо настроить веб-сервер, чтобы он мог правильно определять PHP-скрипт, который должен быть запущен, если в запрошенном URL он не указан явно. Рекомендованные настройки для Apache и Nginx описаны в разделе [Установка Yii](start-installation.md#rekomenduemye-nastrojki-apache). ### Правила URL @@ -262,7 +262,7 @@ echo Url::previous(); Правило URL может содержать несколько именованных параметров запроса, которые указываются в шаблоне в следующем формате: ``, где `ParamName` определяет имя параметра, а `RegExp` - необязательное регулярное выражение, используемое для определения значения параметра. В случае, если `RegExp` не указан, значением параметра будет любая последовательность символов кроме слешей. -> Note: Возможно указание только регулярного выражения для параметров. В таком случае, остальная часть шаблона будет считаться простым текстом. +> Note: Возможно указание только регулярного выражения для параметров. В таком случае остальная часть шаблона будет считаться простым текстом. После разбора URL, параметры запроса, соответствующие шаблону правила, будут доступны в массиве `$_GET` через компонент приложения `request`. При создании URL, значения указанных параметров будут вставлены в URL в соответствии с шаблоном правила. @@ -311,7 +311,7 @@ echo Url::previous(); > Note: Использование параметров в маршрутах позволяет значительно уменьшить количество правил URL и улучшить производительность компонента [[yii\web\UrlManager|URL manager]]. -По умолчанию, все параметры, указанные в правиле, являются обязательными. Если запрошенный URL не содержит обязательный параметр, или если URL создается без обязательного параметра, данное правило не будет применено. Свойство [[yii\web\UrlRule::defaults]] позволяет сделать нужные параметры не обязательными. Параметры, перечисленные в данном свойстве, будут иметь заданные значения, в случае если они пропущены. +По умолчанию все параметры, указанные в правиле, являются обязательными. Если запрошенный URL не содержит обязательный параметр, или если URL создается без обязательного параметра, данное правило не будет применено. Свойство [[yii\web\UrlRule::defaults]] позволяет сделать нужные параметры не обязательными. Параметры, перечисленные в данном свойстве, будут иметь заданные значения, в случае если они пропущены. В следующем правиле описаны необязательные параметры `page` и `tag`, которые примут значения `1` и `пустая строка` в случае, если они будут пропущены. @@ -338,7 +338,7 @@ echo Url::previous(); ### Правила с именами серверов -Существует возможность включать имена серверов в шаблон правил URL. Главным образом, это удобно, когда требуется разное поведение приложения, в зависимости от разных имен Веб серверов. Например, следующее правило позволит разобрать URL `http://admin.example.com/login` в маршрут `admin/user/login` и `http://www.example.com/login` в `site/login`. +Существует возможность включать имена серверов в шаблон правил URL. Главным образом, это удобно, когда требуется разное поведение приложения, в зависимости от разных имен веб-серверов. Например, следующее правило позволит разобрать URL `http://admin.example.com/login` в маршрут `admin/user/login` и `http://www.example.com/login` в `site/login`. ```php [ @@ -359,7 +359,7 @@ echo Url::previous(); ### Суффиксы в URL -Компонент предоставляет возможность добавления к URL суффиксов. Например, можно добавить к URL `.html`, что бы они выглядели как статические HTML страницы; можно добавить к URL суффикс `.json`, для указания на ожидаемый тип данных ответа. Настроить суффиксы в URL можно при помощи соответствующего свойства [[yii\web\UrlManager::suffix]] в конфигурации приложения: +Компонент предоставляет возможность добавления к URL суффиксов. Например, можно добавить к URL `.html`, чтобы они выглядели как статические HTML-страницы; можно добавить к URL суффикс `.json`, для указания на ожидаемый тип данных ответа. Настроить суффиксы в URL можно при помощи соответствующего свойства [[yii\web\UrlManager::suffix]] в конфигурации приложения: ```php [ @@ -413,7 +413,7 @@ echo Url::previous(); что позволяет справиться с вариациями одного и того же URL с присутствующим или отсутствующим слешем в конце. Технически `http://example.com/path` и `http://example.com/path/` являются разными URL, отдача одинакового содержимого в обоих вариантах может негативно повлиять на SEO. По умолчанию нормализатор заменяет повторяющиеся слеши на один и либо -убирает, либо добавляет завершающие слеши в зависимости от суффикса и производит [редирект 301](https://en.wikipedia.org/wiki/HTTP_301) +убирает, либо добавляет завершающие слеши в зависимости от суффикса и производит [редирект 301](https://ru.wikipedia.org/wiki/HTTP_301) на нормализованный URL. Нормализатор может быть настроен как глобально для менеджера URL, так и индивидуально для каждого правила. По умолчанию все правила используют нормализатор, заданный в менеджере URL. Вы можете выставить [[yii\web\UrlRule::$normalizer|UrlRule::$normalizer]] в `false` для отключения нормализации для конкретного правила. @@ -456,9 +456,9 @@ echo Url::previous(); > Note: по умолчанию [[yii\web\UrlManager::$normalizer|UrlManager::$normalizer]] отключен. Чтобы использовать нормализацию его необходимо сконфигурировать. -### HTTP методы +### Методы HTTP -При реализации RESTful API, зачастую бывает необходимость в том, чтобы один и тот же URL был разобран в разные маршруты, в зависимости от HTTP метода запроса. Это легко достигается указанием HTTP методов, поддерживаемых правилом в начале шаблона. Если правило поддерживает несколько HTTP методов, их имена разделяются запятыми. Например, следующие правила имеют шаблон `post/` с разными поддерживаемыми HTTP методами. Запрос `PUT post/100` будет разобран в маршрут `post/create`, в то время, как запрос `GET post/100` будер разобран в `post/view`. +При реализации RESTful API, зачастую бывает необходимость в том, чтобы один и тот же URL был разобран в разные маршруты, в зависимости от HTTP-метода запроса. Это легко достигается указанием HTTP-методов, поддерживаемых правилом в начале шаблона. Если правило поддерживает несколько HTTP-методов, их имена разделяются запятыми. Например, следующие правила имеют шаблон `post/` с разными поддерживаемыми HTTP-методами. Запрос `PUT post/100` будет разобран в маршрут `post/create`, в то время, как запрос `GET post/100` будер разобран в `post/view`. ```php [ @@ -468,7 +468,7 @@ echo Url::previous(); ] ``` -> Note: Если правило URL содержит HTTP метод в шаблоне, это правило будет использовано только при разборе URL. Такое правило не будет учитываться компонентом [[yii\web\UrlManager|URL manager]] при создании URL. +> Note: Если правило URL содержит HTTP-метод в шаблоне, это правило будет использовано только при разборе URL. Такое правило не будет учитываться компонентом [[yii\web\UrlManager|URL manager]] при создании URL. > Tip: Для упрощения маршрутизации RESTful API, Yii предоставляет специальный класс [[yii\rest\UrlRule]], который достаточно эффективен и предоставляет такие удобные возможности, как автоматическое приведение идентификаторов контроллеров к множественной форме. Более подробную информацию можно найти в разделе Веб-сервисы REST [Роутинг](rest-routing.md). @@ -489,12 +489,12 @@ echo Url::previous(); ] ``` -> Info: По умолчанию, если в конфигурации правила явно незадан параметр `class`, будет создано правило класса [[yii\web\UrlRule]]. +> Info: По умолчанию, если в конфигурации правила явно не задан параметр `class`, будет создано правило класса [[yii\web\UrlRule]]. ### Добавление правил URL динамически -Правила URL могут быть динамически добавлены в компонент [[yii\web\UrlManager|URL manager]]. Часто это необходимо подключаемым [модулям](structure-modules.md) для настройки своих правил URL. Для того, что бы динамически добавленные правила могли влиять на процесс роутинга, они должны быть добавлены в процессе [предзагрузки](runtime-bootstrapping.md). В частности, модули должны реализовываться интерфейс [[yii\base\BootstrapInterface]] и добавлять правила в методе [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]], например: +Правила URL могут быть динамически добавлены в компонент [[yii\web\UrlManager|URL manager]]. Часто это необходимо подключаемым [модулям](structure-modules.md) для настройки своих правил URL. Для того чтобы динамически добавленные правила могли влиять на процесс роутинга, они должны быть добавлены в процессе [предзагрузки](runtime-bootstrapping.md). В частности, модули должны реализовываться интерфейс [[yii\base\BootstrapInterface]] и добавлять правила в методе [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]], например: ```php public function bootstrap($app) @@ -505,7 +505,7 @@ public function bootstrap($app) } ``` -Так же, необходимо включить данный модуль в [[yii\web\Application::bootstrap]], чтобы он смог участвовать в процессе [предзагрузки](runtime-bootstrapping.md). +Также необходимо включить данный модуль в [[yii\web\Application::bootstrap]], чтобы он смог участвовать в процессе [предзагрузки](runtime-bootstrapping.md). ### Создание классов правил @@ -564,7 +564,7 @@ class CarUrlRule extends BaseObject implements UrlRuleInterface ## Производительность -При разработке сложных Веб приложений, важно оптимизировать правила URL так, чтобы разбор запросов и создание URL занимали минимальное время. +При разработке сложных веб-приложений, важно оптимизировать правила URL так, чтобы разбор запросов и создание URL занимали минимальное время. Использование параметров в маршрутах позволяет уменьшить количество правил, что значительно увеличивает производительность. From f4caae8dcace91abbbc0b10e27f27c4675e312e8 Mon Sep 17 00:00:00 2001 From: Dmitry Naumenko Date: Sat, 5 May 2018 08:30:25 +0300 Subject: [PATCH 070/902] CHANGELOG updated [ci skip] --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a970267050b..e75424e7ef8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -16,7 +16,7 @@ Yii Framework 2 Change Log - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) - Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) -- Bug #16191: Fixed `yii\helpers\Inflector::camel2words()` to work with UTF-8 (silverfire) +- Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) 2.0.15.1 March 21, 2018 From 02d3f8a2e9c167d417e19c5f2858257f69836eac Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Sat, 5 May 2018 08:32:43 +0300 Subject: [PATCH 071/902] PHPDocs updated [skip ci] --- framework/helpers/BaseInflector.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/helpers/BaseInflector.php b/framework/helpers/BaseInflector.php index ab822815552..5b640a62065 100644 --- a/framework/helpers/BaseInflector.php +++ b/framework/helpers/BaseInflector.php @@ -612,8 +612,8 @@ private static function encoding() /** * The same as built-in `ucfirst`, but unicode-safe * - * @param $string - * @param $encoding + * @param string $string + * @param string $encoding * @return string */ private static function mb_ucfirst($string, $encoding) From 183c555a6f2967c613e731064b50a59bb0fc07af Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 10:24:27 +0300 Subject: [PATCH 072/902] Russian translation: improvements of concept-configurations (#16232) [skip ci] --- docs/guide-ru/concept-configurations.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guide-ru/concept-configurations.md b/docs/guide-ru/concept-configurations.md index 0dac8fedfea..360ef1f4314 100644 --- a/docs/guide-ru/concept-configurations.md +++ b/docs/guide-ru/concept-configurations.md @@ -4,7 +4,7 @@ Конфигурации широко используются в Yii при создании новых объектов или при инициализации уже существующих объектов. Обычно конфигурации включают в себя названия классов создаваемых объектов и список первоначальных значений, которые должны быть присвоены [свойствам](concept-properties.md) объекта. Также в конфигурациях можно указать список -[обработчиков событий](concept-events.md) объекта, и/или список [поведений](concept-behaviors.md) объекта. +[обработчиков событий](concept-events.md) объекта и/или список [поведений](concept-behaviors.md) объекта. Пример конфигурации подключения к базе данных и дальнейшей инициализации подключения: @@ -80,7 +80,7 @@ Yii::configure($object, $config); ## Использование конфигурации Конфигурации повсеместно используются в Yii. В самом начале данной главы мы узнали как -создать объект с необходимыми параметрами используя метод [[Yii::createObject()]]. +создать объект с необходимыми параметрами, используя метод [[Yii::createObject()]]. В данном разделе речь пойдет о конфигурации приложения и конфигурациях виджетов — двух основных способов использования конфигурации. @@ -155,15 +155,15 @@ $config = [ ``` Чтобы узнать о возможных значениях `definitions` и `singletons`, а также о реальных примерах использования, -прочитайте подраздел [более сложное практическое применение](concept-di-container.md#advanced-practical-usage) раздела -[Dependency Injection Container](concept-di-container.md). +прочитайте подраздел [Более сложное практическое применение](concept-di-container.md#advanced-practical-usage) раздела +[Контейнер внедрения зависимостей](concept-di-container.md). ### Конфигурации виджетов При использовании [виджетов](structure-widgets.md) часто возникает необходимость изменить параметры виджета с помощью конфигурации. Для создания виджета можно использовать два метода: [[yii\base\Widget::widget()]] и -[[yii\base\Widget::begin()]]. Оба метода принимают конфигурацию в виде PHP массива: +[[yii\base\Widget::begin()]]. Оба метода принимают конфигурацию в виде PHP-массива: ```php use yii\widgets\Menu; @@ -181,13 +181,13 @@ echo Menu::widget([ Данный код создает виджет `Menu` и устанавливает параметр виджета `activeItems` в значение `false`. Также устанавливается параметр `items`, состоящий из элементов меню. -Обратите внимание что параметр `class` НЕ передается, так как полное имя уже указано. +Обратите внимание, что параметр `class` НЕ передается, так как полное имя уже указано. ## Конфигурационные файлы -Если конфигурация очень сложная, то её, как правило, разделяют по нескольким PHP файлам. Такие файлы называют -*Конфигурационными файлами*. Конфигурационный файл возвращает массив PHP являющийся конфигурацией. +Если конфигурация очень сложная, то её, как правило, разделяют по нескольким PHP-файлам. Такие файлы называют +*конфигурационными файлами*. Конфигурационный файл возвращает массив PHP, являющийся конфигурацией. Например, конфигурацию приложения можно хранить в отдельном файле `web.php`, как показано ниже: ```php @@ -240,7 +240,7 @@ $config = require 'path/to/web.php'; ## Значения конфигурации по умолчанию -Метод [[Yii::createObject()]] реализован с использованием [dependency injection container](concept-di-container.md). +Метод [[Yii::createObject()]] реализован с использованием [контейнера внедрения зависимостей](concept-di-container.md). Это позволяет задавать так называемые *значения конфигурации по умолчанию*, которые будут применены ко ВСЕМ экземплярам классов во время их инициализации методом [[Yii::createObject()]]. Значения конфигурации по умолчанию указываются с помощью метода `Yii::$container->set()` на этапе [предварительной загрузки](runtime-bootstrapping.md). Например, если мы хотим изменить виджет [[yii\widgets\LinkPager]] так, чтобы все виджеты данного вида показывали максимум From 2c1d93e1eb15f0c1ec45c7fc98b0607f4e37b4f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Phan=20Xu=C3=A2n=20D=C5=A9ng?= Date: Sat, 5 May 2018 14:25:09 +0700 Subject: [PATCH 073/902] Update Vietnamese translate (#16231) [skip ci] * Strucure entry scripts Update * update struct application * update struct application * update struct application * update struct application components * update struct controller * update struct controller * update struct model * update structure model --- .../structure-application-components.md | 119 ++++ docs/guide-vi/structure-applications.md | 607 ++++++++++++++++++ docs/guide-vi/structure-controllers.md | 444 +++++++++++++ docs/guide-vi/structure-entry-scripts.md | 116 ++++ docs/guide-vi/structure-models.md | 529 +++++++++++++++ 5 files changed, 1815 insertions(+) create mode 100644 docs/guide-vi/structure-application-components.md create mode 100644 docs/guide-vi/structure-applications.md create mode 100644 docs/guide-vi/structure-controllers.md create mode 100644 docs/guide-vi/structure-entry-scripts.md create mode 100644 docs/guide-vi/structure-models.md diff --git a/docs/guide-vi/structure-application-components.md b/docs/guide-vi/structure-application-components.md new file mode 100644 index 00000000000..185bd064a3e --- /dev/null +++ b/docs/guide-vi/structure-application-components.md @@ -0,0 +1,119 @@ +Các thành phần ứng dụng +====================== + +Mỗi ứng dụng là hiện thực của [mẫu thiết kế Service Locators](concept-service-locator.md). Mỗi ứng dụng sẽ chứa các thành phần +được gọi là *thành phần ứng dụng* giúp cung cấp các dịch vụ cho các tiến trình xử lý. Chẳng hạn, +thành phần `urlManager` đảm nhiệm chức năng cho bộ định tuyến cho các yêu cầu xử lý tới các bộ điều khiển; +thành phần `db` cung cấp các dịch vụ để giao tiếp với cơ sở dữ liệu (CSDL); và các thành phần khác. + +Mỗi thành phần ứng dụng đều có một định danh ID giúp xác định thành phần duy nhất trong cùng một ứng dụng +. Bạn có thể truy cập vào các thành phần ứng dụng qua câu lệnh sau. + +```php +\Yii::$app->componentID +``` + +Ví dụ, sử dụng câu lệnh `\Yii::$app->db` để lấy thông tin [[yii\db\Connection|kết nối tới CSDL]], +và câu lệnh `\Yii::$app->cache` để lấy thông tin [[yii\caching\Cache|primary cache]] đã đăng ký trong ứng dụng. + +Mỗi thành phần ứng dụng được tạo một lần và được truy cập trong ứng dụng. Và có bất kỳ sự truy cập nào +sau đó đều trả về cùng một thể hiện của thành phần đó. + +Bất kỳ đối tượng nào cũng có thể là thành phần ứng dụng. Bạn có thể đăng ký chúng bằng việc thiết lập các +thuộc tính [[yii\base\Application::components]] vào trong [mục cấu hình ứng dụng](structure-applications.md#application-configurations). +Ví dụ, + +```php +[ + 'components' => [ + // Dung class để đăng ký thành phần "cache" + 'cache' => 'yii\caching\ApcCache', + + // Dùng mảng các tham số để đăng ký thành phần "db" + 'db' => [ + 'class' => 'yii\db\Connection', + 'dsn' => 'mysql:host=localhost;dbname=demo', + 'username' => 'root', + 'password' => '', + ], + + // Dùng hàm để đăng ký thành phần "search" + 'search' => function () { + return new app\components\SolrService; + }, + ], +] +``` + +> Lưu ý: Bạn cần đăng ký các thành phần ứng dụng một cách cẩn thận. + Các thành phần ứng dụng cũng như các biến có phạm vi toàn cục. Sử dụng quá nhiều các thành phần ứng dụng có thể khiến mã nguồn + khó kiểm tra và bảo trì. Cách tốt nhất, bạn nên khởi tạo các thành phần ở phạm vi cục bộ + và khi cần thiết có thể thêm vào ứng dụng. + + +## Thành phần tải tự động (Bootstrapping) + +Như đề cập ở trên, các thành phần ứng dụng chỉ được khởi tạo khi nó được truy cập vào lần đầu tiên. +Nếu thành phần không được truy cập tại các yêu cầu xử lý, thì sẽ không được khởi tạo. Tuy vậy , thỉnh thoảng, các thành phần ứng dụng +có thể được khởi tạo ở mỗi yêu cầu, thậm chí nó không được truy cập. +Để làm được như vậy, bạn cần liệt kê các định danh vào trong thuộc tinh [[yii\base\Application::bootstrap|bootstrap]] của ứng dụng application. + +Ví dụ, thông tin cấu hình sau sẽ chắc chắn rằng thành phần `log` luôn luôn được tải: + +```php +[ + 'bootstrap' => [ + 'log', + ], + 'components' => [ + 'log' => [ + // Các thiết lập cho thành phần "log" + ], + ], +] +``` + + +## Các thành phần ứng dụng chính + +Yii định nghĩa danh sách các thành phần ứng dụng chính cùng với nó là các định danh và thông tin cấu hình. Ví dụ, +thành phần [[yii\web\Application::request|request]] được dùng để lấy thông tin về các yêu cầu từ user +và xác minh rồi gửi tới các [bộ định tuyến (route)](runtime-routing.md); thành phần [[yii\base\Application::db|db]] +có chức năng thiết lập các kết nối và thông qua đó bạn có thể thực hiện các truy vấn vào CSDL. +Như vậy, các thành phần ứng dụng sẽ giúp ứng dụng Yii tiếp nhận các yêu cầu từ user. + +Phần dưới là danh sách các thành phần ứng dụng chính được xác định trước. Bạn cần phải cấu hình và tùy biến chúng +như những thành phần ứng dụng khác. Mỗi khi bạn cấu hình các thành phần này, +nếu bạn không xác định các class, thì giá trị mặc định sẽ được dùng. + +* [[yii\web\AssetManager|assetManager]]: quản lý các file tài nguyên (asset) được đóng gói và chia sẽ. + Tham khảo thêm mục [Quản lý các file tài nguyên](structure-assets.md) để biết thêm chi tiết. +* [[yii\db\Connection|db]]: thực hiện kết nối CSDL và dựa vào thành phần có thể thực hiện các câu lệnh truy vấn dữ liệu. + Lưu ý, khi bạn thiết lập thành phần này, bạn cần phải cung cấp các thông tin về các thuộc tính được yêu cầu + , như [[yii\db\Connection::dsn]]. + Tham khảo thêm tại mục [Data Access Objects](db-dao.md) để biết thêm thông tin. +* [[yii\base\Application::errorHandler|errorHandler]]: nắm giữ các ngoại lệ và lỗi của PHP. + Tham khảo thêm mục [Bắt lỗi](runtime-handling-errors.md) để biết thêm thông tin. +* [[yii\i18n\Formatter|formatter]]: định dạng dữ liệu mỗi khi gửi tới user. Ví dụ, các số có thể được + hiển thị cùng với các dấu ngăn cách phần ngàn, ngày có thể được định dạng ở dạng ngày dài. + Tham khảo thêm tại mục [Định dạng dữ liệu](output-formatting.md) để biết thêm thông tin. +* [[yii\i18n\I18N|i18n]]: hỗ trợ định dạng và dịch đa ngôn ngữ. + Tham khảo thêm tại mục [Internationalization](tutorial-i18n.md) để biết thêm thông tin. +* [[yii\log\Dispatcher|log]]: quản lý mục log. + Tham khảo thêm tại mục [Logging](runtime-logging.md) để biết thêm thông tin. +* [[yii\swiftmailer\Mailer|mail]]: hỗ trợ soạn thảo và gửi email. + Tham khảo thêm tại mục [Mailing](tutorial-mailing.md) để biết thêm thông tin.. +* [[yii\base\Application::response|response]]: represents the response being sent to end users. + Tham khảo thêm tại mục [Responses](runtime-responses.md) để biết thêm thông tin.. +* [[yii\base\Application::request|request]]: tiếp nhận các yêu cầu từ user. + Tham khảo thêm tại mục [Requests](runtime-requests.md) để biết thêm thông tin.. +* [[yii\web\Session|session]]: quản lý các phiên (session). Thành phần này chỉ được kích hoạt với + [[yii\web\Application|Ứng dụng Web]]. + Tham khảo thêm tại mục [Sessions and Cookies](runtime-sessions-cookies.md) để biết thêm thông tin.. +* [[yii\web\UrlManager|urlManager]]: xử lý thông tin về URL. + Tham khảo thêm tại mục [URL Parsing and Generation](runtime-routing.md) để biết thêm thông tin.. +* [[yii\web\User|user]]: giúp xác thực người dùng. Thành phần này chỉ được kích hoạt với + [[yii\web\Application|Ứng dụng Web]] + Tham khảo thêm tại mục [Xác thực (Authentication)](security-authentication.md) để biết thêm thông tin.. +* [[yii\web\View|view]]: hỗ trợ giao diện. + Tham khảo thêm tại mục[Views](structure-views.md) để biết thêm thông tin.. diff --git a/docs/guide-vi/structure-applications.md b/docs/guide-vi/structure-applications.md new file mode 100644 index 00000000000..6134fabe39d --- /dev/null +++ b/docs/guide-vi/structure-applications.md @@ -0,0 +1,607 @@ +Ứng dụng +============ + +Mỗi ứng dụng là một đối tượng giúp quản lý tổng thể cấu trúc và vòng đời của ứng dụng Yii. +Mỗi ứng dụng Yii đều chứa một đối tượng ứng dụng, đối tượng này được khởi tạo tại mục +[entry script](structure-entry-scripts.md) và đồng thời được truy cập qua biểu thức `\Yii::$app`. + +> Gợi ý: Phụ thuộc vào từng ngữ cảnh, có khi chúng ta gọi là "một application", có nghĩa là một đối tượng ứng dụng + hoặc một hệ thống ứng dụng. + +Có 2 kiểu ứng dụng: [[yii\web\Application|Ứng dụng Web]] và +[[yii\console\Application|ứng dụng giao diện dòng lệnh]]. Tương tự như vậy, ứng dụng Web xử lý với các yêu cầu về Web, +, ứng dụng còn lại sẽ xử lý với các yêu cầu ở giao diện dòng lệnh. + + +## Cấu hình ứng dụng + +Mỗi khi [entry script](structure-entry-scripts.md) tạo ứng dụng mới, nó sẽ tải thêm thông tin về +[cấu hình](concept-configurations.md) và gán vào trong ứng dụng, như sau: + +```php +require(__DIR__ . '/../vendor/autoload.php'); +require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); + +// tải các cấu hình ứng dụng +$config = require(__DIR__ . '/../config/web.php'); + +// gán cấu hình và khởi tạo ứng dụng +(new yii\web\Application($config))->run(); +``` + +Thông thường việc [cấu hình](concept-configurations.md), ứng dụng sẽ xác định làm thế nào để +khởi tạo các thuộc tính và đối tượng ứng dụng. Do việc cấu hình ứng dụng khá phức tạp nên vậy +, chúng thường được lưu giữ tại [các file cấu hình](concept-configurations.md#configuration-files), +như file `web.php` ở ví dụ trên. + + +## Các thuộc tính của ứng dụng + +Có nhiều thuộc tính quan trọng mà bạn cần phải cấu hình trong ứng dụng. Những thuộc tính này +thường được mô tả về môi trường mà ứng dụng đang chạy. Chẳng hạn, ứng dụng cần biết làm thế nào để tải các [controllers](structure-controllers.md), +nơi lưu trữ các file tạm, vv. Trong phần dưới này, chúng ta sẽ tổng hợp thông tin về thuộc tính. + + +### Thuộc tính bắt buộc + +Ở mỗi ứng dụng, bạn cần cấu hình ít nhất 2 thuộc tính là: [[yii\base\Application::id|id]] +và [[yii\base\Application::basePath|basePath]]. + + +#### [[yii\base\Application::id|id]] + +Thuộc tính [[yii\base\Application::id|id]] giúp đặc tả một định danh ID để phân biệt với các ứng dụng khác +. Thuộc tính chủ yếu được sử dụng trong chương trình. Mặc dù nó không được yêu cầu, để thích hợp cho khả năng tương tác +nên chỉ sử dụng các chữ cái chữ số khi mô tả một định danh của ứng dụng. + + +#### [[yii\base\Application::basePath|basePath]] + +Thuộc tính [[yii\base\Application::basePath|basePath]] dùng để mô tả thư mục gốc của ứng dụng. +Nó là thư mục chứa tất cả mã nguồn của ứng dụng. Bên trong thư mục, +bạn sẽ thấy các thư mục con như `models`, `views`, và `controllers`, các thư mục con này chứa các mã nguồn +tương ứng với các thành phần trong mô hình MVC. + +Bạn phải cấu hình thuộc tính [[yii\base\Application::basePath|basePath]] bằng sử dụng các đường dẫn trực tiếp +hoặc [một bí danh](concept-aliases.md). Trong các trường hợp, các thư mục tương ứng phải tồn tại, nếu không sẽ phát sinh ra lỗi +. Đường dẫn trực tiếp được lấy qua việc gọi hàm `realpath()` . + +Thuộc tính [[yii\base\Application::basePath|basePath]] thường được dùng để lấy được các đường dẫn quan trọng khác +(vd đường dẫn dành cho thực thi). Vì vậy, bí danh `@app` được xác định là đường dẫn gốc +. Các đường dẫn trong ứng dụng được lấy từ bí danh (vd `@app/runtime` tương ứng tới đường dẫn mục runtime). + + +### Các thuộc tính quan trọng + +Các thuộc tính được mô tả trong phần này thường cần được cấu hình bởi vì mỗi ứng dụng có +các thuộc tính khác nhau. + + +#### [[yii\base\Application::aliases|aliases]] + +Thuộc tính cho phép khai báo các [bí danh(aliases)](concept-aliases.md) vào trong một mảng. +Các khóa lưu trữ tên bí danh, và giá trị trong mảng tương ứng với đường dẫn được khai báo. +Ví dụ: + +```php +[ + 'aliases' => [ + '@name1' => 'path/to/path1', + '@name2' => 'path/to/path2', + ], +] +``` + +Thuộc tính này được cung cấp cho bạn việc khai báo các bí danh trong cấu hình ứng dụng thay vì gọi phương thức +[[Yii::setAlias()]]. + + +#### [[yii\base\Application::bootstrap|bootstrap]] + +Thuộc tính này khá quan trọng. Nó cung cấp cho bạn thông tin về mảng các thành phần (components) mà cần được +chạy trong suốt chu trình ứng dụng [[yii\base\Application::bootstrap()|bootstrapping process]]. +Ví dụ, nếu bạn muốn một [module](structure-modules.md) dùng để tùy biến các [URL](runtime-routing.md), +bạn có thể tùy biến các ID như phần tử trong các thuộc tính. + +Mỗi thành phần được liệt kê ra có thể khai báo một trong các định dạng sau: + +- một đinh danh về thành phần được tuân thủ qua [components](#components), +- một định danh về module tuân thủ theo quy định về [modules](#modules), +- một tên class, +- một mảng các cấu hình, +- một hàm dùng để khởi tạo và trả về một thành phần. + +Ví dụ: + +```php +[ + 'bootstrap' => [ + // một định danh về thành phần hoặc module + 'demo', + + // tên class + 'app\components\Profiler', + + // mảng cấu hình + [ + 'class' => 'app\components\Profiler', + 'level' => 3, + ], + + // hàm trả về một thành phần + function () { + return new app\components\Profiler(); + } + ], +] +``` + +> Lưu ý: Nếu định danh của module trùng với định danh của thành phần , ứng dụng sẽ sử dụng +> trong suốt tiền trình xử lý. Nếu bạn muốn chỉ sử dụng mỗi module, bạn cần lấy nó ở một hàm khác +> như sau: +> +> ```php +> [ +> function () { +> return Yii::$app->getModule('user'); +> }, +> ] +> ``` + + +Trong suốt quá trình xử lý, mỗi thành phần sẽ được khởi tạo. nếu lớp thành phần được hiện thực từ giao diện +[[yii\base\BootstrapInterface]], thì phương thức [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] +sẽ đồng thời được gọi. + +Một ví dụ khác trong việc cấu hình ứng dụng trong [Mẫu Basic Project](start-installation.md), +module `debug` và `gii` được cấu hình như những thành phần khi ứng dụng khởi chạy +ở môi trường phát triển: + +```php +if (YII_ENV_DEV) { + // cấu hình được thiết lập trong môi trường phát triển 'dev' + $config['bootstrap'][] = 'debug'; + $config['modules']['debug'] = 'yii\debug\Module'; + + $config['bootstrap'][] = 'gii'; + $config['modules']['gii'] = 'yii\gii\Module'; +} +``` + +> Lưu ý: Việc đưa quá nhiều các thành phần vào `bootstrap` sẽ làm giảm hiệu năng trong ứng dụng, bởi vì + mỗi khi có yêu cầu, các thành phần sẽ được chạy. Vì vậy việc sử dụng các thành phần cần sử dụng một cách khôn ngoan. + + +#### [[yii\web\Application::catchAll|catchAll]] + +Thuộc tính này chỉ được hỗ trợ với [[yii\web\Application| ứng dụng Web]]. Nó mô tả một + [hành động](structure-controllers.md) và nhận xử lý mọi yêu cầu. Thường được sử dụng mỗi khi +ứng dụng đang ở chế độ bảo trì và cần xử lý mọi yêu cầu được gửi tới. + +Thông tin được cấu hình bao gồm mảng và chứa thông tin về router và action. +Các thông tin mô tả các tham số (thông tin khóa-giá trị) để giới hạn các action. Ví dụ: + +```php +[ + 'catchAll' => [ + 'offline/notice', + 'param1' => 'value1', + 'param2' => 'value2', + ], +] +``` + + +#### [[yii\base\Application::components|components]] + +Đây là thuộc tính quan trọng nhất. Nó cho phép đăng ký danh sách cách component để sử dụng ở các mục khác +được gọi là [application components](structure-application-components.md). Ví dụ: + +```php +[ + 'components' => [ + 'cache' => [ + 'class' => 'yii\caching\FileCache', + ], + 'user' => [ + 'identityClass' => 'app\models\User', + 'enableAutoLogin' => true, + ], + ], +] +``` + +Mỗi thành phần ứng dụng đều xác định một mảng các thông tin chứa cặp key-value. Giá trị key đại diện cho định danh của thành phần, +trong khi đó value đại diện cho tên class hoặc thông tin về [cấu hình](concept-configurations.md). + +Bạn có thể đăng ký bất kỳ thành phần nào vào ứng dụng, và các thành phần có thể truy cập ở phạm vi toàn cục +qua biểu thức `\Yii::$app->componentID`. + +Xem thêm mục [Application Components](structure-application-components.md) để biết thêm thông tin. + + +#### [[yii\base\Application::controllerMap|controllerMap]] + +Thuộc tính này cho phép liên kết tới một định danh (ID) tới lớp của trình điều khiển. Mặc định, Yii sẽ liên kết +ID tới các lớp của trình điều khiển dựa trên [các nguyên tắc](#controllerNamespace) (chẳng hạn định danh ID của trình điều khiển `post` sẽ liên kết +tới lớp `app\controllers\PostController`). Bằng việc cấu hình những thuộc tính này, bạn có thay đổi các nguyên tắc này cho các trình điều khiển cụ thể +. Trong ví dụ sau, `account` sẽ được liên kết tới class +`app\controllers\UserController`, trong khi đó `article` sẽ liên kết tới class `app\controllers\PostController`. + +```php +[ + 'controllerMap' => [ + [ + 'account' => 'app\controllers\UserController', + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], + ], +] +``` + +Danh sách khóa của các thuộc tính trên đại diện cho ID của trình điều khiển, giá trị của mỗi khóa sẽ đại diện về thông tin +tên class của trình điều khiển hoặc [các thông tin về cấu hình](concept-configurations.md). + + +#### [[yii\base\Application::controllerNamespace|controllerNamespace]] + +Thuộc tính này xác định các thông tin tên lớp mặc định của trình điều khiển. Mặc định là +`app\controllers`. Nếu ID của trình điều khiển là `post`, theo quy ước thì tên class của trình điều khiển (không bao gồm +không gian tên) sẽ là `PostController`, và tên lớp đầy đủ sẽ là `app\controllers\PostController`. + +Các lớp trình điều khiển thường được lưu trữ ở thư mục con của thư mục chính các không gian tên. +Chẳng hạn, với ID của trình điều khiển `admin/post`, tương ứng với tên lớp đầy đủ sẽ là + `app\controllers\admin\PostController`. + +Điều này khá quan trọng vì các lớp điều khiển có thể được [tải tự động](concept-autoloading.md) +và các không gian tên của các lớp điều khiển sẽ khớp với giá trị của các thuộc tính. Nếu không thì, +bạn sẽ nhận thông báo lỗi "Không tìm thấy trang" khi truy cập vào ứng dụng. + +Trong trường hợp khác, nếu bạn muốn bỏ các quy ước này như mổ tả ở trên, bạn có thể tùy chỉnh lại các thuộc tính trong phần [controllerMap](#controllerMap). + + +#### [[yii\base\Application::language|language]] + +Thuộc tính này mô tả thông tin về ngôn ngữ trong mỗi ứng dụng và nội dung được hiển thị tới user. +Giá trị mặc định của thuộc tính là `en`, có nghĩa là tiếng Anh. Bạn có thể tùy chỉnh thuộc tính này +rằng nếu ứng dụng của bạn hỗ trợ đa ngôn ngữ . + +Giá trị của thuộc tính được xác định theo chuẩn [quốc tế hóa](tutorial-i18n.md), +bao gồm các thông tin, định dạng ngày giờ, số, vv. Ví dụ, widget [[yii\jui\DatePicker]] +sẽ sử dụng các giá trị thuộc tính qua việc xác định ngôn ngữ nào cần được hiển thị và định dạng ngày giờ như thế nào. + +Khuyến khích bạn xác định các ngôn ngữ dựa theo [IETF language tag](http://en.wikipedia.org/wiki/IETF_language_tag). +Ví dụ, `en` là chuẩn cho tiếng anh, trong khi đó `en-US` chuẩn cho tiếng anh ở Mỹ (United States). + +Xem thêm thông tin về thuộc tính này tại mục [Internationalization](tutorial-i18n.md). + + +#### [[yii\base\Application::modules|modules]] + +Thuộc tính này mô tả các thông tin về [modules](structure-modules.md) được chứa trong ứng dụng. + +Thuộc tính này chứa mảng các lớp về module hoặc thông tin về [cấu hình](concept-configurations.md) chứa mảng các khóa +về các định danh của module. Ví dụ: + +```php +[ + 'modules' => [ + // "booking" mô tả tên class + 'booking' => 'app\modules\booking\BookingModule', + + // "comment" được mô tả với mảng cấu hình + 'comment' => [ + 'class' => 'app\modules\comment\CommentModule', + 'db' => 'db', + ], + ], +] +``` + +Tham khảo thêm ở phần [Modules](structure-modules.md) để biết thêm thông tin. + + +#### [[yii\base\Application::name|name]] + +Thuộc tính này mô tả tên của ứng dụng và hiển thị tới user. Khác với thuộc tính +[[yii\base\Application::id|id]], cần phải là tên duy nhất, thì thuộc tính này dùng với mục đích để hiển thị tới user; +không cần thiết phải là tên duy nhất. + +Nếu trong mã nguồn bạn không cần phải dùng tới nó thì bạn không cần phải thiết lập. + + +#### [[yii\base\Application::params|params]] + +Thuộc tính này là mảng chứa các tham số mà có thể truy cập trong ứng dụng ở phạm vi toàn cầu. Thay vì trong mã +nguồn của bạn cần được mã hóa bởi số và ký tự, đây là cách tốt để định nghĩa các tham số của ứng dụng, định nghĩa một lần +và có thể được truy cập ở mọi nơi. Ví dụ, bạn có thể định nghĩa kích thước ảnh thumbnail +với kích thước như sau: + +```php +[ + 'params' => [ + 'thumbnail.size' => [128, 128], + ], +] +``` + +Bạn có thể thực hiện dòng lệnh sau để lấy tham số về kích thước ảnh thumbnail: + +```php +$size = \Yii::$app->params['thumbnail.size']; +$width = \Yii::$app->params['thumbnail.size'][0]; +``` + +Bạn có thể thay đổi kích thước ảnh thumbnail sau đó, bạn chỉ cần thay đổi vào trong mục cấu hình ứng dụng; +bạn không cần phải đụng chạm vào mã nguồn của bạn. + + +#### [[yii\base\Application::sourceLanguage|sourceLanguage]] + +Thuộc tính mô tả về ngôn ngữ được sử dụng để viết mã nguồn của bạn. Giá trị mặc đinh là `'en-US'`, +nghĩa là tiếng Anh Mỹ(United States). Bạn nên cấu hình thuộc tính này nếu nội dung trong mã nguồn của bạn không phải là tiếng Anh. + +Giống như thuộc tính [language](#language), you should configure this property in terms of +an [IETF language tag](http://en.wikipedia.org/wiki/IETF_language_tag). Ví dụ, `en` chuẩn cho tiếng Anh, +trong khi `en-US` chuẩn cho tiếng Anh Mỹ (United States). + +Xem thêm trong phần [Quốc tế hóa](tutorial-i18n.md) để hiểu thêm thuộc tính này. + + +#### [[yii\base\Application::timeZone|timeZone]] + +Thuộc tính này cung cấp cách khác để thiết lập time zone trong PHP. +Qua việc cấu hình thuộc tính này, chủ yếu được gọi qua hàm +[date_default_timezone_set()](http://php.net/manual/en/function.date-default-timezone-set.php). Ví dụ: + +```php +[ + 'timeZone' => 'America/Los_Angeles', +] +``` + + +#### [[yii\base\Application::version|version]] + +Thuộc tính mô tả về phiên bản của ứng dụng. Mặc định là `'1.0'`. Bạn không cần phải thiết lập thuộc tính này nếu như +trong mã nguồn của bạn không dùng tới. + + +### Các thuộc tính thông dụng + +Những thuộc tính được mô tả trong phần dưới thường có sự cấu hình khác nhau bởi vì các giá trị thường khác nhau +. Tuy nhiên, nêu bạn muốn thay đổi giá trị mặc định, bạn có thể cấu hình theo cách của bạn. + + +#### [[yii\base\Application::charset|charset]] + +Thuộc tính này mô tả các bộ ký tự mà ứng dụng sử dụng. Mặc định là `'UTF-8'`, hầu hết các ứng dụng đều sử dụng. + + +#### [[yii\base\Application::defaultRoute|defaultRoute]] + +Thuộc tính này mô tả các [route](runtime-routing.md), ứng dụng sẽ dùng route này để thực hiện khi có yêu cầu +gửi đến mà không được mô tả. Mỗi router gồm có các module ID, a controller ID, hoặc có thể là một action ID. +Ví dụ, `help`, `post/create`, hoặc `admin/post/create`. Nếu action ID không khai báo, thuộc tính sẽ lấy giá trị mặc định +được mô tả trong [[yii\base\Controller::defaultAction]]. + +Đối với [[yii\web\Application| Ứng dụng Web ]], giá trị mặc định của thuộc tính là `'site'`, nghĩa là +trình điều khiển `SiteController` được gọi và một hành động mặc định được sử dụng. Như vậy, nếu bạn +truy cập vào ứng dụng mà không cung cấp thông tin route, thì ứng dụng mặc định sẽ trả về hành động `app\controllers\SiteController::actionIndex()`. + +Đối với [[yii\console\Application| Ứng dụng console]], thì giá trị mặc định là `'help'`, đồng nghĩa hành động +[[yii\console\controllers\HelpController::actionIndex()]] sẽ được gọi. Như vậy, nếu bạn chạy dòng lệnh `yii` +mà không cung cấp các tham số nào khác, thì nó sẽ hiển thị lên màn hình trợ giúp tương ứng kết quả của action index của trình điều khiển HelpController. + + +#### [[yii\base\Application::extensions|extensions]] + +Thuộc tính này mô tả về danh sách các [thành phần mở rộng (extensions)](structure-extensions.md) đã được cài và sử dụng trong ứng dụng. +Mặc định, thuộc tính sẽ nhận mảng được trả về từ file `@vendor/yiisoft/extensions.php`. File `extensions.php` +được sinh tự động khi bạn sử dụng [Composer](https://getcomposer.org) để cài các thành phần mở rộng. +Ở các trường hợp này, thuộc tính này có thể không cần cấu hình. + +Trong trường hợp, khi bạn muốn cấu hình các extension một cách thủ công, bạn có thể cấu hình thuộc tính như sau: + +```php +[ + 'extensions' => [ + [ + 'name' => 'tên extension', + 'version' => 'phiên bản', + 'bootstrap' => 'BootstrapClassName', // mặc định, giá trị thường là mảng + 'alias' => [ // mặc định + '@alias1' => 'to/path1', + '@alias2' => 'to/path2', + ], + ], + + // ... các extensions khác ... + + ], +] +``` + +Như bạn thấy ở phần trên, thuộc tính sẽ nhận thông tin bao gồm mảng các cấu hình. Mỗi extension được mô tả là mảng +bao gồm các thành phần là`name` và `version`. Nêu muốn extension cần được chạy ở tiến trình [bootstrap](runtime-bootstrapping.md) +, mỗi `bootstrap` cần được mô tả về tên lớp hoặc mảng giá trị về [cấu hình](concept-configurations.md) +. Mỗi extension có thể định nghĩa thêm các [bí danh (aliases)](concept-aliases.md). + + +#### [[yii\base\Application::layout|layout]] + +Thuộc tính này mô tả vê layout mặc định được dùng mỗi khi render dữ liệu ra [view](structure-views.md). +Giá trị mặc định là `'main'`, nghĩa là file `main.php` nằm trong [đường dẫn layout](#layoutPath) được dùng. +Nếu giá trị [layout path](#layoutPath) và [view path](#viewPath) nhận giá trị là mặc định, +giá trị mặc định của file layout có thể được thay thế qua bí danh `@app/views/layouts/main.php`. + +Bạn có thể cấu hình thuộc tính với giá trị `false` nếu bạn muốn tắt giá trị mặc định của layout. + + +#### [[yii\base\Application::layoutPath|layoutPath]] + +Thuộc tính mô tả đường dẫn nơi lưu trữ file layout. Giá trị mặc định sẽ là +`layouts` thư mục con nằm trong [đường dẫn view](#viewPath). Nếu [đường dẫn view](#viewPath) nhận giá trị mặc định +, giá trị mặc định tới đường dẫn layout được thay thế như một đường dẫn của bí danh `@app/views/layouts`. + +Bạn có thể cấu hình như đường dẫn hoặc một [bí danh](concept-aliases.md). + + +#### [[yii\base\Application::runtimePath|runtimePath]] + +Đường dẫn chứa đường dẫn tới các file tạm của ứng dụng, như file log và cache, cần được tạo ra. +Giá trị mặc định của đường dẫn có thể lấy qua bí danh `@app/runtime`. + +Bạn có thể cấu hình thuộc tính với đường dẫn hoặc một [bí danh](concept-aliases.md). Đường dẫn này cần được quyền ghi đè lên +trong quá trình ứng dụng được chạy. Và user không thể truy cập vào đường dẫn +, bởi vì các tập tin này có thể chứa các thông tin nhạy cảm. + +Yii cung cấp cách đơn giản nhất để truy cập vào đường dẫn này qua bí danh là `@runtime`. + + +#### [[yii\base\Application::viewPath|viewPath]] + +Thuộc tính này chỉ định thư mục để lưu trữ những file view trong mô hình MVC. Giá trị mặc định là +là một bí danh `@app/views`. Bạn có thể cấu hình nó với thư mục hoặc đường dẫn [alias](concept-aliases.md). + + +#### [[yii\base\Application::vendorPath|vendorPath]] + +Thuộc tính này quy định cụ thể về thư mục được quản lý bởi [Composer](https://getcomposer.org). Thư mục này chứa các thư viện +được cung cấp bởi nhà phát triển và được dùng trong ứng dụng, bao gồm Yii framework. Giá trị mặc định là +một thư mục được cung cấp bởi bí danh `@app/vendor`. + +Thuộc tính có thể được cấu hình là thư mục hoặc là đường dẫn [alias](concept-aliases.md). Mỗi khi bạn thay đổi thuộc tính này +, bạn cần phải thay đổi thông tin cấu hình Composer cho phù hợp. + +Yii cung cấp cách thức đơn giản để truy cập vào đường dẫn này qua bí danh là `@vendor`. + + +#### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] + +Thuộc tính này chỉ được hỗ trợ bởi [[yii\console\Application|ứng dụng console]]. Nó được xác định +vị trí các dòng lệnh được kích hoạt lên trong phiên bản Yii. Giá trị mặc định là `true`. + + +## Sự kiện + +Ứng dụng trong chu trình hoạt động sẽ gán một vài sự kiện để nắm bắt các yêu cầu. Bạn cần liên kết tới các sự kiện +vào trong ứng dụng như sau: + +```php +[ + 'on beforeRequest' => function ($event) { + // ... + }, +] +``` + +Các mô tả về cú pháp của các sự kiện `on eventName` được mô tả ở trong mục [Cấu hình](concept-configurations.md#configuration-format). + +Cách khác, bạn có thể nắm bắt các sự kiện tại [tiến trình bootstrapping](runtime-bootstrapping.md) +mỗi khi ứng dụng được khởi tạo. Ví dụ: + +```php +\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { + // ... +}); +``` + +### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] + +Sự kiện được gán *trước lúc* ứng dụng nhận các yêu cầu. Tên sự kiện gọi là `beforeRequest`. + +Mỗi nắm bắt được sự kiện, ứng dụng sẽ tải các thông tin cấu hình và khởi tạo. So it is a good place +to insert your custom code via the event mechanism to intercept the request handling process. For example, +in the event handler, you may dynamically set the [[yii\base\Application::language]] property based on some parameters. + + +### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] + +Sự kiện được gán *sau khi* ứng dụng hoàn thành việc xử lý *trước lúc* đưa phản hồi. +Tên sự kiện là `afterRequest`. + +Mỗi khi sự kiện được gán, việc nắm giữ yêu cầu xử lý thành công thì bạn có thể xử lý sau đó +các thông tin về yêu cầu xử lý hoặc nội dung phản hồi. + +Lưu ý rằng thành phần [[yii\web\Response|response]] luôn được gán một vài sự kiện mỗi lúc gửi nội dung +tới user. Những sự kiện được gán *sau* sự kiện này là. + + +### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] + +Sự kiện sẽ được gán *trước* khi thực hiện chạy một [hành động](structure-controllers.md). +Tên sự kiện là `beforeAction`. + +Các tham số của sự kiện được khởi tạo từ [[yii\base\ActionEvent]]. Các sự kiện cần thiết lập thuộc tính +[[yii\base\ActionEvent::isValid]] về giá trị `false` để tạm ngưng hành động. +Ví dụ: + +```php +[ + 'on beforeAction' => function ($event) { + if (some condition) { + $event->isValid = false; + } else { + } + }, +] +``` + +Lưu ý, có một sự kiện tương tự `beforeAction` được gán bởi [modules](structure-modules.md) +và [controllers](structure-controllers.md). Ứng dụng sẽ nắm bắt sự kiện này trước +, tiếp sau đó bởi modules (nếu có), và cuối cùng là trình điều khiển. Nếu sự kiện đều thiết lập tham số +[[yii\base\ActionEvent::isValid]] là `false`, tất cả các yêu cầu nằm trong sự kiện sẽ không được nắm giữ. + + +### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] + +Tương tự, sự kiện này được gán *sau khi* khởi chạy một [hành động](structure-controllers.md). +Tên sự kiện là `afterAction`. + +Các tham số của sự kiện được khởi tạo từ [[yii\base\ActionEvent]]. Xem thuộc tính +[[yii\base\ActionEvent::result]], sự kiện này có thể truy cập hoặc chỉnh sửa kết quả trả về. +Chẳng hạn: + +```php +[ + 'on afterAction' => function ($event) { + if (điều kiện) { + // thay đổi kết quả $event->result + } else { + } + }, +] +``` + +Lưu ý rằng với sự kiện `afterAction` được gán bởi [modules](structure-modules.md) +và [controllers](structure-controllers.md). Những đối tượng được gán vào trong sự kiện này được ưu tiên ngược lại +như sự kiện `beforeAction`. Đó là, trình điều khiển sẽ nắm giữ trước, +tiếp đến là module modules (nếu có), và cuối cùng là ứng dụng. + + +## Vòng đời ứng dụng + +![Vòng đời ứng dụng](images/application-lifecycle.png) + +Khi một [entry script](structure-entry-scripts.md) được gọi và nắm giữ các yêu cầu, +vòng đời của ứng dụng sẽ được thực hiện như sau: + +1. Entry script sẽ tải các thông tin cấu hình trong ứng dụng ra một mảng. +2. Entry script sẽ khởi tạo mới một ứng dụng: + * Phương thức [[yii\base\Application::preInit()|preInit()]] sẽ được gọi, nhằm tải các thông tin cấu hình mà có sự ưu tiên cao + , như thuộc tính [[yii\base\Application::basePath|basePath]]. + * Đăng ký một [[yii\base\Application::errorHandler|error handler]]. + * Cấu hình các thuộc tính trong ứng dụng. + * Phương thức [[yii\base\Application::init()|init()]] sẽ được gọi và phương thức + [[yii\base\Application::bootstrap()|bootstrap()]] sẽ tải thành phần bootstrapping. +3. Entry script sẽ gọi phương thức [[yii\base\Application::run()]] để chạy ứng dụng: + * Sự kiện [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] sẽ được gán sau đó. + * Xử lý các yêu cầu: chuyển các yêu cầu vào [bộ định tuyến (route)](runtime-routing.md) và các tham số liên quan; + khởi tạo đối tượng module, controller, và action như phần mô tả ở bộ định tuyến; và khởi chạy action. + * Gán sự kiện [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]]. + * Gửi phản hồi tới user. +4. Entry script tiếp nhận trạng thái kết thúc từ ứng dụng hoàn tất xử lý tiến trình. diff --git a/docs/guide-vi/structure-controllers.md b/docs/guide-vi/structure-controllers.md new file mode 100644 index 00000000000..bda426f289d --- /dev/null +++ b/docs/guide-vi/structure-controllers.md @@ -0,0 +1,444 @@ +Bộ điều khiển (Controller) +=========== + +Controller thuộc một phần trong mẫu thiết kế [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). +Controller là đối tượng được kế thừa từ class [[yii\base\Controller]] và chịu trách nhiệm xứ lý các yêu cầu và gửi phản hồi +. Đặc biệt, sau khi tiếp nhận các yêu cầu điều khiển từ [ứng dụng](structure-applications.md), +controllers sẽ phân tích thông tin yêu cầu được gửi đến, gửi dữ liệu qua [models](structure-models.md) để xử lý, và gán kết quả xử lý từ model +vào [views](structure-views.md), và cuối cùng là gửi phản hồi. + + +## Hành động (Actions) + +Mỗi Controller đều chứa các *action* để user có thế tìm thấy, gửi yêu cầu tới ứng dụng để xử lý +. Mỗi bộ điều khiển có thể có nhiều hành động. + +Ví dụ dưới mô tả Controller `post` cùng với 2 action là : `view` và `create`: + +```php +namespace app\controllers; + +use Yii; +use app\models\Post; +use yii\web\Controller; +use yii\web\NotFoundHttpException; + +class PostController extends Controller +{ + public function actionView($id) + { + $model = Post::findOne($id); + if ($model === null) { + throw new NotFoundHttpException; + } + + return $this->render('view', [ + 'model' => $model, + ]); + } + + public function actionCreate() + { + $model = new Post; + + if ($model->load(Yii::$app->request->post()) && $model->save()) { + return $this->redirect(['view', 'id' => $model->id]); + } else { + return $this->render('create', [ + 'model' => $model, + ]); + } + } +} +``` + +Với action `view` (được định nghĩa bởi phương thức `actionView()`), dòng đầu dùng [Model](structure-models.md) +để tải dữ liệu dựa theo định danh ID; Nếu Model được tải thành công, thì sẽ được hiển thị qua +[view](structure-views.md) là `view`. Còn không, ứng dụng sẽ thông báo ngoại lệ là không tìm thấy. + +Với action `create` (được định nghĩa bởi phương thức `actionCreate()`), tương tự như vậy. Trước tiên +sẽ khởi tạo [Model](structure-models.md), Model sẽ thực hiện nhận dữ liệu và lưu thông tin. Nếu cả hai việc này thành công thì Controller +sẽ điều hướng trình duyệt tới View `view` cùng với định danh ID vừa được tạo bởi Model. Còn không, Controller sẽ gọi +View `create` có chức năng hiển thị form nhập liệu. + + +## Bộ định tuyến (Routes) + +Người dùng có thể tìm thấy các actions qua các bộ định tuyến gọi là *routes*. Mỗi Route là chuỗi bao gồm các thông tin: + +* Một định danh của Module: chỉ tồn tại nếu bộ điều khiển thuộc về thành phần [module](structure-modules.md); +* Một định danh của [Controller](#controller-ids): là một chuỗi xác định duy nhất của Controller trong ứng dụng + (hoặc có thể là Module nếu Controller tương ứng là một Module); +* Một [Action ](#action-ids):là một chuỗi xác định duy nhất của Action trong ứng dụng. + +Mỗi Route có định dạng như sau: + +``` +ControllerID/ActionID +``` + +hoặc có định dạng sau nếu Controller được gán như một Module: + +```php +ModuleID/ControllerID/ActionID +``` + +Như vậy nếu user truy cập vào đường dẫn sau `http://hostname/index.php?r=site/index`, thì hành động `index` nằm trong bộ điều khiển `site` +sẽ được thực hiện. Để biết thêm thông tin về cách bộ định tuyến xác định các hành động, vui lòng tham khảo tại mục +[Routing và URL Generation](runtime-routing.md). + + +## Tạo Controller + +Trong mỗi [[yii\web\Application|Ứng dụng Web]], Controllers cần được kế thừa từ class [[yii\web\Controller]] hoặc các lớp con của nó +. Tương tự trong [[yii\console\Application|Ứng dụng console]], Controllers cần được kế thừa từ class +[[yii\console\Controller]] hoặc các lớp con của nó. Đoạn code sau được định nghĩa trong Controller `site` : + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ +} +``` + + +### Định danh Controller (Controller ID) + +Thông thường, Controller được thiết kế để xử lý các yêu cầu từ các nguồn tài nguyên cụ thể. +Vì lý do này, mỗi định danh của Controller thường là danh từ cập nhật tới kiểu tài nguyên được xử lý. +Ví dụ, sử dụng `article` như định danh của Controller nhằm lưu giữ các dữ liệu về bài viết. + +Mặc định, Thông tin các định danh Controller nên chỉ chứa các ký tự : Các chữ cái viết thường, số, +dấu gạch dưới, dấu nối, và dấu gạch nghiêng phải. Ví dụ, `article` và `post-comment` đều là những định danh đúng, +trong khi đó `article?`, `PostComment`, `admin\post` đều không hợp lý. + +Các định danh Controller ID nên chứa tiền tố trong thư mục con. Ví dụ, `admin/article` xác định cho Controller `article` +nằm trong thư mục `admin` được dựa theo [[yii\base\Application::controllerNamespace|controller namespace]]. +Các ký tự hợp lệ dùng cho các tiền tố của thư mục con bao gồm: Các chữ cái viết thường, số, dấu gạch, và dấu gạch nghiêng phải +, dấu gạch nghiêng phải được dùng để phân cách như các thư mục con (vd. `panels/admin`). + + +### Tên lớp Controller + +Tên lớp của các Controller được khởi tạo từ các định danh Controller theo các bước sau: + +1. Chuyển ký tự đầu tiên trong mỗi từ cách nhau bởi dấu gạch nối thành ký tự hoa. Lưu ý rằng nếu các định danh Controller + có chứa dấu gạch chéo, thì quy tắc này chỉ được áp dụng ở phần sau dấu gạch chéo cuối cùng trong các định danh. +2. Xoá các dấu gạch nối và thay thế các dấu gạch chéo xuôi(/) thành dấu gạch chéo ngược (\). +3. Thêm hậu tố `Controller`. +4. Thêm [[yii\base\Application::controllerNamespace|controller namespace]]. + +Xem ví dụ sau, giả sử [[yii\base\Application::controllerNamespace|controller namespace]] +nhận giá trị mặc định là `app\controllers`: + +* `article` thành `app\controllers\ArticleController`; +* `post-comment` thành `app\controllers\PostCommentController`; +* `admin/post-comment` thành `app\controllers\admin\PostCommentController`; +* `adminPanels/post-comment` thành `app\controllers\adminPanels\PostCommentController`. + +Các lớp Controller cần được [tự động tải](concept-autoloading.md). Vì vậy, trong ví dụ trên, +lớp của Controller `article` cần được lưu vào file có [bí danh](concept-aliases.md) +là `@app/controllers/ArticleController.php`; trong khi đó `admin/post-comment` cần được lưu vào file +là `@app/controllers/admin/PostCommentController.php`. + +> Lưu ý: Ở ví dụ với định danh Controller `admin/post-comment` hướng dẫn bạn đặt các Controller vào trong thư mục con + của [[yii\base\Application::controllerNamespace|không gian tên Controller]]. Thông tin này khá là hữu ích + mỗi khi bạn muốn quản lý các Controllers và các chuyên mục và bạn không muốn sử dụng thành phần [Modules](structure-modules.md). + + +### Controller Map + +Bạn có thể cấu hình thông tin về mục [[yii\base\Application::controllerMap|controller map]] để khắc phục những hạn chế về các định danh +và tên class của Controller được mô tả ở trên. Điều này khá hữu ích khi bạn muốn sử dụng +các Controller ở bên thứ ba và bạn không có quyền việc kiểm soát các class này. + +Bạn có thể cấu hình [[yii\base\Application::controllerMap|controller map]] trong mục +[cấu hình ứng dụng](structure-applications.md#application-configurations). Ví dụ: + +```php +[ + 'controllerMap' => [ + // mô tả Controller "account" được sử dụng + 'account' => 'app\controllers\UserController', + + // mô tả về cấu hình Controller"article" dạng mảng + 'article' => [ + 'class' => 'app\controllers\PostController', + 'enableCsrfValidation' => false, + ], + ], +] +``` + + +### Controller mặc định + +Mỗi ứng dụng đều có một Controller mặc định được mô tả qua thuộc tính [[yii\base\Application::defaultRoute]]. +Khi một yêu cầu không được mô tả cụ thể ở mục [route](#routes), thì route mặc định sẽ được gọi. +Chẳng hạn [[yii\web\Application|Web applications]], có giá trị là `'site'`, trong khi đó [[yii\console\Application|ứng dụng console]], +có route mặc định là `help`. Vì vậy, nếu truy cập vào URL sau `http://hostname/index.php`, thì Controller `site` sẽ được gọi và xử lý yêu cầu. + +Bạn có thể thay đổi thông tin Controller mặc định tại mục [cấu hình ứng dung](structure-applications.md#application-configurations) như sau: + +```php +[ + 'defaultRoute' => 'main', +] +``` + + +## Tạo Actions + +Tạo mới một Action khá là đơn giản, bằng chỉ việc định nghĩa trong lớp Controller cùng với tên *action phương thức*. Các phương thức của mỗi Action +đều có phạm vi *toàn cục* tên của phương thức được bắt đầu bằng từ `action`. Kết quả trả về của mỗi action sẽ tương ứng với +dữ liệu được gửi tới user. Đoạn mã sau sẽ định nghĩa hai action là, `index` và `hello-world`: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public function actionIndex() + { + return $this->render('index'); + } + + public function actionHelloWorld() + { + return 'Hello World'; + } +} +``` + + +### Định danh của Action (Action ID) + +Mỗi action được dùng cho nhiệm vụ với tài nguyên cụ thể. Vì lý do này, mỗi +action ID thường là một đông từ, như `view`, `update`, vv. + +Mặc định, mỗi action ID chỉ nên chứa các chữ cái: Chữ thường, số, +dấu gạch dưới, và dấu gạch ngang. (Bạn cũng có thể sử dụng các dấu gạch ngang để nối các từ lại với nhau.) Ví dụ, +`view`, `update2`, và `comment-post` đều là những định danh hợp lệ, còn `view?` và `Update` là không hợp lệ. + +Có hai cách để tạo mới các action: inline actions và standalone actions. Với inline action được định nghĩa +như những phương thức trong lớp Controller, trong khi đó standalone action là lớp được kế thừa từ lớp +[[yii\base\Action]] hoặc là lớp con. Nếu bạn không muốn tái sử dụng các action thì bạn có thể dùng inline actions +, cách này thường hay được sử dụng hơn. Trong khi đó các standalone actions thường được tạo để sử dụng +ở những Controllers khác nhau và được dùng như [thành phần mở rộng](structure-extensions.md). + + +### Inline Actions + +Inline actions được định nghĩa vào trong các phương thức như chúng ta đã mô tả trên. + +Tên của phương thức thường đặt tên theo định danh của action và theo các bước sau: + +1. Chuyển ký tự đầu tiên trong mỗi từ định danh của action thành ký tự in hoa. +2. Xoá dấu gạch nối. +3. Thêm tiền tố `action`. + +Ví dụ, `index` thành `actionIndex`, và `hello-world` thành `actionHelloWorld`. + +> Lưu ý: Việc đặt tên của các phương thức cần phải *cẩn thận*. Nếu bạn có phương thức là `ActionIndex`, + thì phương thức của action sẽ không xác định, như vậy, khi có yêu cầu tới action `index` + thì sẽ sinh ra lỗi. Cũng lưu ý rằng các phương thức này phải ở phạm vi public (toàn cục). Các phạm vi private (riêng) hoặc protected (bảo vệ) + thì sẽ không được định nghĩa như một action. + + +Inline actions thường được hay sử dụng hơn bởi vì việc khởi tạo đơn giản hơn. Tuy nhiên, +nếu bạn muốn tái sử dụng action ở những vị trí khác, bạn có thể tham khảo thêm ở mục *standalone action*. + + +### Standalone Actions + +Standalone actions được định nghĩa từ việc kế thừa từ class [[yii\base\Action]] hoặc các lớp con của nó. +Ví dụ, ở phiên bản Yii đã phát hành, các action [[yii\web\ViewAction]] và [[yii\web\ErrorAction]], đều là những +standalone actions. + +Để sử dụng standalone action, bạn cần phải khai báo ở phần *liên kết các action* bằng việc ghi đè lên phương thức +[[yii\base\Controller::actions()]] ở lớp Controller như sau: + +```php +public function actions() +{ + return [ + // khai báo action "error" bằng việc sử dụng tên class + 'error' => 'yii\web\ErrorAction', + + // khai báo action "view" bằng thông tin cấu hình dạng mảng + 'view' => [ + 'class' => 'yii\web\ViewAction', + 'viewPrefix' => '', + ], + ]; +} +``` + +Như vậy, phương thức `actions()` sẽ trả về một mảng và chứa các khoá của các định danh action và giá trị tương ứng +tên class hoặc thông tin [cấu hình](concept-configurations.md). Không giống như inline actions, action ID được dùng cho standalone +actions có thể chứa các ký tự tuỳ ý, miễn là chúng được khai báo trong phương thức `actions()`. + +Để tạo các class standalone action, bạn nên kế thừa từ lớp [[yii\base\Action]] hoặc lớp con của nó, và hiện thực +phương thức là `run()`. Vài trò của phương thức `run()` tương tự như một phương thức của action. Chẳng hạn, + +```php + + +Kết quả trả về của phương thức action hoặc phương thức `run()` của standalone action khá quan trọng. Nó là +kết quả tương ứng của từng action. + +Giá trị trả về là đối tượng [phản hồi](runtime-responses.md) được gửi tới user như những phản hồi. + +* Chẳng hạn với [[yii\web\Application|Ứng dụng Web]], kết quả trả về bao gồm dữ liệu được gán vào thuộc tính + [[yii\web\Response::data]] và chuyển sang dữ liệu là string chuyển tới nội dung phản hồi kết quả. +* Với [[yii\console\Application|ứng dụng console]], kết quả trả về là số nguyên tương ứng với thuộc tính + [[yii\console\Response::exitStatus|exit status]] của mỗi lần thực thi lệnh. + +Ở ví dụ dưới, action sẽ trả về là chuỗi dữ liệu và được xử lý như nội dung phản hồi tới user +. Ví dụ dưới chỉ cách các action điều hướng tới trình duyệt một URL +bằng việc gửi một đối tượng phản hồi (vì phương thức [[yii\web\Controller::redirect()|redirect()]] sẽ trả về +một đối tượng): + +```php +public function actionForward() +{ + // điều hướng tới URL http://example.com + return $this->redirect('http://example.com/'); +} +``` + + +### Các tham số của Action + +Các phương thức dành cho inline action và phương thức `run()` cho standalone actions có thể nhận các tham số, +được gọi là *các tham số action*. Giá trị nhận được từ các yêu cầu. Với [[yii\web\Application|Ứng dụng Web]], +giá trị của các tham số được nhận từ biến `$_GET` sử dụng các tham số như các khoá; +với [[yii\console\Application|ứng dụng console]], các tham số sẽ tương ứng với các đối số dòng lệnh. + +Trong ví dụ sau, action `view` (là một inline action) được khai báo hai tham số là: `$id` và `$version`. + +```php +namespace app\controllers; + +use yii\web\Controller; + +class PostController extends Controller +{ + public function actionView($id, $version = null) + { + // ... + } +} +``` + +Các tham số cho action sẽ được dùng như sau và tương ứng với các yêu cầu khác nhau: + +* `http://hostname/index.php?r=post/view&id=123`: biến `$id` sẽ nhận giá trị là + `'123'`, trong khi đó tham số `$version` nhận giá trị null vì không có đối số `version` được truyền lên. +* `http://hostname/index.php?r=post/view&id=123&version=2`: biến `$id` và `$version` sẽ nhận giá trị tương ứng là + `'123'` và `'2'`. +* `http://hostname/index.php?r=post/view`: ngoại lệ [[yii\web\BadRequestHttpException]] sẽ được gửi ra + vì tham số `$id` không được gửi lên. +* `http://hostname/index.php?r=post/view&id[]=123`: xảy ra ngoại lệ [[yii\web\BadRequestHttpException]] lý do vì + tham số `$id` nhận dữ liệu là một mảng do vậy không hợp lệ `['123']`. + +Nếu bạn muốn tham số của action nhận dữ liệu là một mảng, bạn nên khai báo biên là `array`, như sau: + +```php +public function actionView(array $id, $version = null) +{ + // ... +} +``` + +Nếu yêu cầu là `http://hostname/index.php?r=post/view&id[]=123`, thì tham số `$id` sẽ nhận giá trị là + `['123']`. Nếu yêu cầu là `http://hostname/index.php?r=post/view&id=123`, tham số `$id` sẽ chỉ nhận +các giá trị trong mảng là giống nhau bởi vì giá trị `'123'` không là mảng và sẽ tự động chuyển vào mảng. + +Ở ví dụ trên sẽ hướng dẫn các tham số trong mỗi action hoạt động trong ứng dụng Web. Với ứng dụng console, +vui lòng tham khảo tại mục [Console Commands](tutorial-console.md) để biết thêm thông tin. + + +### Action mặc định + +Mỗi controller đều có các action mặc định và đợc mô tả ở thuộc tính [[yii\base\Controller::defaultAction]]. +Mỗi khi [route](#routes) chỉ nhận giá trị là định danh của controller, router sẽ tự hiểu rằng action mặc định +của controller sẽ được gọi. + +Mặc định, action mặc định sẽ là `index`. nếu bạn muốn thay đổi giá trị này, cách đơn giản nhất là ghi đè thuộc tính +trong lớp controller, như sau: + +```php +namespace app\controllers; + +use yii\web\Controller; + +class SiteController extends Controller +{ + public $defaultAction = 'home'; + + public function actionHome() + { + return $this->render('home'); + } +} +``` + + +## Chu trình Controller + +Khi xử lý yêu cầu, [ứng dụng](structure-applications.md) sẽ khởi tạo controller +dựa theo các yêu cầu tại [route](#routes). Controller sẽ được xử lý qua các chu trình sau để xử lý các yêu cầu: + +1. Phương thức [[yii\base\Controller::init()]] sẽ được gọi sau khi controller được khởi tạo và thiết lập các cấu hình. +2. Controller sẽ tạo đối tượng action dựa trên các yêu cầu qua các định danh của action: + * Nếu định danh của action không được chỉ rõ , thì [[yii\base\Controller::defaultAction|action mặc định]] sẽ được sử dụng. + * Nếu định danh của action được tìm thấy trong phương thức [[yii\base\Controller::actions()|action map]], thì một standalone action + sẽ được khởi tạo; + * Nếu định danh của action được tìm thấy và khớp với phương thức của action, thì một inline action sẽ được; + * Mặt khác hệ thống sẽ gửi ngoại lê [[yii\base\InvalidRouteException]] ra. +3. Controller sẽ lần lượt được gọi tại phương thức `beforeAction()` trong ứng dụng, trong module (nếu controller + thuộc một module), và trong controller. + * Nếu một trong các phương thức không đợc gọi, các phần chưa được gọi trong phương thức `beforeAction()` sẽ được bỏ qua + và việc thực hiện action sẽ bị huỷ bỏ. + * Mặc định, mỗi phương thức `beforeAction()` sẽ được gán vào sự kiện `beforeAction` tới các action mà bạn cần xử lý. +4. Controller thực hiện chạy action. + * Các tham số của action sẽ được phân tích và gán từ các yêu cầu xử lý. +5. Controller sẽ thực hiện tuần tự gọi phương thức `afterAction()` trong Controller, module (nếu Controller + là module), và trong ứng dụng. + * Mặc định, mỗi phương thức `afterAction()` sẽ gọi tới một sự kiện `afterAction` tới các action mà bạn cần xử lý. +6. Ứng dụng sẽ nhận kết quả từ các action và chuyển tới thành phần [response](runtime-responses.md). + + +## Thực hành + +Với mỗi ứng dụng được thiết kế tốt, thì Controllers thường rất gọn nhẹ, mỗi action chỉ chứa khá ít dòng code. +Nếu Controller trong ứng dụng của bản khá phức tạp, thì bạn nên cấu trúc lại và chuyển sang một lớp khác. + +Sau đây gợi ý vài thủ thuật. Controllers + +* có thể truy cập dữ liệu từ các [request](runtime-requests.md); +* gọi các phương thức từ [models](structure-models.md) và các thành phần khác cùng với dữ liệu được gửi; +* dùng thành phần [views](structure-views.md) để gửi phản hồi; +* KHÔNG NÊN xử lý dữ liệu - nên xử lý ở tầng [model](structure-models.md); +* không nên nhúng mã HTML vào hoặc đoạn mã khác - mã này nên nhũng ở thành phần [views](structure-views.md). diff --git a/docs/guide-vi/structure-entry-scripts.md b/docs/guide-vi/structure-entry-scripts.md new file mode 100644 index 00000000000..64447032c58 --- /dev/null +++ b/docs/guide-vi/structure-entry-scripts.md @@ -0,0 +1,116 @@ +Entry Scripts +============= + +Entry script là tiến trình đầu tiên của ứng dụng. Một ứng dụng (hoặc +ứng dụng Web hoặc ứng dụng console) đều có một entry script. Người dùng đầu cuối tạo các request tới entry script, entry script +sẽ khởi tạo ứng dụng và nhanh chóng chuyển các yêu cầu tới chúng. + +Entry script dành cho các ứng dụng web cần được thiết lập ở dưới thư mục truy cập Web để người dùng cuối có thể truy cập +. Những mục này thường được đặt tên là `index.php`, tuy nhiên có thể sử dụng các tên khác, +được cung cấp và có thể xác định bởi các máy chủ Web. + +Entry script cho các ứng dụng console thông thường được nằm ở [đường dẫn cơ sở](structure-applications.md) +của ứng dụng và có tên là `yii` (cùng với hậu tố `.php`). Chúng được xây dựng để thực thi các ứng dụng console +thông qua dòng lệnh `./yii [arguments] [options]`. + +Entry scripts có chức năng chính như sau: + +* Khai báo các hằng số ở phạm vi toàn cục; +* Đăng ký [Composer autoloader](http://getcomposer.org/doc/01-basic-usage.md#autoloading); +* Tải các file class của [[Yii]]; +* Tải cấu hình ứng dụng; +* Tạo và cấu hình các phiên bản [application](structure-applications.md); +* Gọi phương thức [[yii\base\Application::run()]] để xử lý các request được gọi tới. + + +## Ứng dụng Web + +Mã nguồn dưới đây là các dòng lệnh trong mục script trong [Mẫu ứng dụng cơ bản](start-installation.md). + +```php +run(); +``` + + +## Ứng dụng Console(dòng lệnh) + +Tương tự, Mã nguồn dưới đây là các dòng lệnh trong mục script của ứng dụng console: + +```php +#!/usr/bin/env php +run(); +exit($exitCode); +``` + + +## Định nghĩa các hằng số + +Entry scripts thích hợp để định nghĩa các hằng ở phạm vi toàn cục. Yii hỗ trợ 3 hằng số sau: + +* `YII_DEBUG`: xác định xem ứng dụng đang chay trong chế độ debug (gỡ lỗi). Khi ở chế độ debug, ứng dụng + sẽ log các thông tin, và sẽ thông báo chi tiết về các lỗi nếu có các ngoại lệ được gửi ra. Vì lý do này + , chế độ debug nên được dùng thường xuyên trong quá trình xây dựng ứng dụng. Giá trị mặc định của hằng `YII_DEBUG` là false. +* `YII_ENV`: xác định thông tin về môi trường của ứng dụng đang chạy (sản phẩm hay đang phát triển). Điều này sẽ mô tả chi tiết trong phần + [Cấu hình](concept-configurations.md#environment-constants). Giá trị mặc định của hằng số `YII_ENV` là `'prod'`, có nghĩa là ứng dụng đang chạy là phiển bản sản phẩm + đã phát hành. +* `YII_ENABLE_ERROR_HANDLER`: mô tả nơi cho phép được giữ (handler) các lỗi được cung cấp bởi Yii. Giá trị mặc đình của hằng + số là true. + +Khi định nghĩa các hằng số, chúng ta thường sử dụng đoạn mã như sau: + +```php +defined('YII_DEBUG') or define('YII_DEBUG', true); +``` + +Khai báo trên tương đương với đoạn code sau: + +```php +if (!defined('YII_DEBUG')) { + define('YII_DEBUG', true); +} +``` + +Ta thấy đoạn code trên ngắn gọi và dễ hiểu hơn nhiều. + +Việc định nghĩa các hằng số nên được thực hiện ở phần đầu của entry script để các hằng số này có thể được gọi +ở những file php khác. diff --git a/docs/guide-vi/structure-models.md b/docs/guide-vi/structure-models.md new file mode 100644 index 00000000000..bdd2db914a5 --- /dev/null +++ b/docs/guide-vi/structure-models.md @@ -0,0 +1,529 @@ +Model +====== + +Model là phần trong kiến trúc [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). +Là đối tượng đại diện cho phần dữ liệu, phương thức xử lý và nghiệp vụ logic. + +Bạn có thể tạo mới các lớp model bằng việc kế thừa từ lớp [[yii\base\Model]] hoặc các lớp con của nó. Lớp cơ sở +[[yii\base\Model]] hỗ trợ nhiều tính năng như: + +* [Thuộc tính (Attributes)](#attributes): đại diện cho các dữ liệu nghiệp vụ và có thể truy cập như các thuộc tính + hoặc mảng các phần tử; +* [Attribute labels](#attribute-labels): tên hiển thị cho các thuộc tính; +* [Gán nhanh (Massive assignment)](#massive-assignment): hỗ trợ nhập dữ liệu cho thuộc tính trong một bước; +* [Quy tắc xác nhận (Validation rules)](#validation-rules): khai báo các quy tắc và xác thực dữ liệu được nhập vào; +* [Xuất dữ liệu (Data Exporting)](#data-exporting): cho phép xuất dữ liệu dưới dạng mảng hoặc tuỳ chọn khác. + +Lớp `Model` thường dựa trên lớp để thực hiện chức năng nâng cao, chẳng hạn [Active Record](db-active-record.md). +Vui lòng tham khảo thêm tài liệu để biết thêm thông tin. + +> Lưu ý: Model của bạn không phải bắt buộc kế thừa từ lớp [[yii\base\Model]]. Tuy nhiên, vì Yii chứa nhiều thành phần + dựng lên và hỗ trợ cho [[yii\base\Model]], vì thế nó là lớp cơ sở cho các lớp Model. + + +## Thuộc tính (Attribute) + +Model đại diện cho tầng xử lý nghiệp vụ và chứa các *thuộc tính*. Mỗi thuộc tính được truy cập toàn cục như phần tử của +model. Phương thức [[yii\base\Model::attributes()]] sẽ mô tả các thuộc tính trong lớp model hiện có. + +Bạn có thể truy cập vào thuộc tính như các phần tử của các đối tượng: + +```php +$model = new \app\models\ContactForm; + +// "name" là tên thuộc tính của ContactForm +$model->name = 'example'; +echo $model->name; +``` + +Bạn có thể truy cập các thuộc tính như truy cập mảng các phần tử, nhờ sự hỗ trợ từ lớp +[ArrayAccess](http://php.net/manual/en/class.arrayaccess.php) và [ArrayIterator](http://php.net/manual/en/class.arrayiterator.php) +bởi [[yii\base\Model]]: + +```php +$model = new \app\models\ContactForm; + +// truy cập các thuộc tính như mảng các phần tử +$model['name'] = 'example'; +echo $model['name']; + +// iterate attributes +foreach ($model as $name => $value) { + echo "$name: $value\n"; +} +``` + + +### Định nghĩa các thuộc tính + +Mặc định, nếu Model của bạn được kế thừa từ lớp [[yii\base\Model]], và tất cả các biến có phạm vi *toàn cục trong lớp* +. Ví dụ, Model `ContactForm` sau có bốn thuộc tính là: `name`, `email`, +`subject` và `body`. Model `ContactForm` dùng để nhận dữ liệu từ form HTML. + +```php +namespace app\models; + +use yii\base\Model; + +class ContactForm extends Model +{ + public $name; + public $email; + public $subject; + public $body; +} +``` + + +Bạn có thể ghi đè phương thức [[yii\base\Model::attributes()]] để định nghĩa các thuộc tính theo các cách khác. Phương thức nên được trả +tên của thuộc tính trong Model. Ví dụ, lớp [[yii\db\ActiveRecord]] trả về +danh sách tên của các cột liên quan tới các bảng trong CSDL như tên các thuộc tính. Bạn có thể ghi đè các phương thức như +`__get()`, `__set()` để có thể truy cập các thuộc tính như các đối tượng thông thường. + + +### Nhãn của thuộc tính + +Mỗi khi cần hiển thị giá trị hoặc nhận dữ liệu cho thuộc tính, bạn cần hiển thị nhãn tương ứng với các thuộc tính +. Ví dụ, với thuộc tính `firstName`, bạn cần hiển thị nhãn `First Name` +nhãn này sẽ thân thiện hơn khi hiển thị tới người dùng với việc nhập dữ liệu và hiện thông báo. + +Bạn có thể lấy tên nhãn các thuộc tính quan việc gọi phương thức [[yii\base\Model::getAttributeLabel()]]. Ví dụ, + +```php +$model = new \app\models\ContactForm; + +// hiển thị "Name" +echo $model->getAttributeLabel('name'); +``` + +Mặc định, nhãn thuộc tính sẽ tự động tạo từ tên của thuộc tính. +Phương thức [[yii\base\Model::generateAttributeLabel()]] sẽ tạo mới các nhãn cho các thuộc tính. Nó sẽ chuyển tên các biến thành các từ mới +qua việc chuyển ký tự đầu tiên thành ký tự in hoa. Ví dụ, `username` thành `Username`, +và `firstName` thành `First Name`. + +Nếu bạn không muốn việc tạo các nhản bằng cách tự động, bạn cần ghi đè phương thức [[yii\base\Model::attributeLabels()]] +để mô tả các thuộc tính. Chẳng hạn, + +```php +namespace app\models; + +use yii\base\Model; + +class ContactForm extends Model +{ + public $name; + public $email; + public $subject; + public $body; + + public function attributeLabels() + { + return [ + 'name' => 'Your name', + 'email' => 'Your email address', + 'subject' => 'Subject', + 'body' => 'Content', + ]; + } +} +``` + +Với ứng dụng cần hỗ trợ đa ngôn ngữ, bạn cần dịch lại nhãn của các thuộc tính. Xem trong phương thức +[[yii\base\Model::attributeLabels()|attributeLabels()]] , như sau: + +```php +public function attributeLabels() +{ + return [ + 'name' => \Yii::t('app', 'Your name'), + 'email' => \Yii::t('app', 'Your email address'), + 'subject' => \Yii::t('app', 'Subject'), + 'body' => \Yii::t('app', 'Content'), + ]; +} +``` + +Bạn có thể gán nhãn cho các thuộc tính. Chẳng hạn, dựa vào [scenario](#scenarios)của Model +đã được sử dụng , bạn có thể trả về các nhãn khác nhau cho các thuộc tính khác nhau. + +> Lưu ý: Chính xác rằng, nhãn của thuộc tính là một phần của [views](structure-views.md). Tuy nhiên việc khai báo các nhãn + vào Model thường rất tiện lợi, code dễ nhìn và tái sử dụng. + + +## Kịch bản (Scenarios) + +Model thường được sử dụng ở các *kịch bản* khác nhau . Ví dụ, Model `User` dùng để xử lý việc đăng nhập, +nhưng cũng có thể được dùng ở mục đăng ký. Ở các kịch bản khác nhau, Model có thể được dùng trong các nghiệp vụ +và xử lý logic khác nhau. Ví dụ,thuộc tính `email` có thể được yêu cầu trong mục đăng ký tài khoản mới, +nhưng không được yêu cầu khi xử lý đăng nhập. + +Mỗi Model sử dụng thuộc tính [[yii\base\Model::scenario]] để xử lý tuỳ theo kịch bản cần đợc dùng. +Mặc định, Model sẽ hỗ trợ kịch bản là `default`. Xem đoạn mã sau để hiểu 2 cách thiết lập kịch bản cho Model. +setting the scenario of a model: + +```php +// kịch bản được thiết lập qua thuộc tính +$model = new User; +$model->scenario = User::SCENARIO_LOGIN; + +// kịch bản được thiết lập qua việc cấu hình khởi tạo +$model = new User(['scenario' => User::SCENARIO_LOGIN]); +``` + +Mặc định, các kịch bản được hỗ trợ bởi model được xác định qua [các nguyên tắc xác minh](#validation-rules) được +mô tả ở Model. Tuy nhiên, bạn có thê tuỳ biến bằng cách ghi đè phương thức [[yii\base\Model::scenarios()]], +như sau: + +```php +namespace app\models; + +use yii\db\ActiveRecord; + +class User extends ActiveRecord +{ + const SCENARIO_LOGIN = 'login'; + const SCENARIO_REGISTER = 'register'; + + public function scenarios() + { + return [ + self::SCENARIO_LOGIN => ['username', 'password'], + self::SCENARIO_REGISTER => ['username', 'email', 'password'], + ]; + } +} +``` + +> Lưu ý: Như phần trên và ví dụ vừa rồi, lớp Model được kế thừa từ lớp [[yii\db\ActiveRecord]] + bởi vì lớp [Active Record](db-active-record.md) thường được sử dụng nhiều kịch bản. + +Phương thức `scenarios()` trả về một mảng có chứa các khóa là tên các kịch bản và các giá trị tương ứng là các +danh sách *thuộc tính được chọn*. An active attribute can be [massively assigned](#massive-assignment) và là đối tượng sẽ được +dùng để [xác thực (validation)](#validation-rules). Chẳng hạn ở ví dụ trên, thuộc tính `username` và `password` sẽ được chọn +ở kịch bản `login`; còn ở kịch bản `register`, sẽ có thêm thuộc tính `email` ngoài 2 thuộc tính `username` và `password`. + +Việc triển khai phương thức `scenarios()` mặc định sẻ trả về các kịch bản tìm thấy trong phương thức +[[yii\base\Model::rules()]]. Khi khi đè phương thức `scenarios()`, nếu bạn muốn khai báo các kịch bản mới, ngoài các kịch bản mặc định +in addition to the default ones, bạn có thể viết mã như sau: + +```php +namespace app\models; + +use yii\db\ActiveRecord; + +class User extends ActiveRecord +{ + const SCENARIO_LOGIN = 'login'; + const SCENARIO_REGISTER = 'register'; + + public function scenarios() + { + $scenarios = parent::scenarios(); + $scenarios[self::SCENARIO_LOGIN] = ['username', 'password']; + $scenarios[self::SCENARIO_REGISTER] = ['username', 'email', 'password']; + return $scenarios; + } +} +``` + +Xây dựng các kịch bản được dùng vào việc [xác thực](#validation-rules) và [massive attribute assignment](#massive-assignment). +Tuy nhiên, bạn có thể dùng vào mục đích khác. Chẳng hạn, bạn có thể khai báo các [nhãn thuộc tính](#attribute-labels) +khác nhau được dựa trên kịch bản hiện tại. + + +## Các quy tắc xác nhận (Validation Rules) + +Khi dữ liệu cho model được chuyển lên từ người dùng cuối, dữ liệu này cần được xác thực để chắc chắn rằng dữ liệu này là hợp lệ + (được gọi là *quy tắc xác nhận*, có thể gọi *business rules*). Ví dụ, cho model `ContactForm`, +bạn muốn tất cả các thuộc tính không được để trống và thuộc tính `email` phải là địa chỉ email hợp lệ. +Nếu các giá trị cho các thuộc tính không được thỏa mãn với các quy tắc xác nhận, các thông báo lỗi sẽ được +được hiển thị để giúp người dùng sửa lỗi. + +Bạn có thể gọi phương thức [[yii\base\Model::validate()]] để xác thực các dữ liệu đã nhận. Phương thức sẽ dùng các quy tắc xác nhận +được khai báo ở phương thức [[yii\base\Model::rules()]] để xác thực mọi thuộc tính liên quan. Nếu không có lỗi nào tìm thấy +, sẽ trả về giá trị `true`. Nếu không thì, phương thức sẽ giữ các thông báo lỗi tại thuộc tính [[yii\base\Model::errors]] +và trả kết quả`false`. Ví dụ, + +```php +$model = new \app\models\ContactForm; + +// gán các thuộc tính của model từ dữ liệu người dùng +$model->attributes = \Yii::$app->request->post('ContactForm'); + +if ($model->validate()) { + // tất cả các dữ liệu nhập vào hợp lệ +} else { + // xác nhận lỗi: biến $errors chứa mảng các nội dung thông báo lỗi + $errors = $model->errors; +} +``` + + +Các quy tắc xác nhận được gắn vào model, việc ghi đè phương thức [[yii\base\Model::rules()]] cùng với việc trả về +có chứa các thuộc tính an toàn cần được xác thực. Ví dụ sau đây sẽ cho thấy các quy tắc xác nhận được khai báo cho model +`ContactForm`: + +```php +public function rules() +{ + return [ + // the name, email, subject and body attributes are required + [['name', 'email', 'subject', 'body'], 'required'], + + // the email attribute should be a valid email address + ['email', 'email'], + ]; +} +``` + +Mỗi quy tắc được dùng để xác nhận một hoặc nhiều các thuộc tính, và một thuộc tính có thể được xác nhận một hoặc nhiều quy tắc. +Vui lòng tham khảo mục [Xác nhận đầu vào](input-validation.md) để biết thêm chi tiết về cách khai báo các quy tắc xác nhận. + +Đôi khi, bạn muốn các quy tắc chỉ được áp dụng chỉ trong một số [kịch bản](#scenarios). Để làm như vậy, bạn có thể +thêm thông tin thuộc tính `on` ở mỗi quy tắc, giống như sau: + +```php +public function rules() +{ + return [ + // thuộc tính username, email và password cần được nhập ở kịch bản "register" + [['username', 'email', 'password'], 'required', 'on' => self::SCENARIO_REGISTER], + + // username và password cần được nhập ở kịch bản "login" + [['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN], + ]; +} +``` + +Nếu bạn không chỉ định thuộc tính `on`, quy tắc sẽ áp dụng trong tất cả các kịch bản. Một quy tắc được gọi +một *quy tắc hoạt động* nếu nó được áp dụng với kịch bản hiện tại [[yii\base\Model::scenario|scenario]]. + +Một thuộc tính được xác nhận nếu và chỉ nếu nó là thuộc tính được kích hoạt với khai báo tại phương thức `scenarios()` và +được liên kết với một hoặc nhiều quy tắc được khai báo ở phương thức `rules()`. + + +## Gán nhanh (Massive Assignment) + +Gán nhanh là cách tiện lợi cho việc nhập dữ liệu vào model từ người dùng với một dòng mã. +Nó nhập vào các thuộc tính của model bằng việc gán dữ liệu nhập vào qua thuộc tính [[yii\base\Model::$attributes]] +. 2 đoạn mã sau hoạt động giống nhau , cả 2 đều lấy dữ liệu trong form gửi lên từ người dùng +vào các thuộc tính của model `ContactForm`. Nhanh gọn, cách trên, sẽ dùng gán nhanh, mã của bạn trông sạch và ít lỗi hơn cách sau đó: + +```php +$model = new \app\models\ContactForm; +$model->attributes = \Yii::$app->request->post('ContactForm'); +``` + +```php +$model = new \app\models\ContactForm; +$data = \Yii::$app->request->post('ContactForm', []); +$model->name = isset($data['name']) ? $data['name'] : null; +$model->email = isset($data['email']) ? $data['email'] : null; +$model->subject = isset($data['subject']) ? $data['subject'] : null; +$model->body = isset($data['body']) ? $data['body'] : null; +``` + + +### Thuộc tính an toàn (Safe Attributes) + +Gán nhanh chỉ gán dữ liệu cho những thuộc tính gọi là *thuộc tính an toàn (safe attributes)* đó là các thuộc tính được liệt kê trong phương thức +[[yii\base\Model::scenarios()]] cho thuộc tính [[yii\base\Model::scenario|scenario]] của model. +Chẳng hạn, nếu model `User` có các kịch bản mô tả như sau, tiếp đến kịch bản +`login` đang được chọn, thì chỉ thuộc tính `username` và `password` có thể được gán nhanh. Bất kỳ các thuộc tính khác +sẽ được giữ nguyên. + +```php +public function scenarios() +{ + return [ + self::SCENARIO_LOGIN => ['username', 'password'], + self::SCENARIO_REGISTER => ['username', 'email', 'password'], + ]; +} +``` + +> Thông tin: Lý do việc gán nhanh chỉ gán dữ liệu cho các thuộc tính an toàn là bởi vì bạn muốn kiểm soát + những thuộc tính có thể được thay đổi bởi người dùng. Chẳng hạn, nếu model `User` + có thuộc tính `permission` nhằm xác định các quyền hạn của người dùng, bạn chỉ muốn + thuộc tính này chỉ được thay đổi bởi quản trị viên thông qua giao diện phụ trợ. + +Bởi vì mặc định phương thức [[yii\base\Model::scenarios()]] sẽ trả về tất cả các kịch bản và thuộc tính +nằm trong phương thức [[yii\base\Model::rules()]], nếu bạn không ghi đè phương thức này, có nghĩa là một thuộc tính là an toàn +miễn là có khai báo ở một trong các quy tắc xác nhận. + +Vì lý do này, bí danh `safe` được đưa ra bạn có thể khai báo các thuộc tính an toàn +mà không thực sự xác nhận nó. Chẳng hạn, các quy tắc sau đây khai báo thuộc tính `title` +và `description` là thuộc tính an toàn. + +```php +public function rules() +{ + return [ + [['title', 'description'], 'safe'], + ]; +} +``` + + +### Thuộc tính không an toàn (Unsafe Attributes) + +Như mô tả trên, khai báo phương thức [[yii\base\Model::scenarios()]] có 2 mục đích: liệt kê thuộc tính cần được xác nhận +, và xác định các thuộc tính là an toàn. Trong một số trường hợp khác, bạn muốn xác nhận thuộc tính nhưng +không muốn đánh dấu là an toàn. bạn có thể thực hiện bằng việc đặt dấu chấm than `!` vào tên thuộc tính +khi khai báo tại phương thức `scenarios()`, giốn như thuộc tính `secret` như sau: + +```php +public function scenarios() +{ + return [ + self::SCENARIO_LOGIN => ['username', 'password', '!secret'], + ]; +} +``` + +Khi model đang ở kịch bản `login`, cả 3 thuộc tính sẽ được xác nhận. Tuy nhiên, chỉ có thuộc tính `username` +và `password` được gán nhanh. Để gán giá trị cho thuộc tính `secret`, bạn +cần được gán trực tiếp như sau, + +```php +$model->secret = $secret; +``` + +Điều tương tự có thể được thực hiện trong phương thức `rules()`: + +```php +public function rules() +{ + return [ + [['username', 'password', '!secret'], 'required', 'on' => 'login'] + ]; +} +``` + +Trong trường hợp này các thuộc tính `username`, `password` và `secret` là yêu cầu nhập, nhưng thuộc tính `secret` phải cần được gán trực tiếp. + + +## Xuất dữ liệu (Data Exporting) + +Các model thường được cần trích xuất ra các định dạng khác nhau. Chẳng hạn, bạn cần chuyển dữ liệu sang của +models sang định dạng JSON hoặc Excel. Quá trình xuất có thể được chia nhỏ thành hai bước độc lập: + +- models cần được chuyển sang định dạng mảng; +- các mảng cần được chuyển đổi thành các định dạng cần chuyển. + +Bạn chỉ cần tập trung vào bước đầu tiên, bởi vì bước thứ 2 có thể được thực hiện bởi các trình định dạng dữ liệu +, chẳng hạn như [[yii\web\JsonResponseFormatter]]. + +Các đơn giản nhất để chuyển đổi model sang dạng mảng là sử dụng thuộc tính [[yii\base\Model::$attributes]]. +For example, + +```php +$post = \app\models\Post::findOne(100); +$array = $post->attributes; +``` + +Bởi mặc định, thuộc tính [[yii\base\Model::$attributes]] sẽ trả về các giá trị của *tất cả* các thuộc tính +được khai báo trong phương thức [[yii\base\Model::attributes()]]. + +Còn một cách linh hoạt và tiện lợi hơn trong việc chuyển đổi model sang định dạng mảng là sử dụng phương thức [[yii\base\Model::toArray()]] +. Cách chuyển đổi cũng tương tự như trong cách của thuộc tính [[yii\base\Model::$attributes]]. Tuy nhiên, nó cho phép bạn chọn các dữ liệu +, được gọi là *fields*, được đặt trong mảng kết quả và chúng được định dạng thế nào. +Trong thực tế, đó là cách trích xuất mặc định của các model ở việc phát triển các dịch vụ RESTful Web, như được mô tả trong +mục [Response Formatting](rest-response-formatting.md). + + +### Các trường (Fields) + +Một trường đơn giản là tên của thành phần thu được nằm trong mảng khi gọi phương thức [[yii\base\Model::toArray()]] +của model. + +Mặc định, tên trường sẽ tương đương với tên thuộc tính. Tuy nhiên, bạn có thể thay đổi bằng việc ghi đè +qua phương thức [[yii\base\Model::fields()|fields()]] và/hoặc phương thức [[yii\base\Model::extraFields()|extraFields()]]. Cả 2 phương thức +trả về danh sách các khai báo trường. Các trường được định nghĩa bởi phương thức `fields()` là các trường mặc định, nghĩa là phương thức +`toArray()` sẽ trả về những trường mặc định. Phương thức `extraFields()` sẽ khai báo thêm các trường bổ sung có thể được trả về +bởi phương thức `toArray()` miễn là bạn chỉ định chugns qua tham số `$expand`. Chẳng hạn, +đoạn mã sau sẽ trả về các trường được định nghĩa trong phương thức `fields()` và 2 trường `prettyName` và `fullAddress` +nếu chúng được định nghĩa trong phương thức `extraFields()`. + +```php +$array = $model->toArray([], ['prettyName', 'fullAddress']); +``` + +Bạn có thể ghi đè phương thức `fields()` để thêm, xóa, cập nhật hoặc định nghĩa lại các trường. Phương thức `fields()` +sẽ trả về dữ liệu dạng mảng. Mảng này có các khóa là tên các trường, và các giá trị của mảng tương ứng +với các trường đã định nghĩa giá trị có thể là tên các thuộc tính/biến hoặc một hàm trả về các giá trị trường tương ứng +. Trong trường hợp đặc biệt khi tên trường giống với tên thuộc tính xác định của nó, bạn có thể bỏ qua khóa mảng. Ví dụ, + +```php +// liệt kê rõ ràng các trường, sử dụng tốt nhất khi bạn nắm được các thay đổi +// trong bản CSDL hoặc các thuộc tính của model, không gây ra sự thay đổi của trường (để giữ tương thích với API). +public function fields() +{ + return [ + // tên trường giống với tên thuộc tính + 'id', + + // tên trường là "email", tương ứng với tên thuộc tính là "email_address" + 'email' => 'email_address', + + // tên trường là "name", giá trị được định nghĩa bởi hàm + 'name' => function () { + return $this->first_name . ' ' . $this->last_name; + }, + ]; +} + +// lọc ra một số trường, nên sử dụng khi bạn muốn kế thừa các trường +// thêm vào blacklist một số trường không cần thiết. +public function fields() +{ + $fields = parent::fields(); + + // remove fields that contain sensitive information + unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']); + + return $fields; +} +``` + +> Cảnh báo: Bởi vì theo mặc định tất cả các thuộc tính của model sẽ liệt kê trong mảng trích xuất, bạn nên +> kiểm tra dữ liệu của bạn để chắc chắn rằng chúng không chứa các thông tin không cần thiết. Nếu có thông tin như vậy, +> bạn nên ghi đè phương thức `fields()` để lọc chúng ra. Tại ví dụ trên, chúng ta chọn +> các trường để lọc ra là `auth_key`, `password_hash` và `password_reset_token`. + + +## Bài thực hành + +Các model là phần trung tâm đại diện cho tầng dữ liệu, chứa các quy tắc và logic. Model thường được tái sử dụng +tại một số nơi khác nhau. Với một ứng dụng được thiết kế tốt, thông thường các model được chú trọng hơn +[controllers](structure-controllers.md). + +Tổng hợp mục, models + +* có thể chứa các thuộc tính đại diện cho tầng dữ liệu (business data); +* có thể chứa các quy tắc xác nhận để đảm bảo tính hợp lệ và tính toàn vẹn của dữ liệu;; +* có thể chứa các phương thức tại tầng logic (business logic); +* không nên trực tiếp xử lý các yêu cầu, session, hoặc bất cứ dữ liệu môi trường. Những dữ liệu này nên được tiến hành xử lý + bởi [controllers](structure-controllers.md) vào model; +* tránh việc nhúng mã HTML hoặc các dữ liệu hiển thị - mã này nên được đặt tại [views](structure-views.md); +* tránh có quá nhiều kịch bản [scenarios](#scenarios) trong một model. + +Bạn cần có sự xem xét các đề nghị trên mỗi khi bạn triển khai hệ thống lớn và phức tạp. +Trong các hệ thống này, cácmodel cần được chú trọng bởi vì chúng được sử dụng ở nhiều nơi và có thể chứa nhiều các quy tắc +và các xử lý nghiệp vụ. Điều này có sự ảnh hưởng tại tiến trình bảo trì mỗi thay đổi mã của bạn +có thể ảnh hưởng tới nhiều vị trí khác nhau. Để mã code của bạn dễ được bảo trì hơn, +bạn có thể được thực hiện các chiến lược sau: + +* Định nghĩa tập các lớp model cơ sở (base model) lớp này được chia sẻ qua các [ứng dụng](structure-applications.md) hoặc + [modules](structure-modules.md) khác nhau. Các model này có thể chứa tập các quy tắc và logic có thể được + dùng rộng rãi ở các lớp cần được sử dụng. +* Tại mỗi [ứng dụng](structure-applications.md) hoặc [module](structure-modules.md) có dùng model, + ta định nghĩa lớp khung model bằng việc kế thừa từ lớp model cơ sở. Lớp khung model này + có thể chứa các quy tắc logic được mô tả cụ thể chi ứng dụng hoặc module này. + +Ví dụ, với [Mẫu Dự án Advanced](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md), bạn có thể định nghĩa lớp cơ sở model +là `common\models\Post`. Tiếp đến tại ứng dụng front end, bạn định nghĩa lớp khung là +`frontend\models\Post` lớp này kế thừa từ lớp `common\models\Post`. Và tương tự cho ứng dụng back end, +bạn định nghĩa model `backend\models\Post`. Với cách giải quyết này, bạn sẽ chắc chắn rằng mã của bạn tại model `frontend\models\Post` +chỉ dùng cho ứng dụng front end, và nếu bạn thực hiện với bất kỳ thay đổi nào, bạn không cần lo lắng về +việc thay đổi này có ảnh hưởng tới ứng dụng back end. \ No newline at end of file From 93cd3b2736943e63dca6aeb2bfb5cf33038b59fd Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sat, 5 May 2018 22:17:21 +0300 Subject: [PATCH 074/902] Russian translation: improvements of start-looking-ahead --- docs/guide-ru/start-looking-ahead.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-ru/start-looking-ahead.md b/docs/guide-ru/start-looking-ahead.md index d782edd3862..9872ae0e356 100644 --- a/docs/guide-ru/start-looking-ahead.md +++ b/docs/guide-ru/start-looking-ahead.md @@ -3,8 +3,8 @@ В итоге вы создали полноценное приложение на Yii и узнали, как реализовать некоторые наиболее часто используемые функции, такие, как получение данных от пользователя -при помощи HTML форм, выборки данных из базы данных и их отображения в разбитом на страницы виде. -Так же вы узнали, как использовать [Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/README.md) для +при помощи HTML-форм, выборки данных из базы данных и их отображения в разбитом на страницы виде. +Также вы узнали, как использовать [Gii](https://github.com/yiisoft/yii2-gii/blob/master/docs/guide/README.md) для автоматической генерации кода, что превращает программирование в настолько простую задачу, как простое заполнение какой-либо формы. В этом разделе мы обобщим ресурсы о Yii, которые помогут вам быть более продуктивным при использовании Yii. @@ -16,7 +16,7 @@ - Описание классов: определяет использование каждого класса, представленного в Yii. Им следует пользоваться, когда вы пишете код и хотите разобраться в использовании конкретного класса, метода, свойства. - - Вики статьи: + - Вики-статьи: написаны пользователями Yii на основе их собственного опыта. Большинство из них составлены для сборника рецептов, показывая, как решить конкретные проблемы с использованием Yii. Причём качество этих статей может быть таким же хорошим, как в Подробном руководстве. From b0fcb6cd366284029099c9f9ad00b3efc1e7beb4 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Mon, 7 May 2018 12:56:27 +0300 Subject: [PATCH 075/902] Russian translation: improvements of tutorial-template-engines (#16237) [skip ci] --- docs/guide-ru/tutorial-template-engines.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide-ru/tutorial-template-engines.md b/docs/guide-ru/tutorial-template-engines.md index 21af4396c38..7d79257f321 100644 --- a/docs/guide-ru/tutorial-template-engines.md +++ b/docs/guide-ru/tutorial-template-engines.md @@ -1,10 +1,10 @@ Использование шаблонизаторов ====================== -По умолчанию, Yii использует PHP в шаблонах, но вы можете настроить Yii на поддержку других шаблонизаторов,таких как +По умолчанию, Yii использует PHP в шаблонах, но вы можете настроить Yii на поддержку других шаблонизаторов, таких как [Twig](http://twig.sensiolabs.org/) или [Smarty](http://www.smarty.net/), которые доступны в расширениях. -`view` компонент, отвественный за генерацию видов. Вы можете добавить шаблонизатор, с помощью перенастройки поведения компонента: +Компонент `view`, отвественный за генерацию видов. Вы можете добавить шаблонизатор с помощью перенастройки поведения компонента: ```php [ @@ -19,7 +19,7 @@ 'twig' => [ 'class' => 'yii\twig\ViewRenderer', 'cachePath' => '@runtime/Twig/cache', - // Array of twig options: + // Массив опций twig: 'options' => [ 'auto_reload' => true, ], @@ -44,4 +44,4 @@ Для получения подробной информации об использовании конкретного шаблонизатора обратитесь в их документации: - [Twig guide](https://github.com/yiisoft/yii2-twig/tree/master/docs/guide) -- [Smarty guide](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide) \ No newline at end of file +- [Smarty guide](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide) From ce38d5e5ef002ac535b9b519e6ae856cf66dc600 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Tue, 8 May 2018 11:45:17 +0300 Subject: [PATCH 076/902] Update concept-components.md (#16244) [skip ci] Wrong namespace --- docs/guide-ru/concept-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/concept-components.md b/docs/guide-ru/concept-components.md index b29a4df2f70..b76a2637d83 100644 --- a/docs/guide-ru/concept-components.md +++ b/docs/guide-ru/concept-components.md @@ -46,7 +46,7 @@ echo DatePicker::widget([ ```php Date: Tue, 8 May 2018 16:39:55 +0300 Subject: [PATCH 077/902] Fixed BC breaking change in Inflector Fixes #16239 --- framework/helpers/BaseInflector.php | 24 +++-------- framework/helpers/BaseStringHelper.php | 36 ++++++++++++++++ tests/framework/helpers/InflectorTest.php | 6 ++- tests/framework/helpers/StringHelperTest.php | 45 ++++++++++++++++++++ 4 files changed, 90 insertions(+), 21 deletions(-) diff --git a/framework/helpers/BaseInflector.php b/framework/helpers/BaseInflector.php index 5b640a62065..282f6e9e73f 100644 --- a/framework/helpers/BaseInflector.php +++ b/framework/helpers/BaseInflector.php @@ -342,7 +342,7 @@ public static function titleize($words, $ucAll = false) { $words = static::humanize(static::underscore($words), $ucAll); - return $ucAll ? mb_convert_case($words, MB_CASE_TITLE, self::encoding()) : self::mb_ucfirst($words, self::encoding()); + return $ucAll ? StringHelper::mb_ucwords($words, self::encoding()) : StringHelper::mb_ucfirst($words, self::encoding()); } /** @@ -357,7 +357,7 @@ public static function titleize($words, $ucAll = false) */ public static function camelize($word) { - return str_replace(' ', '', mb_convert_case(preg_replace('/[^\pL\pN]+/u', ' ', $word), MB_CASE_TITLE, self::encoding())); + return str_replace(' ', '', StringHelper::mb_ucwords(preg_replace('/[^\pL\pN]+/u', ' ', $word), self::encoding())); } /** @@ -375,7 +375,7 @@ public static function camel2words($name, $ucwords = true) '.', ], ' ', preg_replace('/(\p{Lu})/u', ' \0', $name))), self::encoding()); - return $ucwords ? mb_convert_case($label, MB_CASE_TITLE, self::encoding()) : $label; + return $ucwords ? StringHelper::mb_ucwords($label, self::encoding()) : $label; } /** @@ -407,7 +407,7 @@ public static function camel2id($name, $separator = '-', $strict = false) */ public static function id2camel($id, $separator = '-') { - return str_replace(' ', '', mb_convert_case(str_replace($separator, ' ', $id), MB_CASE_TITLE, self::encoding())); + return str_replace(' ', '', StringHelper::mb_ucwords(str_replace($separator, ' ', $id), self::encoding())); } /** @@ -431,7 +431,7 @@ public static function humanize($word, $ucAll = false) $word = str_replace('_', ' ', preg_replace('/_id$/', '', $word)); $encoding = self::encoding(); - return $ucAll ? mb_convert_case($word, MB_CASE_TITLE, $encoding) : self::mb_ucfirst($word, $encoding); + return $ucAll ? StringHelper::mb_ucwords($word, $encoding) : StringHelper::mb_ucfirst($word, $encoding); } /** @@ -609,18 +609,4 @@ private static function encoding() return isset(Yii::$app) ? Yii::$app->charset : 'UTF-8'; } - /** - * The same as built-in `ucfirst`, but unicode-safe - * - * @param string $string - * @param string $encoding - * @return string - */ - private static function mb_ucfirst($string, $encoding) - { - $firstChar = mb_substr($string, 0, 1, $encoding); - $rest = mb_substr($string, 1, null, $encoding); - - return mb_strtoupper($firstChar, $encoding) . $rest; - } } diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index 524f1d729f9..e3a304ac049 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -418,4 +418,40 @@ public static function matchWildcard($pattern, $string, $options = []) return preg_match($pattern, $string) === 1; } + + /** + * This method provides a unicode-safe implementation of built-in PHP function `ucfirst()`. + * + * @param string $string the string to be proceeded + * @param string $encoding Optional, defaults to "UTF-8" + * @return string + * @see http://php.net/manual/en/function.ucfirst.php + * @since 2.0.16 + */ + public static function mb_ucfirst($string, $encoding = 'UTF-8') + { + $firstChar = mb_substr($string, 0, 1, $encoding); + $rest = mb_substr($string, 1, null, $encoding); + + return mb_strtoupper($firstChar, $encoding) . $rest; + } + + /** + * This method provides a unicode-safe implementation of built-in PHP function `ucwords()`. + * + * @param string $string the string to be proceeded + * @param string $encoding Optional, defaults to "UTF-8" + * @see http://php.net/manual/en/function.ucwords.php + * @return string + */ + public static function mb_ucwords($string, $encoding = 'UTF-8') + { + $words = preg_split("/\s/u", $string, -1, PREG_SPLIT_NO_EMPTY); + + $titelized = array_map(function ($word) use ($encoding) { + return static::mb_ucfirst($word, $encoding); + }, $words); + + return implode(' ', $titelized); + } } diff --git a/tests/framework/helpers/InflectorTest.php b/tests/framework/helpers/InflectorTest.php index 728b92119a5..6b921df4524 100644 --- a/tests/framework/helpers/InflectorTest.php +++ b/tests/framework/helpers/InflectorTest.php @@ -89,9 +89,9 @@ public function testTitleize() public function testCamelize() { - $this->assertEquals('MeMySelfAndi', Inflector::camelize('me my_self-andI')); + $this->assertEquals('MeMySelfAndI', Inflector::camelize('me my_self-andI')); $this->assertEquals('QweQweEwq', Inflector::camelize('qwe qwe^ewq')); - $this->assertEquals('ВідомоЩоТестиЗберігатьНашіНерви', Inflector::camelize('Відомо, що тести зберігать наші НЕРВИ! 🙃')); + $this->assertEquals('ВідомоЩоТестиЗберігатьНашіНЕРВИ', Inflector::camelize('Відомо, що тести зберігать наші НЕРВИ! 🙃')); } public function testUnderscore() @@ -138,6 +138,8 @@ public function testId2camel() $this->assertEquals('PostTag', Inflector::id2camel('post_tag', '_')); $this->assertEquals('НевжеІЦеПрацює', Inflector::id2camel('невже_і_це_працює', '_')); + $this->assertEquals('ShouldNotBecomeLowercased', Inflector::id2camel('ShouldNotBecomeLowercased', '_')); + $this->assertEquals('FooYBar', Inflector::id2camel('foo-y-bar')); $this->assertEquals('FooYBar', Inflector::id2camel('foo_y_bar', '_')); } diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php index 419c1e0b850..5f6416e6a4a 100644 --- a/tests/framework/helpers/StringHelperTest.php +++ b/tests/framework/helpers/StringHelperTest.php @@ -16,6 +16,7 @@ */ class StringHelperTest extends TestCase { + protected function setUp() { parent::setUp(); @@ -399,4 +400,48 @@ public function testMatchWildcard($pattern, $string, $expectedResult, $options = { $this->assertSame($expectedResult, StringHelper::matchWildcard($pattern, $string, $options)); } + + public function dataProviderMb_ucfirst() + { + return [ + ['foo', 'Foo'], + ['foo bar', 'Foo bar'], + ['👍🏻 foo bar', '👍🏻 foo bar'], + ['', ''], + [null, ''], + ['здесь我 multibyte我 строка', 'Здесь我 multibyte我 строка'], + ]; + } + + /** + * @param string $string + * @param string $expectedResult + * @dataProvider dataProviderMb_ucfirst + */ + public function testMb_ucfirst($string, $expectedResult) + { + $this->assertSame($expectedResult, StringHelper::mb_ucfirst($string)); + } + + public function dataProviderMb_ucwords() + { + return [ + ['foo', 'Foo'], + ['foo bar', 'Foo Bar'], + ['👍🏻 foo bar', '👍🏻 Foo Bar'], + ['', ''], + [null, ''], + ['здесь我 multibyte我 строка', 'Здесь我 Multibyte我 Строка'], + ]; + } + + /** + * @param string $string + * @param string $expectedResult + * @dataProvider dataProviderMb_ucwords + */ + public function testMb_ucwords($string, $expectedResult) + { + $this->assertSame($expectedResult, StringHelper::mb_ucwords($string)); + } } From f21a7a6837327c82eaf0d53bd76f418b5a137abd Mon Sep 17 00:00:00 2001 From: wxxiong6 <601115211@qq.com> Date: Thu, 10 May 2018 10:41:52 +0800 Subject: [PATCH 078/902] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正错误 --- docs/guide-zh-CN/tutorial-console.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/guide-zh-CN/tutorial-console.md b/docs/guide-zh-CN/tutorial-console.md index 00ace8a7691..444e4b01c33 100644 --- a/docs/guide-zh-CN/tutorial-console.md +++ b/docs/guide-zh-CN/tutorial-console.md @@ -192,20 +192,19 @@ use yii\console\Controller; class HelloController extends Controller { public $message; - - public function options() + + public function options($actionID) { return ['message']; } - + public function optionAliases() { return ['m' => 'message']; } - - public function actionIndex() - { - echo $message . "\n"; + + public function actionIndex(){ + echo $this->message; } } ``` From 97cac7fe83f2d938920fac715d7b4c34f023bdc8 Mon Sep 17 00:00:00 2001 From: deepziyu Date: Thu, 10 May 2018 12:29:42 +0800 Subject: [PATCH 079/902] =?UTF-8?q?=E5=AF=B9=E9=BD=90=E5=85=B6=E8=A1=8C?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guide-zh-CN/tutorial-console.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/tutorial-console.md b/docs/guide-zh-CN/tutorial-console.md index 444e4b01c33..88bf9f14f8c 100644 --- a/docs/guide-zh-CN/tutorial-console.md +++ b/docs/guide-zh-CN/tutorial-console.md @@ -203,7 +203,8 @@ class HelloController extends Controller return ['m' => 'message']; } - public function actionIndex(){ + public function actionIndex() + { echo $this->message; } } From 03641a35f8ded16908f4ba69bb1cdb6e8fd23aec Mon Sep 17 00:00:00 2001 From: xuepeng2 <1641381910@qq.com> Date: Thu, 10 May 2018 15:11:32 +0800 Subject: [PATCH 080/902] Update runtime-responses.md --- docs/guide-zh-CN/runtime-responses.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/guide-zh-CN/runtime-responses.md b/docs/guide-zh-CN/runtime-responses.md index 76c024712d4..7a5a5ff8292 100644 --- a/docs/guide-zh-CN/runtime-responses.md +++ b/docs/guide-zh-CN/runtime-responses.md @@ -1,23 +1,22 @@ 响应 ========= -当应用完成处理一个[请求](runtime-requests.md)后, 会生成一个[[yii\web\Response|response]]响应对象并发送给终端用户 -响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, -网页应用开发的最终目的本质上就是根据不同的请求构建这些响应对象。 +当一个应用在处理完一个[请求](runtime-requests.md)后, 这个应用会生成一个[[yii\web\Response|response]]响应对象并把这个响应对象发送给终端用户 +这个响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, +从本质上说,网页应用开发最终的目标就是根据不同的请求去构建这些响应对象。 -在大多是情况下主要处理继承自 [[yii\web\Response]] 的 -`response` [应用组件](structure-application-components.md), -尽管如此,Yii也允许你创建你自己的响应对象并发送给终端用户,这方面后续会阐述。 +在大多数实际应用情况下,你应该主要地去处理`response`这个 [应用组件](structure-application-components.md),在默认情况下,它是一个继承自[[yii\web\Response]]的实例 +然而,Yii也允许你创建自己的响应对象并发送给终端用户,这方面在后续会阐述。 -在本节,将会描述如何构建响应和发送给终端用户。 +在本节,我们将会讲述如何组装和构建响应并把它发送给终端用户。 ## 状态码 -构建响应时,最先应做的是标识请求是否成功处理的状态,可通过设置 -[[yii\web\Response::statusCode]] 属性,该属性使用一个有效的 -[HTTP 状态码](https://tools.ietf.org/html/rfc2616#section-10)。例如,为标识处理已被处理成功, -可设置状态码为200,如下所示: +构建响应要做的第一件事就是声明请求是否被成功处理,我们可通过设置 +[[yii\web\Response::$statusCode]] 这个属性来做到这一点,该属性接受一个有效的 +[HTTP 状态码](https://tools.ietf.org/html/rfc2616#section-10)。例如,表明该请求已被成功处理, +可以设置状态码为200,如下所示: ```php Yii::$app->response->statusCode = 200; From 4dda9dad9ae3d61c2b8caa6eac098779ecfce736 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Fri, 11 May 2018 00:03:13 +0300 Subject: [PATCH 081/902] Russian translation: improvements of helper-overview (#16262) [skip ci] --- docs/guide-ru/helper-overview.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guide-ru/helper-overview.md b/docs/guide-ru/helper-overview.md index 5462a2cb15f..bb2a2894b4e 100644 --- a/docs/guide-ru/helper-overview.md +++ b/docs/guide-ru/helper-overview.md @@ -3,10 +3,10 @@ > Note: Этот раздел находиться в стадии разработки. -Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML кода, и так далее. Все helper классы организованны в рамках пространства имен `yii\helpers` и являются статическими методами +Yii предоставляет много классов, которые помогают упростить общие задачи программирования, такие как манипуляция со строками или массивами, генерация HTML-кода, и так далее. Все helper-классы организованы в рамках пространства имен `yii\helpers` и являются статическими методами (это означает, что они содержат в себе только статические свойства и методы и объекты статического класса создать нельзя). -Вы можете использовать helper класс с помощью вызова одного из статических методов, как показано ниже: +Вы можете использовать helper-класс с помощью вызова одного из статических методов, как показано ниже: ```php use yii\helpers\Html; @@ -14,14 +14,14 @@ use yii\helpers\Html; echo Html::encode('Test > test'); ``` -> Note: Помощь в [настройке helper классов](#customizing-helper-classes), в Yii каждый основной helper состоит из двух классов: базовый класс (например `BaseArrayHelper`) и конкретный класс (например `ArrayHelper`). +> Note: Помощь в [настройке helper-классов](#customizing-helper-classes), в Yii каждый основной helper состоит из двух классов: базовый класс (например, `BaseArrayHelper`) и конкретный класс (например, `ArrayHelper`). Когда вы используете helper, вы должны использовать только конкретные версии классов и никогда не использовать базовые классы. Встроенные хелперы ------------------ -В этой версии Yii предоставляются следующие основные helper классы: +В этой версии Yii предоставляются следующие основные helper-классы: - [ArrayHelper](helper-array.md) - Console @@ -41,9 +41,9 @@ echo Html::encode('Test > test'); Настройка хелперов -------------------------- -Для настройки основных helper классов (например [[yii\helpers\ArrayHelper]]), вы должны создать расширяющийся класс из помощников соответствующих базовых классов (например [[yii\helpers\BaseArrayHelper]]) и дать похожее название, вашему классу, с соответствующим конкретному классу (например [[yii\helpers\ArrayHelper]]), в том числе его пространство имен. Тогда созданный класс заменит оригинальную реализацию в фреимворке. +Для настройки основных helper-классов (например, [[yii\helpers\ArrayHelper]]), вы должны создать расширяющийся класс из помощников соответствующих базовых классов (например, [[yii\helpers\BaseArrayHelper]]) и дать похожее название вашему классу с соответствующим конкретному классу (например, [[yii\helpers\ArrayHelper]]), в том числе его пространство имен. Тогда созданный класс заменит оригинальную реализацию в фреймворке. -В следующих примерах показывается как настроить [[yii\helpers\ArrayHelper::merge()|merge()]] метод +В следующих примерах показывается как настроить метод [[yii\helpers\ArrayHelper::merge()|merge()]] [[yii\helpers\ArrayHelper]] класса: ```php @@ -55,7 +55,7 @@ class ArrayHelper extends BaseArrayHelper { public static function merge($a, $b) { - // your custom implementation + // ваша собственная реализация } } ``` @@ -64,10 +64,10 @@ class ArrayHelper extends BaseArrayHelper Далее, в приложении [входной скрипт](structure-entry-scripts.md), добавьте следующую строчку кода после подключения `yii.php` файла, которая сообщит [автозагрузка классов Yii](concept-autoloading.md) загрузить -ваш класс вместо оригинального helper класса фреимворка: +ваш класс вместо оригинального helper-класса фреимворка: ```php Yii::$classMap['yii\helpers\ArrayHelper'] = '@app/components/ArrayHelper.php'; ``` -Обратите внимание что пользовательская настройка helper классов полезна только, если вы хотите изменить поведение существующей функции helper классов. Если вы хотите добавить дополнительные функции, для использования в вашем приложении, будет лучше создать отдельный helper. +Обратите внимание что пользовательская настройка helper-классов полезна только, если вы хотите изменить поведение существующей функции helper-классов. Если вы хотите добавить дополнительные функции, для использования в вашем приложении, будет лучше создать отдельный helper. From 68edea375efa6a51adc9c48747d4ddda49df73d2 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Fri, 11 May 2018 00:39:17 +0300 Subject: [PATCH 082/902] Russian translation: improvements of helper-url (#16255) [skip ci] --- docs/guide-ru/helper-url.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide-ru/helper-url.md b/docs/guide-ru/helper-url.md index b292507a473..b171dacf28f 100644 --- a/docs/guide-ru/helper-url.md +++ b/docs/guide-ru/helper-url.md @@ -1,7 +1,7 @@ -Url хелпер +Url ========== -Url хелпер предоставляет набор статических методов для управления URL. +Хелпер Url предоставляет набор статических методов для управления URL. ## Получение общих URL @@ -94,7 +94,7 @@ echo Url::toRoute('site/index', 'https'); В разделе [[toRoute()]] подробно описано как задавать роут; - Строка, начинающаяся с `@`, будет обработана как псевдоним. Будет возвращено соответствующее значение псевдонима; - Пустая строка: вернет текущий URL; -- Обычная строка: вернет строку без изменений +- Обычная строка: вернет строку без изменений. Когда у метода задан второй параметр `$scheme` (строка или `true`), то сгенерированный URL будет с протоколом (полученным из [[\yii\web\UrlManager::hostInfo]]). Если в `$url` указан протокол, то его значение будет заменено. @@ -128,7 +128,7 @@ echo Url::to('@web/images/logo.gif', 'https'); ``` Начиная с версии 2.0.3, вы можете использовать [[yii\helpers\Url::current()]], чтобы создавать URL на основе текущего -запрошенного роута и его GET-параметров. Вы можете изменить, удалить или добавить новые GET-параметры передав в метод +запрошенного роута и его GET-параметров. Вы можете изменить, удалить или добавить новые GET-параметры, передав в метод параметр `$params`. Например: ```php From 5b0c163c59aa7d07d620269658496ac2955e39ea Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Fri, 11 May 2018 00:39:47 +0300 Subject: [PATCH 083/902] Russian translation: improvements of helper-array (#16256) [skip ci] --- docs/guide-ru/helper-array.md | 36 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/guide-ru/helper-array.md b/docs/guide-ru/helper-array.md index f68de6c63f8..c8ffc40595a 100644 --- a/docs/guide-ru/helper-array.md +++ b/docs/guide-ru/helper-array.md @@ -1,6 +1,6 @@ ArrayHelper =========== -В добавок к [богатому набору функций](http://php.net/manual/en/book.array.php) для работы с массивами, которые есть в самом PHP, Yii Array helper предоставляет свои статические функции, которые могут быть вам полезны. +Вдобавок к [богатому набору функций](http://php.net/manual/ru/book.array.php) для работы с массивами, которые есть в самом PHP, хелпер Yii Array предоставляет свои статические функции, которые могут быть вам полезны. ## Получение значений @@ -31,7 +31,7 @@ $value = ArrayHelper::getValue($array, 'foo.bar.name'); Первый аргумент – массив или объект из которого мы извлекаем значение. Второй аргумент определяет как будут извлекаться данные и может выглядеть как один из таких вариантов: - Имя ключа массива или свойства объекта, значение которого нужно вернуть - Путь к нужному значению, разделенный точками, как в примере выше -- Callback-функция возвращающая значение +- Callback-функция, возвращающая значение Callback-функция должна выглядеть примерно так: @@ -41,7 +41,7 @@ $fullName = ArrayHelper::getValue($user, function ($user, $defaultValue) { }); ``` -Третий, необязательный, аргумент определяет значение по-умолчанию. Если не установлен – равен `null`. Используется так: +Третий необязательный аргумент определяет значение по умолчанию. Если не установлен – равен `null`. Используется так: ```php $username = ArrayHelper::getValue($comment, 'user.username', 'Unknown'); @@ -110,7 +110,7 @@ $type = ArrayHelper::remove($array, 'type'); ## Проверка наличия ключей -`ArrayHelper::keyExists` работает так же как и стандартный [array_key_exists](http://php.net/manual/en/function.array-key-exists.php), +`ArrayHelper::keyExists` работает так же, как и стандартный [array_key_exists](http://php.net/manual/ru/function.array-key-exists.php), но также может проверять ключи без учёта регистра: ```php @@ -123,7 +123,7 @@ $data2 = [ ]; if (!ArrayHelper::keyExists('username', $data1, false) || !ArrayHelper::keyExists('username', $data2, false)) { - echo "Please provide username."; + echo "Пожалуйста, укажите имя пользователя."; } ``` @@ -164,13 +164,13 @@ $array = [ ['id' => '345', 'data' => 'def'], ]; $result = ArrayHelper::index($array, 'id'); -// the result is: +// результат будет таким: // [ // '123' => ['id' => '123', 'data' => 'abc'], // '345' => ['id' => '345', 'data' => 'def'], // ] -// using anonymous function +// использование анонимной функции $result = ArrayHelper::index($array, function ($element) { return $element['id']; }); @@ -182,7 +182,7 @@ $result = ArrayHelper::index($array, function ($element) { Для получения пар ключ-значение из многомерного массива или из массива объектов вы можете использовать метод `map`. -Параметры `$from` и `$to` определяют имена ключей или свойств, которые будут использованы в map. Так же, третьим необязательным параметром вы можете задать правила группировки. +Параметры `$from` и `$to` определяют имена ключей или свойств, которые будут использованы в map. Также третьим необязательным параметром вы можете задать правила группировки. ```php $array = [ @@ -192,7 +192,7 @@ $array = [ ); $result = ArrayHelper::map($array, 'id', 'name'); -// the result is: +// результат будет таким: // [ // '123' => 'aaa', // '124' => 'bbb', @@ -200,7 +200,7 @@ $result = ArrayHelper::map($array, 'id', 'name'); // ] $result = ArrayHelper::map($array, 'id', 'name', 'class'); -// the result is: +// результат будет таким: // [ // 'x' => [ // '123' => 'aaa', @@ -245,7 +245,7 @@ ArrayHelper::multisort($data, function($item) { ``` Третий аргумент определяет способ сортировки – от большего к меньшему или от меньшего к большему. В случае, если мы сортируем по одному ключу, передаем `SORT_ASC` или `SORT_DESC`. Если сортировка осуществляется по нескольким ключам, вы можете назначить направление сортировки для каждого из них с помощью массива. -Последний аргумент – это флаг, который используется в стандартной функции PHP `sort()`. Посмотреть его возможные значения можно [тут](http://php.net/manual/en/function.sort.php). +Последний аргумент – это флаг, который используется в стандартной функции PHP `sort()`. Посмотреть его возможные значения можно [тут](http://php.net/manual/ru/function.sort.php). ## Определение типа массива @@ -253,11 +253,11 @@ ArrayHelper::multisort($data, function($item) { Удобный способ для определения, является массив индексным или ассоциативным. Вот пример: ```php -// no keys specified +// ключи не определены $indexed = ['Qiang', 'Paul']; echo ArrayHelper::isIndexed($indexed); -// all keys are strings +// все ключи - строки $associative = ['framework' => 'Yii', 'version' => '2.0']; echo ArrayHelper::isAssociative($associative); ``` @@ -295,9 +295,9 @@ $data = ArrayHelper::toArray($posts, [ 'app\models\Post' => [ 'id', 'title', - // the key name in array result => property name + // ключ в результирующем массиве => имя свойства 'createTime' => 'created_at', - // the key name in array result => anonymous function + // ключ в результирующем массиве => анонимная функция 'length' => function ($post) { return strlen($post->content); }, @@ -305,7 +305,7 @@ $data = ArrayHelper::toArray($posts, [ ]); ``` -Первый аргумент содержит данные, которые вы хотите конвертировать. В нашем случае это Active Record модель `Post`. +Первый аргумент содержит данные, которые вы хотите конвертировать. В нашем случае это модель Active Record `Post`. Второй аргумент служит для управления процессом конвертации и может быть трех видов: @@ -331,11 +331,11 @@ $data = ArrayHelper::toArray($posts, [ ## Проверка на присутствие в массиве Часто необходимо проверить, содержится ли элемент в массиве, или является ли массив подмножеством другого массива. -К сожалению, PHP функция `in_array()` не поддерживает подмножества объектов, реализующих интерфейс `\Traversable`. +К сожалению, PHP-функция `in_array()` не поддерживает подмножества объектов, реализующих интерфейс `\Traversable`. Для таких случаев [[yii\helpers\ArrayHelper]] предоставляет [[yii\helpers\ArrayHelper::isIn()|isIn()]] и [[yii\helpers\ArrayHelper::isSubset()|isSubset()]]. Методы принимают такие же параметры, что и -[in_array()](http://php.net/manual/en/function.in-array.php). +[in_array()](http://php.net/manual/ru/function.in-array.php). ```php // true From bb4f5f6a0af23375c55e147678b0ae02f4b44bdf Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 11 May 2018 15:58:57 +0800 Subject: [PATCH 084/902] Update runtime-responses.md --- docs/guide-zh-CN/runtime-responses.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/runtime-responses.md b/docs/guide-zh-CN/runtime-responses.md index 7a5a5ff8292..a24533bf290 100644 --- a/docs/guide-zh-CN/runtime-responses.md +++ b/docs/guide-zh-CN/runtime-responses.md @@ -5,7 +5,8 @@ 这个响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, 从本质上说,网页应用开发最终的目标就是根据不同的请求去构建这些响应对象。 -在大多数实际应用情况下,你应该主要地去处理`response`这个 [应用组件](structure-application-components.md),在默认情况下,它是一个继承自[[yii\web\Response]]的实例 +在大多数实际应用情况下,你应该主要地去处理`response`这个 [应用组件](structure-application-components.md), +在默认情况下,它是一个继承自[[yii\web\Response]]的实例 然而,Yii也允许你创建自己的响应对象并发送给终端用户,这方面在后续会阐述。 在本节,我们将会讲述如何组装和构建响应并把它发送给终端用户。 From 84cb255aab99ef5fe5b20a6279aed6dbbe7a6ab9 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 11 May 2018 10:04:00 +0200 Subject: [PATCH 085/902] Fixes #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors --- .travis.yml | 5 +++-- framework/CHANGELOG.md | 2 ++ framework/db/BaseActiveRecord.php | 2 ++ tests/data/ar/Cat.php | 20 ++++++++++++++++++++ tests/framework/db/ActiveRecordTest.php | 16 ++++++++++++++++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index ac5cb295bf5..62ff03b551d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,8 +91,9 @@ matrix: - mysql - postgresql - # test against the latest HHVM version by using a newer image - - php: hhvm + # test against the latest pre 3.26 HHVM version by using a newer image. + # @see https://github.com/facebook/hhvm/issues/8192 + - php: hhvm-3.24 sudo: true addons: code_climate: diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index cea32f7bb9d..79fd9bd76d5 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -18,9 +18,11 @@ Yii Framework 2 Change Log - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) - Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) +- Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) + 2.0.15.1 March 21, 2018 ----------------------- diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 3c8697c07a0..52464442279 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -333,6 +333,8 @@ public function __isset($name) { try { return $this->__get($name) !== null; + } catch (\Throwable $t) { + return false; } catch (\Exception $e) { return false; } diff --git a/tests/data/ar/Cat.php b/tests/data/ar/Cat.php index 2d5a31ce9af..954c52140a6 100644 --- a/tests/data/ar/Cat.php +++ b/tests/data/ar/Cat.php @@ -25,4 +25,24 @@ public static function populateRecord($record, $row) $record->does = 'meow'; } + + /** + * This is to test if __isset catches the exception. + * @throw DivisionByZeroError + * @return float|int + */ + public function getException() + { + throw new \Exception('no'); + } + + /** + * This is to test if __isset catches the error. + * @throw DivisionByZeroError + * @return float|int + */ + public function getThrowable() + { + return 5/0; + } } diff --git a/tests/framework/db/ActiveRecordTest.php b/tests/framework/db/ActiveRecordTest.php index f88024b1f48..061d8ec47a8 100644 --- a/tests/framework/db/ActiveRecordTest.php +++ b/tests/framework/db/ActiveRecordTest.php @@ -1799,4 +1799,20 @@ public function testResetNotSavedRelation() $this->assertEquals(1, sizeof($order->orderItems)); } + + public function testIssetException() + { + $cat = new Cat(); + $this->assertFalse(isset($cat->exception)); + } + + /** + * @requires PHP 7 + */ + public function testIssetThrowable() + { + $cat = new Cat(); + $this->assertFalse(isset($cat->throwable)); + + } } From a8d95f429d5894eb52ffc92512b8eb126bbe24c7 Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 11 May 2018 11:50:56 +0200 Subject: [PATCH 086/902] Fixes #14636: Views can now use relative paths even when using themed views --- framework/CHANGELOG.md | 1 + framework/base/View.php | 20 ++++++++++++++++---- tests/framework/base/ViewTest.php | 30 ++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 79fd9bd76d5..65f5dd39c06 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -18,6 +18,7 @@ Yii Framework 2 Change Log - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) - Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) +- Bug #14636: Views can now use relative paths even when using themed views (sammousa) - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) diff --git a/framework/base/View.php b/framework/base/View.php index 1a501d5b57e..73aac16d1f5 100644 --- a/framework/base/View.php +++ b/framework/base/View.php @@ -184,7 +184,7 @@ protected function findViewFile($view, $context = null) } } elseif ($context instanceof ViewContextInterface) { $file = $context->getViewPath() . DIRECTORY_SEPARATOR . $view; - } elseif (($currentViewFile = $this->getViewFile()) !== false) { + } elseif (($currentViewFile = $this->getRequestedViewFile()) !== false) { $file = dirname($currentViewFile) . DIRECTORY_SEPARATOR . $view; } else { throw new InvalidCallException("Unable to resolve view file for view '$view': no active view context."); @@ -222,7 +222,7 @@ protected function findViewFile($view, $context = null) */ public function renderFile($viewFile, $params = [], $context = null) { - $viewFile = Yii::getAlias($viewFile); + $viewFile = $requestedFile = Yii::getAlias($viewFile); if ($this->theme !== null) { $viewFile = $this->theme->applyTo($viewFile); @@ -238,7 +238,10 @@ public function renderFile($viewFile, $params = [], $context = null) $this->context = $context; } $output = ''; - $this->_viewFiles[] = $viewFile; + $this->_viewFiles[] = [ + 'resolved' => $viewFile, + 'requested' => $requestedFile + ]; if ($this->beforeRender($viewFile, $params)) { Yii::debug("Rendering view file: $viewFile", __METHOD__); @@ -267,7 +270,16 @@ public function renderFile($viewFile, $params = [], $context = null) */ public function getViewFile() { - return end($this->_viewFiles); + return empty($this->_viewFiles) ? false : end($this->_viewFiles)['resolved']; + } + + /** + * @return string|bool the requested view currently being rendered. False if no view file is being rendered. + * @since 2.0.16 + */ + protected function getRequestedViewFile() + { + return empty($this->_viewFiles) ? false : end($this->_viewFiles)['requested']; } /** diff --git a/tests/framework/base/ViewTest.php b/tests/framework/base/ViewTest.php index f008804ecf8..fae03cdd723 100644 --- a/tests/framework/base/ViewTest.php +++ b/tests/framework/base/ViewTest.php @@ -8,7 +8,9 @@ namespace yiiunit\framework\base; use Yii; +use yii\base\Theme; use yii\base\View; +use yii\base\ViewEvent; use yii\helpers\FileHelper; use yiiunit\TestCase; @@ -67,4 +69,32 @@ public function testExceptionOnRenderFile() $this->assertEquals($obInitialLevel, ob_get_level()); } + + public function testRelativePathInView() + { + $view = new View(); + FileHelper::createDirectory($this->testViewPath . '/theme1'); + \Yii::setAlias('@testviews', $this->testViewPath); + \Yii::setAlias('@theme', $this->testViewPath . '/theme1'); + + $baseView = "{$this->testViewPath}/theme1/base.php"; + file_put_contents($baseView, <<<'PHP' +render("sub"); +?> +PHP + ); + + $subView = "{$this->testViewPath}/sub.php"; + $subViewContent = "subviewcontent"; + file_put_contents($subView, $subViewContent); + + $view->theme = new Theme([ + 'pathMap' => [ + '@testviews' => '@theme' + ] + ]); + + $this->assertSame($subViewContent, $view->render('@testviews/base')); + } } From cc2cac58d298e2d4caef393baa373229cc505320 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 12 May 2018 14:17:59 +0300 Subject: [PATCH 087/902] Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` --- framework/CHANGELOG.md | 1 + framework/db/Schema.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 65f5dd39c06..e34308e83b8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -22,6 +22,7 @@ Yii Framework 2 Change Log - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) +- Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) 2.0.15.1 March 21, 2018 diff --git a/framework/db/Schema.php b/framework/db/Schema.php index 30cdd82fc75..ced2e6d4539 100644 --- a/framework/db/Schema.php +++ b/framework/db/Schema.php @@ -732,7 +732,7 @@ protected function getTableMetadata($name, $type, $refresh) $cache = null; if ($this->db->enableSchemaCache && !in_array($name, $this->db->schemaCacheExclude, true)) { $schemaCache = is_string($this->db->schemaCache) ? Yii::$app->get($this->db->schemaCache, false) : $this->db->schemaCache; - if ($schemaCache instanceof Cache) { + if ($schemaCache instanceof CacheInterface) { $cache = $schemaCache; } } From 1945dc69c715c1257af9cd89789d7f3081bba089 Mon Sep 17 00:00:00 2001 From: Salem Ouerdani Date: Sat, 12 May 2018 12:43:13 +0100 Subject: [PATCH 088/902] Fixes #9133: Added `yii\behaviors\OptimisticLockBehavior` --- docs/guide/db-active-record.md | 18 +- framework/CHANGELOG.md | 1 + .../behaviors/OptimisticLockBehavior.php | 160 ++++++++++ framework/db/BaseActiveRecord.php | 4 +- .../behaviors/OptimisticLockBehaviorTest.php | 283 ++++++++++++++++++ 5 files changed, 462 insertions(+), 4 deletions(-) create mode 100644 framework/behaviors/OptimisticLockBehavior.php create mode 100644 tests/framework/behaviors/OptimisticLockBehaviorTest.php diff --git a/docs/guide/db-active-record.md b/docs/guide/db-active-record.md index d11cee82ae5..3e29a69847d 100644 --- a/docs/guide/db-active-record.md +++ b/docs/guide/db-active-record.md @@ -743,9 +743,10 @@ To use optimistic locking, 1. Create a column in the DB table associated with the Active Record class to store the version number of each row. The column should be of big integer type (in MySQL it would be `BIGINT DEFAULT 0`). 2. Override the [[yii\db\ActiveRecord::optimisticLock()]] method to return the name of this column. -3. In the Web form that takes user inputs, add a hidden field to store the current version number of the row being updated. - Be sure your version attribute has input validation rules and validates successfully. -4. In the controller action that updates the row using Active Record, try and catch the [[yii\db\StaleObjectException]] +3. Implement [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] inside your model class to automatically parse its value from received requests. +4. In the Web form that takes user inputs, add a hidden field to store the current version number of the row being updated. + Remove the version attribute from validation rules as [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] should handle it. +5. In the controller action that updates the row using Active Record, try and catch the [[yii\db\StaleObjectException]] exception. Implement necessary business logic (e.g. merging the changes, prompting staled data) to resolve the conflict. For example, assume the version column is named as `version`. You can implement optimistic locking with the code like @@ -780,6 +781,17 @@ public function actionUpdate($id) // logic to resolve the conflict } } + +// ------ model code ------- + +use yii\behaviors\OptimisticLockBehavior; + +public function behaviors() +{ + return [ + OptimisticLockBehavior::className(), + ]; +} ``` diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e34308e83b8..bc11f1c94a8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ +- Enh #9133: Added `yii\behaviors\OptimisticLockBehavior` (tunecino) - Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins (Jianjun Chen) - Bug #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' (OndrejVasicek) - Bug #16006: Handle case when `X-Forwarded-Host` header have multiple hosts separated with a comma (pgaultier) diff --git a/framework/behaviors/OptimisticLockBehavior.php b/framework/behaviors/OptimisticLockBehavior.php new file mode 100644 index 00000000000..ba5d2aef306 --- /dev/null +++ b/framework/behaviors/OptimisticLockBehavior.php @@ -0,0 +1,160 @@ +upgrade(); + * ``` + * + * @author Salem Ouerdani + * @since 2.0.16 + * @see \yii\db\BaseActiveRecord::optimisticLock() for details on how to enable optimistic lock. + */ +class OptimisticLockBehavior extends AttributeBehavior +{ + /** + * {@inheritdoc} + * + * In case of `null` value it will be directly parsed from [[\yii\web\Request::getBodyParam()|getBodyParam()]] or set to 0. + */ + public $value; + /** + * {@inheritdoc} + */ + public $skipUpdateOnClean = false; + /** + * @var string the attribute name holding the version value. + */ + private $_lockAttribute; + + + /** + * {@inheritdoc} + */ + public function attach($owner) + { + parent::attach($owner); + + if (empty($this->attributes)) { + $lock = $this->getLockAttribute(); + $this->attributes = array_fill_keys(array_keys($this->events()), $lock); + } + } + + /** + * {@inheritdoc} + */ + public function events() + { + return Yii::$app->request instanceof \yii\web\Request ? [ + BaseActiveRecord::EVENT_BEFORE_INSERT => 'evaluateAttributes', + BaseActiveRecord::EVENT_BEFORE_UPDATE => 'evaluateAttributes', + BaseActiveRecord::EVENT_BEFORE_DELETE => 'evaluateAttributes', + ] : []; + } + + /** + * Returns the column name to hold the version value as defined in [[\yii\db\BaseActiveRecord::optimisticLock()|optimisticLock()]]. + * @return string the property name. + * @throws InvalidCallException if [[\yii\db\BaseActiveRecord::optimisticLock()|optimisticLock()]] is not properly configured. + * @since 2.0.16 + */ + protected function getLockAttribute() + { + if ($this->_lockAttribute) { + return $this->_lockAttribute; + } + + /* @var $owner BaseActiveRecord */ + $owner = $this->owner; + $lock = $owner->optimisticLock(); + if ($lock === null || $owner->hasAttribute($lock) === false) { + throw new InvalidCallException("Unable to get the optimistic lock attribute. Probably 'optimisticLock()' method is misconfigured."); + } + $this->_lockAttribute = $lock; + return $lock; + } + + /** + * {@inheritdoc} + * + * In case of `null`, value will be parsed from [[\yii\web\Request::getBodyParam()|getBodyParam()]] or set to 0. + */ + protected function getValue($event) + { + if ($this->value === null) { + $lock = $this->getLockAttribute(); + $input = Yii::$app->getRequest()->getBodyParam($lock); + $isValid = $input && (new NumberValidator())->validate($input); + return $isValid ? $input : 0; + } + + return parent::getValue($event); + } + + /** + * Upgrades the version value by one and stores it to database. + * + * ```php + * $model->upgrade(); + * ``` + * @throws InvalidCallException if owner is a new record. + * @since 2.0.16 + */ + public function upgrade() + { + /* @var $owner BaseActiveRecord */ + $owner = $this->owner; + if ($owner->getIsNewRecord()) { + throw new InvalidCallException('Upgrading the model version is not possible on a new record.'); + } + $lock = $this->getLockAttribute(); + $version = $owner->$lock ?: 0; + $owner->updateAttributes([$lock => $version + 1]); + } +} diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index 52464442279..df969048939 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -222,7 +222,9 @@ public static function deleteAll($condition = null) * * 1. Create a column to store the version number of each row. The column type should be `BIGINT DEFAULT 0`. * Override this method to return the name of this column. - * 2. Add a `required` validation rule for the version column to ensure the version value is submitted. + * 2. Ensure the version value is submitted and loaded to your model before any update or delete. + * Or add [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] to your model + * class in order to automate the process. * 3. In the Web form that collects the user input, add a hidden field that stores * the lock version of the recording being updated. * 4. In the controller action that does the data updating, try to catch the [[StaleObjectException]] diff --git a/tests/framework/behaviors/OptimisticLockBehaviorTest.php b/tests/framework/behaviors/OptimisticLockBehaviorTest.php new file mode 100644 index 00000000000..a81fa1a61c2 --- /dev/null +++ b/tests/framework/behaviors/OptimisticLockBehaviorTest.php @@ -0,0 +1,283 @@ +mockApplication([ + 'components' => [ + 'db' => [ + 'class' => '\yii\db\Connection', + 'dsn' => 'sqlite::memory:', + ], + ], + ]); + + $columns = [ + 'id' => 'pk', + 'version' => 'integer NOT NULL', + ]; + Yii::$app->getDb()->createCommand()->createTable('test_auto_lock_version', $columns)->execute(); + + $columns = [ + 'id' => 'pk', + 'version' => 'string NOT NULL', + ]; + Yii::$app->getDb()->createCommand()->createTable('test_auto_lock_version_string', $columns)->execute(); + } + + public function tearDown() + { + Yii::$app->getDb()->close(); + parent::tearDown(); + gc_enable(); + gc_collect_cycles(); + } + + // Tests : + + public function testUpdateRecordWithinConsoleRequest() + { + ActiveRecordLockVersion::$behaviors = [ + OptimisticLockBehavior::className(), + ]; + $model = new ActiveRecordLockVersion(); + $model->version = 0; + $model->save(false); + + // upgrade model + + $model->upgrade(); + + $this->assertEquals(1, $model->version, 'updated version should equal 1'); + + // a console request should use the version number as loaded from database (the behavior should be omitted) + + $model->markAttributeDirty('version'); + + $model->save(false); + + $this->assertEquals(2, $model->version, 'updated version should equal 2'); + } + + + public function testNewRecord() + { + // create a record without any version + + $request = new Request(); + Yii::$app->set('request', $request); + + ActiveRecordLockVersion::$behaviors = [ + OptimisticLockBehavior::className(), + ]; + $model = new ActiveRecordLockVersion(); + $model->save(false); + + $this->assertEquals(0, $model->version, 'init version should equal 0'); + + // create a record starting from version 5 + + $request->setBodyParams(['version' => 5]); + Yii::$app->set('request', $request); + + $model = new ActiveRecordLockVersion(); + $model->save(false); + + $this->assertEquals(5, $model->version, 'init version should equal 5'); + } + + + public function testUpdateRecord() + { + $request = new Request(); + Yii::$app->set('request', $request); + + ActiveRecordLockVersion::$behaviors = [ + OptimisticLockBehavior::className(), + ]; + $model = new ActiveRecordLockVersion(); + $model->save(false); + + // upgrade model + + $model->upgrade(); + + $this->assertEquals(1, $model->version, 'updated version should equal 1'); + + // save stale data without sending version + + $thrown = false; + + try { + $model->save(false); + } catch (\yii\db\StaleObjectException $e) { + $this->assertContains('The object being updated is outdated.', $e->getMessage()); + $thrown = true; + } + + $this->assertTrue($thrown, 'A StaleObjectException exception should have been thrown.'); + + // save stale data by sending an outdated version + + $request->setBodyParams(['version' => 0]); + Yii::$app->set('request', $request); + + $thrown = false; + + try { + $model->save(false); + } catch (\yii\db\StaleObjectException $e) { + $this->assertContains('The object being updated is outdated.', $e->getMessage()); + $thrown = true; + } + + $this->assertTrue($thrown, 'A StaleObjectException exception should have been thrown.'); + + // save stale data by sending an 'invalid' version number + + $request->setBodyParams(['version' => 'yii']); + Yii::$app->set('request', $request); + + $thrown = false; + + try { + $model->save(false); + } catch (\yii\db\StaleObjectException $e) { + $this->assertContains('The object being updated is outdated.', $e->getMessage()); + $thrown = true; + } + + $this->assertTrue($thrown, 'A StaleObjectException exception should have been thrown.'); + + // the behavior should set version to 0 when user input is not a valid number. + + $this->assertEquals(0, $model->version, 'updated version should equal 0'); + + // a successful update by sending the correct version + + $request->setBodyParams(['version' => '1']); + Yii::$app->set('request', $request); + + $model->save(false); + + $this->assertEquals(2, $model->version, 'updated version should equal 2'); + } + + public function testDeleteRecord() + { + $request = new Request(); + Yii::$app->set('request', $request); + + ActiveRecordLockVersion::$behaviors = [ + OptimisticLockBehavior::className(), + ]; + $model = new ActiveRecordLockVersion(); + $model->save(false); + + // upgrade model version to 1 + + $model->upgrade(); + + // delete stale data without sending version + + $thrown = false; + + try { + $model->delete(); + } catch (\yii\db\StaleObjectException $e) { + $this->assertContains('The object being deleted is outdated.', $e->getMessage()); + $thrown = true; + } + + $this->assertTrue($thrown, 'A StaleObjectException exception should have been thrown.'); + + // delete stale data by sending an outdated version + + $request->setBodyParams(['version' => 0]); + Yii::$app->set('request', $request); + + $thrown = false; + + try { + $model->delete(); + } catch (\yii\db\StaleObjectException $e) { + $this->assertContains('The object being deleted is outdated.', $e->getMessage()); + $thrown = true; + } + + $this->assertTrue($thrown, 'A StaleObjectException exception should have been thrown.'); + + // a successful update by sending the correct version + + $request->setBodyParams(['version' => '1']); + Yii::$app->set('request', $request); + + $model->delete(); + + $this->assertEquals(1, $model->version, 'deleted version should remain 1'); + } +} + +/** + * Test Active Record class with [[OptimisticLockBehavior]] behavior attached. + * + * @property int $id + * @property int $created_at + * @property int $updated_at + */ +class ActiveRecordLockVersion extends ActiveRecord +{ + public static $behaviors; + public static $lockAttribute = 'version'; + public static $tableName = 'test_auto_lock_version'; + + public function behaviors() + { + return static::$behaviors; + } + + public function optimisticLock() + { + return static::$lockAttribute; + } + + public static function tableName() + { + return static::$tableName; + } +} From e4b559d720168b43c70233b08ca1a30514c7ed59 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 12 May 2018 14:47:00 +0300 Subject: [PATCH 089/902] Fixes #16217: Fixed `yii\console\controllers\HelpController` to work well in Windows environment --- .appveyor.yml | 1 + framework/CHANGELOG.md | 2 +- framework/console/controllers/HelpController.php | 10 +++++----- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index ad34461ebf2..d9a7f7e0cd6 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -30,6 +30,7 @@ install: - echo extension=php_intl.dll >> php.ini - echo extension=php_mbstring.dll >> php.ini - echo extension=php_openssl.dll >> php.ini + - echo extension=php_pdo_sqlite.dll >> php.ini - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/1.4.1/composer.phar) before_test: diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index bc11f1c94a8..792f796c94b 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -19,10 +19,10 @@ Yii Framework 2 Change Log - Bug #16091: Make `yii\test\InitDbFixture` work with non-SQL DBMS (cebe) - Bug #16184: Fixed `yii\base\Widget` to access `stack` property with `self` instead of `static` (yanggs07) - Bug #16039: Fixed implicit conversion from `char` to `varbinnary` in MSSQL (vsivsivsi) +- Bug #16217: Fixed `yii\console\controllers\HelpController` to work well in Windows environment (samdark) - Bug #14636: Views can now use relative paths even when using themed views (sammousa) - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) - - Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) diff --git a/framework/console/controllers/HelpController.php b/framework/console/controllers/HelpController.php index 5bb5040ff74..20d695fb0ec 100644 --- a/framework/console/controllers/HelpController.php +++ b/framework/console/controllers/HelpController.php @@ -116,13 +116,13 @@ public function actionListActionOptions($action) } foreach ($controller->getActionArgsHelp($action) as $argument => $help) { - $description = str_replace("\n", '', addcslashes($help['comment'], ':')) ?: $argument; + $description = preg_replace("~\R~", '', addcslashes($help['comment'], ':')) ?: $argument; $this->stdout($argument . ':' . $description . "\n"); } $this->stdout("\n"); foreach ($controller->getActionOptionsHelp($action) as $argument => $help) { - $description = str_replace("\n", '', addcslashes($help['comment'], ':')); + $description = preg_replace("~\R~", '', addcslashes($help['comment'], ':')); $this->stdout('--' . $argument . ($description ? ':' . $description : '') . "\n"); } } @@ -251,16 +251,16 @@ protected function getModuleCommands($module) $file = $matches[0]; $relativePath = str_replace($controllerPath, '', $file); $class = strtr($relativePath, [ - DIRECTORY_SEPARATOR => '\\', + '/' => '\\', '.php' => '', ]); $controllerClass = $module->controllerNamespace . $class; if ($this->validateControllerClass($controllerClass)) { - $dir = ltrim(pathinfo($relativePath, PATHINFO_DIRNAME), DIRECTORY_SEPARATOR); + $dir = ltrim(pathinfo($relativePath, PATHINFO_DIRNAME), '\\/'); $command = Inflector::camel2id(substr(basename($file), 0, -14), '-', true); if (!empty($dir)) { - $command = $dir . DIRECTORY_SEPARATOR . $command; + $command = $dir . '/' . $command; } $commands[] = $prefix . $command; } From a32cfcc8ef025dfe03a98eff675d56c1132eec74 Mon Sep 17 00:00:00 2001 From: Thoulah Date: Sun, 13 May 2018 00:14:39 +0200 Subject: [PATCH 090/902] Fixes #16266: Fixed `yii\helpers\BaseStringHelper` where explode would not allow 0 as trim string --- framework/CHANGELOG.md | 1 + framework/helpers/BaseStringHelper.php | 2 +- tests/framework/helpers/StringHelperTest.php | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 792f796c94b..391b6a7fe08 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -22,6 +22,7 @@ Yii Framework 2 Change Log - Bug #16217: Fixed `yii\console\controllers\HelpController` to work well in Windows environment (samdark) - Bug #14636: Views can now use relative paths even when using themed views (sammousa) - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) +- Bug #16266: Fixed `yii\helpers\BaseStringHelper` where explode would not allow 0 as trim string (Thoulah) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) - Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) diff --git a/framework/helpers/BaseStringHelper.php b/framework/helpers/BaseStringHelper.php index e3a304ac049..8eff643b81c 100644 --- a/framework/helpers/BaseStringHelper.php +++ b/framework/helpers/BaseStringHelper.php @@ -269,7 +269,7 @@ public static function endsWith($string, $with, $caseSensitive = true) public static function explode($string, $delimiter = ',', $trim = true, $skipEmpty = false) { $result = explode($delimiter, $string); - if ($trim) { + if ($trim !== false) { if ($trim === true) { $trim = 'trim'; } elseif (!is_callable($trim)) { diff --git a/tests/framework/helpers/StringHelperTest.php b/tests/framework/helpers/StringHelperTest.php index 5f6416e6a4a..1fc49fc4bc7 100644 --- a/tests/framework/helpers/StringHelperTest.php +++ b/tests/framework/helpers/StringHelperTest.php @@ -267,6 +267,7 @@ public function testExplode() $this->assertEquals(['It', 'is', 'a test with trimmed digits', '0', '1', '2'], StringHelper::explode('It, is, a test with trimmed digits, 0, 1, 2', ',', true, true)); $this->assertEquals(['It', 'is', 'a second', 'test'], StringHelper::explode('It+ is+ a second+ test', '+')); $this->assertEquals(['Save', '', '', 'empty trimmed string'], StringHelper::explode('Save, ,, empty trimmed string', ',')); + $this->assertEquals(['44', '512'], StringHelper::explode('0 0 440 512', ' ', '0', true)); $this->assertEquals(['Здесь', 'multibyte', 'строка'], StringHelper::explode('Здесь我 multibyte我 строка', '我')); $this->assertEquals(['Disable', ' trim ', 'here but ignore empty'], StringHelper::explode('Disable, trim ,,,here but ignore empty', ',', false, true)); $this->assertEquals(['It/', ' is?', ' a', ' test with rtrim'], StringHelper::explode('It/, is?, a , test with rtrim', ',', 'rtrim')); From ea6139f111e42357d6e570a4f6b0c14d00277131 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Mon, 14 May 2018 14:22:27 +0900 Subject: [PATCH 091/902] guide-ja/db-active-record.md updated [ci skip] --- docs/guide-ja/db-active-record.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/docs/guide-ja/db-active-record.md b/docs/guide-ja/db-active-record.md index 5240947e1a4..287ebd57b49 100644 --- a/docs/guide-ja/db-active-record.md +++ b/docs/guide-ja/db-active-record.md @@ -742,10 +742,11 @@ class Post extends \yii\db\ActiveRecord 1. アクティブ・レコード・クラスと関連付けられている DB テーブルに、各行のバージョン番号を保存するカラムを作成します。 カラムは長倍精度整数 (big integer) タイプでなければなりません (MySQL では `BIGINT DEFAULT 0` です)。 -2. [[yii\db\ActiveRecord::optimisticLock()]] メソッドをオーバーライドして、このカラムの名前を返すようにします。 -3. ユーザ入力を収集するウェブフォームに、更新されるレコードの現在のバージョン番号を保持する隠しフィールドを追加します。 - バージョン属性が入力の検証規則を持っており、検証が成功することを確かめてください。 -4. アクティブ・レコードを使って行の更新を行うコントローラ・アクションにおいて、[[\yii\db\StaleObjectException]] 例外を捕捉して、 +2. [[yii\db\ActiveRecord::optimisticLock()]] メソッドをオーバーライドして、このカラムの名前を返すようにします。 +3. あなたのモデル・クラスの中で [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] を実装し、受診したリクエストからその値を自動的に解析できるようにします。 +4. ユーザ入力を収集するウェブフォームに、更新されるレコードの現在のバージョン番号を保持する隠しフィールドを追加します。 + [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] が検証を処理すべきですので、バージョンの属性は検証規則から削除します。 +5. アクティブ・レコードを使って行の更新を行うコントローラ・アクションにおいて、[[\yii\db\StaleObjectException]] 例外を捕捉して、 衝突を解決するために必要なビジネス・ロジック (例えば、変更をマージしたり、データの陳腐化を知らせたり) を実装します。 例えば、バージョン番号のカラムが `version` と名付けられているとすると、 @@ -780,6 +781,17 @@ public function actionUpdate($id) // 衝突を解決するロジック } } + +// ------ モデルのコード ------- + +use yii\behaviors\OptimisticLockBehavior; + +public function behaviors() +{ + return [ + OptimisticLockBehavior::className(), + ]; +} ``` From 6dd2aec011db09d286de11faeda490a3e718edb9 Mon Sep 17 00:00:00 2001 From: Vladimir Reznichenko Date: Mon, 14 May 2018 11:00:01 +0200 Subject: [PATCH 092/902] [minor]: SCA (#16269) * Php Inspections (EA Ultimate): minor code tweaks * Php Inspections (EA Ultimate): code style * Php Inspections (EA Ultimate): code style * Php Inspections (EA Ultimate): code style --- framework/db/ActiveRelationTrait.php | 30 +++++++++++++--------------- framework/db/oci/Schema.php | 2 +- framework/web/Request.php | 2 +- framework/web/Session.php | 8 +++----- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/framework/db/ActiveRelationTrait.php b/framework/db/ActiveRelationTrait.php index 3297e2655d0..5c196daa0e5 100644 --- a/framework/db/ActiveRelationTrait.php +++ b/framework/db/ActiveRelationTrait.php @@ -353,24 +353,22 @@ private function populateInverseRelation(&$primaryModels, $models, $primaryName, } } } - } else { - if ($this->multiple) { - foreach ($primaryModels as $i => $primaryModel) { - foreach ($primaryModel[$primaryName] as $j => $m) { - if ($m instanceof ActiveRecordInterface) { - $m->populateRelation($name, $primaryModel); - } else { - $primaryModels[$i][$primaryName][$j][$name] = $primaryModel; - } + } elseif ($this->multiple) { + foreach ($primaryModels as $i => $primaryModel) { + foreach ($primaryModel[$primaryName] as $j => $m) { + if ($m instanceof ActiveRecordInterface) { + $m->populateRelation($name, $primaryModel); + } else { + $primaryModels[$i][$primaryName][$j][$name] = $primaryModel; } } - } else { - foreach ($primaryModels as $i => $primaryModel) { - if ($primaryModels[$i][$primaryName] instanceof ActiveRecordInterface) { - $primaryModels[$i][$primaryName]->populateRelation($name, $primaryModel); - } elseif (!empty($primaryModels[$i][$primaryName])) { - $primaryModels[$i][$primaryName][$name] = $primaryModel; - } + } + } else { + foreach ($primaryModels as $i => $primaryModel) { + if ($primaryModels[$i][$primaryName] instanceof ActiveRecordInterface) { + $primaryModels[$i][$primaryName]->populateRelation($name, $primaryModel); + } elseif (!empty($primaryModels[$i][$primaryName])) { + $primaryModels[$i][$primaryName][$name] = $primaryModel; } } } diff --git a/framework/db/oci/Schema.php b/framework/db/oci/Schema.php index 3f85de33159..2b317dc4e7d 100644 --- a/framework/db/oci/Schema.php +++ b/framework/db/oci/Schema.php @@ -621,7 +621,7 @@ public function insert($table, $columns) } else { $returnParams[$phName]['dataType'] = \PDO::PARAM_INT; } - $returnParams[$phName]['size'] = isset($columnSchemas[$name]) && isset($columnSchemas[$name]->size) ? $columnSchemas[$name]->size : -1; + $returnParams[$phName]['size'] = isset($columnSchemas[$name]->size) ? $columnSchemas[$name]->size : -1; $returning[] = $this->quoteColumnName($name); } $sql .= ' RETURNING ' . implode(', ', $returning) . ' INTO ' . implode(', ', array_keys($returnParams)); diff --git a/framework/web/Request.php b/framework/web/Request.php index d7c49773a4e..acc5d02f611 100644 --- a/framework/web/Request.php +++ b/framework/web/Request.php @@ -937,7 +937,7 @@ protected function resolvePathInfo() throw new InvalidConfigException('Unable to determine the path info of the current request.'); } - if (substr($pathInfo, 0, 1) === '/') { + if (strncmp($pathInfo, '/', 1) === 0) { $pathInfo = substr($pathInfo, 1); } diff --git a/framework/web/Session.php b/framework/web/Session.php index 16584ddac61..d1868211f24 100644 --- a/framework/web/Session.php +++ b/framework/web/Session.php @@ -814,12 +814,10 @@ public function addFlash($key, $value = true, $removeAfterAccess = true) $_SESSION[$this->flashParam] = $counters; if (empty($_SESSION[$key])) { $_SESSION[$key] = [$value]; + } elseif (is_array($_SESSION[$key])) { + $_SESSION[$key][] = $value; } else { - if (is_array($_SESSION[$key])) { - $_SESSION[$key][] = $value; - } else { - $_SESSION[$key] = [$_SESSION[$key], $value]; - } + $_SESSION[$key] = [$_SESSION[$key], $value]; } } From 0fbec30bbc5c40f77a22ea7023f9ce28e8b3ef41 Mon Sep 17 00:00:00 2001 From: Sohel Ahmed Mesaniya Date: Mon, 14 May 2018 15:29:00 +0530 Subject: [PATCH 093/902] Docs enhancement (#15464) [skip ci] --- framework/base/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/base/Controller.php b/framework/base/Controller.php index 9120c17b08d..27f2343053e 100644 --- a/framework/base/Controller.php +++ b/framework/base/Controller.php @@ -211,7 +211,7 @@ public function bindActionParams($action, $params) * The method first checks if the action ID has been declared in [[actions()]]. If so, * it will use the configuration declared there to create the action object. * If not, it will look for a controller method whose name is in the format of `actionXyz` - * where `Xyz` stands for the action ID. If found, an [[InlineAction]] representing that + * where `xyz` is the action ID. If found, an [[InlineAction]] representing that * method will be created and returned. * @param string $id the action ID. * @return Action|null the newly created action instance. Null if the ID doesn't resolve into any action. From e47ac0c4a485a53b75dff20f2c15942f20877951 Mon Sep 17 00:00:00 2001 From: Soul11201 Date: Mon, 14 May 2018 18:04:53 +0800 Subject: [PATCH 094/902] fix bug: when use a subquery --- framework/db/Query.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/db/Query.php b/framework/db/Query.php index 79e81b0d754..c81ab85e092 100644 --- a/framework/db/Query.php +++ b/framework/db/Query.php @@ -748,7 +748,7 @@ public function distinct($value = true) */ public function from($tables) { - if ($tables instanceof Expression) { + if ($tables instanceof ExpressionInterface) { $tables = [$tables]; } if (is_string($tables)) { From 282152e9841f279723ff1963abf7e9b67f5bf461 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 14 May 2018 12:13:26 +0200 Subject: [PATCH 095/902] Update Connection.php fix event phpdoc types --- framework/db/Connection.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/db/Connection.php b/framework/db/Connection.php index 9175639a3fd..eb3a1af0554 100644 --- a/framework/db/Connection.php +++ b/framework/db/Connection.php @@ -136,19 +136,19 @@ class Connection extends Component { /** - * @event [[yii\base\Event|Event]] an event that is triggered after a DB connection is established + * @event yii\base\Event an event that is triggered after a DB connection is established */ const EVENT_AFTER_OPEN = 'afterOpen'; /** - * @event [[yii\base\Event|Event]] an event that is triggered right before a top-level transaction is started + * @event yii\base\Event an event that is triggered right before a top-level transaction is started */ const EVENT_BEGIN_TRANSACTION = 'beginTransaction'; /** - * @event [[yii\base\Event|Event]] an event that is triggered right after a top-level transaction is committed + * @event yii\base\Event an event that is triggered right after a top-level transaction is committed */ const EVENT_COMMIT_TRANSACTION = 'commitTransaction'; /** - * @event [[yii\base\Event|Event]] an event that is triggered right after a top-level transaction is rolled back + * @event yii\base\Event an event that is triggered right after a top-level transaction is rolled back */ const EVENT_ROLLBACK_TRANSACTION = 'rollbackTransaction'; From 2ec34eb9fefa2809fd9e5d0ad9e03d1f9846428d Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Mon, 14 May 2018 13:28:34 +0300 Subject: [PATCH 096/902] Updated CHANGELOG [skip ci] Follow-up to #16277 --- framework/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 391b6a7fe08..3daa7b180ed 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -23,6 +23,7 @@ Yii Framework 2 Change Log - Bug #14636: Views can now use relative paths even when using themed views (sammousa) - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Bug #16266: Fixed `yii\helpers\BaseStringHelper` where explode would not allow 0 as trim string (Thoulah) +- Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) - Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) From d86b82a8ba2a564979ff2433bc49621f3e1c42bc Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Mon, 14 May 2018 23:41:54 +0300 Subject: [PATCH 097/902] Russian translation: improvements of tutorial-template-engines --- docs/guide-ru/tutorial-template-engines.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ru/tutorial-template-engines.md b/docs/guide-ru/tutorial-template-engines.md index 7d79257f321..e69bb5f17cc 100644 --- a/docs/guide-ru/tutorial-template-engines.md +++ b/docs/guide-ru/tutorial-template-engines.md @@ -43,5 +43,5 @@ Для получения подробной информации об использовании конкретного шаблонизатора обратитесь в их документации: -- [Twig guide](https://github.com/yiisoft/yii2-twig/tree/master/docs/guide) -- [Smarty guide](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide) +- [Руководство по Twig (англ.)](https://github.com/yiisoft/yii2-twig/tree/master/docs/guide) +- [Руководство Smarty (англ.)](https://github.com/yiisoft/yii2-smarty/tree/master/docs/guide) From 39548bf3e2151a8aa9c9eb4da8e72a53480d2e2a Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 15 May 2018 17:22:01 +0300 Subject: [PATCH 098/902] Russian translation: improvements of output-theming (#16282) [skip ci] --- docs/guide-ru/output-theming.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide-ru/output-theming.md b/docs/guide-ru/output-theming.md index 3d3373dad90..5e759de68ce 100644 --- a/docs/guide-ru/output-theming.md +++ b/docs/guide-ru/output-theming.md @@ -42,16 +42,16 @@ return [ ```php $theme = $this->theme; -// returns: $theme->baseUrl . '/img/logo.gif' +// возвращает: $theme->baseUrl . '/img/logo.gif' $url = $theme->getUrl('img/logo.gif'); -// returns: $theme->basePath . '/img/logo.gif' +// возвращает: $theme->basePath . '/img/logo.gif' $file = $theme->getPath('img/logo.gif'); ``` Свойство [[yii\base\Theme::pathMap]] определяет то, как заменяются файлы представлений. Свойство принимает массив пар -ключ-значение где ключи являются путями к оригинальным файлам, которые мы хотим заменить, а значения — соответствующими -путями к файлам из темы. Замена основана на частичном совпадении: если путь к представлению начинается с любого из ключей +ключ-значение, где ключи являются путями к оригинальным файлам, которые мы хотим заменить, а значения — соответствующие +пути к файлам из темы. Замена основана на частичном совпадении: если путь к представлению начинается с любого из ключей массива [[yii\base\Theme::pathMap|pathMap]], то соответствующая ему часть будет заменена значением из того же массива. Для приведённой выше конфигурации `@app/views/site/about.php` частично совпадает с ключом `@app/views` и будет заменён на `@app/themes/basic/site/about.php`. From 790f6aaed0c59fa21ea18545c6e8a153d278e833 Mon Sep 17 00:00:00 2001 From: yuniorsk Date: Wed, 16 May 2018 16:33:28 +0200 Subject: [PATCH 099/902] Switch to "config.asset-installer-paths" option as "extra" is deprecated + fixed headers (#16290) [skip ci] --- docs/guide/structure-assets.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide/structure-assets.md b/docs/guide/structure-assets.md index 46f9313ca26..243a190ae5a 100644 --- a/docs/guide/structure-assets.md +++ b/docs/guide/structure-assets.md @@ -215,7 +215,7 @@ To achieve this, we should configure our composer a bit. There are two options t ___ -##### Using asset-packagist repository +#### Using asset-packagist repository This way will satisfy requirements of the majority of projects, that need NPM or Bower packages. @@ -248,7 +248,7 @@ $config = [ Visit [asset-packagist.org](https://asset-packagist.org) to know, how it works. -##### Using fxp/composer-asset-plugin +#### Using fxp/composer-asset-plugin Compared to asset-packagist, composer-asset-plugin does not require any changes to application config. Instead, it requires global installation of a special Composer plugin by running the following command: @@ -265,7 +265,7 @@ Add the following lines to `composer.json` of your project to adjust directories will be placed, if you want to publish them using Yii: ```json -"extra": { +"config": { "asset-installer-paths": { "npm-asset-library": "vendor/npm", "bower-asset-library": "vendor/bower" From 3f2fcde7e4f8322b4619698f8c0d8189a89399d6 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Thu, 17 May 2018 23:56:32 +0300 Subject: [PATCH 100/902] Russian translation: improvements of input-forms (#16293) [skip ci] --- docs/guide-ru/input-forms.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/guide-ru/input-forms.md b/docs/guide-ru/input-forms.md index 2475a1ad54d..73aa62171c7 100644 --- a/docs/guide-ru/input-forms.md +++ b/docs/guide-ru/input-forms.md @@ -1,11 +1,11 @@ Создание форм -============== +============= Основным способом использования форм в Yii является использование [[yii\widgets\ActiveForm]]. Этот подход должен быть применён, когда форма основана на модели. Кроме того, имеются дополнительные методы в [[yii\helpers\Html]], которые используются для добавления кнопок и текстовых подсказок к любой форме. -Форма, которая отображается на стороне клиента, в большинстве случаев, соответствует [модели](structure-models.md). +Форма, которая отображается на стороне клиента в большинстве случаев соответствует [модели](structure-models.md). Модель, в свою очередь, проверяет данные из элементов формы на сервере (смотрите раздел [Валидация](input-validation.md) для более подробных сведений). Когда создаётся форма, основанная на модели, необходимо определить, что же является моделью. Модель может основываться на классе [Active Record](db-active-record.md), который описывает некоторые данные из базы данных, @@ -53,19 +53,19 @@ $form = ActiveForm::begin([ ``` -В вышеизложенном коде, [[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] не только создаёт экземпляр формы, но +В вышеприведённом коде [[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] не только создаёт экземпляр формы, но также и знаменует её начало. Весь контент, расположенный между [[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] и [[yii\widgets\ActiveForm::end()|ActiveForm::end()]], будет завёрнут в HTML-тег `
`. Вы можете изменить некоторые -настройки виджета через передачу массива в его `begin` метод, также как и в любом другом виджете. В этом случае, дополнительный CSS класс и идентификатор ID будет прикреплён к открывающемуся тегу ``. Для просмотра всех доступных настроек,пожалуйста, обратитесь к API документации [[yii\widgets\ActiveForm]]. +настройки виджета через передачу массива в его `begin` метод, также как и в любом другом виджете. В этом случае дополнительный CSS-класс и идентификатор будет прикреплён к открывающемуся тегу ``. Для просмотра всех доступных настроек, пожалуйста, обратитесь к документации API [[yii\widgets\ActiveForm]]. -Для создания в форме элемента с меткой и любой применимой Javascript валидацией, вызывается [[yii\widgets\ActiveForm::field()|ActiveForm::field()]],который возвращает экземпляр [[yii\widgets\ActiveField]]. Когда этот метод вызывается непосредственно, то результатом будет текстовый элемент (`input type="text"`). Для того, чтобы настроить элемент, можно вызвать один за одним дополнительные методы [[yii\widgets\ActiveField|ActiveField]]: +Для создания в форме элемента с меткой и любой применимой валидацией с помощью JavaScript, вызывается [[yii\widgets\ActiveForm::field()|ActiveForm::field()]], который возвращает экземпляр [[yii\widgets\ActiveField]]. Когда этот метод вызывается непосредственно, то результатом будет текстовый элемент (`input type="text"`). Для того, чтобы настроить элемент, можно вызвать один за одним дополнительные методы [[yii\widgets\ActiveField|ActiveField]]: ```php -// элемент формы password +// элемент формы для ввода пароля echo $form->field($model, 'password')->passwordInput(); -// добавлена подсказка hint и настроена метка label +// добавлена подсказка (hint) и настроена метка (label) echo $form->field($model, 'username')->textInput()->hint('Пожалуйста, введите имя')->label('Имя'); -// создание HTML5 email элемента +// создание элемента HTML5 для ввода email echo $form->field($model, 'email')->input('email'); ``` @@ -90,13 +90,13 @@ echo $form->field($model, 'items[]')->checkboxList(['a' => 'Item A', 'b' => 'Ite Имена элементов форм следует выбирать, учитывая, что могут возникнуть конфликты. Подробнее об этом в [документации jQuery](https://api.jquery.com/submit/): -> Имена и идентификаторы форм и их элементов не должны совпадать с элементами форм, такими как `submit`, `length`, или `method`. Конфликты имен могут вызывать трудно диагностируемые ошибки. Подробнее о способах избегания подобных проблем смотрите [DOMLint](http://kangax.github.io/domlint/). +> Имена и идентификаторы форм и их элементов не должны совпадать с элементами форм, такими как `submit`, `length` или `method`. Конфликты имен могут вызывать трудно диагностируемые ошибки. Подробнее о способах избегания подобных проблем смотрите [DOMLint](http://kangax.github.io/domlint/). -Дополнительные HTML элементы можно добавить к форме, используя обычный HTML или методы из класса помощника [[yii\helpers\Html|Html]], как это было сделано с помощью [[yii\helpers\Html::submitButton()|Html::submitButton()]] в примере, приведённом выше. +Дополнительные HTML-элементы можно добавить к форме, используя обычный HTML или методы из класса помощника [[yii\helpers\Html|Html]], как это было сделано с помощью [[yii\helpers\Html::submitButton()|Html::submitButton()]] в примере, приведённом выше. > Tip: Если вы использует Twitter Bootstrap CSS в своём приложении, то воспользуйтесь [[yii\bootstrap\ActiveForm]] вместо [[yii\widgets\ActiveForm]]. Он добавит к ActiveForm дополнительные стили, которые сработают в рамках bootstrap CSS. -> Tip: для добавления "звёздочки" к обязательным элементам формы воспользуйтесь следующим CSS: +> Tip: для добавления "звёздочки" к обязательным элементам формы, воспользуйтесь следующим CSS: > > ```css > div.required label.control-label:after { @@ -157,7 +157,7 @@ Pjax::end(); > также отображаться внутри виджета. Чтобы ссылка работала без PJAX, добавьте к ней HTML-атрибут > `data-pjax="0"`. -#### Значения кнопок submit и загрузка файлов +#### Значения кнопок отправки и загрузка файлов В `jQuery.serializeArray()` имеются определённые проблемы [при работе с файлами](https://github.com/jquery/jquery/issues/2321) и @@ -170,7 +170,7 @@ Pjax::end(); класса `FormData`. -Еще по теме +Ещё по теме --------------- Следующая глава [Валидация](input-validation.md) описывает валидацию отправленной формы как на стороне сервера, From 4e17feb5bb6329c15e963a68b125fe785d05a573 Mon Sep 17 00:00:00 2001 From: khvalov Date: Thu, 17 May 2018 17:05:50 -0400 Subject: [PATCH 101/902] Fixes #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode --- framework/CHANGELOG.md | 1 + framework/filters/Cors.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3daa7b180ed..08c0b7dc47e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -26,6 +26,7 @@ Yii Framework 2 Change Log - Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) - Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) +- Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) 2.0.15.1 March 21, 2018 diff --git a/framework/filters/Cors.php b/framework/filters/Cors.php index d3a3079e758..02f863e749a 100644 --- a/framework/filters/Cors.php +++ b/framework/filters/Cors.php @@ -9,6 +9,7 @@ use Yii; use yii\base\ActionFilter; +use yii\base\InvalidConfigException; use yii\web\Request; use yii\web\Response; @@ -168,7 +169,7 @@ public function prepareHeaders($requestHeaders) // Per CORS standard (https://fetch.spec.whatwg.org), wildcard origins shouldn't be used together with credentials if (isset($this->cors['Access-Control-Allow-Credentials']) && $this->cors['Access-Control-Allow-Credentials']) { if (YII_DEBUG) { - throw new Exception("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration."); + throw new InvalidConfigException("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration."); } else { Yii::error("Allowing credentials for wildcard origins is insecure. Please specify more restrictive origins or set 'credentials' to false in your CORS configuration.", __METHOD__); } From 725fe755795243c5758a5c1520acdc25cf844137 Mon Sep 17 00:00:00 2001 From: Vladimir Babin Date: Sun, 20 May 2018 06:09:06 +0500 Subject: [PATCH 102/902] Update db-migrations.md (#16298) [skip ci] --- docs/guide-ru/db-migrations.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/guide-ru/db-migrations.md b/docs/guide-ru/db-migrations.md index d282c48d495..c37c6ce7cae 100644 --- a/docs/guide-ru/db-migrations.md +++ b/docs/guide-ru/db-migrations.md @@ -784,7 +784,7 @@ return [ С приведённой выше конфигурацией, каждый раз при запуске команды миграции, таблица `backend_migration` будет использована для записи истории миграций. И Вам больше не нужно указывать её через параметр `migrationTable` в командной строке. -### Миграции с пространсвом имен +### Миграции с пространством имен Начиная с версии 2.0.10 вы можете использовать пространства имен при объявлении класса миграции. Вы можете указать список пространств имен миграций через [[yii\console\controllers\MigrateController::migrationNamespaces|migrationNamespaces]]. Использование пространств @@ -810,7 +810,7 @@ return [ Работая с миграциями по пространствам имен: при создании, отмене и т.д., следует указывать полное имя пространства имен перед именем миграции. Имейте в виду, что символ обратного слеша (`\`), как правило, является специальным символом в консоли, -так что вам придется экранировать его соответствующим образом во избежании ошибок или неверного поведения. Например: +так что вам придется экранировать его соответствующим образом во избежание ошибок или неверного поведения. Например: ``` yii migrate/create 'app\\migrations\\createUserTable' @@ -907,4 +907,3 @@ yii migrate --migrationPath=@app/migrations/db2 --db=db2 ``` Первая команда применит миграции в директории `@app/migrations/db1` к базе данных `db1`, а вторая команда применит миграции в директории `@app/migrations/db2` к базе данных `db2` и так далее. - From 3278b0aea62c7e5adae21e46b08794c079e941a7 Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Sun, 20 May 2018 04:15:25 +0300 Subject: [PATCH 103/902] Russian translation: improvements of input-tabular-input (#16297) [skip ci] --- docs/guide-ru/input-tabular-input.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guide-ru/input-tabular-input.md b/docs/guide-ru/input-tabular-input.md index 5223fcf0d67..f0d67fcd04d 100644 --- a/docs/guide-ru/input-tabular-input.md +++ b/docs/guide-ru/input-tabular-input.md @@ -1,7 +1,7 @@ Табличный ввод ======================== -Иногда возникает необходимость обработки нескольких моделей одного вида в одной форме. Например, несколько параметров, каждый из которых сохраняется как пара имя-значение и представляется моделью `Setting` [active record](db-active-record.md). +Иногда возникает необходимость обработки нескольких моделей одного вида в одной форме. Например, несколько параметров, каждый из которых сохраняется как пара имя-значение и представляется моделью [Active Record](db-active-record.md) `Setting`. Такой тип форм часто называют "табличным вводом". Обработка данных нескольких моделей разных видов в одной форме описана в разделе [Работа с несколькими моделями](input-multiple-models.md). @@ -14,7 +14,7 @@ В отличие от форм с одной моделью, рассмотренных ранее, теперь будем иметь дело с массивом моделей. Этот массив передается в представление и для каждой модели отображаются поля ввода в табличном виде. Для загрузки и валидации нескольких моделей сразу будем использовать вспомогательные методы класса [[yii\base\Model]]: -- [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] загружает данные post в массив моделей; +- [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] загружает POST-данные в массив моделей; - [[yii\base\Model::validateMultiple()|Model::validateMultiple()]] валидирует массив моделей. ### Изменение фиксированного набора записей @@ -51,7 +51,7 @@ class SettingsController extends Controller } ``` -В коде выше, для получения из базы данных массива моделей, индексированного по главному ключу, использован метод [[yii\db\ActiveQuery::indexBy()|indexBy()]]. В дальнейшем будем использовать это для идентификации полей формы. Метод [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] загружает данные запроса POST в массив моделей, а метод [[yii\base\Model::validateMultiple()|Model::validateMultiple()]] проводит валидацию всех моделей. Так, как модели уже прошли валидацию, мы передаем методу [[yii\db\ActiveRecord::save()|save()]] параметр `false` для отключения повторной валидации. +В коде выше, для получения из базы данных массива моделей, индексированного по главному ключу, использован метод [[yii\db\ActiveQuery::indexBy()|indexBy()]]. В дальнейшем будем использовать это для идентификации полей формы. Метод [[yii\base\Model::loadMultiple()|Model::loadMultiple()]] загружает данные запроса POST в массив моделей, а метод [[yii\base\Model::validateMultiple()|Model::validateMultiple()]] проводит валидацию всех моделей. Так как модели уже прошли валидацию, мы передаем методу [[yii\db\ActiveRecord::save()|save()]] параметр `false` для отключения повторной валидации. Теперь займемся формой в представлении `update`: @@ -89,9 +89,9 @@ public function actionCreate() } ``` -Сначала создается массив `$settings`, содержащий один экземпляр модели, так что, по умолчанию в представлении всегда будет отображено хотя бы одно поле. Дополнительно, добавляются модели для каждой полученной строки ввода. +Сначала создается массив `$settings`, содержащий один экземпляр модели, так что по умолчанию в представлении всегда будет отображено хотя бы одно поле. Дополнительно, добавляются модели для каждой полученной строки ввода. -В представлении возможно использовать javascript для добавления новых полей динамически. +В представлении возможно использовать JavaScript для добавления новых полей динамически. ### Изменение, создание и удаление записей на одной странице From 33fe3476c741d9588183ac187e64c2947bbb07e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jankowiak?= Date: Sun, 20 May 2018 22:17:34 +0200 Subject: [PATCH 104/902] Fixes #16280: Fixed `yii\base\Model::getActiveValidators()` to return correct validators for attribute on scenario --- framework/CHANGELOG.md | 1 + framework/base/Model.php | 14 ++++++++++-- framework/validators/Validator.php | 35 +++++++++++++++++++----------- tests/framework/base/ModelTest.php | 35 ++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 15 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 08c0b7dc47e..c04e6d90b4e 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -24,6 +24,7 @@ Yii Framework 2 Change Log - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Bug #16266: Fixed `yii\helpers\BaseStringHelper` where explode would not allow 0 as trim string (Thoulah) - Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) +- Bug #16280: Fixed `yii\base\Model::getActiveValidators()` to return correct validators for attribute on scenario (paweljankowiak06) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) - Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) diff --git a/framework/base/Model.php b/framework/base/Model.php index 25bc24d54ae..9dc9417f38c 100644 --- a/framework/base/Model.php +++ b/framework/base/Model.php @@ -431,10 +431,20 @@ public function getValidators() */ public function getActiveValidators($attribute = null) { - $validators = []; + $activeAttributes = $this->activeAttributes(); + if ($attribute !== null && !in_array($attribute, $activeAttributes, true)) { + return []; + } $scenario = $this->getScenario(); + $validators = []; foreach ($this->getValidators() as $validator) { - if ($validator->isActive($scenario) && ($attribute === null || in_array($attribute, $validator->getAttributeNames(), true))) { + if ($attribute === null) { + $validatorAttributes = $validator->getValidationAttributes($activeAttributes); + $attributeValid = !empty($validatorAttributes); + } else { + $attributeValid = in_array($attribute, $validator->getValidationAttributes($attribute), true); + } + if ($attributeValid && $validator->isActive($scenario)) { $validators[] = $validator; } } diff --git a/framework/validators/Validator.php b/framework/validators/Validator.php index 706cdfb8ffa..7dfd808347c 100644 --- a/framework/validators/Validator.php +++ b/framework/validators/Validator.php @@ -240,24 +240,13 @@ public function init() /** * 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. + * @param array|string|null $attributes the list of attributes to be validated. * Note that if an attribute is not associated with the validator - 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 = []; - $attributeNames = $this->getAttributeNames(); - foreach ($attributes as $attribute) { - if (in_array($attribute, $attributeNames, true)) { - $newAttributes[] = $attribute; - } - } - $attributes = $newAttributes; - } else { - $attributes = $this->getAttributeNames(); - } + $attributes = $this->getValidationAttributes($attributes); foreach ($attributes as $attribute) { $skip = $this->skipOnError && $model->hasErrors($attribute) @@ -270,6 +259,26 @@ public function validateAttributes($model, $attributes = null) } } + public function getValidationAttributes($attributes = null) + { + if ($attributes === null) { + return $this->getAttributeNames(); + } + + if (is_string($attributes)) { + $attributes = [$attributes]; + } + + $newAttributes = []; + $attributeNames = $this->getAttributeNames(); + foreach ($attributes as $attribute) { + if (in_array($attribute, $attributeNames, true)) { + $newAttributes[] = $attribute; + } + } + return $newAttributes; + } + /** * Validates a single attribute. * Child classes must implement this method to provide the actual validation logic. diff --git a/tests/framework/base/ModelTest.php b/tests/framework/base/ModelTest.php index bfe0fe1accb..b9dc899b1b5 100644 --- a/tests/framework/base/ModelTest.php +++ b/tests/framework/base/ModelTest.php @@ -429,6 +429,18 @@ public function testDefaultScenarios() $this->assertEquals($scenarios, $model->scenarios()); } + public function testValidatorsWithDifferentScenarios() + { + $model = new CustomScenariosModel(); + self::assertCount(3, $model->getActiveValidators()); + self::assertCount(2, $model->getActiveValidators('name')); + + $model->setScenario('secondScenario'); + self::assertCount(2, $model->getActiveValidators()); + self::assertCount(2, $model->getActiveValidators('id')); + self::assertCount(0, $model->getActiveValidators('name'), 'This attribute has no validators in current scenario.'); + } + public function testIsAttributeRequired() { $singer = new Singer(); @@ -536,3 +548,26 @@ public function setPassword($pw) $this->passwordHash = $pw; } } + +class CustomScenariosModel extends Model +{ + public $id; + public $name; + + public function rules() + { + return [ + [['id', 'name'], 'required'], + ['id', 'integer'], + ['name', 'string'], + ]; + } + + public function scenarios() + { + return [ + self::SCENARIO_DEFAULT => ['id', 'name'], + 'secondScenario' => ['id'], + ]; + } +} From 624a520023b335a3d7479e56d6632b6a28c20c30 Mon Sep 17 00:00:00 2001 From: Pavlo Date: Mon, 21 May 2018 12:56:08 +0300 Subject: [PATCH 105/902] Fixed a/an grammar mistake (#16302) [skip ci] --- docs/guide/structure-application-components.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/structure-application-components.md b/docs/guide/structure-application-components.md index 104c8fe7e9a..2d037e5c2b5 100644 --- a/docs/guide/structure-application-components.md +++ b/docs/guide/structure-application-components.md @@ -58,7 +58,7 @@ If it is not accessed at all during a request, it will not be instantiated. Some to instantiate an application component for every request, even if it is not explicitly accessed. To do so, you may list its ID in the [[yii\base\Application::bootstrap|bootstrap]] property of the application. -You can also use Closures to bootstrap customized components. Returning a instantiated component is not +You can also use Closures to bootstrap customized components. Returning an instantiated component is not required. A Closure can also be used simply for running code after [[yii\base\Application]] instantiation. For example, the following application configuration makes sure the `log` component is always loaded: From 3ebc19203a2353bae98b599c4efc71390f4a4469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serhat=20=C3=96zle=C5=9F?= Date: Mon, 21 May 2018 12:56:40 +0300 Subject: [PATCH 106/902] Turkish translation (#16300) [skip ci] * Turkish Language guide added. * Turkish translation: some word changed * Turkish translation: link changed * Turkish translation --- docs/guide-tr/README.md | 205 +++++++++++++++++++++++++++++++++ docs/guide-tr/blocktypes.json | 6 + docs/guide-tr/intro-yii.md | 37 ++++++ docs/guide-tr/translators.json | 3 + 4 files changed, 251 insertions(+) create mode 100644 docs/guide-tr/README.md create mode 100644 docs/guide-tr/blocktypes.json create mode 100644 docs/guide-tr/intro-yii.md create mode 100644 docs/guide-tr/translators.json diff --git a/docs/guide-tr/README.md b/docs/guide-tr/README.md new file mode 100644 index 00000000000..4df9a1fe6ff --- /dev/null +++ b/docs/guide-tr/README.md @@ -0,0 +1,205 @@ +Yii 2.0 için Açıklayıcı Rehber +=============================== + +Bu döküman, [Yii Dökümantasyon Koşulları](http://www.yiiframework.com/doc/terms/) altında yayınlandı. + +Tüm hakları saklıdır. + +2014 (c) Yii Software LLC. + + +Giriş +------------ + +* [Yii hakkında](intro-yii.md) +* [Sürüm 1.1'den yükseltme](intro-upgrade-from-v1.md) + + +Başlarken +--------------- + +* [Ne öğrenmeye ihtiyacın var](start-prerequisites.md) +* [Yii Yükleme](start-installation.md) +* [Uygulamaları Çalıştırmak](start-workflow.md) +* [Merhaba deyin](start-hello.md) +* [Formlarla Çalışırken](start-forms.md) +* [Veritabanıyla Çalışırken](start-databases.md) +* [Gii ile Kod Oluşturmak](start-gii.md) +* [İleriye Bakmak](start-looking-ahead.md) + + +Uygulama Yapısı +--------------------- + +* [Uygulama Yapısına Genel Bakış](structure-overview.md) +* [Giriş Komutları](structure-entry-scripts.md) +* [Uygulamalar](structure-applications.md) +* [Uygulama Bileşenleri](structure-application-components.md) +* [Kontroller](structure-controllers.md) +* [Modeller](structure-models.md) +* [Görünümler](structure-views.md) +* [Modüller](structure-modules.md) +* [Filtreler](structure-filters.md) +* [Araçlar](structure-widgets.md) +* [Varlıklar](structure-assets.md) +* [Uzantılar](structure-extensions.md) + + +İstekleri İşlemek +----------------- + +* [İstekleri İşlemeye Genel Bakış](runtime-overview.md) +* [Bootstrapping](runtime-bootstrapping.md) +* [Yönlendirme ve URL Oluşturmak](runtime-routing.md) +* [İstekler](runtime-requests.md) +* [Cevaplar](runtime-responses.md) +* [Sessionlar ve Cookieler](runtime-sessions-cookies.md) +* [Hataları İşleme](runtime-handling-errors.md) +* [Olay Günlüğü](runtime-logging.md) + + +Anahtar Kavramlar +------------ + +* [Components](concept-components.md) +* [Properties](concept-properties.md) +* [Olaylar](concept-events.md) +* [Behaviors](concept-behaviors.md) +* [Yapılandırmalar](concept-configurations.md) +* [Aliases](concept-aliases.md) +* [Class Autoloading](concept-autoloading.md) +* [Service Locator](concept-service-locator.md) +* [Dependency Injection Container](concept-di-container.md) + + +Veritabanıyla Çalışırken +---------------------- + +* [Database Access Objects](db-dao.md): Bir veritabanına bağlanmak, basit sorgular, işlemler ve şema manipilasyonu +* [Query Builder](db-query-builder.md): Basit bir ayırma katmanı kullanarak veritabanı sorgulamak +* [Active Record](db-active-record.md): Active Record ORM, kayıtları almak, değiştirmek ve ilişkileri tanımlamak +* [Migrations](db-migrations.md): Bir takım geliştirme ortamında sürüm kontrolünü veritabanlarına uygula +* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide) +* [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide) +* [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide) +* [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide) + + +Kullanıcılardan Veri Alırken +----------------------- + +* [Form Oluşturma](input-forms.md) +* [Validating Input](input-validation.md) +* [Dosya Yükleme](input-file-upload.md) +* [Collecting Tabular Input](input-tabular-input.md) +* [Birden fazla Model için Veri Alma](input-multiple-models.md) +* [Extending ActiveForm on the Client Side](input-form-javascript.md) + + +Veriyi Gösterirken +--------------- + +* [Veri Formatlama](output-formatting.md) +* [Sayfalama](output-pagination.md) +* [Sıralama](output-sorting.md) +* [Veri Sağlayıcıları](output-data-providers.md) +* [Veri Araçları](output-data-widgets.md) +* [Scriptlerle Çalışmak](output-client-scripts.md) +* [Tema Kullanımı](output-theming.md) + + +Güvenlik +-------- + +* [Güvenliğe Genel Bakış](security-overview.md) +* [Doğrulama](security-authentication.md) +* [Yetkilendirme](security-authorization.md) +* [Şifrelerle Çalışma](security-passwords.md) +* [Kriptografi](security-cryptography.md) +* [Auth Clients](https://www.yiiframework.com/extension/yiisoft/yii2-authclient/doc/guide) +* [En İyi Egzersizler](security-best-practices.md) + + +Önbellek +------- + +* [Cache Genel Bakış](caching-overview.md) +* [Veriyi Cache Almak](caching-data.md) +* [Kısım Cachelemek](caching-fragment.md) +* [Sayfayı Cache Almak](caching-page.md) +* [HTTP Cache Almak](caching-http.md) + + +RESTful Web Servisleri +-------------------- + +* [Hızlı Başlangıç](rest-quick-start.md) +* [Kaynaklar](rest-resources.md) +* [Kontroller](rest-controllers.md) +* [Routing](rest-routing.md) +* [Yanıt Formatlama](rest-response-formatting.md) +* [Doğrulama](rest-authentication.md) +* [İstek Sınırlama](rest-rate-limiting.md) +* [Sürümlere Ayırma](rest-versioning.md) +* [Hataları Kullanma](rest-error-handling.md) + + +Geliştirici Araçları +----------------- + +* [Debug Toolbar ve Debugger](https://www.yiiframework.com/extension/yiisoft/yii2-debug/doc/guide) +* [Gii'yi Kullanarak Kod Oluşturmak](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) +* [API Dökümanı OLuşturma](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc) + + +Test +------- + +* [Testlere Genel Bakış](test-overview.md) +* [Testlere Ortam Kurulumu](test-environment-setup.md) +* [Unit Testleri](test-unit.md) +* [Fonksiyonel Testler](test-functional.md) +* [Kabul Testleri](test-acceptance.md) +* [Fixtures](test-fixtures.md) + + +Özel Başlıklar +-------------- + +* [Gelişmiş Proje Şablonu](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) +* [Building Application from Scratch](tutorial-start-from-scratch.md) +* [Console Komutları](tutorial-console.md) +* [Core Validators](tutorial-core-validators.md) +* [Docker](tutorial-docker.md) +* [Uluslararası hale getirme](tutorial-i18n.md) +* [Mailing](tutorial-mailing.md) +* [Performans Ayarları](tutorial-performance-tuning.md) +* [Paylaşımlı Hosting Ortamı](tutorial-shared-hosting.md) +* [Şablon Motoru](tutorial-template-engines.md) +* [3. parti kodlarla çalışmak](tutorial-yii-integration.md) +* [Yii'yi mikro kütüphane gibi kullanmak](tutorial-yii-as-micro-framework.md) + + +Araçlar +------- + +* [GridView](https://www.yiiframework.com/doc-2.0/yii-grid-gridview.html) +* [ListView](https://www.yiiframework.com/doc-2.0/yii-widgets-listview.html) +* [DetailView](https://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html) +* [ActiveForm](https://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform) +* [Pjax](https://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html) +* [Menu](https://www.yiiframework.com/doc-2.0/yii-widgets-menu.html) +* [LinkPager](https://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html) +* [LinkSorter](https://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html) +* [Bootstrap Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide) +* [jQuery UI Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide) + + +Yardımcılar +------- + +* [Helpers Overview](helper-overview.md) +* [ArrayHelper](helper-array.md) +* [Html](helper-html.md) +* [Url](helper-url.md) + diff --git a/docs/guide-tr/blocktypes.json b/docs/guide-tr/blocktypes.json new file mode 100644 index 00000000000..e0d4c16e57b --- /dev/null +++ b/docs/guide-tr/blocktypes.json @@ -0,0 +1,6 @@ +{ + "Warning:": "Uyarı:", + "Note:": "Not:", + "Info:": "Bilgi:", + "Tip:": "İpucu:" +} \ No newline at end of file diff --git a/docs/guide-tr/intro-yii.md b/docs/guide-tr/intro-yii.md new file mode 100644 index 00000000000..27117e14f61 --- /dev/null +++ b/docs/guide-tr/intro-yii.md @@ -0,0 +1,37 @@ +Yii nedir? +=========== + +Yii, yüksek performanslı ve modern Web uygulamalarını hızlı geliştirmeyi sağlayan bileşen tabanlı bir PHP kütüphanesidir. Yii kelimesinin anlamı Çince de **basit ve evrimseldir.** Ayrıca, **Yes It Is** (Evet, İşte bu) kısaltması olarak da düşünülebilir. + +Yii'nin en iyi olduğu şey nedir? +--------------------- + +Yii genel bir Web programlama kütüphanesidir yani, PHP kullanılan her türlü Web uygulaması geliştirilebilir. Çünkü bileşen tabanlı mimari ve sofistike cache almayı destekler, büyük çaplı uygulamalar için özellikle uygundur; portallar, forumlar, içerik yönetim sistemleri (CMS), e-ticaret projeleri, RESTful Web servisleri ve dahası. + +Yii'yi diğer kütüphanelerle nasıl karşılaştırabilirim? +------------------------------------------- + +Eğer zaten başka bir kütüphane ailesine dahilseniz, Yii'yi karşılaştırmak için anlamanız gereken şeyler: + +- Çoğu PHP kütüphaneleri gibi, Yii MVC (Model-View-Controller) desenini uygular ve bu desene göre kod organizasyonunu teşvik eder. +- Yii, kodun basit ama zarif bir şekilde yazılması gerektiğini felsefe edinir. Yii, asla bazı tasarım desenlerini sıkı takip etmek amacıyla herşeyi aşırı tasarlamayacaktır. +- Yii, kanıtlanmış full-stack bir kütüphanedir ve şu özellikleri kullanıma hazırdır: sorgu mimarı ve ActiveRecord her ikisi için ilişkisel ve NoSQL veritabanlarını; RESTful API geliştirmeyi; multi-tier (çok katmanlı) cache desteği ve dahasını destekler. +- Yii son derece genişletilebilir. Neredeyse her bir çekirdek kodunu kişiselleştirebilir veya değiştirebilirsiniz. Yeniden dağıtılabilir uzantıları kullanmak veya geliştirmek için Yii'nin katı uzantı mimarisinden de yararlanabilirsiniz. +- Yüksek performans her zaman Yii'nin öncelikli hedefidir. + +Yii tek kişilik bir gösteri değildir, [güçlü çekirdek geliştirici ekibi](http://www.yiiframework.com/team/) ve Yii'nin gelişimine sürekli katkıda bulunan büyük bir profesyonel geliştirici topluluğu tarafından da destekleniyor. Yii geliştirici ekibi, en yeni Web geliştirme teknikleri ile diğer kütüphaneler ve projelerde bulunan en iyi uygulamalara ve özelliklere yakından göz atmaktadır. Basit ve zarif arayüzler aracılığıyla, başka yerde bulunan en uygun, en iyi uygulamalar ve özellikler, düzenli olarak çekirdek kütüphaneye dahil edilir. + + +Yii'nin Sürümleri +------------ + +Yii'nin şuan da 1.1 ve 2.0 olmak üzere 2 tane major sürümü vardır. 1.1 sürümü eski nesil ve şuan da bakım modundadır.Sürüm 2.0, Yii'nin Composer, PSR, namespaceler, traitler ve benzerlerini içeren en son teknolojileri ve protokolleri benimseyen eksiksiz bir yeniden yazımıdır. Sürüm 2.0, kütüphanenin mevcut sürümünü temsil eder ve önümüzdeki birkaç yıl boyunca geliştirilmeye devam edecektir. + +Bu kılavuz esas olarak sürüm 2.0 ile ilgilidir. + +Gereksinimler ve Önkoşullar +------------------------------ + +Yii 2.0, PHP 5.4.0 veya üstü sürüm gerektirir ve PHP 7'nin en son sürümü ile en iyi şekilde çalışır. Her bir Yii sürümünde yer alan gereksinim denetleyicisini çalıştırarak, daha ayrıntılı gereksinimleri ayrı ayrı özellikler için bulabilirsiniz. + +Yii OOP temelli bir kütüphane olduğu için Yii'yi kullanmak, nesne yönelimli programlama (OOP) hakkında temel bilgi gerektirir. Yii 2.0 ayrıca PHP'nin [namespaceler](http://www.php.net/manual/en/language.namespaces.php) ve [traitler](http://www.php.net/manual/en/language.oop5.traits.php) gibi son özelliklerinden de yararlanır. Bu kavramları anlamak, Yii 2.0'ı daha kolay anlamanıza yardımcı olacaktır. diff --git a/docs/guide-tr/translators.json b/docs/guide-tr/translators.json new file mode 100644 index 00000000000..cdd21558a6c --- /dev/null +++ b/docs/guide-tr/translators.json @@ -0,0 +1,3 @@ +[ + "Serhat Özleş" +] \ No newline at end of file From 0b61f9ba3b634bb1038efa70789b8f8c85b797e7 Mon Sep 17 00:00:00 2001 From: Viktor Date: Mon, 21 May 2018 21:19:49 +0400 Subject: [PATCH 107/902] Fixes #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` --- framework/CHANGELOG.md | 1 + framework/web/User.php | 2 +- tests/framework/web/UserTest.php | 38 ++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index c04e6d90b4e..d6ccc732a5f 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -28,6 +28,7 @@ Yii Framework 2 Change Log - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) - Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) +- Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) 2.0.15.1 March 21, 2018 diff --git a/framework/web/User.php b/framework/web/User.php index eae378f7462..e1f679ee53c 100644 --- a/framework/web/User.php +++ b/framework/web/User.php @@ -219,12 +219,12 @@ public function setIdentity($identity) { if ($identity instanceof IdentityInterface) { $this->_identity = $identity; - $this->_access = []; } elseif ($identity === null) { $this->_identity = null; } else { throw new InvalidValueException('The identity object must implement IdentityInterface.'); } + $this->_access = []; } /** diff --git a/tests/framework/web/UserTest.php b/tests/framework/web/UserTest.php index f8eefc45ebe..4b6d207c166 100644 --- a/tests/framework/web/UserTest.php +++ b/tests/framework/web/UserTest.php @@ -394,6 +394,44 @@ public function testGetIdentityException() Yii::$app->getUser()->getIdentity(); } + public function testSetIdentity() + { + $appConfig = [ + 'components' => [ + 'user' => [ + 'identityClass' => UserIdentity::className(), + ], + 'authManager' => [ + 'class' => PhpManager::className(), + 'itemFile' => '@runtime/user_test_rbac_items.php', + 'assignmentFile' => '@runtime/user_test_rbac_assignments.php', + 'ruleFile' => '@runtime/user_test_rbac_rules.php', + ], + ], + ]; + $this->mockWebApplication($appConfig); + + $am = Yii::$app->authManager; + $am->removeAll(); + $am->add($role = $am->createPermission('rUser')); + $am->add($perm = $am->createPermission('doSomething')); + $am->addChild($role, $perm); + $am->assign($role, 'user1'); + + $this->assertNull(Yii::$app->user->identity); + $this->assertFalse(Yii::$app->user->can('doSomething')); + + Yii::$app->user->setIdentity(UserIdentity::findIdentity('user1')); + $this->assertInstanceOf(UserIdentity::className(), Yii::$app->user->identity); + $this->assertTrue(Yii::$app->user->can('doSomething')); + + Yii::$app->user->setIdentity(null); + $this->assertNull(Yii::$app->user->identity); + $this->assertFalse(Yii::$app->user->can('doSomething')); + + $this->expectException('\yii\base\InvalidValueException'); + Yii::$app->user->setIdentity(new \stdClass()); + } } static $cookiesMock; From 18d02669e4bf3666e843191c8598de812edbb78a Mon Sep 17 00:00:00 2001 From: Vladimir Babin Date: Tue, 22 May 2018 20:10:00 +0500 Subject: [PATCH 108/902] Update runtime-routing.md (#16310) [skip ci] --- docs/guide-ru/runtime-routing.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ru/runtime-routing.md b/docs/guide-ru/runtime-routing.md index 846bd8f7152..4a419b6f262 100644 --- a/docs/guide-ru/runtime-routing.md +++ b/docs/guide-ru/runtime-routing.md @@ -326,7 +326,7 @@ echo Url::previous(); ] ``` -Выше приведенное правило может быть использовано для разбора или создания следующих URL: +Вышеприведенное правило может быть использовано для разбора или создания следующих URL: * `/index.php/posts`: `page` равно 1, `tag` равно ''. * `/index.php/posts/2`: `page` равно 2, `tag` равно ''. @@ -383,7 +383,7 @@ echo Url::previous(); > Note: При настроенном суффиксе, все URL не содержащие этот суффикс будут расценены как неизвестные URL. Такое поведение рекомендовано для SEO (поисковая оптимизация). -Иногда возникает необходимость использовать разные суффиксы для разных URL. Добиться этого можно настройкой свойства [[yii\web\UrlRule::suffix|suffix]] у каждого правила. Когда это свойство установлено, оно имеет приоритет перед общей конфигурацией компонента [[yii\web\UrlManager|URL manager]]. Например, cледующая конфигурация содержит правило URL, которое использует `.json` в качестве суффикса вместо глобального `.html`. +Иногда возникает необходимость использовать разные суффиксы для разных URL. Добиться этого можно настройкой свойства [[yii\web\UrlRule::suffix|suffix]] у каждого правила. Когда это свойство установлено, оно имеет приоритет перед общей конфигурацией компонента [[yii\web\UrlManager|URL manager]]. Например, следующая конфигурация содержит правило URL, которое использует `.json` в качестве суффикса вместо глобального `.html`. ```php [ From 025c5a4c14a0a0d708b2ee169ae5e309cbfcb947 Mon Sep 17 00:00:00 2001 From: Vladimir Babin Date: Tue, 22 May 2018 20:10:48 +0500 Subject: [PATCH 109/902] Update helper-url.md (#16309) [skip ci] --- docs/guide-ru/helper-url.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/helper-url.md b/docs/guide-ru/helper-url.md index b171dacf28f..83df346fd7f 100644 --- a/docs/guide-ru/helper-url.md +++ b/docs/guide-ru/helper-url.md @@ -57,7 +57,7 @@ $url = Url::toRoute(['product/view', 'id' => 42]); правилам: - Если роут пустая строка, то будет использовано текущее значение [[\yii\web\Controller::route|route]]; -- Если роут не содержит слешей (например, `index`), то он будет считаться экшеном текущего контролера и будет определен +- Если роут не содержит слешей (например, `index`), то он будет считаться экшеном текущего контроллера и будет определен с помощью [[\yii\web\Controller::uniqueId]]; - Если роут начинается не со слеша (например, `site/index`), то он будет считаться относительным роутом текущего модуля и будет определен с помощью [[\yii\base\Module::uniqueId|uniqueId]]. From 9e6d5aa1a85f0a87030a4916b717dba87a9d02ca Mon Sep 17 00:00:00 2001 From: Sergey Gonimar Date: Thu, 24 May 2018 16:29:05 +0500 Subject: [PATCH 110/902] Fixes #15548: Fixed index names collision in RBAC --- framework/CHANGELOG.md | 1 + ...38_rbac_updates_indexes_without_prefix.php | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index d6ccc732a5f..b51bc69ea1c 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -12,6 +12,7 @@ Yii Framework 2 Change Log - Bug #14660: Fixed `yii\caching\DbCache` concurrency issue when set values with the same key (rugabarbo) - Bug #15988: Fixed bash completion (alekciy) - Bug #15798: Fixed render `yii\grid\RadioButtonColumn::$content` and `yii\grid\CheckboxColumn::$content` (lesha724) +- Bug #15548: Fixed index names collision in RBAC (gonimar) - Bug #15117: Fixed `yii\db\Schema::getTableMetadata` cache refreshing (boboldehampsink) - Bug #15875: afterSave for new models flushes unsaved data (shirase) - Bug #16073: Fixed regression in Oracle `IN` condition builder for more than 1000 items (cebe) diff --git a/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php b/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php new file mode 100644 index 00000000000..d088cf7cbfc --- /dev/null +++ b/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php @@ -0,0 +1,64 @@ + + * @since 2.0.16 + */ +class m180523_151638_rbac_updates_indexes_without_prefix extends Migration +{ + /** + * @throws yii\base\InvalidConfigException + * @return DbManager + */ + protected function getAuthManager() + { + $authManager = Yii::$app->getAuthManager(); + if (!$authManager instanceof DbManager) { + throw new InvalidConfigException('You should configure "authManager" component to use database before executing this migration.'); + } + + return $authManager; + } + + /** + * {@inheritdoc} + */ + public function up() + { + $authManager = $this->getAuthManager(); + + $this->dropIndex('auth_assignment_user_id_idx', $authManager->assignmentTable); + $this->createIndex('{{%idx-auth_assignment-user_id}}', $authManager->assignmentTable, 'user_id'); + + $this->dropIndex('idx-auth_item-type', $authManager->itemTable); + $this->createIndex('{{%idx-auth_item-type}}', $authManager->itemTable, 'type'); + } + + /** + * {@inheritdoc} + */ + public function down() + { + $authManager = $this->getAuthManager(); + + $this->dropIndex('{{%idx-auth_assignment-user_id}}', $authManager->assignmentTable); + $this->createIndex('auth_assignment_user_id_idx', $authManager->assignmentTable, 'user_id'); + + + $this->dropIndex('{{%idx-auth_item-type}}', $authManager->assignmentTable); + $this->createIndex('idx-auth_item-type', $authManager->itemTable, 'type'); + } +} From 57bde21398ec8c7f90e56d1c2e9503fc8472b451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Serhat=20=C3=96zle=C5=9F?= Date: Sat, 26 May 2018 18:33:26 +0300 Subject: [PATCH 111/902] Turkish Translation (#16323) [skip ci] --- docs/guide-tr/README.md | 78 ++++++++++++++-------------- docs/guide-tr/start-prerequisites.md | 17 ++++++ 2 files changed, 56 insertions(+), 39 deletions(-) create mode 100644 docs/guide-tr/start-prerequisites.md diff --git a/docs/guide-tr/README.md b/docs/guide-tr/README.md index 4df9a1fe6ff..03e7b38eab7 100644 --- a/docs/guide-tr/README.md +++ b/docs/guide-tr/README.md @@ -1,5 +1,5 @@ Yii 2.0 için Açıklayıcı Rehber -=============================== +============================== Bu döküman, [Yii Dökümantasyon Koşulları](http://www.yiiframework.com/doc/terms/) altında yayınlandı. @@ -18,8 +18,8 @@ Giriş Başlarken --------------- -* [Ne öğrenmeye ihtiyacın var](start-prerequisites.md) -* [Yii Yükleme](start-installation.md) +* [Ne bilmeye ihtiyacın var](start-prerequisites.md) +* [Yii Kurulumu](start-installation.md) * [Uygulamaları Çalıştırmak](start-workflow.md) * [Merhaba deyin](start-hello.md) * [Formlarla Çalışırken](start-forms.md) @@ -35,7 +35,7 @@ Uygulama Yapısı * [Giriş Komutları](structure-entry-scripts.md) * [Uygulamalar](structure-applications.md) * [Uygulama Bileşenleri](structure-application-components.md) -* [Kontroller](structure-controllers.md) +* [Kontrolcüler](structure-controllers.md) * [Modeller](structure-models.md) * [Görünümler](structure-views.md) * [Modüller](structure-modules.md) @@ -50,35 +50,35 @@ Uygulama Yapısı * [İstekleri İşlemeye Genel Bakış](runtime-overview.md) * [Bootstrapping](runtime-bootstrapping.md) -* [Yönlendirme ve URL Oluşturmak](runtime-routing.md) +* [Yönlendirme ve URL Oluşturma](runtime-routing.md) * [İstekler](runtime-requests.md) -* [Cevaplar](runtime-responses.md) -* [Sessionlar ve Cookieler](runtime-sessions-cookies.md) +* [Yanıtlar](runtime-responses.md) +* [Oturumlar ve Çerezler](runtime-sessions-cookies.md) * [Hataları İşleme](runtime-handling-errors.md) -* [Olay Günlüğü](runtime-logging.md) +* [Logging](runtime-logging.md) Anahtar Kavramlar ------------ -* [Components](concept-components.md) -* [Properties](concept-properties.md) +* [Bileşenler](concept-components.md) +* [Özellikler](concept-properties.md) * [Olaylar](concept-events.md) -* [Behaviors](concept-behaviors.md) +* [Davranışlar](concept-behaviors.md) * [Yapılandırmalar](concept-configurations.md) -* [Aliases](concept-aliases.md) -* [Class Autoloading](concept-autoloading.md) -* [Service Locator](concept-service-locator.md) +* [Takma Adlar](concept-aliases.md) +* [Sınıf Otomatik Yüklemesi](concept-autoloading.md) +* [Servis Bulucu](concept-service-locator.md) * [Dependency Injection Container](concept-di-container.md) Veritabanıyla Çalışırken ---------------------- -* [Database Access Objects](db-dao.md): Bir veritabanına bağlanmak, basit sorgular, işlemler ve şema manipilasyonu -* [Query Builder](db-query-builder.md): Basit bir ayırma katmanı kullanarak veritabanı sorgulamak -* [Active Record](db-active-record.md): Active Record ORM, kayıtları almak, değiştirmek ve ilişkileri tanımlamak -* [Migrations](db-migrations.md): Bir takım geliştirme ortamında sürüm kontrolünü veritabanlarına uygula +* [Veritabanı Erişim Nesneleri](db-dao.md): Bir veritabanına bağlanmak, basit sorgular, işlemler ve şema manipilasyonu +* [Sorgu Oluşturucu](db-query-builder.md): Basit bir ayırma katmanı kullanarak veritabanı sorgulama +* [Active Record](db-active-record.md): Active Record ORM, kayıtları almak, değiştirmek ve ilişkileri tanımlama +* [Taşıma İşlemleri](db-migrations.md): Bir takım geliştirme ortamında sürüm kontrolünü veritabanlarına uygula * [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide) * [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide) * [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide) @@ -89,7 +89,7 @@ Kullanıcılardan Veri Alırken ----------------------- * [Form Oluşturma](input-forms.md) -* [Validating Input](input-validation.md) +* [Veri Kontrolü](input-validation.md) * [Dosya Yükleme](input-file-upload.md) * [Collecting Tabular Input](input-tabular-input.md) * [Birden fazla Model için Veri Alma](input-multiple-models.md) @@ -99,7 +99,7 @@ Kullanıcılardan Veri Alırken Veriyi Gösterirken --------------- -* [Veri Formatlama](output-formatting.md) +* [Veri Tipini Değiştirme](output-formatting.md) * [Sayfalama](output-pagination.md) * [Sıralama](output-sorting.md) * [Veri Sağlayıcıları](output-data-providers.md) @@ -112,22 +112,22 @@ Güvenlik -------- * [Güvenliğe Genel Bakış](security-overview.md) -* [Doğrulama](security-authentication.md) +* [Kimlik Denetleme](security-authentication.md) * [Yetkilendirme](security-authorization.md) * [Şifrelerle Çalışma](security-passwords.md) * [Kriptografi](security-cryptography.md) * [Auth Clients](https://www.yiiframework.com/extension/yiisoft/yii2-authclient/doc/guide) -* [En İyi Egzersizler](security-best-practices.md) +* [Egzersizler](security-best-practices.md) -Önbellek +Cache Almak ------- * [Cache Genel Bakış](caching-overview.md) -* [Veriyi Cache Almak](caching-data.md) -* [Kısım Cachelemek](caching-fragment.md) -* [Sayfayı Cache Almak](caching-page.md) -* [HTTP Cache Almak](caching-http.md) +* [Veriyi Cache Alma](caching-data.md) +* [Sayfanın Sadece Bir Kısmını Cache Alma](caching-fragment.md) +* [Sayfanın Tamamını Cache Alma](caching-page.md) +* [HTTP Cache Alma](caching-http.md) RESTful Web Servisleri @@ -135,10 +135,10 @@ RESTful Web Servisleri * [Hızlı Başlangıç](rest-quick-start.md) * [Kaynaklar](rest-resources.md) -* [Kontroller](rest-controllers.md) -* [Routing](rest-routing.md) +* [Kontrolcüler](rest-controllers.md) +* [Rota Yöntemleri](rest-routing.md) * [Yanıt Formatlama](rest-response-formatting.md) -* [Doğrulama](rest-authentication.md) +* [Kimlik Denetleme](rest-authentication.md) * [İstek Sınırlama](rest-rate-limiting.md) * [Sürümlere Ayırma](rest-versioning.md) * [Hataları Kullanma](rest-error-handling.md) @@ -147,16 +147,16 @@ RESTful Web Servisleri Geliştirici Araçları ----------------- -* [Debug Toolbar ve Debugger](https://www.yiiframework.com/extension/yiisoft/yii2-debug/doc/guide) +* [Geliştirici Aracı ve Debugger](https://www.yiiframework.com/extension/yiisoft/yii2-debug/doc/guide) * [Gii'yi Kullanarak Kod Oluşturmak](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide) -* [API Dökümanı OLuşturma](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc) +* [API Dökümanı Oluşturma](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc) Test ------- * [Testlere Genel Bakış](test-overview.md) -* [Testlere Ortam Kurulumu](test-environment-setup.md) +* [Testler için Ortam Kurulumu](test-environment-setup.md) * [Unit Testleri](test-unit.md) * [Fonksiyonel Testler](test-functional.md) * [Kabul Testleri](test-acceptance.md) @@ -168,16 +168,16 @@ Test * [Gelişmiş Proje Şablonu](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) * [Building Application from Scratch](tutorial-start-from-scratch.md) -* [Console Komutları](tutorial-console.md) +* [Konsol Komutları](tutorial-console.md) * [Core Validators](tutorial-core-validators.md) * [Docker](tutorial-docker.md) -* [Uluslararası hale getirme](tutorial-i18n.md) -* [Mailing](tutorial-mailing.md) +* [Uluslararası Hale Getirme](tutorial-i18n.md) +* [Mail Gönderme](tutorial-mailing.md) * [Performans Ayarları](tutorial-performance-tuning.md) -* [Paylaşımlı Hosting Ortamı](tutorial-shared-hosting.md) +* [Paylaşımlı Sunucu Ortamı](tutorial-shared-hosting.md) * [Şablon Motoru](tutorial-template-engines.md) -* [3. parti kodlarla çalışmak](tutorial-yii-integration.md) -* [Yii'yi mikro kütüphane gibi kullanmak](tutorial-yii-as-micro-framework.md) +* [3. Parti Kodlarla Çalışma](tutorial-yii-integration.md) +* [Yii'yi Mikro Kütüphane Gibi Kullanma](tutorial-yii-as-micro-framework.md) Araçlar diff --git a/docs/guide-tr/start-prerequisites.md b/docs/guide-tr/start-prerequisites.md new file mode 100644 index 00000000000..2463fbab4d0 --- /dev/null +++ b/docs/guide-tr/start-prerequisites.md @@ -0,0 +1,17 @@ +# Ne bilmeye ihtiyacın var + +Yii'yi öğrenmesi, diğer PHP kütüphaneleri kadar zor olmasada, yine de başlamadan önce öğrenmeniz gereken bazı şeyler var. + +## PHP + +Yii bir PHP kütüphanesidir, bu yüzden [PHP Dil Başvuru Kılavuzunu](http://php.net/manual/tr/langref.php) okuduğunuzdan ve anladığınızdan emin olun. Yii ile geliştirirken, nesne yönelimli bir şekilde kod yazacaksınız, bu yüzden [Sınıflar ve Nesneler](https://secure.php.net/manual/tr/language.oop5.basic.php) gibi [ad alanları](https://secure.php.net/manual/en/language.namespaces.php)na aşina olduğunuzdan emin olun. + +## Nesne Yönelimli Programlama (OOP) + +Nesne yönelimli programlamanın temelini öğrenmeniz gerekmektedir. Eğer aşina değilseniz, [tuts+'daki gibi](https://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762) benzeri derslere göz atabilirsiniz. + +Uygulamanız ne kadar karmaşıksa, o karmaşıklığı başarılı bir şekilde yönetmek için öğrenmeniz gereken daha gelişmiş OOP kavramları olduğunu unutmayın. + +## Komut satırı ve composer + +Yii, de-facto standart PHP paket yöneticisi [Composer](https://getcomposer.org/)'ı kullanır. Bu yüzden [rehberini](https://getcomposer.org/doc/01-basic-usage.md) okuyup anladığınızdan emin olun. Komut satırını kullanmayı bilmiyorsanız, şimdi denemeye başlamanın tam zamanı. Temelleri öğrendikten sonra asla onsuz çalışmak istemeyeceksiniz. \ No newline at end of file From a18681729f0091f63e426e8d7c950c588b34db4c Mon Sep 17 00:00:00 2001 From: cuiliang Date: Sun, 27 May 2018 20:30:39 +0800 Subject: [PATCH 112/902] Update structure-applications.md --- docs/guide-zh-CN/structure-applications.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/structure-applications.md b/docs/guide-zh-CN/structure-applications.md index 45b18183cf7..85f0649a232 100644 --- a/docs/guide-zh-CN/structure-applications.md +++ b/docs/guide-zh-CN/structure-applications.md @@ -169,7 +169,7 @@ if (YII_ENV_DEV) { } ``` -> 注: 启动太多的组件会降低系统性能,因为每次请求都需要重新运行启动组件, +> Note: 启动太多的组件会降低系统性能,因为每次请求都需要重新运行启动组件, > 因此谨慎配置启动组件。 From 94ea0a6280e210b18e9d78b35fa8730711b5b387 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Sun, 27 May 2018 21:32:09 +0800 Subject: [PATCH 113/902] Update runtime-sessions-cookies.md --- docs/guide-zh-CN/runtime-sessions-cookies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/runtime-sessions-cookies.md b/docs/guide-zh-CN/runtime-sessions-cookies.md index 0680ed4f6c2..820c8c73b09 100644 --- a/docs/guide-zh-CN/runtime-sessions-cookies.md +++ b/docs/guide-zh-CN/runtime-sessions-cookies.md @@ -362,5 +362,5 @@ return [ ]; ``` -> 补充: [[yii\web\Request::cookieValidationKey|cookieValidationKey]] 对你的应用安全很重要, +> Info: [[yii\web\Request::cookieValidationKey|cookieValidationKey]] 对你的应用安全很重要, 应只被你信任的人知晓,请不要将它放入版本控制中。 From de11b8454dc37486ceac2d0fa0203519f87b8781 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Sun, 27 May 2018 21:36:22 +0800 Subject: [PATCH 114/902] Update tutorial-console.md --- docs/guide-zh-CN/tutorial-console.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guide-zh-CN/tutorial-console.md b/docs/guide-zh-CN/tutorial-console.md index 88bf9f14f8c..b9f91af64bb 100644 --- a/docs/guide-zh-CN/tutorial-console.md +++ b/docs/guide-zh-CN/tutorial-console.md @@ -192,20 +192,20 @@ use yii\console\Controller; class HelloController extends Controller { public $message; - + public function options($actionID) { return ['message']; } - + public function optionAliases() { return ['m' => 'message']; } - + public function actionIndex() { - echo $this->message; + echo $this->message . "\n"; } } ``` From b9a93b1543e9d0fde802986b2628349c566da24a Mon Sep 17 00:00:00 2001 From: cuiliang Date: Tue, 29 May 2018 20:12:48 +0800 Subject: [PATCH 115/902] Doc (#16324) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修正错误 修正错误 * 对齐其行数 * Update runtime-responses.md * Update runtime-responses.md * Update structure-applications.md * Update runtime-sessions-cookies.md * Update tutorial-console.md --- docs/guide-zh-CN/runtime-responses.md | 22 ++++++++++---------- docs/guide-zh-CN/runtime-sessions-cookies.md | 2 +- docs/guide-zh-CN/structure-applications.md | 2 +- docs/guide-zh-CN/tutorial-console.md | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/guide-zh-CN/runtime-responses.md b/docs/guide-zh-CN/runtime-responses.md index 76c024712d4..a24533bf290 100644 --- a/docs/guide-zh-CN/runtime-responses.md +++ b/docs/guide-zh-CN/runtime-responses.md @@ -1,23 +1,23 @@ 响应 ========= -当应用完成处理一个[请求](runtime-requests.md)后, 会生成一个[[yii\web\Response|response]]响应对象并发送给终端用户 -响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, -网页应用开发的最终目的本质上就是根据不同的请求构建这些响应对象。 +当一个应用在处理完一个[请求](runtime-requests.md)后, 这个应用会生成一个[[yii\web\Response|response]]响应对象并把这个响应对象发送给终端用户 +这个响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, +从本质上说,网页应用开发最终的目标就是根据不同的请求去构建这些响应对象。 -在大多是情况下主要处理继承自 [[yii\web\Response]] 的 -`response` [应用组件](structure-application-components.md), -尽管如此,Yii也允许你创建你自己的响应对象并发送给终端用户,这方面后续会阐述。 +在大多数实际应用情况下,你应该主要地去处理`response`这个 [应用组件](structure-application-components.md), +在默认情况下,它是一个继承自[[yii\web\Response]]的实例 +然而,Yii也允许你创建自己的响应对象并发送给终端用户,这方面在后续会阐述。 -在本节,将会描述如何构建响应和发送给终端用户。 +在本节,我们将会讲述如何组装和构建响应并把它发送给终端用户。 ## 状态码 -构建响应时,最先应做的是标识请求是否成功处理的状态,可通过设置 -[[yii\web\Response::statusCode]] 属性,该属性使用一个有效的 -[HTTP 状态码](https://tools.ietf.org/html/rfc2616#section-10)。例如,为标识处理已被处理成功, -可设置状态码为200,如下所示: +构建响应要做的第一件事就是声明请求是否被成功处理,我们可通过设置 +[[yii\web\Response::$statusCode]] 这个属性来做到这一点,该属性接受一个有效的 +[HTTP 状态码](https://tools.ietf.org/html/rfc2616#section-10)。例如,表明该请求已被成功处理, +可以设置状态码为200,如下所示: ```php Yii::$app->response->statusCode = 200; diff --git a/docs/guide-zh-CN/runtime-sessions-cookies.md b/docs/guide-zh-CN/runtime-sessions-cookies.md index 0680ed4f6c2..820c8c73b09 100644 --- a/docs/guide-zh-CN/runtime-sessions-cookies.md +++ b/docs/guide-zh-CN/runtime-sessions-cookies.md @@ -362,5 +362,5 @@ return [ ]; ``` -> 补充: [[yii\web\Request::cookieValidationKey|cookieValidationKey]] 对你的应用安全很重要, +> Info: [[yii\web\Request::cookieValidationKey|cookieValidationKey]] 对你的应用安全很重要, 应只被你信任的人知晓,请不要将它放入版本控制中。 diff --git a/docs/guide-zh-CN/structure-applications.md b/docs/guide-zh-CN/structure-applications.md index 45b18183cf7..85f0649a232 100644 --- a/docs/guide-zh-CN/structure-applications.md +++ b/docs/guide-zh-CN/structure-applications.md @@ -169,7 +169,7 @@ if (YII_ENV_DEV) { } ``` -> 注: 启动太多的组件会降低系统性能,因为每次请求都需要重新运行启动组件, +> Note: 启动太多的组件会降低系统性能,因为每次请求都需要重新运行启动组件, > 因此谨慎配置启动组件。 diff --git a/docs/guide-zh-CN/tutorial-console.md b/docs/guide-zh-CN/tutorial-console.md index 00ace8a7691..b9f91af64bb 100644 --- a/docs/guide-zh-CN/tutorial-console.md +++ b/docs/guide-zh-CN/tutorial-console.md @@ -193,7 +193,7 @@ class HelloController extends Controller { public $message; - public function options() + public function options($actionID) { return ['message']; } @@ -205,7 +205,7 @@ class HelloController extends Controller public function actionIndex() { - echo $message . "\n"; + echo $this->message . "\n"; } } ``` From 69db5508760d34605dadddf35df2c537038502a3 Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Wed, 30 May 2018 02:12:26 +0500 Subject: [PATCH 116/902] Fixed RBAC migration updates (#16330) --- .../m180523_151638_rbac_updates_indexes_without_prefix.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php b/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php index d088cf7cbfc..f5882eb344a 100644 --- a/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php +++ b/framework/rbac/migrations/m180523_151638_rbac_updates_indexes_without_prefix.php @@ -58,7 +58,7 @@ public function down() $this->createIndex('auth_assignment_user_id_idx', $authManager->assignmentTable, 'user_id'); - $this->dropIndex('{{%idx-auth_item-type}}', $authManager->assignmentTable); + $this->dropIndex('{{%idx-auth_item-type}}', $authManager->itemTable); $this->createIndex('idx-auth_item-type', $authManager->itemTable, 'type'); } } From 0d87c339f2a8792082280742a374bf2840b49289 Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Wed, 30 May 2018 02:13:31 +0500 Subject: [PATCH 117/902] dropped deprecated exception (#16328) --- framework/web/JsonParser.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/web/JsonParser.php b/framework/web/JsonParser.php index 5225649f6c2..d741ba73744 100644 --- a/framework/web/JsonParser.php +++ b/framework/web/JsonParser.php @@ -7,7 +7,7 @@ namespace yii\web; -use yii\base\InvalidParamException; +use yii\base\InvalidArgumentException; use yii\helpers\Json; /** @@ -50,7 +50,7 @@ public function parse($rawBody, $contentType) try { $parameters = Json::decode($rawBody, $this->asArray); return $parameters === null ? [] : $parameters; - } catch (InvalidParamException $e) { + } catch (InvalidArgumentException $e) { if ($this->throwException) { throw new BadRequestHttpException('Invalid JSON data in request body: ' . $e->getMessage()); } From 45880060086d80a84fcd0bc92d52063ddb26b9c7 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 31 May 2018 01:10:51 +0900 Subject: [PATCH 118/902] docs/guide-ja/structure-assets.md updated [ci skip] (#16337) --- docs/guide-ja/structure-assets.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-ja/structure-assets.md b/docs/guide-ja/structure-assets.md index 3f590854e9f..760ae85b776 100644 --- a/docs/guide-ja/structure-assets.md +++ b/docs/guide-ja/structure-assets.md @@ -215,7 +215,7 @@ PHP の世界には PHP の依存を管理する Composer がありますが、P ___ -##### asset-packagist レポジトリを使う +#### asset-packagist レポジトリを使う この方法は NPM または Bower のパッケージを必要とするプロジェクトの大半の要求を満たすことが出来ます。 @@ -248,7 +248,7 @@ $config = [ asset-packagist がどのようにして動作するのかは、[asset-packagist.org のサイト](https://asset-packagist.org) に説明があります。 -##### fxp/composer-asset-plugin を使う +#### fxp/composer-asset-plugin を使う asset-packagist と異なって、composer-asset-plugin はアプリケーション構成の変更を少しも要求しません。 その代りに、次のコマンドを実行して特別な Composer プラグインをグローバルにインストールすることが要求されます。 @@ -265,7 +265,7 @@ Yii を使ってこれらのアセットを発行したい場合は、プロジ インストールされるパッケージが配置されるディレクトリを調整します。 ```json -"extra": { +"config": { "asset-installer-paths": { "npm-asset-library": "vendor/npm", "bower-asset-library": "vendor/bower" From 252ae83dd2374e4c6fe5a1e876b282259474f8e0 Mon Sep 17 00:00:00 2001 From: Basil Date: Wed, 30 May 2018 18:36:25 +0200 Subject: [PATCH 119/902] Update CHANGELOG.md (#16325) [skip ci] --- framework/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index b51bc69ea1c..a5f96932a12 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -27,7 +27,7 @@ Yii Framework 2 Change Log - Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) - Bug #16280: Fixed `yii\base\Model::getActiveValidators()` to return correct validators for attribute on scenario (paweljankowiak06) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) -- Bug: Fixed bad instnaceof check in `yii\db\Schema::getTableMetadata()` (samdark) +- Bug: Fixed bad instanceof check in `yii\db\Schema::getTableMetadata()` (samdark) - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) - Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) From 15dfbb08755440870bcf1cda0de66cdca0e72c16 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 30 May 2018 22:48:07 +0300 Subject: [PATCH 120/902] Fixes #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation --- framework/CHANGELOG.md | 1 + framework/web/Request.php | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index a5f96932a12..fc2cafe78b2 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -30,6 +30,7 @@ Yii Framework 2 Change Log - Bug: Fixed bad instanceof check in `yii\db\Schema::getTableMetadata()` (samdark) - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) - Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) +- Bug #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation (samdark, Felix Wiedemann) 2.0.15.1 March 21, 2018 diff --git a/framework/web/Request.php b/framework/web/Request.php index acc5d02f611..c05937579ae 100644 --- a/framework/web/Request.php +++ b/framework/web/Request.php @@ -1712,6 +1712,6 @@ private function validateCsrfTokenInternal($clientSuppliedToken, $trueToken) $security = Yii::$app->security; - return $security->unmaskToken($clientSuppliedToken) === $security->unmaskToken($trueToken); + return $security->compareString($security->unmaskToken($clientSuppliedToken), $security->unmaskToken($trueToken)); } } From b933d618619b2c33543d7228d3f9bc617d6ac324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andres=20Felipe=20Solarte=20L=C3=B3pez?= Date: Wed, 30 May 2018 14:49:41 -0500 Subject: [PATCH 121/902] Update m170907_052038_rbac_add_index_on_auth_assignment_user_id.php (#16272) When the authManager DB Connection is not the default one the migration fails --- ...70907_052038_rbac_add_index_on_auth_assignment_user_id.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/rbac/migrations/m170907_052038_rbac_add_index_on_auth_assignment_user_id.php b/framework/rbac/migrations/m170907_052038_rbac_add_index_on_auth_assignment_user_id.php index 26ec41f80ea..061da00f8cc 100644 --- a/framework/rbac/migrations/m170907_052038_rbac_add_index_on_auth_assignment_user_id.php +++ b/framework/rbac/migrations/m170907_052038_rbac_add_index_on_auth_assignment_user_id.php @@ -42,6 +42,8 @@ protected function getAuthManager() public function up() { $authManager = $this->getAuthManager(); + $this->db = $authManager->db; + $this->createIndex($this->index, $authManager->assignmentTable, $this->column); } @@ -51,6 +53,8 @@ public function up() public function down() { $authManager = $this->getAuthManager(); + $this->db = $authManager->db; + $this->dropIndex($this->index, $authManager->assignmentTable); } } From aeeb6ce39de53a40d553a71fdf00cf3642504e20 Mon Sep 17 00:00:00 2001 From: Vuong Minh <38932626+vuongxuongminh@users.noreply.github.com> Date: Thu, 31 May 2018 02:51:52 +0700 Subject: [PATCH 122/902] Fixes #16252: Fixed `yii\base\DynamicModel` for checking exist property --- framework/CHANGELOG.md | 2 +- framework/base/DynamicModel.php | 38 +++++++++++++++++++---- tests/framework/base/DynamicModelTest.php | 4 +++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index fc2cafe78b2..9d7b6ab5fc5 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -27,12 +27,12 @@ Yii Framework 2 Change Log - Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) - Bug #16280: Fixed `yii\base\Model::getActiveValidators()` to return correct validators for attribute on scenario (paweljankowiak06) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) +- Bug #16252: Fixed `yii\base\DynamicModel` for checking exist property (vuongxuongminh) - Bug: Fixed bad instanceof check in `yii\db\Schema::getTableMetadata()` (samdark) - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) - Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) - Bug #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation (samdark, Felix Wiedemann) - 2.0.15.1 March 21, 2018 ----------------------- diff --git a/framework/base/DynamicModel.php b/framework/base/DynamicModel.php index 7d983364ce0..fa995af3b37 100644 --- a/framework/base/DynamicModel.php +++ b/framework/base/DynamicModel.php @@ -80,7 +80,7 @@ public function __construct(array $attributes = [], $config = []) */ public function __get($name) { - if (array_key_exists($name, $this->_attributes)) { + if ($this->hasAttribute($name)) { return $this->_attributes[$name]; } @@ -92,7 +92,7 @@ public function __get($name) */ public function __set($name, $value) { - if (array_key_exists($name, $this->_attributes)) { + if ($this->hasAttribute($name)) { $this->_attributes[$name] = $value; } else { parent::__set($name, $value); @@ -104,7 +104,7 @@ public function __set($name, $value) */ public function __isset($name) { - if (array_key_exists($name, $this->_attributes)) { + if ($this->hasAttribute($name)) { return isset($this->_attributes[$name]); } @@ -116,13 +116,39 @@ public function __isset($name) */ public function __unset($name) { - if (array_key_exists($name, $this->_attributes)) { + if ($this->hasAttribute($name)) { unset($this->_attributes[$name]); } else { parent::__unset($name); } } + /** + * {@inheritdoc} + */ + public function canGetProperty($name, $checkVars = true, $checkBehaviors = true) + { + return parent::canGetProperty($name, $checkVars, $checkBehaviors) || $this->hasAttribute($name); + } + + /** + * {@inheritdoc} + */ + public function canSetProperty($name, $checkVars = true, $checkBehaviors = true) + { + return parent::canSetProperty($name, $checkVars, $checkBehaviors) || $this->hasAttribute($name); + } + + /** + * Returns a value indicating whether the model has an attribute with the specified name. + * @param string $name the name of the attribute + * @return bool whether the model has an attribute with the specified name + */ + public function hasAttribute($name) + { + return array_key_exists($name, $this->_attributes); + } + /** * Defines an attribute. * @param string $name the attribute name @@ -155,7 +181,7 @@ public function undefineAttribute($name) public function addRule($attributes, $validator, $options = []) { $validators = $this->getValidators(); - $validators->append(Validator::createValidator($validator, $this, (array) $attributes, $options)); + $validators->append(Validator::createValidator($validator, $this, (array)$attributes, $options)); return $this; } @@ -179,7 +205,7 @@ public static function validateData(array $data, $rules = []) if ($rule instanceof Validator) { $validators->append($rule); } elseif (is_array($rule) && isset($rule[0], $rule[1])) { // attributes, validator type - $validator = Validator::createValidator($rule[1], $model, (array) $rule[0], array_slice($rule, 2)); + $validator = Validator::createValidator($rule[1], $model, (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.'); diff --git a/tests/framework/base/DynamicModelTest.php b/tests/framework/base/DynamicModelTest.php index 8f03625d6b0..c2dc1c724fc 100644 --- a/tests/framework/base/DynamicModelTest.php +++ b/tests/framework/base/DynamicModelTest.php @@ -72,6 +72,10 @@ public function testDynamicProperty() $model = new DynamicModel(compact('name', 'email')); $this->assertEquals($email, $model->email); $this->assertEquals($name, $model->name); + $this->assertTrue($model->canGetProperty('email')); + $this->assertTrue($model->canGetProperty('name')); + $this->assertTrue($model->canSetProperty('email')); + $this->assertTrue($model->canSetProperty('name')); $this->expectException('yii\base\UnknownPropertyException'); $age = $model->age; } From 22046e5c11ce63a6627ea3c72d4b77b6a2de68dd Mon Sep 17 00:00:00 2001 From: haobing <9262286+countrywind@users.noreply.github.com> Date: Thu, 31 May 2018 09:29:23 +0800 Subject: [PATCH 123/902] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `分页缓存` 更新为 `页面缓存` --- docs/guide-zh-CN/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/README.md b/docs/guide-zh-CN/README.md index 4543823db5e..cf450d88b86 100644 --- a/docs/guide-zh-CN/README.md +++ b/docs/guide-zh-CN/README.md @@ -126,7 +126,7 @@ Yii 2.0 权威指南 * [概述(Overview)](caching-overview.md) * [数据缓存(Data Caching)](caching-data.md) * [片段缓存(Fragment Caching)](caching-fragment.md) -* [分页缓存(Page Caching)](caching-page.md) +* [页面缓存(Page Caching)](caching-page.md) * [HTTP 缓存(HTTP Caching)](caching-http.md) From 5023b1646629fdbfcb91b25f545f886e6db99de0 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Thu, 31 May 2018 10:49:38 +0800 Subject: [PATCH 124/902] Update rest-controllers.md --- docs/guide-zh-CN/rest-controllers.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/guide-zh-CN/rest-controllers.md b/docs/guide-zh-CN/rest-controllers.md index 62cf8cea893..f3968c62182 100644 --- a/docs/guide-zh-CN/rest-controllers.md +++ b/docs/guide-zh-CN/rest-controllers.md @@ -120,14 +120,14 @@ public function behaviors() ### 自定义动作 -[[yii\rest\ActiveController]] 默认提供一下动作: - -* [[yii\rest\IndexAction|index]]: 按页列出资源; -* [[yii\rest\ViewAction|view]]: 返回指定资源的详情; -* [[yii\rest\CreateAction|create]]: 创建新的资源; -* [[yii\rest\UpdateAction|update]]: 更新一个存在的资源; -* [[yii\rest\DeleteAction|delete]]: 删除指定的资源; -* [[yii\rest\OptionsAction|options]]: 返回支持的HTTP方法. +[[yii\rest\ActiveController]] 默认提供一下动作: + +* [[yii\rest\IndexAction|index]]:按页列出资源; +* [[yii\rest\ViewAction|view]]:返回指定资源的详情; +* [[yii\rest\CreateAction|create]]:创建新的资源; +* [[yii\rest\UpdateAction|update]]:更新一个存在的资源; +* [[yii\rest\DeleteAction|delete]]:删除指定的资源; +* [[yii\rest\OptionsAction|options]]:返回支持的HTTP方法. 所有这些动作通过[[yii\rest\ActiveController::actions()|actions()]] 方法申明,可覆盖`actions()`方法配置或禁用这些动作, 如下所示: From a4d380854c23701a62a29d8361423c538578ec8d Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Thu, 31 May 2018 12:10:40 +0300 Subject: [PATCH 125/902] Russian translation: improvements of start-forms (#16340) [skip ci] --- docs/guide-ru/start-forms.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guide-ru/start-forms.md b/docs/guide-ru/start-forms.md index 97cac4b3457..1401f8ac7ed 100644 --- a/docs/guide-ru/start-forms.md +++ b/docs/guide-ru/start-forms.md @@ -11,7 +11,7 @@ * Как создать [модель](structure-models.md) для данных, введённых пользователем; * Как объявить правила проверки введённых данных; -* Как создать HTML форму в [представлении](structure-views.md). +* Как создать HTML-форму в [представлении](structure-views.md). Создание модели @@ -96,10 +96,10 @@ class SiteController extends Controller Действие создает объект `EntryForm`. Затем оно пытается заполнить модель данными из массива `$_POST`, доступ к которому обеспечивает Yii при помощи [[yii\web\Request::post()]]. Если модель успешно заполнена, то есть пользователь -отправил данные из HTML формы, то для проверки данных будет вызван метод [[yii\base\Model::validate()|validate()]]. +отправил данные из HTML-формы, то для проверки данных будет вызван метод [[yii\base\Model::validate()|validate()]]. Если всё в порядке, действие отобразит представление `entry-confirm`, которое показывает пользователю введенные им данные. -В противном случае будет отображено представление `entry`, которое содержит HTML форму и ошибки проверки данных, если +В противном случае будет отображено представление `entry`, которое содержит HTML-форму и ошибки проверки данных, если они есть. > Info: `Yii::$app` представляет собой глобально доступный экземпляр-одиночку @@ -111,7 +111,7 @@ class SiteController extends Controller Создание представления ---------------------------------------------------- -В заключение, создаём два представления с именами `entry-confirm` и `entry`, которые отображаются действием `entry` из +В заключение создаём два представления с именами `entry-confirm` и `entry`, которые отображаются действием `entry` из предыдущего подраздела. Представление `entry-confirm` просто отображает имя и email. Оно должно быть сохранено в файле `views/site/entry-confirm.php`. @@ -128,7 +128,7 @@ use yii\helpers\Html; ``` -Представление `entry` отображает HTML форму. Оно должно быть сохранено в файле `views/site/entry.php`. +Представление `entry` отображает HTML-форму. Оно должно быть сохранено в файле `views/site/entry.php`. ```php ``` -Для построения HTML формы представление использует мощный [виджет](structure-widgets.md) [[yii\widgets\ActiveForm|ActiveForm]]. +Для построения HTML-формы представление использует мощный [виджет](structure-widgets.md) [[yii\widgets\ActiveForm|ActiveForm]]. Методы `begin()` и `end()` выводят открывающий и закрывающий теги формы. Между этими вызовами создаются поля ввода при помощи метода [[yii\widgets\ActiveForm::field()|field()]]. Первым идёт поле для "name", вторым — для "email". Далее для генерации кнопки отправки данных вызывается метод [[yii\helpers\Html::submitButton()]]. @@ -177,11 +177,11 @@ http://hostname/index.php?r=site%2Fentry ### Как работает вся эта «магия» -Вы, скорее всего, задаётесь вопросом о том, как же эта HTML форма работает на самом деле. Весь процесс может показаться -немного волшебным: то как показываются подписи к полям, ошибки проверки данных при некорректном вводе и то что всё это +Вы, скорее всего, задаётесь вопросом о том, как же эта HTML-форма работает на самом деле. Весь процесс может показаться +немного волшебным: то как показываются подписи к полям, ошибки проверки данных при некорректном вводе и то, что всё это происходит без перезагрузки страницы. -Да, проверка данных на самом деле происходит и на стороне клиента при помощи JavaScript и на стороне сервера. +Да, проверка данных на самом деле происходит и на стороне клиента при помощи JavaScript, и на стороне сервера. [[yii\widgets\ActiveForm]] достаточно продуман, чтобы взять правила проверки, которые вы объявили в `EntryForm`, преобразовать их в JavaScript код и использовать его для проведения проверок. На случай отключения JavaScript в браузере валидация проводится и на стороне сервера как показано в методе `actionEntry()`. Это даёт уверенность в том, что данные From 1b3ee0838d6dbfe2d8c621ddda5644f2e17cb1a7 Mon Sep 17 00:00:00 2001 From: haobing <9262286+countrywind@users.noreply.github.com> Date: Thu, 31 May 2018 17:36:48 +0800 Subject: [PATCH 126/902] fix typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除多余的空格 --- docs/guide-zh-CN/db-active-record.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-zh-CN/db-active-record.md b/docs/guide-zh-CN/db-active-record.md index 5aaaa50610b..adbd0f4d826 100644 --- a/docs/guide-zh-CN/db-active-record.md +++ b/docs/guide-zh-CN/db-active-record.md @@ -303,8 +303,8 @@ class Customer extends ActiveRecord } ``` -现在你的 PHP 代码中,你可以访问 `$ customer-> birthdayText`, -来以 `'YYYY/MM/DD'` 的格式输入和显示客户生日,而不是访问 `$ customer-> birthday`。 +现在你的 PHP 代码中,你可以访问 `$customer->birthdayText`, +来以 `'YYYY/MM/DD'` 的格式输入和显示客户生日,而不是访问 `$customer->birthday`。 > Tip: 上述示例显示了以不同格式转换数据的通用方法。如果你正在使用 > 日期值,您可以使用 [DateValidator](tutorial-core-validators.md#date) 和 [[yii\jui\DatePicker|DatePicker]] 来操作, From 03c398b2e42c8f9226fa8eafc6c5582840aaf96e Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Thu, 31 May 2018 16:30:29 +0300 Subject: [PATCH 127/902] Fixed typo (#16342) [skip ci] --- docs/guide-ru/concept-behaviors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/concept-behaviors.md b/docs/guide-ru/concept-behaviors.md index 6ae761fee44..07c2bc79196 100644 --- a/docs/guide-ru/concept-behaviors.md +++ b/docs/guide-ru/concept-behaviors.md @@ -334,7 +334,7 @@ $user->touch('login_time'); - [yii2tech\ar\softdelete\SoftDeleteBehavior](https://github.com/yii2tech/ar-softdelete) - предоставляет методы для «мягкого» удаления и воосстановления ActiveRecord. То есть выставляет статус или флаг, который показывает, что запись удалена. -- [yii2tech\ar\position\PositionBehavior](https://github.com/yii2tech/ar-position) - позволяет упралять порядком +- [yii2tech\ar\position\PositionBehavior](https://github.com/yii2tech/ar-position) - позволяет управлять порядком записей через специальные методы. Информация сохраняется в целочисленном поле. From 292a545642eaa947a5169d7c6366a6dca486d571 Mon Sep 17 00:00:00 2001 From: Sergey Date: Thu, 31 May 2018 17:37:14 +0300 Subject: [PATCH 128/902] Fixes #16104: Fixed `yii\db\pgsql\QueryBuilder::dropIndex()` to prepend index name with schema name --- framework/CHANGELOG.md | 1 + framework/db/pgsql/QueryBuilder.php | 13 ++++++++++ tests/framework/db/pgsql/QueryBuilderTest.php | 25 +++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 9d7b6ab5fc5..5c7ee1f5338 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -5,6 +5,7 @@ Yii Framework 2 Change Log ------------------------ - Enh #9133: Added `yii\behaviors\OptimisticLockBehavior` (tunecino) +- Bug #16104: Fixed `yii\db\pgsql\QueryBuilder::dropIndex()` to prepend index name with schema name (wapmorgan) - Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins (Jianjun Chen) - Bug #16068: Fixed `yii\web\CookieCollection::has` when an expiration param is set to 'until the browser is closed' (OndrejVasicek) - Bug #16006: Handle case when `X-Forwarded-Host` header have multiple hosts separated with a comma (pgaultier) diff --git a/framework/db/pgsql/QueryBuilder.php b/framework/db/pgsql/QueryBuilder.php index acf40313b12..795c421b996 100644 --- a/framework/db/pgsql/QueryBuilder.php +++ b/framework/db/pgsql/QueryBuilder.php @@ -140,6 +140,19 @@ public function createIndex($name, $table, $columns, $unique = false) */ public function dropIndex($name, $table) { + if (strpos($table, '.') !== false && strpos($name, '.') === false) { + if (strpos($table, '{{') !== false) { + $table = preg_replace('/\\{\\{(.*?)\\}\\}/', '\1', $table); + list($schema, $table) = explode('.', $table); + if (strpos($schema, '%') === false) + $name = $schema.'.'.$name; + else + $name = '{{'.$schema.'.'.$name.'}}'; + } else { + list($schema) = explode('.', $table); + $name = $schema.'.'.$name; + } + } return 'DROP INDEX ' . $this->db->quoteTableName($name); } diff --git a/tests/framework/db/pgsql/QueryBuilderTest.php b/tests/framework/db/pgsql/QueryBuilderTest.php index 89d8c9dad8e..c6d8f97c4af 100644 --- a/tests/framework/db/pgsql/QueryBuilderTest.php +++ b/tests/framework/db/pgsql/QueryBuilderTest.php @@ -353,4 +353,29 @@ public function updateProvider() return $items; } + + public function testDropIndex() + { + $qb = $this->getQueryBuilder(); + + $expected = 'DROP INDEX "index"'; + $sql = $qb->dropIndex('index', '{{table}}'); + $this->assertEquals($expected, $sql); + + $expected = 'DROP INDEX "schema"."index"'; + $sql = $qb->dropIndex('index', '{{schema.table}}'); + $this->assertEquals($expected, $sql); + + $expected = 'DROP INDEX "schema"."index"'; + $sql = $qb->dropIndex('schema.index', '{{schema2.table}}'); + $this->assertEquals($expected, $sql); + + $expected = 'DROP INDEX "schema"."index"'; + $sql = $qb->dropIndex('index', '{{schema.%table}}'); + $this->assertEquals($expected, $sql); + + $expected = 'DROP INDEX {{%schema.index}}'; + $sql = $qb->dropIndex('index', '{{%schema.table}}'); + $this->assertEquals($expected, $sql); + } } From 6590feef0db1e994a42ffdc3536bccbe2f737ee4 Mon Sep 17 00:00:00 2001 From: drlibra <13391053+drlibra@users.noreply.github.com> Date: Sun, 3 Jun 2018 18:30:53 +0500 Subject: [PATCH 129/902] Fixes #16192: `yii\db\Command::logQuery()` is now protected --- framework/CHANGELOG.md | 3 ++- framework/db/Command.php | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 5c7ee1f5338..5e09c326836 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -28,11 +28,12 @@ Yii Framework 2 Change Log - Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) - Bug #16280: Fixed `yii\base\Model::getActiveValidators()` to return correct validators for attribute on scenario (paweljankowiak06) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) -- Bug #16252: Fixed `yii\base\DynamicModel` for checking exist property (vuongxuongminh) +- Bug #16252: Fixed `yii\base\DynamicModel` for checking exist property (vuongxuongminh) - Bug: Fixed bad instanceof check in `yii\db\Schema::getTableMetadata()` (samdark) - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) - Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) - Bug #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation (samdark, Felix Wiedemann) +- Chg #16192: `yii\db\Command::logQuery()` is now protected (drlibra) 2.0.15.1 March 21, 2018 ----------------------- diff --git a/framework/db/Command.php b/framework/db/Command.php index 060fa10381d..b2fed611006 100644 --- a/framework/db/Command.php +++ b/framework/db/Command.php @@ -1093,7 +1093,7 @@ public function execute() * @return array array of two elements, the first is boolean of whether profiling is enabled or not. * The second is the rawSql if it has been created. */ - private function logQuery($category) + protected function logQuery($category) { if ($this->db->enableLogging) { $rawSql = $this->getRawSql(); From f2fbd58f43261d79cfa29bee182b8c0ff06a73ca Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 12 Jun 2018 09:26:46 +0300 Subject: [PATCH 130/902] Russian translation: improvements of input-forms (#16381) [skip ci] --- docs/guide-ru/input-forms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/input-forms.md b/docs/guide-ru/input-forms.md index 73aa62171c7..a3888128381 100644 --- a/docs/guide-ru/input-forms.md +++ b/docs/guide-ru/input-forms.md @@ -141,7 +141,7 @@ use yii\widgets\Pjax; use yii\widgets\ActiveForm; Pjax::begin([ - // Pjax options + // Опции Pjax ]); $form = ActiveForm::begin([ 'options' => ['data' => ['pjax' => true]], From 858d3531ed2e7fa8b6dc1c19d6a07455648a4c8c Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Tue, 12 Jun 2018 09:27:24 +0300 Subject: [PATCH 131/902] Russian translation: improvements of runtime-logging (#16380) [skip ci] --- docs/guide-ru/runtime-logging.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-ru/runtime-logging.md b/docs/guide-ru/runtime-logging.md index f6c45aa2467..9ec41b3886c 100644 --- a/docs/guide-ru/runtime-logging.md +++ b/docs/guide-ru/runtime-logging.md @@ -22,7 +22,7 @@ Yii предоставляет мощную, гибко настраиваему Эти методы позволяют записывать сообщения разных *уровней важности* и *категорий*. Они имеют одинаковое описание функции `function ($message, $category = 'application')`, где `$message` передает сообщение для записи, а `$category` - категорию сообщения. В следующем примере будет записано *trace* сообщение с категорией по умолчанию `application`: ```php -Yii::debug('start calculating average revenue'); +Yii::debug('начало вычисления среднего дохода'); ``` > Note: Сообщение может быть как строкой, так и объектом или массивом. За корректную работу с содержимым сообщения отвечают [цели лога](#log-targets). По умолчанию, если сообщение не является строкой, оно будет приведено к строковому типу при помощи [[yii\helpers\VarDumper::export()]]. @@ -143,7 +143,7 @@ return [ По умолчанию сообщения логов форматируются методом [[yii\log\Target::formatMessage()]]: ``` -Временная метка [IP адрес][ID пользователя][ID сессии][Уровень важности][Категория] Текст сообщения +Временная метка [IP-адрес][ID пользователя][ID сессии][Уровень важности][Категория] Текст сообщения ``` Этот формат может быть изменен при помощи свойства [[yii\log\Target::prefix]], которое получает анонимную функцию, возвращающую нужный префикс сообщения. Например, следующий код позволяет настроить вывод идентификатор текущего пользователя в качестве префикса для всех сообщений. @@ -287,7 +287,7 @@ return [ ```php \Yii::beginProfile('myBenchmark'); -...участок кода для профилирования... +// участок кода для профилирования... \Yii::endProfile('myBenchmark'); ``` From ca3c8da503d9a152fc0d9ba7c2b51df5752a00fa Mon Sep 17 00:00:00 2001 From: Razvan Grigore Date: Tue, 12 Jun 2018 08:50:43 +0200 Subject: [PATCH 132/902] Fixes #16377: Fixed `yii\base\Event:off()` undefined index error when event handler does not match --- framework/CHANGELOG.md | 1 + framework/base/Event.php | 26 ++++++++++++++------------ tests/framework/base/EventTest.php | 8 ++++++++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 5e09c326836..fe46100f533 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -34,6 +34,7 @@ Yii Framework 2 Change Log - Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) - Bug #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation (samdark, Felix Wiedemann) - Chg #16192: `yii\db\Command::logQuery()` is now protected (drlibra) +- Bug #16377: Fixed `yii\base\Event:off()` undefined index error when event handler does not match (razvanphp) 2.0.15.1 March 21, 2018 ----------------------- diff --git a/framework/base/Event.php b/framework/base/Event.php index d0464d4b8f7..4aad3ff4192 100644 --- a/framework/base/Event.php +++ b/framework/base/Event.php @@ -164,19 +164,21 @@ public static function off($class, $name, $handler = null) // wildcard event names $removed = false; - foreach (self::$_eventWildcards[$name][$class] as $i => $event) { - if ($event[0] === $handler) { - unset(self::$_eventWildcards[$name][$class][$i]); - $removed = true; + if (isset(self::$_eventWildcards[$name][$class])) { + foreach (self::$_eventWildcards[$name][$class] as $i => $event) { + if ($event[0] === $handler) { + unset(self::$_eventWildcards[$name][$class][$i]); + $removed = true; + } } - } - if ($removed) { - self::$_eventWildcards[$name][$class] = array_values(self::$_eventWildcards[$name][$class]); - // remove empty wildcards to save future redundant regex checks : - if (empty(self::$_eventWildcards[$name][$class])) { - unset(self::$_eventWildcards[$name][$class]); - if (empty(self::$_eventWildcards[$name])) { - unset(self::$_eventWildcards[$name]); + if ($removed) { + self::$_eventWildcards[$name][$class] = array_values(self::$_eventWildcards[$name][$class]); + // remove empty wildcards to save future redundant regex checks : + if (empty(self::$_eventWildcards[$name][$class])) { + unset(self::$_eventWildcards[$name][$class]); + if (empty(self::$_eventWildcards[$name])) { + unset(self::$_eventWildcards[$name]); + } } } } diff --git a/tests/framework/base/EventTest.php b/tests/framework/base/EventTest.php index 8a2b9e4eafe..0e6eaeb1c9f 100644 --- a/tests/framework/base/EventTest.php +++ b/tests/framework/base/EventTest.php @@ -91,6 +91,14 @@ public function testHasHandlers() $this->assertTrue(Event::hasHandlers('yiiunit\framework\base\SomeInterface', SomeInterface::EVENT_SUPER_EVENT)); } + public function testOffUnmatchedHandler() + { + $this->assertFalse(Event::hasHandlers(Post::className(), 'afterSave')); + Event::on(Post::className(), 'afterSave', [$this, 'bla-bla']); + $this->assertFalse(Event::off(Post::className(), 'afterSave', [$this, 'bla-bla-bla'])); + $this->assertTrue(Event::off(Post::className(), 'afterSave', [$this, 'bla-bla'])); + } + /** * @depends testOn * @depends testHasHandlers From 3412d5c636937ba42138c8db5c0f8355063dfedd Mon Sep 17 00:00:00 2001 From: eyglys Date: Tue, 12 Jun 2018 16:26:31 -0300 Subject: [PATCH 133/902] Translation of Portuguese Brasil messages (#16390) [skip ci] --- framework/messages/pt-BR/yii.php | 131 ++++++++++++++++--------------- 1 file changed, 69 insertions(+), 62 deletions(-) diff --git a/framework/messages/pt-BR/yii.php b/framework/messages/pt-BR/yii.php index 78f56ab93a3..cd3c6bec818 100644 --- a/framework/messages/pt-BR/yii.php +++ b/framework/messages/pt-BR/yii.php @@ -23,21 +23,76 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" não suporta o operador "{operator}".', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'A condição para "{attribute}" deve ser um valor ou a especificação de um operador válido.', + 'Operator "{operator}" must be used with a search attribute.' => 'O operador "{operator}" deve ser usado com um atributo de busca.', + 'Operator "{operator}" requires multiple operands.' => 'O operador "{operator}" requer múltiplos operandos.', + 'The format of {filter} is invalid.' => 'O formato de {filter} é inválido.', + 'Unknown filter attribute "{attribute}"' => 'Atributo de filtro desconhecido "{attribute}"', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Você deve enviar ao menos {limit, number} {limit, plural, one{arquivo} other{arquivos}}.', ' and ' => ' e ', '(not set)' => '(não definido)', + 'An internal server error occurred.' => 'Ocorreu um erro interno do servidor.', + 'Are you sure you want to delete this item?' => 'Deseja realmente excluir este item?', + 'Delete' => 'Excluir', + 'Error' => 'Erro', + 'File upload failed.' => 'O upload do arquivo falhou.', + 'Home' => 'Página Inicial', + 'Invalid data received for parameter "{param}".' => 'Dados inválidos recebidos para o parâmetro "{param}".', + 'Login Required' => 'Login Necessário.', + 'Missing required arguments: {params}' => 'Argumentos obrigatórios ausentes: {params}', + 'Missing required parameters: {params}' => 'Parâmetros obrigatórios ausentes: {params}', + 'No' => 'Não', + 'No results found.' => 'Nenhum resultado foi encontrado.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'São permitidos somente arquivos com os seguintes tipos MIME: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'São permitidos somente arquivos com as seguintes extensões: {extensions}.', + 'Page not found.' => 'Página não encontrada.', + 'Please fix the following errors:' => 'Por favor, corrija os seguintes erros:', + 'Please upload a file.' => 'Por favor, faça upload de um arquivo.', + 'Powered by {yii}' => 'Desenvolvido com {yii}', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Exibindo {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{item} other{itens}}.', + 'The combination {values} of {attributes} has already been taken.' => 'A combinação {values} de {attributes} já foi utilizado.', + 'The file "{file}" is not an image.' => 'O arquivo "{file}" não é uma imagem.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'O arquivo "{file}" é grande demais. Seu tamanho não pode exceder {formattedLimit}.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'O arquivo "{file}" é pequeno demais. Seu tamanho não pode ser menor que {formattedLimit}.', + 'The format of {attribute} is invalid.' => 'O formato de "{attribute}" é inválido.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é grande demais. A altura não pode ser maior que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é grande demais. A largura não pode ser maior que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é pequeno demais. A altura não pode ser menor que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é pequeno demais. A largura não pode ser menor que {limit, number} {limit, plural, one{pixel} other{pixels}}.', + 'The requested view "{name}" was not found.' => 'A visão "{name}" solicitada não foi encontrada.', + 'The verification code is incorrect.' => 'O código de verificação está incorreto.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itens}}.', + 'Unable to verify your data submission.' => 'Não foi possível verificar o seu envio de dados.', + 'Unknown alias: -{name}' => 'Alias desconhecido: -{name}', + 'Unknown option: --{name}' => 'Opção desconhecida : --{name}', + 'Update' => 'Alterar', + 'View' => 'Exibir', + 'Yes' => 'Sim', + 'Yii Framework' => 'Yii Framework', + 'You are not allowed to perform this action.' => 'Você não está autorizado a realizar essa ação.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Você pode fazer o upload de, no máximo, {limit, number} {limit, plural, one{arquivo} other{arquivos}}.', + 'in {delta, plural, =1{a day} other{# days}}' => 'em {delta, plural, =1{1 dia} other{# dias}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'em {delta, plural, =1{1 minuto} other{# minutos}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'em {delta, plural, =1{1 mês} other{# meses}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'em {delta, plural, =1{1 segundo} other{# segundos}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'em {delta, plural, =1{1 ano} other{# anos}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'em {delta, plural, =1{1 hora} other{# horas}}', + 'just now' => 'agora mesmo', + 'the input value' => 'o valor de entrada', '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" já foi utilizado.', '{attribute} cannot be blank.' => '"{attribute}" não pode ficar em branco.', '{attribute} contains wrong subnet mask.' => '{attribute} contém a máscara de sub-rede errado.', '{attribute} is invalid.' => '"{attribute}" é inválido.', - '{attribute} is not a valid email address.' => '"{attribute}" não é um endereço de e-mail válido.', '{attribute} is not a valid URL.' => '"{attribute}" não é uma URL válida.', + '{attribute} is not a valid email address.' => '"{attribute}" não é um endereço de e-mail válido.', '{attribute} is not in the allowed range.' => '{attribute} intervalo não permitido.', '{attribute} must be "{requiredValue}".' => '"{attribute}" deve ser "{requiredValue}".', '{attribute} must be a number.' => '"{attribute}" deve ser um número.', '{attribute} must be a string.' => '"{attribute}" deve ser um texto.', '{attribute} must be a valid IP address.' => '{attribute} deve ser um endereço IP válido.', - '{attribute} must be an integer.' => '"{attribute}" deve ser um número inteiro.', '{attribute} must be an IP address with specified subnet.' => '{attribute} deve ser um endereço IP com sub-rede especificada.', + '{attribute} must be an integer.' => '"{attribute}" deve ser um número inteiro.', '{attribute} must be either "{true}" or "{false}".' => '"{attribute}" deve ser "{true}" ou "{false}".', '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} deve ser igual a "{compareValueOrAttribute}".', '{attribute} must be greater than "{compareValueOrAttribute}".' => '"{attribute}" deve ser maior que "{compareValueOrAttribute}".', @@ -50,9 +105,9 @@ '{attribute} must not be an IPv4 address.' => '{attribute} não deve ser um endereço IPv4.', '{attribute} must not be an IPv6 address.' => '{attribute} não deve ser um endereço IPv6.', '{attribute} must not be equal to "{compareValueOrAttribute}".' => '"{attribute}" não deve ser igual a "{compareValueOrAttribute}".', - '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '"{attribute}" deve conter {length, number} {length, plural, one{caractere} other{caracteres}}.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '"{attribute}" deve conter pelo menos {min, number} {min, plural, one{caractere} other{caracteres}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '"{attribute}" deve conter no máximo {max, number} {max, plural, one{caractere} other{caracteres}}.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '"{attribute}" deve conter {length, number} {length, plural, one{caractere} other{caracteres}}.', '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dia} other{# dias}}', '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hora} other{# horas}}', '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minutos}}', @@ -65,17 +120,6 @@ '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{há 1 segundo} other{há # segundos}}', '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{há 1 ano} other{há # anos}}', '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{há 1 hora} other{há # horas}}', - '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', - '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', - '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', - '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}', - '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}', - '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}', - '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}', - '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}', - '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}', - '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}', - '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}', '{nFormatted} B' => '{nFormatted} B', '{nFormatted} GB' => '{nFormatted} GB', '{nFormatted} GiB' => '{nFormatted} GiB', @@ -87,52 +131,15 @@ '{nFormatted} PiB' => '{nFormatted} PiB', '{nFormatted} TB' => '{nFormatted} TB', '{nFormatted} TiB' => '{nFormatted} TiB', - 'An internal server error occurred.' => 'Ocorreu um erro interno do servidor.', - 'Are you sure you want to delete this item?' => 'Deseja realmente excluir este item?', - 'Delete' => 'Excluir', - 'Error' => 'Erro', - 'File upload failed.' => 'O upload do arquivo falhou.', - 'Home' => 'Página Inicial', - 'in {delta, plural, =1{a day} other{# days}}' => 'em {delta, plural, =1{1 dia} other{# dias}}', - 'in {delta, plural, =1{a minute} other{# minutes}}' => 'em {delta, plural, =1{1 minuto} other{# minutos}}', - 'in {delta, plural, =1{a month} other{# months}}' => 'em {delta, plural, =1{1 mês} other{# meses}}', - 'in {delta, plural, =1{a second} other{# seconds}}' => 'em {delta, plural, =1{1 segundo} other{# segundos}}', - 'in {delta, plural, =1{a year} other{# years}}' => 'em {delta, plural, =1{1 ano} other{# anos}}', - 'in {delta, plural, =1{an hour} other{# hours}}' => 'em {delta, plural, =1{1 hora} other{# horas}}', - 'Invalid data received for parameter "{param}".' => 'Dados inválidos recebidos para o parâmetro "{param}".', - 'just now' => 'agora mesmo', - 'Login Required' => 'Login Necessário.', - 'Missing required arguments: {params}' => 'Argumentos obrigatórios ausentes: {params}', - 'Missing required parameters: {params}' => 'Parâmetros obrigatórios ausentes: {params}', - 'No results found.' => 'Nenhum resultado foi encontrado.', - 'No' => 'Não', - 'Only files with these extensions are allowed: {extensions}.' => 'São permitidos somente arquivos com as seguintes extensões: {extensions}.', - 'Only files with these MIME types are allowed: {mimeTypes}.' => 'São permitidos somente arquivos com os seguintes tipos MIME: {mimeTypes}.', - 'Page not found.' => 'Página não encontrada.', - 'Please fix the following errors:' => 'Por favor, corrija os seguintes erros:', - 'Please upload a file.' => 'Por favor, faça upload de um arquivo.', - 'Powered by {yii}' => 'Desenvolvido com {yii}', - 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => 'Exibindo {begin, number}-{end, number} de {totalCount, number} {totalCount, plural, one{item} other{itens}}.', - 'The combination {values} of {attributes} has already been taken.' => 'A combinação {values} de {attributes} já foi utilizado.', - 'The file "{file}" is not an image.' => 'O arquivo "{file}" não é uma imagem.', - 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'O arquivo "{file}" é grande demais. Seu tamanho não pode exceder {formattedLimit}.', - 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'O arquivo "{file}" é pequeno demais. Seu tamanho não pode ser menor que {formattedLimit}.', - 'The format of {attribute} is invalid.' => 'O formato de "{attribute}" é inválido.', - 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é grande demais. A altura não pode ser maior que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é grande demais. A largura não pode ser maior que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é pequeno demais. A altura não pode ser menor que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'O arquivo "{file}" é pequeno demais. A largura não pode ser menor que {limit, number} {limit, plural, one{pixel} other{pixels}}.', - 'the input value' => 'o valor de entrada', - 'The requested view "{name}" was not found.' => 'A visão "{name}" solicitada não foi encontrada.', - 'The verification code is incorrect.' => 'O código de verificação está incorreto.', - 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itens}}.', - 'Unable to verify your data submission.' => 'Não foi possível verificar o seu envio de dados.', - 'Unknown alias: -{name}' => 'Alias desconhecido: -{name}', - 'Unknown option: --{name}' => 'Opção desconhecida : --{name}', - 'Update' => 'Alterar', - 'View' => 'Exibir', - 'Yes' => 'Sim', - 'Yii Framework' => 'Yii Framework', - 'You are not allowed to perform this action.' => 'Você não está autorizado a realizar essa ação.', - 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Você pode fazer o upload de, no máximo, {limit, number} {limit, plural, one{arquivo} other{arquivos}}.', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}', ]; From 6ba1d562282bd45ad25eb252845d3bc20075765c Mon Sep 17 00:00:00 2001 From: Anton Samoilenko Date: Tue, 12 Jun 2018 21:27:10 +0200 Subject: [PATCH 134/902] Fixed typo in Russia guide (#16389) [skip ci] --- docs/guide-ru/structure-models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/structure-models.md b/docs/guide-ru/structure-models.md index 8626ac48c9d..0bc5b21da23 100644 --- a/docs/guide-ru/structure-models.md +++ b/docs/guide-ru/structure-models.md @@ -400,7 +400,7 @@ public function fields() * следует избегать встраивания HTML или другого отображаемого кода - это лучше делать в [видах](structure-views.md); * избегайте слишком большого количества [сценариев](#scenarios) в одной модели. -Рекомендации выше обычно учитываются при разработке больших сложных систем. В таких системах, модели могут быть очень большими, в связи стем, что они используются во многих местах и поэтому могут содержать множество наборов правил и бизнес-логики. Это часто заканчивается кошмаром при поддержании кода модели, поскольку одним касанием кода можно повлиять на несколько разных мест. Чтобы сделать код модели более легким в обслуживании, Вы можете предпринять следующую стратегию: +Рекомендации выше обычно учитываются при разработке больших сложных систем. В таких системах, модели могут быть очень большими, в связи с тем, что они используются во многих местах и поэтому могут содержать множество наборов правил и бизнес-логики. Это часто заканчивается кошмаром при поддержании кода модели, поскольку одним касанием кода можно повлиять на несколько разных мест. Чтобы сделать код модели более легким в обслуживании, Вы можете предпринять следующую стратегию: * Определить набор базовых классов моделей, которые являются общими для разных [приложений](structure-applications.md) или [модулей](structure-modules.md). Эти классы моделей должны содержать минимальный набор правил и логики, которые являются общими среди всех используемых приложений или модулей. * В каждом [приложении](structure-applications.md) или [модуле](structure-modules.md) в котором используется модель, определить конкретный класс модели (или классы моделей), отходящий от соответствующего базового класса модели. Конкретный класс модели должен содержать правила и логику, которые являются специфическими для данного приложения или модуля. From cc782353cccf01723200e76b30e31ed10b81b9af Mon Sep 17 00:00:00 2001 From: Thoulah Date: Wed, 13 Jun 2018 11:09:44 +0200 Subject: [PATCH 135/902] Change readme to link https (#16392) [skip ci] --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fb70591ac0a..d4844b98a2b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- + Yii Framework

@@ -11,7 +11,7 @@ The framework is easy to adjust to meet your needs, because Yii has been designe [![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2.svg)](https://packagist.org/packages/yiisoft/yii2) [![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2.svg)](https://packagist.org/packages/yiisoft/yii2) -[![Build Status](https://img.shields.io/travis/yiisoft/yii2.svg)](http://travis-ci.org/yiisoft/yii2) +[![Build Status](https://img.shields.io/travis/yiisoft/yii2.svg)](https://travis-ci.org/yiisoft/yii2) [![Code Coverage](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/coverage.png?s=31d80f1036099e9d6a3e4d7738f6b000b3c3d10e)](https://scrutinizer-ci.com/g/yiisoft/yii2/) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/quality-score.png?s=b1074a1ff6d0b214d54fa5ab7abbb90fc092471d)](https://scrutinizer-ci.com/g/yiisoft/yii2/) [![Code Climate](https://img.shields.io/codeclimate/github/yiisoft/yii2.svg)](https://codeclimate.com/github/yiisoft/yii2) @@ -53,7 +53,7 @@ You may join us and: - [Report an issue](docs/internals/report-an-issue.md) - [Translate documentation or messages](docs/internals/translation-workflow.md) -- [Give us feedback or start a design discussion](http://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/) +- [Give us feedback or start a design discussion](https://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/) - [Contribute to the core code or fix bugs](docs/internals/git-workflow.md) ### Reporting Security issues @@ -89,5 +89,5 @@ If you are using Yii 2 as part of an OpenSource project, a way to acknowledge it If your code is hosted at GitHub, you can place the following in your README.md file to get the badge: ``` -[![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat)](http://www.yiiframework.com/) +[![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=flat)](https://www.yiiframework.com/) ``` From 8010069e8c736cd6564c4552fdda7be274d78104 Mon Sep 17 00:00:00 2001 From: timsabruno <35509391+timsabruno@users.noreply.github.com> Date: Wed, 13 Jun 2018 15:49:24 +0200 Subject: [PATCH 136/902] Added 'vscode' folder used by visual studio code (#16393) [skip ci] --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 77c9164bcc4..f941e247228 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,9 @@ nbproject *.sublime-project *.sublime-workspace +# visual studio code project files +.vscode + # windows thumbnail cache Thumbs.db From b9fe589228a9d02976f343e6e71074c3fb4584bd Mon Sep 17 00:00:00 2001 From: Marcelo Almeida Date: Thu, 14 Jun 2018 06:23:24 -0300 Subject: [PATCH 137/902] start-hello.md (#16399) [skip ci] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apenas umas correção na escrita --- docs/guide-pt-BR/start-hello.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-pt-BR/start-hello.md b/docs/guide-pt-BR/start-hello.md index b1b2cffb0ac..9fe723d3a5d 100644 --- a/docs/guide-pt-BR/start-hello.md +++ b/docs/guide-pt-BR/start-hello.md @@ -78,7 +78,7 @@ para renderizar um arquivo de [visão](structure-views.md) chamado `say`. O parâmetro `message` também é passado para a visão de modo que ele possa ser usado ali. O resultado da renderização é retornado pelo método da ação. Esse resultado será recebido pela aplicação, e exibido para o usuário final no navegador (como -parte de uma págian HTML completa). +parte de uma página HTML completa). Criando uma Visão From 0f929da381657191141ae38f71f1434ec3a7cae5 Mon Sep 17 00:00:00 2001 From: andres101 Date: Thu, 14 Jun 2018 11:24:00 +0200 Subject: [PATCH 138/902] Add Afrikaans (af) translation for framework (#16400) [skip ci] --- framework/messages/af/yii.php | 145 ++++++++++++++++++++++++++++++++++ framework/messages/config.php | 2 +- 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 framework/messages/af/yii.php diff --git a/framework/messages/af/yii.php b/framework/messages/af/yii.php new file mode 100644 index 00000000000..f072740b088 --- /dev/null +++ b/framework/messages/af/yii.php @@ -0,0 +1,145 @@ + ' en ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" ondersteun nie operateur "{operator}" nie.', + '(not set)' => '(nie gestel nie)', + 'An internal server error occurred.' => '\'n Interne bediener fout het plaasgevind.', + 'Are you sure you want to delete this item?' => 'Is jy seker jy wil hierdie item skrap?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'Voorwaarde vir "{attribute}" moet óf \'n waarde, óf \'n geldige operateurspesifikasie wees.', + 'Delete' => 'Skrap', + 'Error' => 'Fout', + 'File upload failed.' => 'Lêeroplaai het misluk.', + 'Home' => 'Tuis', + 'Invalid data received for parameter "{param}".' => 'Ongeldige data ontvang vir parameter "{param}".', + 'Login Required' => 'Inteken vereis', + 'Missing required arguments: {params}' => 'Vereiste argumente ontbreek: {params}', + 'Missing required parameters: {params}' => 'Vereiste parameters ontbreek: {params}', + 'No' => 'Nee', + 'No results found.' => 'Geen resultate gevind nie.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Slegs lêers met hierdie MIME-tipes word toegelaat: {mimeTypes}.', + 'Only files with these extensions are allowed: {extensions}.' => 'Slegs hierdie soort lêers word toegelaat: {extensions}.', + 'Operator "{operator}" must be used with a search attribute.' => 'Operateur "{operator}" moet gebruik word met \'n soekkenmerk.', + 'Operator "{operator}" requires multiple operands.' => 'Operateur "{operator}" vereis veelvuldige operande.', + 'Page not found.' => 'Bladsy nie gevind nie.', + 'Please fix the following errors:' => 'Maak asseblief die volgende foute reg:', + 'Please upload a file.' => 'Laai asseblief \'n lêer op.', + 'Powered by {yii}' => 'Aangedryf deur {yii}', + 'Showing {begin, number}-{end, number} of {totalCount, number} {totalCount, plural, one{item} other{items}}.' => '', + 'The combination {values} of {attributes} has already been taken.' => 'Die kombinasie {values} van {attributes} is reeds geneem.', + 'The file "{file}" is not an image.' => 'Die lêer "{file}" is nie \'n prent nie.', + 'The file "{file}" is too big. Its size cannot exceed {formattedLimit}.' => 'Die lêer "{file}" is te groot. Die grootte daarvan kan nie groter as {formattedLimit} wees nie.', + 'The file "{file}" is too small. Its size cannot be smaller than {formattedLimit}.' => 'Die lêer "{file}" is te klein. Die grootte daarvan kan nie kleiner as {formattedLimit} wees nie.', + 'The format of {attribute} is invalid.' => 'Die formaat van {attribute} is nie geldig nie.', + 'The format of {filter} is invalid.' => 'Die formaat van {filter} is nie geldig nie.', + 'The image "{file}" is too large. The height cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Die prent "{file}" is te groot. Die hoogte kan nie groter as {limit, number} {limit, plural, one{spikkel} other{spikkels}} wees nie.', + 'The image "{file}" is too large. The width cannot be larger than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Die prent "{file}" is te groot. Die wydte kan nie groter as {limit, number} {limit, plural, one{spikkel} other{spikkels}} wees nie.', + 'The image "{file}" is too small. The height cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Die prent "{file}" is te klein. Die hoogte kan nie kleiner as {limit, number} {limit, plural, one{spikkel} other{spikkels}} wees nie.', + 'The image "{file}" is too small. The width cannot be smaller than {limit, number} {limit, plural, one{pixel} other{pixels}}.' => 'Die prent "{file}" is te klein. Die hoogte kan nie kleiner as {limit, number} {limit, plural, one{spikkel} other{spikkels}} wees nie.', + 'The requested view "{name}" was not found.' => 'Die versoekte aansig "{name}" is nie gevind nie.', + 'The verification code is incorrect.' => 'Die verifikasiekode is verkeerd.', + 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Totaal {count, number} {count, plural, one{item} other{items}}.', + 'Unable to verify your data submission.' => 'Die data wat voorgelê is, kon nie verifieer word nie.', + 'Unknown alias: -{name}' => 'Onbekende alias: -{name}', + 'Unknown filter attribute "{attribute}"' => 'Onbekende filterkenmerk "{attribute}', + 'Unknown option: --{name}' => 'Onbekende opsie: --{name}', + 'Update' => 'Opdateer', + 'View' => 'Beskou', + 'Yes' => 'Ja', + 'Yii Framework' => 'Yii Raamwerk', + 'You are not allowed to perform this action.' => 'Jy mag nie hierdie aksie uitvoer nie.', + 'You can upload at most {limit, number} {limit, plural, one{file} other{files}}.' => 'Jy kan \'n maksimum van {limit, number} {limit, plural, one{lêer} other{lêers}} oplaai.', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'Jy moet ten minste {limit, number} {limit, plural, one{lêer} other{lêers}} oplaai.', + 'in {delta, plural, =1{a day} other{# days}}' => 'oor {delta, plural, =1{\'n dag} other{# dae}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'oor {delta, plural, =1{\'n minuut} other{# minute}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'oor {delta, plural, =1{\'n maand} other{# maande}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'oor {delta, plural, =1{\'n sekonde} other{# sekondes}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'oor {delta} jaar', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'oor {delta} uur', + 'just now' => 'netnou', + 'the input value' => 'die insetwaarde', + '{attribute} "{value}" has already been taken.' => '{attribute} "{value}" is reeds geneem.', + '{attribute} cannot be blank.' => '{attribute} kan nie leeg wees nie.', + '{attribute} contains wrong subnet mask.' => '{attribute} bevat verkeerde subnetmasker.', + '{attribute} is invalid.' => '{attribute} is nie geldig nie.', + '{attribute} is not a valid URL.' => '{attribute} is nie \'n geldige webadres nie.', + '{attribute} is not a valid email address.' => '{attribute} is nie \'n geldige e-posadres nie.', + '{attribute} is not in the allowed range.' => '{attribute} is nie in die toegelate reeks nie.', + '{attribute} must be "{requiredValue}".' => '{attribute} moet "{requiredValue}" wees.', + '{attribute} must be a number.' => '{attribute} moet \'n nommer wees.', + '{attribute} must be a string.' => '{attribute} moet teks wees.', + '{attribute} must be a valid IP address.' => '{attribute} moet \'n geldige IP-adres wees.', + '{attribute} must be an IP address with specified subnet.' => '{attribute} waarde moet \'n IP-adres met gespesifiseerde subnet wees.', + '{attribute} must be an integer.' => '{attribute} moet \'n heelgetal wees.', + '{attribute} must be either "{true}" or "{false}".' => '{attribute} moet óf "{true}" óf "{false}" wees.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} moet gelyk wees aan "{compareValueOrAttribute}".', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} moet groter as "{compareValueOrAttribute}" wees.', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} moet groter of gelyk aan "{compareValueOrAttribute}" wees.', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} moet minder as "{compareValueOrAttribute}" wees.', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} moet minder as of gelyk aan "{compareValueOrAttribute}" wees.', + '{attribute} must be no greater than {max}.' => '{attribute} mag nie groter as {max} wees nie.', + '{attribute} must be no less than {min}.' => '{attribute} mag nie kleiner as {min} wees nie.', + '{attribute} must not be a subnet.' => '{attribute} mag nie \'n subnet wees nie.', + '{attribute} must not be an IPv4 address.' => '{attribute} mag nie \'n IPv4-adres wees nie.', + '{attribute} must not be an IPv6 address.' => '{attribute} mag nie \'n IPv6-adres wees nie.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} moet nie gelyk aan "{compareValueOrAttribute}" wees nie.', + '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '{attribute} moet ten minste {min, number} {min, plural, one{karakter} other{karakters}} bevat.', + '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '{attribute} moet hoogstens {max, number} {max, plural, one{karakter} other{karakters}} bevat.', + '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '{attribute} moet {length, number} {length, plural, one{karakter} other{karakters}} bevat.', + '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dag} other{# dae}}', + '{delta, plural, =1{1 hour} other{# hours}}' => '{delta} uur', + '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuut} other{# minute}}', + '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 maand} other{# maande}}', + '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 sekonde} other{# sekondes}}', + '{delta, plural, =1{1 year} other{# years}}' => '{delta} jaar', + '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{\'n dag} other{# dae}} gelede', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{\'n minuut} other{# minute}} gelede', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{\'n maand} other{# maande}} gelede', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{\'n sekonde} other{# sekondes}} gelede', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta} jaar gelede', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta} uur gelede', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KB' => '{nFormatted} KB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{greep} other{grepe}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibigreep} other{gibigrepe}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigagreep} other{gigagrepe}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, =1{kibigreep} other{kibigrepe}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilogreep} other{kilogrepe}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, =1{mebigreep} other{mebigrepe}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megagreep} other{megagrepe}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, =1{pebigreep} other{pebigrepe}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petagreep} other{petagrepe}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{tebigreep} other{tebigrepe}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{teragreep} other{teragrepe}}', +]; diff --git a/framework/messages/config.php b/framework/messages/config.php index 81de62761e9..0ea5eb83b48 100644 --- a/framework/messages/config.php +++ b/framework/messages/config.php @@ -12,7 +12,7 @@ 'messagePath' => __DIR__, // array, required, list of language codes that the extracted messages // should be translated to. For example, ['zh-CN', 'de']. - 'languages' => ['ar', 'az', 'bg', 'bs', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa', 'fi', 'fr', 'he', 'hr', 'hu', 'hy', 'id', 'it', 'ja', 'ka', 'kk', 'ko', 'kz', 'lt', 'lv', 'ms', 'nb-NO', 'nl', 'pl', 'pt', 'pt-BR', 'ro', 'ru', 'sk', 'sl', 'sr', 'sr-Latn', 'sv', 'tg', 'th', 'tr', 'uk', 'uz', 'vi', 'zh-CN', 'zh-TW'], + 'languages' => ['af', 'ar', 'az', 'bg', 'bs', 'ca', 'cs', 'da', 'de', 'el', 'es', 'et', 'fa', 'fi', 'fr', 'he', 'hr', 'hu', 'hy', 'id', 'it', 'ja', 'ka', 'kk', 'ko', 'kz', 'lt', 'lv', 'ms', 'nb-NO', 'nl', 'pl', 'pt', 'pt-BR', 'ro', 'ru', 'sk', 'sl', 'sr', 'sr-Latn', 'sv', 'tg', 'th', 'tr', 'uk', 'uz', 'vi', 'zh-CN', 'zh-TW'], // string, the name of the function for translating messages. // Defaults to 'Yii::t'. This is used as a mark to find the messages to be // translated. You may use a string for single function name or an array for From 959cb985e3ab9f72e2aaf7fcf4a170ef7591a608 Mon Sep 17 00:00:00 2001 From: Rustam Mamadaminov Date: Thu, 14 Jun 2018 22:23:10 +0500 Subject: [PATCH 139/902] Fixed PHPDoc blocks in FileHelper (#16402) [skip ci] --- framework/helpers/BaseFileHelper.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/helpers/BaseFileHelper.php b/framework/helpers/BaseFileHelper.php index 3a51d431db7..026090f8f8b 100644 --- a/framework/helpers/BaseFileHelper.php +++ b/framework/helpers/BaseFileHelper.php @@ -520,7 +520,7 @@ public static function findDirectories($dir, $options = []) return $list; } - /* + /** * @param string $dir */ private static function setBasePath($dir, $options) @@ -534,7 +534,7 @@ private static function setBasePath($dir, $options) return $options; } - /* + /** * @param string $dir */ private static function openDir($dir) @@ -546,7 +546,7 @@ private static function openDir($dir) return $handle; } - /* + /** * @param string $dir */ private static function clearDir($dir) From 7e03c0ec3146ba0e577b22b31dcf3fe344352365 Mon Sep 17 00:00:00 2001 From: Chenhe Date: Fri, 15 Jun 2018 22:31:03 +0800 Subject: [PATCH 140/902] fix typo --- docs/guide-zh-CN/security-best-practices.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-zh-CN/security-best-practices.md b/docs/guide-zh-CN/security-best-practices.md index c0f72290ad5..9af5428e479 100644 --- a/docs/guide-zh-CN/security-best-practices.md +++ b/docs/guide-zh-CN/security-best-practices.md @@ -54,7 +54,7 @@ SELECT * FROM user WHERE username = ''; DROP TABLE user; --' ``` 这是一个合法的查询语句,并将会执行以空的用户名搜索用户操作,然后,删除 `user` 表。 -这极有可能导致网站出差,数据丢失。(你是否进行了规律的数据备份?) +这极有可能导致网站出错,数据丢失。(你是否进行了规律的数据备份?) 在 Yii 中,大部分的数据查询是通过 [Active Record](db-active-record.md) 进行的, 而其是完全使用 PDO 预处理语句执行 SQL 查询的。在预处理语句中,上述示例中,构造 SQL 查询的场景是不可能发生的。 @@ -220,4 +220,4 @@ provided by H5BP project: - [Nginx](https://github.com/h5bp/server-configs-nginx) - [Apache](https://github.com/h5bp/server-configs-apache). - [IIS](https://github.com/h5bp/server-configs-iis). -- [Lighttpd](https://github.com/h5bp/server-configs-lighttpd). \ No newline at end of file +- [Lighttpd](https://github.com/h5bp/server-configs-lighttpd). From 90c31d08e72772c7007a7f3225a9a3a604b37a4a Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 16 Jun 2018 01:57:50 +0300 Subject: [PATCH 141/902] Allow AppVeyor failures (#16410) --- .appveyor.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index d9a7f7e0cd6..4c7c815c48c 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -5,7 +5,11 @@ clone_folder: C:\projects\yii2 environment: matrix: - - php_ver: 7.2.4 + - php_ver: 7.2.4 + +matrix: + allow_failures: + - php_ver: 7.2.4 cache: - '%APPDATA%\Composer' From 8b7802a981a586f214875d11ee15a614799e2f62 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 17 Jun 2018 00:22:20 +0300 Subject: [PATCH 142/902] Fixed nodejs test dependencies (#16412) --- package.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 530270e547d..4003fc31262 100644 --- a/package.json +++ b/package.json @@ -9,14 +9,13 @@ "dependencies": {}, "devDependencies": { "chai": "^3.5.0", - "jsdom": "^9.8.3", - "leche": "^2.1.2", - "mocha": "^3.1.2", - "mocha-jsdom": "^1.1.0", + "leche": "^2.2.3", + "mocha": "^3.5.3", + "mocha-jsdom": "^2.0.0", "sinon": "^1.17.6" }, "scripts": { - "test": "./node_modules/mocha/bin/mocha tests/js/tests/*.test.js --timeout 0" + "test": "./node_modules/.bin/mocha tests/js/tests/*.test.js --timeout 0" }, "repository": { "type": "git", From 4c913d44ee7b9edaafa1a3d5e1553e6e1a9f59df Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Mon, 18 Jun 2018 13:11:36 +0300 Subject: [PATCH 143/902] Removed non-English part [skip ci] --- README.md | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/README.md b/README.md index 7ebed741ce0..d4844b98a2b 100644 --- a/README.md +++ b/README.md @@ -16,29 +16,6 @@ The framework is easy to adjust to meet your needs, because Yii has been designe [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/yiisoft/yii2/badges/quality-score.png?s=b1074a1ff6d0b214d54fa5ab7abbb90fc092471d)](https://scrutinizer-ci.com/g/yiisoft/yii2/) [![Code Climate](https://img.shields.io/codeclimate/github/yiisoft/yii2.svg)](https://codeclimate.com/github/yiisoft/yii2) -分支说明 -------- -* master:主分支 -* doc:文档翻译分支 -* api:api 翻译分支 - -## 官方新版本发布 -doc branch: -``` -git merge upstream/master -``` -api branch: -``` -git merge upstream/master -``` -master branch: -``` -git merge doc -git merge api -``` -> 注意:禁止提交 pull request 至 master 分支,文档修改请提交至 doc 分支,api 修改请提交至 api 分支。 - - Installation ------------ From ec937d004ac82546c77c5302086520045e976d22 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 18 Jun 2018 15:27:18 +0300 Subject: [PATCH 144/902] Update tutorial-console.md (#16417) [skip ci] --- docs/guide-ru/tutorial-console.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide-ru/tutorial-console.md b/docs/guide-ru/tutorial-console.md index 8eb5b282755..f2697daa240 100644 --- a/docs/guide-ru/tutorial-console.md +++ b/docs/guide-ru/tutorial-console.md @@ -275,8 +275,8 @@ public function actionIndex() Есть несколько предопределённых констант, которые вы можете использовать: -- [[yii\console\Controller::EXIT_CODE_NORMAL|Controller::EXIT_CODE_NORMAL]] со значением `0`; -- [[yii\console\Controller::EXIT_CODE_ERROR|Controller::EXIT_CODE_ERROR]] со значением `1`. +- [[yii\console\ExitCode::OK|ExitCode::OK]] со значением `0`; +- [[yii\console\ExitCode::UNSPECIFIED_ERROR|ExitCode::UNSPECIFIED_ERROR]] со значением `1`. Хорошая практика, определять значимые для вашего контроллера константы в случае, если вы используете больше типов ошибок. From bc9a82ff80e0abc3ce1430310d2b9b1f70f18c62 Mon Sep 17 00:00:00 2001 From: alexbs Date: Tue, 19 Jun 2018 21:08:12 +0300 Subject: [PATCH 145/902] Fixed typo in Russian docs [skip ci] --- docs/guide-ru/db-active-record.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-ru/db-active-record.md b/docs/guide-ru/db-active-record.md index 19c697b785a..09bf3717fcc 100644 --- a/docs/guide-ru/db-active-record.md +++ b/docs/guide-ru/db-active-record.md @@ -355,7 +355,7 @@ foreach (Customer::find()->each(10) as $customer) { // пакетная выборка с жадной загрузкой foreach (Customer::find()->with('orders')->each() as $customer) { - // $customer - это объекта класса Customer + // $customer - это объект класса Customer } ``` From 4f35a52b60929d3eae4a3b16c5f5966915607a6d Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Thu, 21 Jun 2018 00:21:27 +0300 Subject: [PATCH 146/902] Russian translation: improvements of output-data-providers (#16426) [skip ci] --- docs/guide-ru/output-data-providers.md | 27 +++++++++++++------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/docs/guide-ru/output-data-providers.md b/docs/guide-ru/output-data-providers.md index eb311d73160..8add3e6bb76 100644 --- a/docs/guide-ru/output-data-providers.md +++ b/docs/guide-ru/output-data-providers.md @@ -56,7 +56,7 @@ echo yii\grid\GridView::widget([ ## ActiveDataProvider Для использования [[yii\data\ActiveDataProvider]], необходимо настроить его свойство [[yii\data\ActiveDataProvider::query|query]]. -Оно принимает любой [[yii\db\Query]] или [[yii\db\ActiveQuery]] объект. Если использовать первый, то данные будут возвращены в +Оно принимает любой объект [[yii\db\Query]] или [[yii\db\ActiveQuery]]. Если использовать первый, то данные будут возвращены в виде массивов, если второй - данные также могут быть возвращены в виде массивов, а также в виде экземпляров [Active Record](db-active-record.md). Например: @@ -92,16 +92,16 @@ $query = (new Query())->from('post')->where(['status' => 1]); > Note: Если query содержит условия сортировки в `orderBy`, то новые условия, полученные от конечных пользователей (через настройки `sort`) будут добавлены к существующим условиям в `orderBy`. Любые условия в `limit` и `offset` - будут переписаны запросом конечного пользователя к различным страницам ( через конфигурацию `pagination`). + будут переписаны запросом конечного пользователя к различным страницам (через конфигурацию `pagination`). -По умолчанию, [[yii\data\ActiveDataProvider]] использует компонент приложения `db` для подключения к базе данных. Можно +По умолчанию [[yii\data\ActiveDataProvider]] использует компонент приложения `db` для подключения к базе данных. Можно использовать разные базы данных, настроив подключение через конфигурацию свойства [[yii\data\ActiveDataProvider::db]]. ## SqlDataProvider [[yii\data\SqlDataProvider]] работает с сырыми запросами SQL, которые используются для извлечение необходимых данных. Основываясь на спецификации из [[yii\data\SqlDataProvider::sort|sort]] и [[yii\data\SqlDataProvider::pagination|pagination]], -провайдер данных будет добавлять `ORDER BY` и `LIMIT` конструкции к SQL запросу, для возврата только запрошенной +провайдер данных будет добавлять конструкции `ORDER BY` и `LIMIT` к SQL-запросу, для возврата только запрошенной страницы данных с учётом определённой сортировки. Для использования [[yii\data\SqlDataProvider]], необходимо настроить свойства [[yii\data\SqlDataProvider::sql|sql]] и @@ -144,8 +144,7 @@ $models = $provider->getModels(); [[yii\data\ArrayDataProvider]] лучше использовать для работы с большим массивом. Этот провайдер помогает вернуть выборку из большого массива с сортировкой по одному или нескольким колонкам. Для использования [[yii\data\ArrayDataProvider]] необходимо определить свойство [[yii\data\ArrayDataProvider::allModels|allModels]], как большой массив. Элементы в -большом массиве могут быть ассоциативными массивами (например результаты выборки из [DAO](db-dao.md)) или объекты ( -[Active Record](db-active-record.md) экземпляры). Например: +большом массиве могут быть ассоциативными массивами (например, результаты выборки из [DAO](db-dao.md)) или объекты (экземпляры [Active Record](db-active-record.md)). Например: ```php use yii\data\ArrayDataProvider; @@ -226,11 +225,11 @@ $provider = new ActiveDataProvider([ сделать это - наследовать [[yii\data\BaseDataProvider]], который помогает сфокусироваться на логике ядра провайдера данных. В основном необходимо реализовать следующие методы: -- [[yii\data\BaseDataProvider::prepareModels()|prepareModels()]]:подготавливает модели данных, которые будут доступны +- [[yii\data\BaseDataProvider::prepareModels()|prepareModels()]]: подготавливает модели данных, которые будут доступны в текущей странице и возвращает их в виде массива. - [[yii\data\BaseDataProvider::prepareKeys()|prepareKeys()]]: принимает массив имеющихся в настоящее время моделей данных и возвращает ключи, связанные с ними. -- [[yii\data\BaseDataProvider::prepareTotalCount()|prepareTotalCount]]:возвращает значение, указывающее общее количество +- [[yii\data\BaseDataProvider::prepareTotalCount()|prepareTotalCount]]: возвращает значение, указывающее общее количество моделей данных в провайдере данных. Ниже приведён пример провайдера данных, который эффективно считывает данные из CSV: @@ -242,19 +241,19 @@ use yii\data\BaseDataProvider; class CsvDataProvider extends BaseDataProvider { /** - * @var string name of the CSV file to read + * @var string имя CSV-файла для чтения */ public $filename; /** - * @var string|callable name of the key column or a callable returning it + * @var string|callable имя столбца с ключом или callback-функция, возвращающие его */ public $key; /** * @var SplFileObject */ - protected $fileObject; // SplFileObject is very convenient for seeking to particular line in a file + protected $fileObject; // с помощью SplFileObject очень удобно искать конкретную строку в файле /** @@ -264,7 +263,7 @@ class CsvDataProvider extends BaseDataProvider { parent::init(); - // open file + // открыть файл $this->fileObject = new SplFileObject($this->filename); } @@ -277,13 +276,13 @@ class CsvDataProvider extends BaseDataProvider $pagination = $this->getPagination(); if ($pagination === false) { - // in case there's no pagination, read all lines + // в случае отсутствия разбивки на страницы - прочитать все строки while (!$this->fileObject->eof()) { $models[] = $this->fileObject->fgetcsv(); $this->fileObject->next(); } } else { - // in case there's pagination, read only a single page + // в случае, если разбивка на страницы есть - прочитать только одну страницу $pagination->totalCount = $this->getTotalCount(); $this->fileObject->seek($pagination->getOffset()); $limit = $pagination->getLimit(); From 5e4905e08878a10ce4a922166dfff81e0cce76f9 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Thu, 21 Jun 2018 16:03:08 +0800 Subject: [PATCH 147/902] Update rest-authentication.md --- docs/guide-zh-CN/rest-authentication.md | 54 ++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/guide-zh-CN/rest-authentication.md b/docs/guide-zh-CN/rest-authentication.md index db99c2ba496..abbf403841b 100644 --- a/docs/guide-zh-CN/rest-authentication.md +++ b/docs/guide-zh-CN/rest-authentication.md @@ -2,43 +2,43 @@ ============== 和Web应用不同,RESTful APIs 通常是无状态的, -也就意味着不应使用sessions 或 cookies, -因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过sessions 或 cookies维护, -常用的做法是每个请求都发送一个秘密的access token来认证用户, -由于access token可以唯一识别和认证用户, -**API 请求应通过HTTPS来防止man-in-the-middle (MitM) 中间人攻击**. +也就意味着不应使用 sessions 或 cookies, +因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, +常用的做法是每个请求都发送一个秘密的 access token来认证用户, +由于 access token 可以唯一识别和认证用户, +**API 请求应通过 HTTPS 来防止 man-in-the-middle (MitM) 中间人攻击**。 下面有几种方式来发送access token: * [HTTP 基本认证](http://en.wikipedia.org/wiki/Basic_access_authentication): access token - 当作用户名发送,应用在access token可安全存在API使用端的场景, - 例如,API使用端是运行在一台服务器上的程序。 -* 请求参数: access token 当作API URL请求参数发送,例如 + 当作用户名发送,应用在 access token 可安全存在 API 使用端的场景, + 例如,API 使用端是运行在一台服务器上的程序。 +* 请求参数: access token 当作 API URL 请求参数发送,例如 `https://example.com/users?access-token=xxxxxxxx`, 由于大多数服务器都会保存请求参数到日志, 这种方式应主要用于`JSONP` 请求,因为它不能使用HTTP头来发送access token -* [OAuth 2](http://oauth.net/2/): 使用者从认证服务器上获取基于OAuth2协议的access token, +* [OAuth 2](http://oauth.net/2/): 使用者从认证服务器上获取基于 OAuth2 协议的 access token, 然后通过[HTTP Bearer Tokens](http://tools.ietf.org/html/rfc6750) 发送到API 服务器。 Yii 支持上述的认证方式,你也可很方便的创建新的认证方式。 -为你的APIs启用认证,做以下步骤: +为你的 APIs 启用认证,做以下步骤: -1. 配置`user` 应用组件: +1. 配置 `user` 应用组件: - 设置 [[yii\web\User::enableSession|enableSession]] 属性为 `false`. - 设置 [[yii\web\User::loginUrl|loginUrl]] 属性为`null` 显示一个HTTP 403 错误而不是跳转到登录界面. 2. 在你的REST 控制器类中配置`authenticator` 行为来指定使用哪种认证方式 3. 在你的[[yii\web\User::identityClass|user identity class]] 类中实现 [[yii\web\IdentityInterface::findIdentityByAccessToken()]] 方法. -步骤1不是必要的,但是推荐配置,因为RESTful APIs应为无状态的, -当[[yii\web\User::enableSession|enableSession]]为false, -请求中的用户认证状态就不能通过session来保持,每个请求的认证通过步骤2和3来实现。 +步骤 1 不是必要的,但是推荐配置,因为 RESTful APIs 应为无状态的, +当 [[yii\web\User::enableSession|enableSession]] 为 false, +请求中的用户认证状态就不能通过 session 来保持,每个请求的认证通过步骤 2 和 3 来实现。 -> Tip: 如果你将RESTful APIs作为应用开发,可以设置应用配置中 `user` 组件的 +> Tip: 如果你将 RESTful APIs 作为应用开发,可以设置应用配置中 `user` 组件的 > [[yii\web\User::enableSession|enableSession]], -> 如果将RESTful APIs作为模块开发,可以在模块的 `init()` 方法中增加如下代码,如下所示: +> 如果将 RESTful APIs 作为模块开发,可以在模块的 `init()` 方法中增加如下代码,如下所示: > ```php > public function init() @@ -48,7 +48,7 @@ Yii 支持上述的认证方式,你也可很方便的创建新的认证方式 > } > ``` -例如,为使用HTTP Basic Auth,可配置`authenticator` 行为,如下所示: +例如,为使用 HTTP Basic Auth,可配置 `authenticator` 行为,如下所示: ```php use yii\filters\auth\HttpBasicAuth; @@ -63,7 +63,7 @@ public function behaviors() } ``` -如果你系那个支持以上3个认证方式,可以使用`CompositeAuth`,如下所示: +如果你想支持上面解释的所有三种认证方法,可以使用 `CompositeAuth`,如下所示: ```php use yii\filters\auth\CompositeAuth; @@ -90,8 +90,8 @@ public function behaviors() `findIdentityByAccessToken()`方法的实现是系统定义的, -例如,一个简单的场景,当每个用户只有一个access token, 可存储access token 到user表的`access_token`列中, -方法可在`User`类中简单实现,如下所示: +例如,一个简单的场景,当每个用户只有一个 access token,可存储 access token 到 user 表的 `access_token` 列中, +方法可在 `User` 类中简单实现,如下所示: ```php use yii\db\ActiveRecord; @@ -106,14 +106,14 @@ class User extends ActiveRecord implements IdentityInterface } ``` -在上述认证启用后,对于每个API请求, -请求控制器都会在它的`beforeAction()`步骤中对用户进行认证。 +在上述认证启用后,对于每个 API 请求, +请求控制器都会在它的 `beforeAction()` 步骤中对用户进行认证。 如果认证成功,控制器再执行其他检查(如频率限制,操作权限),然后再执行动作, -授权用户信息可使用`Yii::$app->user->identity`获取. +授权用户信息可使用 `Yii::$app->user->identity` 获取. -如果认证失败,会发送一个HTTP状态码为401的响应, -并带有其他相关信息头(如HTTP 基本认证会有`WWW-Authenticate` 头信息). +如果认证失败,会发送一个 HTTP 状态码为 401 的响应, +并带有其他相关信息头(如HTTP 基本认证会有 `WWW-Authenticate` 头信息)。 ## 授权 @@ -122,6 +122,6 @@ class User extends ActiveRecord implements IdentityInterface 这个过程称为 *authorization* , 详情请参考 [Authorization section](security-authorization.md). -如果你的控制器从[[yii\rest\ActiveController]]类继承, +如果你的控制器从 [[yii\rest\ActiveController]] 类继承, 可覆盖 [[yii\rest\Controller::checkAccess()|checkAccess()]] 方法 -来执行授权检查,该方法会被[[yii\rest\ActiveController]]内置的操作调用。 +来执行授权检查,该方法会被 [[yii\rest\ActiveController]] 内置的操作调用。 From 730bd8b65a83c9a1f8b398e5de89688708c5ef52 Mon Sep 17 00:00:00 2001 From: SiZE Date: Thu, 21 Jun 2018 14:13:32 +0500 Subject: [PATCH 148/902] =?UTF-8?q?=D0=9E=D1=88=D0=B8=D0=B1=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=B3=D0=B0=D0=B9=D0=B4=D0=B0=20docs/guide-ru/rest-resources.m?= =?UTF-8?q?d=20=D0=BA=20extraFields=20(#16427)=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guide-ru/rest-resources.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/guide-ru/rest-resources.md b/docs/guide-ru/rest-resources.md index 9cc2f76587b..982a40b0eda 100644 --- a/docs/guide-ru/rest-resources.md +++ b/docs/guide-ru/rest-resources.md @@ -91,8 +91,7 @@ public function fields() ### Переопределение `extraFields()` -По умолчанию, [[yii\base\Model::extraFields()]] ничего не возвращает, а [[yii\db\ActiveRecord::extraFields()]] -возвращает названия заданных в БД связей. +По умолчанию, [[yii\base\Model::extraFields()]] и [[yii\db\ActiveRecord::extraFields()]] возвращают пустой массив. Формат возвращаемых `extraFields()` данных такой же как у `fields()`. Как правило, `extraFields()` используется для указания полей, значения которых являются объектами. Например учитывая следующее объявление полей From da447fd1bb9778b8b76994f3e3e14f9748c67625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Ignacio=20Rojas=20Sep=C3=BAlveda?= Date: Sun, 24 Jun 2018 04:39:34 -0400 Subject: [PATCH 149/902] Update rest-routing.md (#16433) [skip ci] Espero sea de ayuda. --- docs/guide-es/rest-routing.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/guide-es/rest-routing.md b/docs/guide-es/rest-routing.md index 974d7956cbd..dcb6bddfd3f 100644 --- a/docs/guide-es/rest-routing.md +++ b/docs/guide-es/rest-routing.md @@ -40,16 +40,16 @@ Por ejemplo, el código anterior es equivalente a las siguientes reglas: Y los siguientes puntos finales del API son mantenidos por esta regla: * `GET /users`: lista de todos los usuarios página a página; -* `HEAD /users`: muestra ĺa información resumén del usuario listado; +* `HEAD /users`: muestra ĺa información resumen del usuario listado; * `POST /users`: crea un nuevo usuario; * `GET /users/123`: devuelve los detalles del usuario 123; -* `HEAD /users/123`: muestra la información resúmen del usuario 123; +* `HEAD /users/123`: muestra la información resumen del usuario 123; * `PATCH /users/123` y `PUT /users/123`: actualizan al usuario 123; * `DELETE /users/123`: borra el usuario 123; * `OPTIONS /users`: muestra los verbos soportados de acuerdo al punto final `/users`; * `OPTIONS /users/123`: muestra los verbos soportados de acuerdo al punto final `/users/123`. -Puedes configurar las opciones `only` y `except` para explícitamente listar cuáles acciones a soportar o cuáles +Puedes configurar las opciones `only` y `except` para explícitamente listar cuáles acciones soportar o cuáles deshabilitar, respectivamente. Por ejemplo, ```php @@ -60,8 +60,8 @@ deshabilitar, respectivamente. Por ejemplo, ], ``` -También puedes configurar las propiedades `patterns` o `extraPatterns` para redifinir patrones existentes o añadir nuevos soportados por esta regla. -Por ejemplo, para soportar una nueva acción `search` por el punto final `GET /users/search`, configura la opción `extraPatterns` como sigue, +También puedes configurar las propiedades `patterns` o `extraPatterns` para redefinir patrones existentes o añadir nuevos soportados por esta regla. +Por ejemplo, para soportar una nueva acción `search` para el punto final `GET /users/search`, configura la opción `extraPatterns` como sigue, ```php [ @@ -81,7 +81,7 @@ Puedes desactivar este comportamiento definiendo la propiedad [[yii\rest\UrlRule reglas especiales de pluralización. Por ejemplo, la palabra `box` (caja) será pluralizada como `boxes` en vez de `boxs`. En caso de que la pluralización automática no encaje en tus requerimientos, puedes además configurar la propiedad -[[yii\rest\UrlRule::controller]] para especificar exlpícitamente cómo mapear un nombre utilizado en un punto final URL +[[yii\rest\UrlRule::controller]] para especificar explícitamente cómo mapear un nombre utilizado en un punto final URL a un ID de controlador. Por ejemplo, el siguiente código mapea el nombre `u` al ID del controlador `user`. ```php From 68e5a9b315e8f3a9b951e4b7d025ef17758bad51 Mon Sep 17 00:00:00 2001 From: bscheshirwork Date: Tue, 26 Jun 2018 19:05:49 +0300 Subject: [PATCH 150/902] Fix typo (#16443) [skip ci] --- tests/framework/validators/UniqueValidatorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/framework/validators/UniqueValidatorTest.php b/tests/framework/validators/UniqueValidatorTest.php index a19f71ff74d..1c2119f841f 100644 --- a/tests/framework/validators/UniqueValidatorTest.php +++ b/tests/framework/validators/UniqueValidatorTest.php @@ -415,10 +415,10 @@ public function testAmbiguousColumnName() } /** - * Test expresssion in targetAttribute. + * Test expression in targetAttribute. * @see https://github.com/yiisoft/yii2/issues/14304 */ - public function testExpresionInAttributeColumnName() + public function testExpressionInAttributeColumnName() { $validator = new UniqueValidator([ 'targetAttribute' => [ From 35556332234736cd59ac5ec66f4e87bc71b16076 Mon Sep 17 00:00:00 2001 From: CedricYii Date: Wed, 27 Jun 2018 21:29:50 +0200 Subject: [PATCH 151/902] Fixes #14289: Added `yii\db\Command::executeResetSequence()` to work with Oracle --- framework/CHANGELOG.md | 1 + framework/db/Command.php | 20 ++++++++++++++++++-- framework/db/QueryBuilder.php | 20 ++++++++++++++++++-- framework/db/oci/QueryBuilder.php | 17 ++++++++++++----- framework/test/ActiveFixture.php | 2 +- tests/framework/db/oci/QueryBuilderTest.php | 18 +++++++++--------- 6 files changed, 59 insertions(+), 19 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index fe46100f533..70cb03daaa6 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ +- Enh #14289: Added `yii\db\Command::executeResetSequence()` to work with Oracle (CedricYii) - Enh #9133: Added `yii\behaviors\OptimisticLockBehavior` (tunecino) - Bug #16104: Fixed `yii\db\pgsql\QueryBuilder::dropIndex()` to prepend index name with schema name (wapmorgan) - Bug #16193: Fixed `yii\filters\Cors` to not reflect origin header value when configured to wildcard origins (Jianjun Chen) diff --git a/framework/db/Command.php b/framework/db/Command.php index b2fed611006..984204fecb3 100644 --- a/framework/db/Command.php +++ b/framework/db/Command.php @@ -931,10 +931,10 @@ public function dropDefaultValue($name, $table) /** * Creates a SQL command for resetting the sequence value of a table's primary key. * The sequence will be reset such that the primary key of the next new row inserted - * will have the specified value or 1. + * will have the specified value or the maximum existing value +1. * @param string $table the name of the table whose primary key sequence will be reset * @param mixed $value the value for the primary key of the next new row inserted. If this is not set, - * the next new row's primary key will have a value 1. + * the next new row's primary key will have the maximum existing value +1. * @return $this the command object itself * @throws NotSupportedException if this is not supported by the underlying DBMS */ @@ -945,6 +945,22 @@ public function resetSequence($table, $value = null) return $this->setSql($sql); } + /** + * Executes a db command resetting the sequence value of a table's primary key. + * Reason for execute is that some databases (Oracle) need several queries to do so. + * The sequence is reset such that the primary key of the next new row inserted + * will have the specified value or the maximum existing value +1. + * @param string $table the name of the table whose primary key sequence is reset + * @param mixed $value the value for the primary key of the next new row inserted. If this is not set, + * the next new row's primary key will have the maximum existing value +1. + * @throws NotSupportedException if this is not supported by the underlying DBMS + * @since 2.0.16 + */ + public function executeResetSequence($table, $value = null) + { + return $this->db->getQueryBuilder()->executeResetSequence($table, $value); + } + /** * Builds a SQL command for enabling or disabling integrity check. * @param bool $check whether to turn on or off the integrity check. diff --git a/framework/db/QueryBuilder.php b/framework/db/QueryBuilder.php index 815a2b3257e..ba6331ea784 100644 --- a/framework/db/QueryBuilder.php +++ b/framework/db/QueryBuilder.php @@ -1028,10 +1028,10 @@ public function dropDefaultValue($name, $table) /** * Creates a SQL statement for resetting the sequence value of a table's primary key. * The sequence will be reset such that the primary key of the next new row inserted - * will have the specified value or 1. + * will have the specified value or the maximum existing value +1. * @param string $table the name of the table whose primary key sequence will be reset * @param array|string $value the value for the primary key of the next new row inserted. If this is not set, - * the next new row's primary key will have a value 1. + * the next new row's primary key will have the maximum existing value +1. * @return string the SQL statement for resetting sequence * @throws NotSupportedException if this is not supported by the underlying DBMS */ @@ -1040,6 +1040,22 @@ public function resetSequence($table, $value = null) throw new NotSupportedException($this->db->getDriverName() . ' does not support resetting sequence.'); } + /** + * Execute a SQL statement for resetting the sequence value of a table's primary key. + * Reason for execute is that some databases (Oracle) need several queries to do so. + * The sequence is reset such that the primary key of the next new row inserted + * will have the specified value or the maximum existing value +1. + * @param string $table the name of the table whose primary key sequence is reset + * @param array|string $value the value for the primary key of the next new row inserted. If this is not set, + * the next new row's primary key will have the maximum existing value +1. + * @throws NotSupportedException if this is not supported by the underlying DBMS + * @since 2.0.16 + */ + public function executeResetSequence($table, $value = null) + { + $this->db->createCommand()->resetSequence($table, $value)->execute(); + } + /** * Builds a SQL statement for enabling or disabling integrity check. * @param bool $check whether to turn on or off the integrity check. diff --git a/framework/db/oci/QueryBuilder.php b/framework/db/oci/QueryBuilder.php index 57004fc11c7..5f380b13e0d 100644 --- a/framework/db/oci/QueryBuilder.php +++ b/framework/db/oci/QueryBuilder.php @@ -138,27 +138,34 @@ public function dropIndex($name, $table) /** * {@inheritdoc} */ - public function resetSequence($table, $value = null) + public function executeResetSequence($table, $value = null) { $tableSchema = $this->db->getTableSchema($table); if ($tableSchema === null) { throw new InvalidArgumentException("Unknown table: $table"); } if ($tableSchema->sequenceName === null) { - return ''; + throw new InvalidArgumentException("There is no sequence associated with table: $table"); } if ($value !== null) { $value = (int) $value; } else { + if (count($tableSchema->primaryKey)>1) { + throw new InvalidArgumentException("Can't reset sequence for composite primary key in table: $table"); + } // use master connection to get the biggest PK value $value = $this->db->useMaster(function (Connection $db) use ($tableSchema) { - return $db->createCommand("SELECT MAX(\"{$tableSchema->primaryKey}\") FROM \"{$tableSchema->name}\"")->queryScalar(); + return $db->createCommand( + 'SELECT MAX("' . $tableSchema->primaryKey[0] . '") FROM "'. $tableSchema->name . '"' + )->queryScalar(); }) + 1; } - return "DROP SEQUENCE \"{$tableSchema->name}_SEQ\";" - . "CREATE SEQUENCE \"{$tableSchema->name}_SEQ\" START WITH {$value} INCREMENT BY 1 NOMAXVALUE NOCACHE"; + //Oracle needs at least two queries to reset sequence (see adding transactions and/or use alter method to avoid grants' issue?) + $this->db->createCommand('DROP SEQUENCE "' . $tableSchema->sequenceName . '"')->execute(); + $this->db->createCommand('CREATE SEQUENCE "' . $tableSchema->sequenceName . '" START WITH ' . $value + . ' INCREMENT BY 1 NOMAXVALUE NOCACHE')->execute(); } /** diff --git a/framework/test/ActiveFixture.php b/framework/test/ActiveFixture.php index b9dfcc4dcae..6d93b79c010 100644 --- a/framework/test/ActiveFixture.php +++ b/framework/test/ActiveFixture.php @@ -125,7 +125,7 @@ protected function resetTable() $table = $this->getTableSchema(); $this->db->createCommand()->delete($table->fullName)->execute(); if ($table->sequenceName !== null) { - $this->db->createCommand()->resetSequence($table->fullName, 1)->execute(); + $this->db->createCommand()->executeResetSequence($table->fullName, 1); } } diff --git a/tests/framework/db/oci/QueryBuilderTest.php b/tests/framework/db/oci/QueryBuilderTest.php index 930eff4e2ef..a923334ced2 100644 --- a/tests/framework/db/oci/QueryBuilderTest.php +++ b/tests/framework/db/oci/QueryBuilderTest.php @@ -106,19 +106,19 @@ public function testCommentTable() $this->assertEquals($this->replaceQuotes($expected), $sql); } - public function testResetSequence() + public function testExecuteResetSequence() { + $db = $this->getConnection(); $qb = $this->getQueryBuilder(); + $sqlResult = "SELECT last_number FROM user_sequences WHERE sequence_name = 'item_SEQ'"; - $expected = 'DROP SEQUENCE "item_SEQ";' - . 'CREATE SEQUENCE "item_SEQ" START WITH 6 INCREMENT BY 1 NOMAXVALUE NOCACHE'; - $sql = $qb->resetSequence('item'); - $this->assertEquals($expected, $sql); + $qb->executeResetSequence('item'); + $result = $db->createCommand($sqlResult)->queryScalar(); + $this->assertEquals(6, $result); - $expected = 'DROP SEQUENCE "item_SEQ";' - . 'CREATE SEQUENCE "item_SEQ" START WITH 4 INCREMENT BY 1 NOMAXVALUE NOCACHE'; - $sql = $qb->resetSequence('item', 4); - $this->assertEquals($expected, $sql); + $qb->executeResetSequence('item', 4); + $result = $db->createCommand($sqlResult)->queryScalar(); + $this->assertEquals(4, $result); } public function likeConditionProvider() From 77d7a5046ef44ca9143c0633ad260b8c113b3f75 Mon Sep 17 00:00:00 2001 From: Pavel Dovlatov Date: Sat, 30 Jun 2018 02:17:27 +0300 Subject: [PATCH 152/902] Small PHPDoc comment fixes in \yii\filters\Cors [skip ci] (#16460) --- framework/filters/Cors.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/filters/Cors.php b/framework/filters/Cors.php index 02f863e749a..cc316723eb9 100644 --- a/framework/filters/Cors.php +++ b/framework/filters/Cors.php @@ -44,10 +44,11 @@ * 'cors' => [ * // restrict access to * 'Origin' => ['http://www.myserver.com/', 'https://www.myserver.com/'], - * 'Access-Control-Request-Method' => ['POST', 'PUT'], * // Allow only POST and PUT methods - * 'Access-Control-Request-Headers' => ['X-Wsse'], + * 'Access-Control-Request-Method' => ['POST', 'PUT'], * // Allow only headers 'X-Wsse' + * 'Access-Control-Request-Headers' => ['X-Wsse'], + * // Allow credentials (cookies, authorization headers, etc.) to be exposed to the browser * 'Access-Control-Allow-Credentials' => true, * // Allow OPTIONS caching * 'Access-Control-Max-Age' => 3600, From e55b3e0ba129531095ce8456d4fcc8a1c3adb82d Mon Sep 17 00:00:00 2001 From: Elvira Sheina Date: Sat, 30 Jun 2018 04:19:40 +0500 Subject: [PATCH 153/902] Fixes #16278: Fixed drop existing views when console `migrate/fresh` command runs --- framework/CHANGELOG.md | 1 + framework/console/controllers/MigrateController.php | 13 +++++++++++-- .../console/controllers/MigrateControllerTest.php | 4 ++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 70cb03daaa6..35135fa3cee 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -26,6 +26,7 @@ Yii Framework 2 Change Log - Bug #14636: Views can now use relative paths even when using themed views (sammousa) - Bug #16245: Fixed `__isset()` in `BaseActiveRecord` not catching errors (sammousa) - Bug #16266: Fixed `yii\helpers\BaseStringHelper` where explode would not allow 0 as trim string (Thoulah) +- Bug #16278: Fixed drop existing views when console `migrate/fresh` command runs (developeruz) - Bug #16277: Fixed `yii\db\Query::from()` to respect `yii\db\ExpressionInterface` (noname007) - Bug #16280: Fixed `yii\base\Model::getActiveValidators()` to return correct validators for attribute on scenario (paweljankowiak06) - Enh #16191: Enhanced `yii\helpers\Inflector` to work correctly with UTF-8 (silverfire) diff --git a/framework/console/controllers/MigrateController.php b/framework/console/controllers/MigrateController.php index 5211834f0f6..6909c757744 100644 --- a/framework/console/controllers/MigrateController.php +++ b/framework/console/controllers/MigrateController.php @@ -310,8 +310,17 @@ protected function truncateDatabase() // Then drop the tables: foreach ($schemas as $schema) { - $db->createCommand()->dropTable($schema->name)->execute(); - $this->stdout("Table {$schema->name} dropped.\n"); + try { + $db->createCommand()->dropTable($schema->name)->execute(); + $this->stdout("Table {$schema->name} dropped.\n"); + } catch (\Exception $e) { + if (strpos($e->getMessage(), 'DROP VIEW to delete view') !== false) { + $db->createCommand()->dropView($schema->name)->execute(); + $this->stdout("View {$schema->name} dropped.\n"); + } else { + $this->stdout("Cannot drop {$schema->name} Table .\n"); + } + } } } diff --git a/tests/framework/console/controllers/MigrateControllerTest.php b/tests/framework/console/controllers/MigrateControllerTest.php index b214b6a5323..7f09058447f 100644 --- a/tests/framework/console/controllers/MigrateControllerTest.php +++ b/tests/framework/console/controllers/MigrateControllerTest.php @@ -287,10 +287,14 @@ public function testRefreshMigration() Yii::$app->db->createCommand("insert into hall_of_fame values(2, 'Alexander Makarov');") ->execute(); + Yii::$app->db->createCommand('create view view_hall_of_fame as select * from hall_of_fame') + ->execute(); + $result = $this->runMigrateControllerAction('fresh'); // Drop worked $this->assertContains('Table hall_of_fame dropped.', $result); + $this->assertContains('View view_hall_of_fame dropped.', $result); // Migration was restarted $this->assertContains('No new migrations found. Your system is up-to-date.', $result); From 84c55b468ad83dbca0b706a97f82f556a05ea244 Mon Sep 17 00:00:00 2001 From: Vladimir Reznichenko Date: Sun, 1 Jul 2018 00:04:48 +0200 Subject: [PATCH 154/902] [minor] SCA (#16464) * Php Inspections (EA Ultimate): new findings * Php Inspections (EA Ultimate): dealing with older PHP versions compatibility --- framework/db/ActiveRelationTrait.php | 5 +---- framework/db/BaseActiveRecord.php | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/framework/db/ActiveRelationTrait.php b/framework/db/ActiveRelationTrait.php index 5c196daa0e5..73df49ba667 100644 --- a/framework/db/ActiveRelationTrait.php +++ b/framework/db/ActiveRelationTrait.php @@ -504,10 +504,7 @@ private function filterByModels($models) // composite keys // ensure keys of $this->link are prefixed the same way as $attributes - $prefixedLink = array_combine( - $attributes, - array_values($this->link) - ); + $prefixedLink = array_combine($attributes, $this->link); foreach ($models as $model) { $v = []; foreach ($prefixedLink as $attribute => $link) { diff --git a/framework/db/BaseActiveRecord.php b/framework/db/BaseActiveRecord.php index df969048939..e19b0a8fbb1 100644 --- a/framework/db/BaseActiveRecord.php +++ b/framework/db/BaseActiveRecord.php @@ -1572,9 +1572,9 @@ private function bindModels($link, $foreignModel, $primaryModel) throw new InvalidCallException('Unable to link models: the primary key of ' . get_class($primaryModel) . ' is null.'); } if (is_array($foreignModel->$fk)) { // relation via array valued attribute - $foreignModel->$fk = array_merge($foreignModel->$fk, [$value]); + $foreignModel->{$fk}[] = $value; } else { - $foreignModel->$fk = $value; + $foreignModel->{$fk} = $value; } } $foreignModel->save(false); From 9659cf656e469396fd9e655d5707d95125437b65 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Tue, 3 Jul 2018 23:33:24 +0300 Subject: [PATCH 155/902] Create ROADMAP.md --- ROADMAP.md | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 ROADMAP.md diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 00000000000..66e9b96255c --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,114 @@ +These are main plans that are additional to [open issues](https://github.com/yiisoft/yii2/milestones/3.0.0). + +# 2.0 + +### 2.0.14 (1st quarter of 2018) + +Will be last release with features and enhancements the last one that will be merged into 3.0 directly. + +### 2.0.15 (2nd quarter of 2018) + +- Since this release main focus is bug fixing. +- No full-branch merges into 3.0. +- No enhancements are accepted. + +### 2.0.16 (3rd quarter of 2018) + +- Bugfixes. + +### 2.0.17 (4th quarter of 2018) + +- Bugfixes. +- Announce bugfixes EOL (a year more?). +- Security fixes only. + +# 3.0 (first half of 2018) + +## Infrastructure + +- [x] Switch to 3.0.0 SemVer-like release tagging. +- [x] Soft-deprecate 2.0. + +## Requirements + +- [x] [Raise requirements to PHP 7.1](https://github.com/yiisoft/yii2/issues/11397). +- [x] Drop HHVM support. + +## Cleanup + +- [x] [Remove everything marked as `@deprecated`](https://github.com/yiisoft/yii2/issues/15957). +- [ ] See if more PHP 7.1 features could be used and more compatibility hacks removed. +- [ ] [Error handler](https://github.com/yiisoft/yii2/issues/14348). +- [x] Remove PJAX support. +- [x] Remove Cubrid support. +- [ ] Extract `findIdentityByAccessToken` from `IdentityInterface` (looks weird when it's not implemented in all web apps). + +## Client side + +- [x] Make core jQuery-free. +- [x] [Move `MaskedInput` into separate repository](https://github.com/yiisoft/yii2-maskedinput). +- [x] Make fxp composer plugin optional. Describe how to use asset packagist instead. +- [x] Remove dependencies on any clientside libraries. + +## Security + +- [x] Remove custom random number generation in favor of what's in PHP 7. +- [x] Remove custom bcrypt password hashing in favor of what's in PHP 7. + +## Databases + +- [x] Move MSSQL into extension: https://github.com/yiisoft/yii2-mssql +- [x] Move Oracle into extension: https://github.com/yiisoft/yii2-oracle +- [ ] Implement upsert. +- [ ] Implement batch w/ ignore. + +## Logging + +- [x] Separate profiling and logging. + +## Cache + +- [x] PSR compatibility. + +## Request + +- [ ] Consider PSR-7 compatible middleware. +- [x] Add `$request->getFile($name)` that returns `UploadedFile` instance. + +## App templates + +- [ ] Implement API template. +- [ ] Implement more sophisticated basic template. +- [ ] Drop advanced template? + +## i18n + +- [ ] Use `-` instead of `_` for view files, message files etc. [See #8057](https://github.com/yiisoft/yii2/pull/8057) + +# 4.0 (late 2018) + +- [ ] Announce LTS. +- [ ] PHP 7 strict scalar types everywhere. +- [ ] Decouple routing from controllers and modules. Allow specifying any class method as a callback for a matching route. +- [ ] Merge `components` and DI container configs. +- [ ] Try to eliminate `Object` and `Component` turning these into traits. Could extract AccessorTrait, EventTrait etc. Alternatively we can drop accessors. Will get [PSR-2](https://github.com/yiisoft/yii2/issues/11956) and stricter interfaces in exchange additionally to possibility to get more performance. +- [ ] When triggering events, pass data as a separate argument instead of a part of event object (commonly referred to as inconvenient). +- [ ] Move methods from Yii class into helpers. For example, `Yii::getAlias()` could be `FileHelper::getAlias()`. +- [ ] Use HTML-5 data attributes to specify validation rules + global validation script that doesn't require additional config. + +## Features + +- [ ] Introduce configuration manager. +- [ ] Implement `change()` for migrations. + +# Bootstrap extension + +- [ ] Remove all widgets that doing things that could be done simpler via plain HTML. + +# Gii extension + +- [ ] [Re-write Gii JavaScript not to use jQuery](https://github.com/yiisoft/yii2-gii/issues/282). + +# Debug extension + +- [ ] [Re-write Debug JavaScript not to use jQuery](https://github.com/yiisoft/yii2-debug/issues/246). From 3879295266fcd8750ffaa24ce6a4f329f9700dda Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 00:09:51 +0300 Subject: [PATCH 156/902] Adjusted roadmap details --- ROADMAP.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 66e9b96255c..7392ae2f881 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -22,11 +22,15 @@ Will be last release with features and enhancements the last one that will be me - Announce bugfixes EOL (a year more?). - Security fixes only. +### Additional releases + +We can tag additional releases in case someone will take the role of release manager. Otherwise we'll focus on 3.0. + # 3.0 (first half of 2018) ## Infrastructure -- [x] Switch to 3.0.0 SemVer-like release tagging. +- [x] [Switch to 3.0.0 SemVer-like release tagging](https://www.yiiframework.com/news/177/yii-adopts-semver-since-version-3-0-0). - [x] Soft-deprecate 2.0. ## Requirements @@ -77,14 +81,17 @@ Will be last release with features and enhancements the last one that will be me ## App templates -- [ ] Implement API template. -- [ ] Implement more sophisticated basic template. -- [ ] Drop advanced template? +- [ ] [Implement more sophisticated basic template](https://github.com/yiisoft/app). +- [x] Drop advanced template? ## i18n - [ ] Use `-` instead of `_` for view files, message files etc. [See #8057](https://github.com/yiisoft/yii2/pull/8057) +## Extensions + +- [ ] Make sure all official extensions have releases for 3.0.0. + # 4.0 (late 2018) - [ ] Announce LTS. @@ -112,3 +119,8 @@ Will be last release with features and enhancements the last one that will be me # Debug extension - [ ] [Re-write Debug JavaScript not to use jQuery](https://github.com/yiisoft/yii2-debug/issues/246). + + +# 1.0 + +- [ ] Tag 1.1.20. From 84115023231df5640e6627fbba44f75472e78512 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 00:16:51 +0300 Subject: [PATCH 157/902] Added info about framework repo movement, added points about DI container [skip ci] --- ROADMAP.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 7392ae2f881..1d9abfc5af9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -32,6 +32,7 @@ We can tag additional releases in case someone will take the role of release man - [x] [Switch to 3.0.0 SemVer-like release tagging](https://www.yiiframework.com/news/177/yii-adopts-semver-since-version-3-0-0). - [x] Soft-deprecate 2.0. +- [ ] Move framework to `yiisoft/framework`? ## Requirements @@ -47,6 +48,13 @@ We can tag additional releases in case someone will take the role of release man - [x] Remove Cubrid support. - [ ] Extract `findIdentityByAccessToken` from `IdentityInterface` (looks weird when it's not implemented in all web apps). +## Dependency injection + +- [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. +- [ ] Port cycles in dependencies detection from `yiisoft/di`. +- [ ] Port method calls support from `yiisoft/di`. +- [ ] Remove ability to set constructor options from method signatures, move it to `__construct`. + ## Client side - [x] Make core jQuery-free. From 6533a05bca88e658ed83c88744fa204e02c7b545 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 00:18:27 +0300 Subject: [PATCH 158/902] We didn't made in 1st half on 2018 :( [skip ci] --- ROADMAP.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 1d9abfc5af9..d17847c2012 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -26,7 +26,7 @@ Will be last release with features and enhancements the last one that will be me We can tag additional releases in case someone will take the role of release manager. Otherwise we'll focus on 3.0. -# 3.0 (first half of 2018) +# 3.0 (2018) ## Infrastructure @@ -100,7 +100,7 @@ We can tag additional releases in case someone will take the role of release man - [ ] Make sure all official extensions have releases for 3.0.0. -# 4.0 (late 2018) +# 4.0 (2018) - [ ] Announce LTS. - [ ] PHP 7 strict scalar types everywhere. From 035fb5bfdea839b78341ec3c62c9eb2ccc1c8465 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 01:13:06 +0300 Subject: [PATCH 159/902] More roadmap details [skip ci] --- ROADMAP.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index d17847c2012..61072d4bf59 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -33,6 +33,7 @@ We can tag additional releases in case someone will take the role of release man - [x] [Switch to 3.0.0 SemVer-like release tagging](https://www.yiiframework.com/news/177/yii-adopts-semver-since-version-3-0-0). - [x] Soft-deprecate 2.0. - [ ] Move framework to `yiisoft/framework`? +- [ ] [Remove subsplit](https://github.com/yiisoft/yii2/issues/16160). ## Requirements @@ -84,7 +85,7 @@ We can tag additional releases in case someone will take the role of release man ## Request -- [ ] Consider PSR-7 compatible middleware. +- [ ] [Consider PSR-7 compatible middleware](https://github.com/yiisoft/yii2/issues/15438). - [x] Add `$request->getFile($name)` that returns `UploadedFile` instance. ## App templates From 9f77192bcb6f6fc65c5c95cd6867849606fb3b86 Mon Sep 17 00:00:00 2001 From: null <1906048796@qq.com> Date: Wed, 4 Jul 2018 16:25:25 +0800 Subject: [PATCH 160/902] Update start-workflow.md (#16473) [skip ci] --- docs/guide-zh-CN/start-workflow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-zh-CN/start-workflow.md b/docs/guide-zh-CN/start-workflow.md index 49898797ce9..fc3628dceef 100644 --- a/docs/guide-zh-CN/start-workflow.md +++ b/docs/guide-zh-CN/start-workflow.md @@ -74,7 +74,7 @@ Yii 实现了[模型-视图-控制器 (MVC)](http://wikipedia.org/wiki/Model-vie 每个应用都有一个入口脚本 `web/index.php`,这是整个应用中唯一可以访问的 PHP 脚本。 入口脚本接受一个 Web 请求并创建[应用](structure-application.md)实例去处理它。 -[应用](structure-applications.md)在它的[组建](concept-components.md)辅助下解析请求, +[应用](structure-applications.md)在它的[组件](concept-components.md)辅助下解析请求, 并分派请求至 MVC 元素。[视图](structure-views.md)使用[小部件](structure-widgets.md) 去创建复杂和动态的用户界面。 From 3afd4c74d5a09ff7cdd7e7848233be9010115412 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 13:45:49 +0300 Subject: [PATCH 161/902] Added post-4.0 roadmap [skip ci] --- ROADMAP.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 61072d4bf59..95260f990ef 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -117,6 +117,15 @@ We can tag additional releases in case someone will take the role of release man - [ ] Introduce configuration manager. - [ ] Implement `change()` for migrations. +# Post 4.0 (but could be done independently) + +Start extracting separate independent components: + +- [ ] DBAL layer. +- [ ] ActiveRecord. +- [ ] i18n. +- [ ] Gii. + # Bootstrap extension - [ ] Remove all widgets that doing things that could be done simpler via plain HTML. From a5c8b215b329403e61871239e81c10490d23deff Mon Sep 17 00:00:00 2001 From: Andrii Vasyliev Date: Wed, 4 Jul 2018 18:45:14 +0300 Subject: [PATCH 162/902] added Documentation section to Roadmap [skip ci] (#16476) --- ROADMAP.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 95260f990ef..a68f6c6c67a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -28,6 +28,11 @@ We can tag additional releases in case someone will take the role of release man # 3.0 (2018) +## Documentation + +- [ ] Prepare changes description. +- [ ] Prepare upgrading instructions. + ## Infrastructure - [x] [Switch to 3.0.0 SemVer-like release tagging](https://www.yiiframework.com/news/177/yii-adopts-semver-since-version-3-0-0). From 80d0c2b05a31d880bd4eb5d5e3cbf19bcd4fc340 Mon Sep 17 00:00:00 2001 From: Evgeniy Moiseenko Date: Wed, 4 Jul 2018 21:42:40 +0300 Subject: [PATCH 163/902] Fixes #16365: Added $filterOnFocusOut option for GridView --- framework/CHANGELOG.md | 1 + framework/assets/yii.gridView.js | 8 ++++++-- framework/grid/GridView.php | 11 ++++++++--- tests/js/tests/yii.gridView.test.js | 9 ++++++--- 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 35135fa3cee..bc236e1ece7 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ +- Enh #16365: Added $filterOnFocusOut option for GridView (s1lver) - Enh #14289: Added `yii\db\Command::executeResetSequence()` to work with Oracle (CedricYii) - Enh #9133: Added `yii\behaviors\OptimisticLockBehavior` (tunecino) - Bug #16104: Fixed `yii\db\pgsql\QueryBuilder::dropIndex()` to prepend index name with schema name (wapmorgan) diff --git a/framework/assets/yii.gridView.js b/framework/assets/yii.gridView.js index 0a3e2e73ff0..cbbcd1a9b62 100644 --- a/framework/assets/yii.gridView.js +++ b/framework/assets/yii.gridView.js @@ -14,7 +14,7 @@ if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { - return methods.init.apply(this, arguments); + return methods.init.apply(this, arguments); } else { $.error('Method ' + method + ' does not exist in jQuery.yiiGridView'); return false; @@ -23,7 +23,8 @@ var defaults = { filterUrl: undefined, - filterSelector: undefined + filterSelector: undefined, + filterOnFocusOut: true }; var gridData = {}; @@ -82,6 +83,9 @@ var $e = $(this); var settings = $.extend({}, defaults, options || {}); var id = $e.attr('id'); + if (!settings.filterOnFocusOut) { + return false; + } if (gridData[id] === undefined) { gridData[id] = {}; } diff --git a/framework/grid/GridView.php b/framework/grid/GridView.php index d815708b091..6de342d86c8 100644 --- a/framework/grid/GridView.php +++ b/framework/grid/GridView.php @@ -248,6 +248,11 @@ class GridView extends BaseListView * This is mainly used by [[Html::error()]] when rendering an error message next to every filter input field. */ public $filterErrorOptions = ['class' => 'help-block']; + /** + * @var bool whatever to apply filters on losing focus. Leaves an ability to manage filters via yiiGridView JS + * @since 2.0.16 + */ + public $filterOnFocusOut = true; /** * @var string the layout that determines how different sections of the grid view should be organized. * The following tokens will be replaced with the corresponding section contents: @@ -288,10 +293,10 @@ public function init() */ public function run() { - $id = $this->options['id']; - $options = Json::htmlEncode($this->getClientOptions()); $view = $this->getView(); GridViewAsset::register($view); + $id = $this->options['id']; + $options = Json::htmlEncode(array_merge($this->getClientOptions(), ['filterOnFocusOut' => $this->filterOnFocusOut])); $view->registerJs("jQuery('#$id').yiiGridView($options);"); parent::run(); } @@ -360,7 +365,7 @@ public function renderItems() $tableFooterAfterBody = $this->renderTableFooter(); } else { $tableFooter = $this->renderTableFooter(); - } + } } $content = array_filter([ diff --git a/tests/js/tests/yii.gridView.test.js b/tests/js/tests/yii.gridView.test.js index 6b173f0cd09..6b60054493b 100644 --- a/tests/js/tests/yii.gridView.test.js +++ b/tests/js/tests/yii.gridView.test.js @@ -14,11 +14,13 @@ describe('yii.gridView', function () { var $gridView; var settings = { filterUrl: '/posts/index', - filterSelector: '#w0-filters input, #w0-filters select' + filterSelector: '#w0-filters input, #w0-filters select', + filterOnFocusOut: true }; var commonSettings = { filterUrl: '/posts/index', - filterSelector: '#w-common-filters input, #w-common-filters select' + filterSelector: '#w-common-filters input, #w-common-filters select', + filterOnFocusOut: true }; var $textInput; var $select; @@ -143,7 +145,8 @@ describe('yii.gridView', function () { describe('init', function () { var customSettings = { filterUrl: '/posts/filter', - filterSelector: '#w-common-filters input' + filterSelector: '#w-common-filters input', + filterOnFocusOut: true }; withData({ From ba6c1a91e8aed11cb117c31f7eeb1ed08fcbfdcf Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 23:45:51 +0300 Subject: [PATCH 164/902] Roadmap updates [skip ci] --- ROADMAP.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index a68f6c6c67a..edc566d68b6 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -59,7 +59,7 @@ We can tag additional releases in case someone will take the role of release man - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. - [ ] Port cycles in dependencies detection from `yiisoft/di`. - [ ] Port method calls support from `yiisoft/di`. -- [ ] Remove ability to set constructor options from method signatures, move it to `__construct`. +- [ ] Deprecate ability to set constructor options from method signatures, move it to `__construct`. ## Client side @@ -77,8 +77,7 @@ We can tag additional releases in case someone will take the role of release man - [x] Move MSSQL into extension: https://github.com/yiisoft/yii2-mssql - [x] Move Oracle into extension: https://github.com/yiisoft/yii2-oracle -- [ ] Implement upsert. -- [ ] Implement batch w/ ignore. +- [x] Implement upsert ([was done in 2.0](https://github.com/yiisoft/yii2/issues/13879)) ## Logging From 9c653b91e383d8264df5edc68414c2ad490e7510 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Wed, 4 Jul 2018 23:55:48 +0300 Subject: [PATCH 165/902] Moved DI container signature change to 4.0 [skip ci] --- ROADMAP.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index edc566d68b6..593c74c278a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -59,7 +59,6 @@ We can tag additional releases in case someone will take the role of release man - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. - [ ] Port cycles in dependencies detection from `yiisoft/di`. - [ ] Port method calls support from `yiisoft/di`. -- [ ] Deprecate ability to set constructor options from method signatures, move it to `__construct`. ## Client side @@ -116,6 +115,10 @@ We can tag additional releases in case someone will take the role of release man - [ ] Move methods from Yii class into helpers. For example, `Yii::getAlias()` could be `FileHelper::getAlias()`. - [ ] Use HTML-5 data attributes to specify validation rules + global validation script that doesn't require additional config. +## Dependency injection + +- [ ] Remove ability to set constructor options from method signatures, move it to `__construct`. + ## Features - [ ] Introduce configuration manager. From 70b78270acf8e4c4d664887457fca25de444f31f Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 5 Jul 2018 11:52:00 +0300 Subject: [PATCH 166/902] Added moving repo to infrastructure plan [skip ci] --- ROADMAP.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 593c74c278a..11df7621f94 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -38,7 +38,8 @@ We can tag additional releases in case someone will take the role of release man - [x] [Switch to 3.0.0 SemVer-like release tagging](https://www.yiiframework.com/news/177/yii-adopts-semver-since-version-3-0-0). - [x] Soft-deprecate 2.0. - [ ] Move framework to `yiisoft/framework`? -- [ ] [Remove subsplit](https://github.com/yiisoft/yii2/issues/16160). +- [ ] [Remove subsplit](https://github.com/yiisoft/yii2/issues/16160) +- [ ] [Move repository to yiisoft/framework](https://github.com/yiisoft/yii2/issues/16482) ## Requirements From e9ffcb2d125460e3dd66eca349fa302121882206 Mon Sep 17 00:00:00 2001 From: Salem Ouerdani Date: Thu, 5 Jul 2018 19:16:36 +0100 Subject: [PATCH 167/902] Fixes #16456: Fixed OptimisticLockBehavior omitting HTML web forms --- docs/guide/db-active-record.md | 5 ++ .../behaviors/OptimisticLockBehavior.php | 16 ++++-- .../behaviors/OptimisticLockBehaviorTest.php | 52 ++++++++++++++----- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/docs/guide/db-active-record.md b/docs/guide/db-active-record.md index 3e29a69847d..12e6b34a629 100644 --- a/docs/guide/db-active-record.md +++ b/docs/guide/db-active-record.md @@ -793,6 +793,11 @@ public function behaviors() ]; } ``` +> Note: Because [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] will ensure the record is only saved +> if user submits a valid user number by directly parsing [[\yii\web\Request::getBodyParam()|getBodyParam()]], it +> may be useful to extend your model class and do step 2 in parent model while attaching the behavior (step 3) to the child +> class so you can have an instance dedicated to internal use while tying the other to controllers responsible of receiving +> end user inputs. Alternatively, you can implement your own logic by configuring its [[\yii\behaviors\OptimisticLockBehavior::$value|value]] property. ## Working with Relational Data diff --git a/framework/behaviors/OptimisticLockBehavior.php b/framework/behaviors/OptimisticLockBehavior.php index ba5d2aef306..026baef25d0 100644 --- a/framework/behaviors/OptimisticLockBehavior.php +++ b/framework/behaviors/OptimisticLockBehavior.php @@ -11,6 +11,7 @@ use yii\db\BaseActiveRecord; use yii\base\InvalidCallException; use yii\validators\NumberValidator; +use yii\helpers\ArrayHelper; /** * OptimisticLockBehavior automatically upgrades a model's lock version using the column name @@ -40,8 +41,14 @@ * By default, OptimisticLockBehavior will use [[\yii\web\Request::getBodyParam()|getBodyParam()]] to parse * the submitted value or set it to 0 on any fail. That means a request not holding the version attribute * may achieve a first successful update to entity, but starting from there any further try should fail - * unless the request is holding the expected version number. You can also configure the [[value]] property - * with a PHP callable to implement a different logic. + * unless the request is holding the expected version number. + + * Once attached, internal use of the model class should also fail to save the record if the version number + * isn't held by [[\yii\web\Request::getBodyParam()|getBodyParam()]]. It may be useful to extend your model class, + * enable optimistic lock in parent class by overriding [[\yii\db\BaseActiveRecord::optimisticLock()|optimisticLock()]], + * then attach the behavior to the child class so you can tie the parent model to internal use while linking the child model + * holding this behavior to the controllers responsible of receiving end user inputs. + * Alternatively, you can also configure the [[value]] property with a PHP callable to implement a different logic. * * OptimisticLockBehavior also provides a method named [[upgrade()]] that increases a model's * version by one, that may be useful when you need to mark an entity as stale among connected clients @@ -128,8 +135,11 @@ protected function getLockAttribute() protected function getValue($event) { if ($this->value === null) { + $request = Yii::$app->getRequest(); $lock = $this->getLockAttribute(); - $input = Yii::$app->getRequest()->getBodyParam($lock); + $formName = $this->owner->formName(); + $formValue = $formName ? ArrayHelper::getValue($request->getBodyParams(), $formName . '.' . $lock) : null; + $input = $formValue ?: $request->getBodyParam($lock); $isValid = $input && (new NumberValidator())->validate($input); return $isValid ? $input : 0; } diff --git a/tests/framework/behaviors/OptimisticLockBehaviorTest.php b/tests/framework/behaviors/OptimisticLockBehaviorTest.php index a81fa1a61c2..1a7c9ae3e57 100644 --- a/tests/framework/behaviors/OptimisticLockBehaviorTest.php +++ b/tests/framework/behaviors/OptimisticLockBehaviorTest.php @@ -77,7 +77,7 @@ public function testUpdateRecordWithinConsoleRequest() ]; $model = new ActiveRecordLockVersion(); $model->version = 0; - $model->save(false); + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); // upgrade model @@ -89,8 +89,7 @@ public function testUpdateRecordWithinConsoleRequest() $model->markAttributeDirty('version'); - $model->save(false); - + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); $this->assertEquals(2, $model->version, 'updated version should equal 2'); } @@ -106,8 +105,7 @@ public function testNewRecord() OptimisticLockBehavior::className(), ]; $model = new ActiveRecordLockVersion(); - $model->save(false); - + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); $this->assertEquals(0, $model->version, 'init version should equal 0'); // create a record starting from version 5 @@ -116,9 +114,17 @@ public function testNewRecord() Yii::$app->set('request', $request); $model = new ActiveRecordLockVersion(); - $model->save(false); - + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); $this->assertEquals(5, $model->version, 'init version should equal 5'); + + // starting from version 8 but mocking a html web form + + $request->setBodyParams(['ActiveRecordLockVersion' => ['version' => 8]]); + Yii::$app->set('request', $request); + + $model = new ActiveRecordLockVersion(); + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); + $this->assertEquals(8, $model->version, 'init version should equal 8'); } @@ -131,7 +137,7 @@ public function testUpdateRecord() OptimisticLockBehavior::className(), ]; $model = new ActiveRecordLockVersion(); - $model->save(false); + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); // upgrade model @@ -193,9 +199,16 @@ public function testUpdateRecord() $request->setBodyParams(['version' => '1']); Yii::$app->set('request', $request); - $model->save(false); - + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); $this->assertEquals(2, $model->version, 'updated version should equal 2'); + + // a successful update as sent from a HTML web form + + $request->setBodyParams(['ActiveRecordLockVersion' => ['version' => '2']]); + Yii::$app->set('request', $request); + + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); + $this->assertEquals(3, $model->version, 'updated version should equal 3'); } public function testDeleteRecord() @@ -207,7 +220,7 @@ public function testDeleteRecord() OptimisticLockBehavior::className(), ]; $model = new ActiveRecordLockVersion(); - $model->save(false); + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); // upgrade model version to 1 @@ -242,14 +255,25 @@ public function testDeleteRecord() $this->assertTrue($thrown, 'A StaleObjectException exception should have been thrown.'); - // a successful update by sending the correct version + // a successful delete by sending the correct version $request->setBodyParams(['version' => '1']); Yii::$app->set('request', $request); - $model->delete(); - + $this->assertEquals(true, $model->delete(), 'model is successfully deleted'); $this->assertEquals(1, $model->version, 'deleted version should remain 1'); + + // save it again, upgrade then remove it one more time but mocking a HTML web form + + $this->assertEquals(true, $model->save(false), 'model is successfully saved'); + + $model->upgrade(); + + $request->setBodyParams(['ActiveRecordLockVersion' => ['version' => '2']]); + Yii::$app->set('request', $request); + + $this->assertEquals(true, $model->delete(), 'model is successfully deleted'); + $this->assertEquals(2, $model->version, 'deleted version should remain 2'); } } From 9dd6730dd9d9d21897e66fe8c3cecc829be10179 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 5 Jul 2018 21:52:24 +0300 Subject: [PATCH 168/902] Removed duplicate entry from roadmap [skip ci] --- ROADMAP.md | 1 - 1 file changed, 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 11df7621f94..71a7299b65f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -37,7 +37,6 @@ We can tag additional releases in case someone will take the role of release man - [x] [Switch to 3.0.0 SemVer-like release tagging](https://www.yiiframework.com/news/177/yii-adopts-semver-since-version-3-0-0). - [x] Soft-deprecate 2.0. -- [ ] Move framework to `yiisoft/framework`? - [ ] [Remove subsplit](https://github.com/yiisoft/yii2/issues/16160) - [ ] [Move repository to yiisoft/framework](https://github.com/yiisoft/yii2/issues/16482) From c37b261622d9dddfbbec426fdde88bee1f0de49a Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 5 Jul 2018 21:53:21 +0300 Subject: [PATCH 169/902] Assigned DI items to @hiqsol [skip ci] --- ROADMAP.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 71a7299b65f..5552f07f90e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -57,8 +57,8 @@ We can tag additional releases in case someone will take the role of release man ## Dependency injection - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. -- [ ] Port cycles in dependencies detection from `yiisoft/di`. -- [ ] Port method calls support from `yiisoft/di`. +- [ ] Port cycles in dependencies detection from `yiisoft/di` (@hiqsol) +- [ ] Port method calls support from `yiisoft/di` (@hiqsol) ## Client side From a52102d5efcfd4c8c72b3cfaa9a88a01b18d2447 Mon Sep 17 00:00:00 2001 From: Vitor Arantes Date: Thu, 5 Jul 2018 20:55:13 +0200 Subject: [PATCH 170/902] Portuguese (pt) translations (#16486) [skip ci] --- framework/messages/pt/yii.php | 79 +++++++++++++++++++++++++++++++---- 1 file changed, 70 insertions(+), 9 deletions(-) diff --git a/framework/messages/pt/yii.php b/framework/messages/pt/yii.php index 4e802d2e99c..0be00592c34 100644 --- a/framework/messages/pt/yii.php +++ b/framework/messages/pt/yii.php @@ -23,6 +23,76 @@ * NOTE: this file must be saved in UTF-8 encoding. */ return [ + ' and ' => ' e ', + '"{attribute}" does not support operator "{operator}".' => '"{attribute}" não suporta o operador "{operator}".', + 'Are you sure you want to delete this item?' => 'Tens a certeza que queres apagar este item?', + 'Condition for "{attribute}" should be either a value or valid operator specification.' => 'A condição para "{attribute}" tem de ser ou um valor ou uma especificação válida do operador.', + 'Only files with these MIME types are allowed: {mimeTypes}.' => 'Apenas ficheiros com este tipo de MIME são permitidos: {mimeTypes}.', + 'Operator "{operator}" must be used with a search attribute.' => 'O operador "{operator}" tem de ser usado com um atributo de pesquisa.', + 'Operator "{operator}" requires multiple operands.' => 'O operador "{operator}" requer vários operandos.', + 'Powered by {yii}' => 'Distribuído por {yii}', + 'The combination {values} of {attributes} has already been taken.' => 'A combinação {values} de {attributes} já está a ser utilizada.', + 'The format of {filter} is invalid.' => 'O formato de {filter} é inválido.', + 'The requested view "{name}" was not found.' => 'A visualização solicitada "{name}" não foi encontrada.', + 'Unknown alias: -{name}' => 'Alias desconhecido: -{name}', + 'Unknown filter attribute "{attribute}"' => 'Atributo de filtro desconhecido "{attribute}"', + 'View' => 'Vêr', + 'Yii Framework' => 'Yii Framework', + 'You should upload at least {limit, number} {limit, plural, one{file} other{files}}.' => 'A transferência deve ser pelo menos {limit, number} {limit, plural, one{ficheiro} other{ficheiros}}. ', + 'in {delta, plural, =1{a day} other{# days}}' => 'em {delta, plural, =1{um dia} other{# dias}}', + 'in {delta, plural, =1{a minute} other{# minutes}}' => 'em {delta, plural, =1{um minuto} other{# minutos}}', + 'in {delta, plural, =1{a month} other{# months}}' => 'em {delta, plural, =1{um mês} other{# meses}}', + 'in {delta, plural, =1{a second} other{# seconds}}' => 'em {delta, plural, =1{um segundo} other{# segundos}}', + 'in {delta, plural, =1{a year} other{# years}}' => 'em {delta, plural, =1{um ano} other{# anos}}', + 'in {delta, plural, =1{an hour} other{# hours}}' => 'em {delta, plural, =1{uma hora} other{# horas}}', + 'just now' => 'agora mesmo', + '{attribute} contains wrong subnet mask.' => '{attribute} contém uma máscara de sub-rede errada.', + '{attribute} is not in the allowed range.' => '{attribute} não está no alcance permitido.', + '{attribute} must be a valid IP address.' => '{attribute} tem de ser um endereço IP válido.', + '{attribute} must be an IP address with specified subnet.' => '{attribute} tem de ser um endereço IP com a sub-rede especificada.', + '{attribute} must be equal to "{compareValueOrAttribute}".' => '{attribute} tem de ser igual a "{compareValueOrAttribute}".', + '{attribute} must be greater than "{compareValueOrAttribute}".' => '{attribute} tem de ser maior que "{compareValueOrAttribute}".', + '{attribute} must be greater than or equal to "{compareValueOrAttribute}".' => '{attribute} tem de ser maior ou igual a "{compareValueOrAttribute}".', + '{attribute} must be less than "{compareValueOrAttribute}".' => '{attribute} tem de ser menor que "{compareValueOrAttribute}".', + '{attribute} must be less than or equal to "{compareValueOrAttribute}".' => '{attribute} tem de ser menor ou igual a "{compareValueOrAttribute}".', + '{attribute} must not be a subnet.' => '{attribute} não pode ser uma sub-rede.', + '{attribute} must not be an IPv4 address.' => '{attribute} não pode ser um endereço IPv4.', + '{attribute} must not be an IPv6 address.' => '{attribute} não pode ser um endereço IPv6.', + '{attribute} must not be equal to "{compareValueOrAttribute}".' => '{attribute} não pode ser igual a "{compareValueOrAttribute}".', + '{delta, plural, =1{1 day} other{# days}}' => '{delta, plural, =1{1 dia} other{# dias}}', + '{delta, plural, =1{1 hour} other{# hours}}' => '{delta, plural, =1{1 hora} other{# horas}}', + '{delta, plural, =1{1 minute} other{# minutes}}' => '{delta, plural, =1{1 minuto} other{# minutos}}', + '{delta, plural, =1{1 month} other{# months}}' => '{delta, plural, =1{1 mês} other{# meses}}', + '{delta, plural, =1{1 second} other{# seconds}}' => '{delta, plural, =1{1 segundo} other{# segundos}}', + '{delta, plural, =1{1 year} other{# years}}' => '{delta, plural, =1{1 ano} other{# anos}}', + '{delta, plural, =1{a day} other{# days}} ago' => '{delta, plural, =1{um dia} other{# dias}} atrás', + '{delta, plural, =1{a minute} other{# minutes}} ago' => '{delta, plural, =1{um minuto} other{# minutos}} atrás', + '{delta, plural, =1{a month} other{# months}} ago' => '{delta, plural, =1{um mês} other{# meses}} atrás', + '{delta, plural, =1{a second} other{# seconds}} ago' => '{delta, plural, =1{um segundo} other{# segundos}} atrás', + '{delta, plural, =1{a year} other{# years}} ago' => '{delta, plural, =1{um ano} other{# anos}} atrás', + '{delta, plural, =1{an hour} other{# hours}} ago' => '{delta, plural, =1{uma hora} other{# horas}} atrás', + '{nFormatted} B' => '{nFormatted} B', + '{nFormatted} GB' => '{nFormatted} GB', + '{nFormatted} GiB' => '{nFormatted} GiB', + '{nFormatted} KB' => '{nFormatted} kB', + '{nFormatted} KiB' => '{nFormatted} KiB', + '{nFormatted} MB' => '{nFormatted} MB', + '{nFormatted} MiB' => '{nFormatted} MiB', + '{nFormatted} PB' => '{nFormatted} PB', + '{nFormatted} PiB' => '{nFormatted} PiB', + '{nFormatted} TB' => '{nFormatted} TB', + '{nFormatted} TiB' => '{nFormatted} TiB', + '{nFormatted} {n, plural, =1{byte} other{bytes}}' => '{nFormatted} {n, plural, =1{byte} other{bytes}}', + '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}' => '{nFormatted} {n, plural, =1{gibibyte} other{gibibytes}}', + '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}' => '{nFormatted} {n, plural, =1{gigabyte} other{gigabytes}}', + '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}' => '{nFormatted} {n, plural, =1{kibibyte} other{kibibytes}}', + '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}' => '{nFormatted} {n, plural, =1{kilobyte} other{kilobytes}}', + '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}' => '{nFormatted} {n, plural, =1{mebibyte} other{mebibytes}}', + '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}' => '{nFormatted} {n, plural, =1{megabyte} other{megabytes}}', + '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}' => '{nFormatted} {n, plural, =1{pebibyte} other{pebibytes}}', + '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}' => '{nFormatted} {n, plural, =1{petabyte} other{petabytes}}', + '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}' => '{nFormatted} {n, plural, =1{tebibyte} other{tebibytes}}', + '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}' => '{nFormatted} {n, plural, =1{terabyte} other{terabytes}}', '(not set)' => '(não definido)', 'An internal server error occurred.' => 'Ocorreu um erro interno do servidor.', 'Delete' => 'Apagar', @@ -34,8 +104,6 @@ 'Missing required arguments: {params}' => 'Argumentos obrigatórios em falta: {params}', 'Missing required parameters: {params}' => 'Parâmetros obrigatórios em falta: {params}', 'No' => 'Não', - 'No help for unknown command "{command}".' => 'Não há ajuda para o comando desconhecido “{command}”.', - 'No help for unknown sub-command "{command}".' => 'Não há ajuda para o sub-comando desconhecido “{command}”.', 'No results found.' => 'Não foram encontrados resultados.', 'Only files with these extensions are allowed: {extensions}.' => 'Só são permitidos ficheiros com as seguintes extensões: {extensions}.', 'Page not found.' => 'Página não encontrada.', @@ -53,7 +121,6 @@ 'The verification code is incorrect.' => 'O código de verificação está incorreto.', 'Total {count, number} {count, plural, one{item} other{items}}.' => 'Total {count, number} {count, plural, one{item} other{itens}}.', 'Unable to verify your data submission.' => 'Não foi possível verificar a sua submissão de dados.', - 'Unknown command "{command}".' => 'Comando desconhecido “{command}”.', 'Unknown option: --{name}' => 'Opção desconhecida : --{name}', 'Update' => 'Atualizar', 'Yes' => 'Sim', @@ -70,14 +137,8 @@ '{attribute} must be a string.' => '“{attribute}” deve ser uma string.', '{attribute} must be an integer.' => '“{attribute}” deve ser um número inteiro.', '{attribute} must be either "{true}" or "{false}".' => '“{attribute}” deve ser “{true}” ou “{false}”.', - '{attribute} must be greater than "{compareValue}".' => '“{attribute}” deve ser maior do que “{compareValue}”.', - '{attribute} must be greater than or equal to "{compareValue}".' => '“{attribute}” deve ser maior ou igual a “{compareValue}”.', - '{attribute} must be less than "{compareValue}".' => '“{attribute}” deve ser menor do que “{compareValue}”.', - '{attribute} must be less than or equal to "{compareValue}".' => '“{attribute}” deve ser menor ou igual a “{compareValue}”.', '{attribute} must be no greater than {max}.' => '“{attribute}” não pode ser maior do que {max}.', '{attribute} must be no less than {min}.' => '“{attribute}” não pode ser menor do que {min}.', - '{attribute} must be repeated exactly.' => '“{attribute}” deve ser repetido exatamente.', - '{attribute} must not be equal to "{compareValue}".' => '“{attribute}” não deve ser igual a “{compareValue}”.', '{attribute} should contain at least {min, number} {min, plural, one{character} other{characters}}.' => '“{attribute}” deve conter pelo menos {min, number} {min, plural, one{caractere} other{caracteres}}.', '{attribute} should contain at most {max, number} {max, plural, one{character} other{characters}}.' => '“{attribute}” deve conter no máximo {max, number} {max, plural, one{caractere} other{caracteres}}.', '{attribute} should contain {length, number} {length, plural, one{character} other{characters}}.' => '“{attribute}” deve conter {length, number} {length, plural, one{caractere} other{caracteres}}.', From bff974cf94e58b2336c1a8ea77f0ecf7dd8edd38 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Fri, 6 Jul 2018 17:06:28 +0300 Subject: [PATCH 171/902] Marked circular references as done [skip ci] --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 5552f07f90e..4518800012c 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -57,7 +57,7 @@ We can tag additional releases in case someone will take the role of release man ## Dependency injection - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. -- [ ] Port cycles in dependencies detection from `yiisoft/di` (@hiqsol) +- [x] Port cycles in dependencies detection from `yiisoft/di` (@hiqsol) - [ ] Port method calls support from `yiisoft/di` (@hiqsol) ## Client side From 1cfd5e624fd586db68f0f481390e68c3569531ef Mon Sep 17 00:00:00 2001 From: Meng Ye Date: Sat, 7 Jul 2018 05:45:04 +0800 Subject: [PATCH 172/902] Fix AD Hoc example syntax (#16491) [skip ci] --- docs/guide/input-validation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/input-validation.md b/docs/guide/input-validation.md index 88fec0f9ab8..6a1919c0cdd 100644 --- a/docs/guide/input-validation.md +++ b/docs/guide/input-validation.md @@ -294,7 +294,7 @@ which supports declaring both attributes and rules on the fly. Its usage is like ```php public function actionSearch($name, $email) { - $model = DynamicModel::validateData(['name' => $name, 'email' => $email]), [ + $model = DynamicModel::validateData(['name' => $name, 'email' => $email], [ [['name', 'email'], 'string', 'max' => 128], ['email', 'email'], ]); From 79982c35568c2d5de17ae8c29998f8f673ea9925 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sat, 7 Jul 2018 01:05:31 +0300 Subject: [PATCH 173/902] Updated roadmap [skip ci] --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 4518800012c..d72764d23bc 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -58,7 +58,7 @@ We can tag additional releases in case someone will take the role of release man - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. - [x] Port cycles in dependencies detection from `yiisoft/di` (@hiqsol) -- [ ] Port method calls support from `yiisoft/di` (@hiqsol) +- [ ] [Port method calls support from `yiisoft/di`](https://github.com/yiisoft/yii2/pull/16495) (@hiqsol) ## Client side From 5a53df5a3c8e601601128c22cbc8343089956507 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Mon, 9 Jul 2018 01:12:10 +0300 Subject: [PATCH 174/902] Updated roadmap [skip ci] --- ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ROADMAP.md b/ROADMAP.md index d72764d23bc..1999c72890f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -59,6 +59,7 @@ We can tag additional releases in case someone will take the role of release man - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. - [x] Port cycles in dependencies detection from `yiisoft/di` (@hiqsol) - [ ] [Port method calls support from `yiisoft/di`](https://github.com/yiisoft/yii2/pull/16495) (@hiqsol) +- [ ] Update guide and docs to reflect DI container additions. ## Client side From 02b469e8b6c037a4e028aaeaa52fdb3d9c059f24 Mon Sep 17 00:00:00 2001 From: Evgeniy Tkachenko Date: Tue, 10 Jul 2018 23:09:50 +0300 Subject: [PATCH 175/902] Checked for Port method calls support (#16503) [skip ci] --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 1999c72890f..f5860a14b5d 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -58,7 +58,7 @@ We can tag additional releases in case someone will take the role of release man - [ ] Declare an interface for DI container in `yiisoft/yii2`. Make it an extension of PSR if possible. - [x] Port cycles in dependencies detection from `yiisoft/di` (@hiqsol) -- [ ] [Port method calls support from `yiisoft/di`](https://github.com/yiisoft/yii2/pull/16495) (@hiqsol) +- [x] [Port method calls support from `yiisoft/di`](https://github.com/yiisoft/yii2/pull/16495) (@hiqsol) - [ ] Update guide and docs to reflect DI container additions. ## Client side From f6ed59885ea0f6f8487f4519ff29e826c05e4cc9 Mon Sep 17 00:00:00 2001 From: Evgeniy Tkachenko Date: Wed, 11 Jul 2018 15:30:37 +0300 Subject: [PATCH 176/902] Updated Roadmap's Cleanup section (#16506) [skip ci] --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index f5860a14b5d..d1f1436d2d4 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -52,7 +52,7 @@ We can tag additional releases in case someone will take the role of release man - [ ] [Error handler](https://github.com/yiisoft/yii2/issues/14348). - [x] Remove PJAX support. - [x] Remove Cubrid support. -- [ ] Extract `findIdentityByAccessToken` from `IdentityInterface` (looks weird when it's not implemented in all web apps). +- [ ] [Split `IdentityInterface`](https://github.com/yiisoft/yii2/issues/13825). ## Dependency injection From cd0e0e71c13325b0eacb716b98456e6141fc263f Mon Sep 17 00:00:00 2001 From: SilverFire - Dmitry Naumenko Date: Wed, 11 Jul 2018 19:53:13 +0300 Subject: [PATCH 177/902] Fixed idn_to_ascii function call to prevent incorrect translation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without the `IDNA_NONTRANSITIONAL_TO_ASCII` parameter, domain `faß.de` gets converted to `fass.de` that is not correct way of making IDN. Follows http://www.unicode.org/reports/tr46/ --- framework/validators/EmailValidator.php | 2 +- framework/validators/UrlValidator.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/validators/EmailValidator.php b/framework/validators/EmailValidator.php index 246808a7a0e..1a562c6dcb3 100644 --- a/framework/validators/EmailValidator.php +++ b/framework/validators/EmailValidator.php @@ -112,7 +112,7 @@ private function idnToAscii($idn) return idn_to_ascii($idn); } - return idn_to_ascii($idn, 0, INTL_IDNA_VARIANT_UTS46); + return idn_to_ascii($idn, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); } /** diff --git a/framework/validators/UrlValidator.php b/framework/validators/UrlValidator.php index 6a823876dcb..812a218b506 100644 --- a/framework/validators/UrlValidator.php +++ b/framework/validators/UrlValidator.php @@ -115,7 +115,7 @@ private function idnToAscii($idn) return idn_to_ascii($idn); } - return idn_to_ascii($idn, 0, INTL_IDNA_VARIANT_UTS46); + return idn_to_ascii($idn, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); } /** From 9ba5581fa4c45dfc897953389f79202fb4b7fa90 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Sat, 14 Jul 2018 01:23:48 +0200 Subject: [PATCH 178/902] added note about session GC config fixes #16516 --- docs/guide/runtime-sessions-cookies.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/guide/runtime-sessions-cookies.md b/docs/guide/runtime-sessions-cookies.md index c95c8bf115a..b8077998310 100644 --- a/docs/guide/runtime-sessions-cookies.md +++ b/docs/guide/runtime-sessions-cookies.md @@ -141,6 +141,11 @@ session storage class without the need to modify your application code that uses sure that the session has already been started by [[yii\web\Session::open()]]. This is because custom session storage handlers are registered within this method. +> Note: If you use a custom session storage you may need to configure the session garbage collector explicitly. + Some installations of PHP (e.g. Debian) use a garbage collector probability of 0 and clean session files + offline in a cronjob. This process does not apply to your custom storage so you need to configure + [[yii\web\Session::$GCProbability]] to use a non-zero value. + To learn how to configure and use these component classes, please refer to their API documentation. Below is an example showing how to configure [[yii\web\DbSession]] in the application configuration to use a database table for session storage: From feae9be281cd897c2eb5d5f9790171bde2ca75d7 Mon Sep 17 00:00:00 2001 From: teo1978 Date: Tue, 17 Jul 2018 18:23:23 +0200 Subject: [PATCH 179/902] Update start-installation.md (#16520) [skip ci] In the Yii2 Guide, where the Advanced Project Template is mentioned, the link should be to the topic about it in the guide, rather than to an .md file in a github repository. --- docs/guide/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index f006f881434..8c2be1ca5e2 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -10,7 +10,7 @@ Its code is organized in a recommended way. Therefore, it can serve as a good st In this and the next few sections, we will describe how to install Yii with the so-called *Basic Project Template* and how to implement new features on top of this template. Yii also provides another template called -the [Advanced Project Template](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md) which is better used in a team development environment +the [Advanced Project Template](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) which is better used in a team development environment to develop applications with multiple tiers. > Info: The Basic Project Template is suitable for developing 90 percent of Web applications. It differs From 71424a42fab75d831939cdaba532a2abfe4a6e7b Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Thu, 19 Jul 2018 12:15:48 +0900 Subject: [PATCH 180/902] docs/guide/db-active-record.md typo fixed (#16529) [skip ci] --- docs/guide/db-active-record.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/db-active-record.md b/docs/guide/db-active-record.md index 12e6b34a629..7d745ed8ba5 100644 --- a/docs/guide/db-active-record.md +++ b/docs/guide/db-active-record.md @@ -794,7 +794,7 @@ public function behaviors() } ``` > Note: Because [[\yii\behaviors\OptimisticLockBehavior|OptimisticLockBehavior]] will ensure the record is only saved -> if user submits a valid user number by directly parsing [[\yii\web\Request::getBodyParam()|getBodyParam()]], it +> if user submits a valid version number by directly parsing [[\yii\web\Request::getBodyParam()|getBodyParam()]], it > may be useful to extend your model class and do step 2 in parent model while attaching the behavior (step 3) to the child > class so you can have an instance dedicated to internal use while tying the other to controllers responsible of receiving > end user inputs. Alternatively, you can implement your own logic by configuring its [[\yii\behaviors\OptimisticLockBehavior::$value|value]] property. From 1ad85c640b379df4a794443942bded47461ffd83 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Thu, 19 Jul 2018 07:19:32 +0300 Subject: [PATCH 181/902] Bug #15826: Fixed JavaScript compareValidator in `yii.validation.js` for attributes not in rules (mgrechanik) --- framework/CHANGELOG.md | 1 + framework/assets/yii.validation.js | 9 ++++----- framework/validators/CompareValidator.php | 1 + tests/js/tests/yii.validation.test.js | 9 ++------- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index bc236e1ece7..3a2d155e533 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ +- Bug #15826: Fixed JavaScript compareValidator in `yii.validation.js` for attributes not in rules (mgrechanik) - Enh #16365: Added $filterOnFocusOut option for GridView (s1lver) - Enh #14289: Added `yii\db\Command::executeResetSequence()` to work with Oracle (CedricYii) - Enh #9133: Added `yii\behaviors\OptimisticLockBehavior` (tunecino) diff --git a/framework/assets/yii.validation.js b/framework/assets/yii.validation.js index fba5183b10b..710977d9612 100644 --- a/framework/assets/yii.validation.js +++ b/framework/assets/yii.validation.js @@ -274,12 +274,11 @@ yii.validation = (function ($) { if (options.compareAttribute === undefined) { compareValue = options.compareValue; } else { - var attributes = $form.data('yiiActiveForm').attributes - for (var i = attributes.length - 1; i >= 0; i--) { - if (attributes[i].id === options.compareAttribute) { - compareValue = $(attributes[i].input).val(); - } + var $target = $('#' + options.compareAttribute); + if (!$target.length) { + $target = $form.find('[name="' + options.compareAttributeName + '"]'); } + compareValue = $target.val(); } if (options.type === 'number') { diff --git a/framework/validators/CompareValidator.php b/framework/validators/CompareValidator.php index 57c358cafd7..8df351b72da 100644 --- a/framework/validators/CompareValidator.php +++ b/framework/validators/CompareValidator.php @@ -248,6 +248,7 @@ public function getClientOptions($model, $attribute) $compareAttribute = $this->compareAttribute === null ? $attribute . '_repeat' : $this->compareAttribute; $compareValue = $model->getAttributeLabel($compareAttribute); $options['compareAttribute'] = Html::getInputId($model, $compareAttribute); + $options['compareAttributeName'] = Html::getInputName($model, $compareAttribute); $compareLabel = $compareValueOrAttribute = $model->getAttributeLabel($compareAttribute); } diff --git a/tests/js/tests/yii.validation.test.js b/tests/js/tests/yii.validation.test.js index 515e254615c..70402c400e3 100644 --- a/tests/js/tests/yii.validation.test.js +++ b/tests/js/tests/yii.validation.test.js @@ -1506,13 +1506,8 @@ describe('yii.validation', function () { describe('with compareAttribute, "==" operator and 2 identical strings', function () { it(VALIDATOR_SUCCESS_MESSAGE, function () { var $form = { - data: function () { - return { - attributes: [{ - "id": "input-id", - "input": "#input-id" - }] - } + find: function(){ + return $input; } }; var messages = []; From 80f079a6c16d311bb0dce46e7a41d7e09af21093 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 19 Jul 2018 23:30:12 +0200 Subject: [PATCH 182/902] Mariadb docs (#16515) * Updated docs * Fix copy-paste typo --- docs/guide/start-databases.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/guide/start-databases.md b/docs/guide/start-databases.md index 6dec3eb3ad3..a418f94bc5b 100644 --- a/docs/guide/start-databases.md +++ b/docs/guide/start-databases.md @@ -23,6 +23,8 @@ Preparing the Database To begin, create a database named `yii2basic`, from which you will fetch data in your application. You may create an SQLite, MySQL, PostgreSQL, MSSQL or Oracle database, as Yii has built-in support for many database applications. For simplicity, MySQL will be assumed in the following description. +> Info: While MariaDB used to be a drop-in replacement for MySQL this is no longer fully true. In case you wish to use advanced features like `JSON` support in MariaDB, please check the MariaDB extension listed below. + Next, create a table named `country` in the database, and insert some sample data. You may run the following SQL statements to do so: ```sql @@ -83,6 +85,7 @@ If you need to work with databases support for which isn't bundled with Yii, che - [Informix](https://github.com/edgardmessias/yii2-informix) - [IBM DB2](https://github.com/edgardmessias/yii2-ibm-db2) - [Firebird](https://github.com/edgardmessias/yii2-firebird) +- [MariaDB](https://github.com/sam-it/yii2-mariadb) Creating an Active Record From 260d82213ef7a2c49d481632ecc2b62d5683cb71 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 20 Jul 2018 13:19:16 +0800 Subject: [PATCH 183/902] Update runtime-responses.md --- docs/guide-zh-CN/runtime-responses.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide-zh-CN/runtime-responses.md b/docs/guide-zh-CN/runtime-responses.md index a24533bf290..938649e22f6 100644 --- a/docs/guide-zh-CN/runtime-responses.md +++ b/docs/guide-zh-CN/runtime-responses.md @@ -203,9 +203,9 @@ public function actionOld() 和浏览器跳转类似,文件发送是另一个依赖指定HTTP头的功能, Yii提供方法集合来支持各种文件发送需求,它们对HTTP头都有内置的支持。 -- [[yii\web\Response::sendFile()]]: 发送一个已存在的文件到客户端 -- [[yii\web\Response::sendContentAsFile()]]: 发送一个文本字符串作为文件到客户端 -- [[yii\web\Response::sendStreamAsFile()]]: 发送一个已存在的文件流作为文件到客户端 +- [[yii\web\Response::sendFile()]]:发送一个已存在的文件到客户端 +- [[yii\web\Response::sendContentAsFile()]]:发送一个文本字符串作为文件到客户端 +- [[yii\web\Response::sendStreamAsFile()]]:发送一个已存在的文件流作为文件到客户端 这些方法都将响应对象作为返回值,如果要发送的文件非常大,应考虑使用 [[yii\web\Response::sendStreamAsFile()]] 因为它更节约内存, From b4c0c867dbe46f36132941788a82ce8cfd8edcd6 Mon Sep 17 00:00:00 2001 From: cuiliang Date: Fri, 20 Jul 2018 13:23:06 +0800 Subject: [PATCH 184/902] Update runtime-responses.md --- docs/guide-zh-CN/runtime-responses.md | 82 +++++++++++++-------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/docs/guide-zh-CN/runtime-responses.md b/docs/guide-zh-CN/runtime-responses.md index 938649e22f6..582ad924507 100644 --- a/docs/guide-zh-CN/runtime-responses.md +++ b/docs/guide-zh-CN/runtime-responses.md @@ -1,13 +1,13 @@ 响应 ========= -当一个应用在处理完一个[请求](runtime-requests.md)后, 这个应用会生成一个[[yii\web\Response|response]]响应对象并把这个响应对象发送给终端用户 +当一个应用在处理完一个[请求](runtime-requests.md)后, 这个应用会生成一个 [[yii\web\Response|response]] 响应对象并把这个响应对象发送给终端用户 这个响应对象包含的信息有HTTP状态码,HTTP头和主体内容等, 从本质上说,网页应用开发最终的目标就是根据不同的请求去构建这些响应对象。 -在大多数实际应用情况下,你应该主要地去处理`response`这个 [应用组件](structure-application-components.md), -在默认情况下,它是一个继承自[[yii\web\Response]]的实例 -然而,Yii也允许你创建自己的响应对象并发送给终端用户,这方面在后续会阐述。 +在大多数实际应用情况下,你应该主要地去处理 `response` 这个 [应用组件](structure-application-components.md), +在默认情况下,它是一个继承自 [[yii\web\Response]] 的实例 +然而,Yii 也允许你创建自己的响应对象并发送给终端用户,这方面在后续会阐述。 在本节,我们将会讲述如何组装和构建响应并把它发送给终端用户。 @@ -24,8 +24,8 @@ Yii::$app->response->statusCode = 200; ``` 尽管如此,大多数情况下不需要明确设置状态码, -因为 [[yii\web\Response::statusCode]] 状态码默认为200, -如果需要指定请求失败,可抛出对应的HTTP异常,如下所示: +因为 [[yii\web\Response::statusCode]] 状态码默认为 200, +如果需要指定请求失败,可抛出对应的 HTTP 异常,如下所示: ```php throw new \yii\web\NotFoundHttpException; @@ -47,7 +47,7 @@ throw new \yii\web\NotFoundHttpException; * [[yii\web\UnauthorizedHttpException]]:状态码 401。 * [[yii\web\UnsupportedMediaTypeHttpException]]:状态码 415。 -如果想抛出的异常不在如上列表中,可创建一个[[yii\web\HttpException]]异常, +如果想抛出的异常不在如上列表中,可创建一个 [[yii\web\HttpException]] 异常, 带上状态码抛出,如下: ```php @@ -57,7 +57,7 @@ throw new \yii\web\HttpException(402); ## HTTP 头部 -可在 `response` 组件中操控[[yii\web\Response::headers|header collection]]来发送HTTP头部信息, +可在 `response` 组件中操控 [[yii\web\Response::headers|header collection]] 来发送 HTTP 头部信息, 例如: ```php @@ -81,7 +81,7 @@ $values = $headers->remove('Pragma'); 大多是响应应有一个主体存放你想要显示给终端用户的内容。 -如果已有格式化好的主体字符串,可赋值到响应的[[yii\web\Response::content]]属性, +如果已有格式化好的主体字符串,可赋值到响应的 [[yii\web\Response::content]] 属性, 例如: ```php @@ -99,7 +99,7 @@ $response->data = ['message' => 'hello world']; ``` Yii支持以下可直接使用的格式,每个实现了[[yii\web\ResponseFormatterInterface|formatter]] 类, -可自定义这些格式器或通过配置[[yii\web\Response::formatters]] 属性来增加格式器。 +可自定义这些格式器或通过配置 [[yii\web\Response::formatters]] 属性来增加格式器。 * [[yii\web\Response::FORMAT_HTML|HTML]]: 通过 [[yii\web\HtmlResponseFormatter]] 来实现. * [[yii\web\Response::FORMAT_XML|XML]]: 通过 [[yii\web\XmlResponseFormatter]]来实现. @@ -107,7 +107,7 @@ Yii支持以下可直接使用的格式,每个实现了[[yii\web\ResponseForma * [[yii\web\Response::FORMAT_JSONP|JSONP]]: 通过 [[yii\web\JsonResponseFormatter]]来实现. * [[yii\web\Response::FORMAT_RAW|RAW]]: use this format if you want to send the response directly without applying any formatting. -上述响应主体可明确地被设置,但是在大多数情况下是通过 [操作](structure-controllers.md) +上述响应主体可明确地被设置,但是在大多数情况下是通过[操作](structure-controllers.md) 方法的返回值隐式地设置,常用场景如下所示: ```php @@ -120,7 +120,7 @@ public function actionIndex() 上述的 `index` 操作返回 `index` 视图渲染结果, 返回值会被 `response` 组件格式化后发送给终端用户。 -因为响应格式默认为[[yii\web\Response::FORMAT_HTML|HTML]], 只需要在操作方法中返回一个字符串, +因为响应格式默认为 [[yii\web\Response::FORMAT_HTML|HTML]],只需要在操作方法中返回一个字符串, 如果想使用其他响应格式,应在返回数据前先设置格式, 例如: @@ -159,12 +159,12 @@ public function actionInfo() ## 浏览器跳转 -浏览器跳转依赖于发送一个`Location` HTTP 头,因为该功能通常被使用, +浏览器跳转依赖于发送一个 `Location` HTTP 头,因为该功能通常被使用, Yii提供对它提供了特别的支持。 -可调用[[yii\web\Response::redirect()]] 方法将用户浏览器跳转到一个URL地址,该方法设置合适的 -带指定URL的 `Location` 头并返回它自己为响应对象,在操作的方法中, -可调用缩写版[[yii\web\Controller::redirect()]],例如: +可调用[[yii\web\Response::redirect()]] 方法将用户浏览器跳转到一个 URL 地址,该方法设置合适的 +带指定 URL 的 `Location` 头并返回它自己为响应对象,在操作的方法中, +可调用缩写版 [[yii\web\Controller::redirect()]],例如: ```php public function actionOld() @@ -173,7 +173,7 @@ public function actionOld() } ``` -在如上代码中,操作的方法返回`redirect()` 方法的结果,如前所述, +在如上代码中,操作的方法返回 `redirect()` 方法的结果,如前所述, 操作的方法返回的响应对象会被当总响应发送给终端用户。 除了动作方法外,可直接调用[[yii\web\Response::redirect()]] 再调用 @@ -183,25 +183,25 @@ public function actionOld() \Yii::$app->response->redirect('http://example.com/new', 301)->send(); ``` -> Info: [[yii\web\Response::redirect()]] 方法默认会设置响应状态码为302,该状态码会告诉浏览器请求的资源 - *临时* 放在另一个URI地址上,可传递一个301状态码告知浏览器请求 - 的资源已经 *永久* 重定向到新的URId地址。 +> Info: [[yii\web\Response::redirect()]] 方法默认会设置响应状态码为 302,该状态码会告诉浏览器请求的资源 + *临时* 放在另一个 URI 地址上,可传递一个 301 状态码告知浏览器请求 + 的资源已经 *永久* 重定向到新的 URId 地址。 -如果当前请求为AJAX 请求, +如果当前请求为 AJAX 请求, 发送一个 `Location` 头不会自动使浏览器跳转,为解决这个问题, -[[yii\web\Response::redirect()]] 方法设置一个值为要跳转的URL的`X-Redirect` 头, -在客户端可编写JavaScript -代码读取该头部值然后让浏览器跳转对应的URL。 +[[yii\web\Response::redirect()]] 方法设置一个值为要跳转的URL的 `X-Redirect` 头, +在客户端可编写 JavaScript +代码读取该头部值然后让浏览器跳转对应的 URL。 -> Info: Yii 配备了一个`yii.js` JavaScript 文件提供常用JavaScript功能, - 包括基于`X-Redirect`头的浏览器跳转, - 因此,如果你使用该JavaScript 文件(通过[[yii\web\YiiAsset]] 资源包注册), - 就不需要编写AJAX跳转的代码。 +> Info: Yii 配备了一个 `yii.js` JavaScript 文件提供常用 JavaScript 功能, + 包括基于 `X-Redirect` 头的浏览器跳转, + 因此,如果你使用该 JavaScript 文件(通过 [[yii\web\YiiAsset]] 资源包注册), + 就不需要编写 AJAX 跳转的代码。 ## 发送文件 -和浏览器跳转类似,文件发送是另一个依赖指定HTTP头的功能, -Yii提供方法集合来支持各种文件发送需求,它们对HTTP头都有内置的支持。 +和浏览器跳转类似,文件发送是另一个依赖指定 HTTP 头的功能, +Yii 提供方法集合来支持各种文件发送需求,它们对 HTTP 头都有内置的支持。 - [[yii\web\Response::sendFile()]]:发送一个已存在的文件到客户端 - [[yii\web\Response::sendContentAsFile()]]:发送一个文本字符串作为文件到客户端 @@ -225,11 +225,11 @@ public function actionDownload() \Yii::$app->response->sendFile('path/to/file.txt')->send(); ``` -一些浏览器提供特殊的名为*X-Sendfile*的文件发送功能, +一些浏览器提供特殊的名为 *X-Sendfile* 的文件发送功能, 原理为将请求跳转到服务器上的文件, -Web应用可在服务器发送文件前结束,为使用该功能, -可调用[[yii\web\Response::xSendFile()]], -如下简要列出一些常用Web服务器如何启用`X-Sendfile` 功能: +Web 应用可在服务器发送文件前结束,为使用该功能, +可调用 [[yii\web\Response::xSendFile()]], +如下简要列出一些常用 Web 服务器如何启用 `X-Sendfile` 功能: - Apache: [X-Sendfile](http://tn123.org/mod_xsendfile) - Lighttpd v1.4: [X-LIGHTTPD-send-file](http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file) @@ -241,22 +241,22 @@ Web应用可在服务器发送文件前结束,为使用该功能, ## 发送响应 在[[yii\web\Response::send()]] 方法调用前响应中的内容不会发送给用户, -该方法默认在[[yii\base\Application::run()]] +该方法默认在 [[yii\base\Application::run()]] 结尾自动调用,尽管如此,可以明确调用该方法强制立即发送响应。 [[yii\web\Response::send()]] 方法使用以下步骤来发送响应: -1. 触发 [[yii\web\Response::EVENT_BEFORE_SEND]] 事件. +1. 触发 [[yii\web\Response::EVENT_BEFORE_SEND]] 事件。 2. 调用 [[yii\web\Response::prepare()]] 来格式化 [[yii\web\Response::data|response data]] 为 - [[yii\web\Response::content|response content]]. -3. 触发 [[yii\web\Response::EVENT_AFTER_PREPARE]] 事件. + [[yii\web\Response::content|response content]]。 +3. 触发 [[yii\web\Response::EVENT_AFTER_PREPARE]] 事件。 4. 调用 [[yii\web\Response::sendHeaders()]] 来发送注册的HTTP头 5. 调用 [[yii\web\Response::sendContent()]] 来发送响应主体内容 -6. 触发 [[yii\web\Response::EVENT_AFTER_SEND]] 事件. +6. 触发 [[yii\web\Response::EVENT_AFTER_SEND]] 事件。 -一旦[[yii\web\Response::send()]] 方法被执行后,其他地方调用该方法会被忽略, +一旦 [[yii\web\Response::send()]] 方法被执行后,其他地方调用该方法会被忽略, 这意味着一旦响应发出后,就不能再追加其他内容。 -如你所见[[yii\web\Response::send()]] 触发了几个实用的事件, +如你所见 [[yii\web\Response::send()]] 触发了几个实用的事件, 通过响应这些事件可调整或包装响应。 From 60d79aa18e03f33eddec16ff59e7c021ec41c7f0 Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Mon, 23 Jul 2018 17:17:15 +0200 Subject: [PATCH 185/902] Update start-installation.md fix broken link in fr docs --- docs/guide-fr/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide-fr/start-installation.md b/docs/guide-fr/start-installation.md index fa36149be3c..dabba80eee8 100644 --- a/docs/guide-fr/start-installation.md +++ b/docs/guide-fr/start-installation.md @@ -38,7 +38,7 @@ Installer depuis une archive Installer Yii depuis une archive se fait en deux étapes : -1. Téléchargez l'archive sur le site [yiiframework.com](http://www.yiiframework.com/download/yii2-basic). +1. Téléchargez l'archive sur le site [yiiframework.com](http://www.yiiframework.com/download/). 2. Décompressez l'archive dans un dossier accessible via le Web. From d0712e49187be2812e7e91afc4dd7cb3f0fdd3da Mon Sep 17 00:00:00 2001 From: Carsten Brandt Date: Tue, 24 Jul 2018 16:43:50 +0200 Subject: [PATCH 186/902] added tests to verify issue #16484 the case is to match all module names before a catch-all URL rule. module routes should work with "module name only", "module name+controller name" and "module/controller/action". --- tests/framework/base/ModuleTest.php | 43 +++++++++++++++++++ .../framework/web/UrlManagerParseUrlTest.php | 28 ++++++++++++ 2 files changed, 71 insertions(+) diff --git a/tests/framework/base/ModuleTest.php b/tests/framework/base/ModuleTest.php index 83a9a0cbc4c..f93768b3476 100644 --- a/tests/framework/base/ModuleTest.php +++ b/tests/framework/base/ModuleTest.php @@ -147,6 +147,49 @@ public function testCreateControllerByID() $route = 'very---complex---name---test'; $this->assertNotInstanceOf(VeryComplexNameTestController::className(), $module->createControllerByID($route)); } + + public function testCreateController() + { + // app module has a submodule "base" which has two controllers: "default" and "other" + $module = new Module('app'); + $module->setModule('base', new Module('base')); + $defaultController = ['class' => 'yii\web\Controller']; + $otherController = ['class' => 'yii\web\Controller']; + $module->getModule('base')->controllerMap = [ + 'default' => $defaultController, + 'other' => $otherController, + ]; + + list($controller, $action) = $module->createController('base'); + $this->assertSame('', $action); + $this->assertSame('base/default', $controller->uniqueId); + + list($controller, $action) = $module->createController('base/default'); + $this->assertSame('', $action); + $this->assertSame('base/default', $controller->uniqueId); + + list($controller, $action) = $module->createController('base/other'); + $this->assertSame('', $action); + $this->assertSame('base/other', $controller->uniqueId); + + list($controller, $action) = $module->createController('base/default/index'); + $this->assertSame('index', $action); + $this->assertSame('base/default', $controller->uniqueId); + + list($controller, $action) = $module->createController('base/other/index'); + $this->assertSame('index', $action); + $this->assertSame('base/other', $controller->uniqueId); + + list($controller, $action) = $module->createController('base/other/someaction'); + $this->assertSame('someaction', $action); + $this->assertSame('base/other', $controller->uniqueId); + + $controller = $module->createController('bases/default/index'); + $this->assertFalse($controller); + + $controller = $module->createController('nocontroller'); + $this->assertFalse($controller); + } } class TestModule extends \yii\base\Module diff --git a/tests/framework/web/UrlManagerParseUrlTest.php b/tests/framework/web/UrlManagerParseUrlTest.php index 652336dad2c..d2ab77b972e 100644 --- a/tests/framework/web/UrlManagerParseUrlTest.php +++ b/tests/framework/web/UrlManagerParseUrlTest.php @@ -434,4 +434,32 @@ public function testRulesCacheIsUsed() ]); } } + + /** + * Test a scenario where catch-all rule is used at the end for a CMS but module names should use the module actions and controllers. + */ + public function testModuleRoute() + { + $modules = 'user|my-admin'; + + $manager = $this->getUrlManager([ + 'rules' => [ + "" => '', + "/" => '/', + "//" => '//', + '' => 'site/index', + ], + ]); + + $result = $manager->parseRequest($this->getRequest('user')); + $this->assertEquals(['user', []], $result); + $result = $manager->parseRequest($this->getRequest('user/somecontroller')); + $this->assertEquals(['user/somecontroller', []], $result); + $result = $manager->parseRequest($this->getRequest('user/somecontroller/someaction')); + $this->assertEquals(['user/somecontroller/someaction', []], $result); + + $result = $manager->parseRequest($this->getRequest('users/somecontroller/someaction')); + $this->assertEquals(['site/index', ['url' => 'users/somecontroller/someaction']], $result); + + } } From 2a4d57a232dafb7b35171a38522527247e80d592 Mon Sep 17 00:00:00 2001 From: Evgeniy Moiseenko Date: Fri, 27 Jul 2018 18:05:57 +0300 Subject: [PATCH 187/902] Update caching data docs (#15901) (#16555) [skip ci] --- docs/guide-ru/caching-data.md | 1 + docs/guide/caching-data.md | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/guide-ru/caching-data.md b/docs/guide-ru/caching-data.md index 4a65bb10a88..c834c4cda59 100644 --- a/docs/guide-ru/caching-data.md +++ b/docs/guide-ru/caching-data.md @@ -261,6 +261,7 @@ $result = Customer::getDb()->cache(function ($db) { - `yii cache/flush cache1 cache2`: очищает кэш в компонентах `cache1`, `cache2` (можно передать несколько названий компонентов кэширования, разделяя их пробелом) - `yii cache/flush-all`: очищает кэш во всех кэширующих компонентах приложения + - `yii cache/flush-schema db`: очищает кеш схемы базы данных для данного компонента соединения > Info: Консольное приложение использует отдельный конфигурационный файл по умолчанию. Для получения должного результата, убедитесь, что в конфигурациях консольного и веб-приложения у вас одинаковые компоненты кэширования. diff --git a/docs/guide/caching-data.md b/docs/guide/caching-data.md index 598751a0ecf..8d7663a6980 100644 --- a/docs/guide/caching-data.md +++ b/docs/guide/caching-data.md @@ -427,6 +427,7 @@ You can flush the cache from the console by calling `yii cache/flush` as well. - `yii cache/flush cache1 cache2`: flushes the cache components `cache1`, `cache2` (you can pass multiple component names separated with space) - `yii cache/flush-all`: flushes all cache components in the application + - `yii cache/flush-schema db`: clears DB schema cache for a given connection component > Info: Console application uses a separate configuration file by default. Ensure, that you have the same caching components in your web and console application configs to reach the proper effect. From ec792617ba8639bb6390fe4e0b088e618a65caf9 Mon Sep 17 00:00:00 2001 From: teo1978 Date: Fri, 27 Jul 2018 17:25:11 +0200 Subject: [PATCH 188/902] Update start-installation.md (#16548) [skip ci] On a typical Linux installation, you will need "sudo" to move composer.phar to /usr/local/bin, as the folder belongs to root. --- docs/guide/start-installation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/start-installation.md b/docs/guide/start-installation.md index 8c2be1ca5e2..caac601f0e5 100644 --- a/docs/guide/start-installation.md +++ b/docs/guide/start-installation.md @@ -28,7 +28,7 @@ If you do not already have Composer installed, you may do so by following the in ```bash curl -sS https://getcomposer.org/installer | php -mv composer.phar /usr/local/bin/composer +sudo mv composer.phar /usr/local/bin/composer ``` On Windows, you'll download and run [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). From 602ba9760e3a9e229b2d8ee7ca35d3fd001e3a64 Mon Sep 17 00:00:00 2001 From: Evgeniy Moiseenko Date: Fri, 27 Jul 2018 18:59:51 +0300 Subject: [PATCH 189/902] Added sample for filter validator (#16494) (#16559) [skip ci] --- docs/guide-ru/tutorial-core-validators.md | 7 +++++++ docs/guide/tutorial-core-validators.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/docs/guide-ru/tutorial-core-validators.md b/docs/guide-ru/tutorial-core-validators.md index 0cd1aeee735..df180b30741 100644 --- a/docs/guide-ru/tutorial-core-validators.md +++ b/docs/guide-ru/tutorial-core-validators.md @@ -308,6 +308,13 @@ function foo($model, $attribute) { // нормализация значения происходит тут return $value; }], + + // нормализует значение "phone" используя функцию "normalizePhone" + ['phone', 'filter', 'filter' => [$this, 'normalizePhone']], + + public function normalizePhone($value) { + return $value; + } ] ``` diff --git a/docs/guide/tutorial-core-validators.md b/docs/guide/tutorial-core-validators.md index da9efe62549..48f03183252 100644 --- a/docs/guide/tutorial-core-validators.md +++ b/docs/guide/tutorial-core-validators.md @@ -367,6 +367,13 @@ section for complete coverage about uploading files and performing validation ab // normalize phone input here return $value; }], + + // normalize "phone" using the function "normalizePhone" + ['phone', 'filter', 'filter' => [$this, 'normalizePhone']], + + public function normalizePhone($value) { + return $value; + } ] ``` From b32ba1132eafd97959e050d066a51dcc9c44fc88 Mon Sep 17 00:00:00 2001 From: Evgeniy Moiseenko Date: Fri, 27 Jul 2018 19:34:33 +0300 Subject: [PATCH 190/902] Update inline validator docs (#16103) (#16556) [skip ci] --- docs/guide-ru/input-validation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/guide-ru/input-validation.md b/docs/guide-ru/input-validation.md index 80cd40d3077..312e4571af8 100644 --- a/docs/guide-ru/input-validation.md +++ b/docs/guide-ru/input-validation.md @@ -323,8 +323,9 @@ public function actionSearch($name, $email) /** * @param string $attribute атрибут проверяемый в настоящее время * @param array $params дополнительные пары имя-значение, заданное в правиле + * @param \yii\validators\InlineValidator $validator связь с экземпляром InlineValidator */ -function ($attribute, $params) +function ($attribute, $params, $validator) ``` Если атрибут не прошел проверку, метод/функция должна вызвать [[yii\base\Model::addError()]], From 32c7c4161bcf7b5dc1324ba8f4145bcc643891a8 Mon Sep 17 00:00:00 2001 From: drlibra <13391053+drlibra@users.noreply.github.com> Date: Fri, 27 Jul 2018 21:39:16 +0500 Subject: [PATCH 191/902] Fixes #16192: `yii\db\Command::logQuery()` is now protected, extracted `getCacheKey()` from `queryInternal()` --- framework/CHANGELOG.md | 2 +- framework/db/Command.php | 32 ++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 3a2d155e533..11ceede67d8 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -37,7 +37,7 @@ Yii Framework 2 Change Log - Bug #16292: Fixed misconfigured CORS filter exception throwing. Now it throws `InvalidConfigException` in Debug mode (khvalov) - Bug #16301: Fixed `yii\web\User::setIdentity()` to clear access check cache while setting identity object to `null` (Izumi-kun) - Bug #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation (samdark, Felix Wiedemann) -- Chg #16192: `yii\db\Command::logQuery()` is now protected (drlibra) +- Chg #16192: `yii\db\Command::logQuery()` is now protected, extracted `getCacheKey()` from `queryInternal()` (drlibra) - Bug #16377: Fixed `yii\base\Event:off()` undefined index error when event handler does not match (razvanphp) 2.0.15.1 March 21, 2018 diff --git a/framework/db/Command.php b/framework/db/Command.php index 984204fecb3..d78b2cce891 100644 --- a/framework/db/Command.php +++ b/framework/db/Command.php @@ -1140,14 +1140,8 @@ protected function queryInternal($method, $fetchMode = null) if (is_array($info)) { /* @var $cache \yii\caching\CacheInterface */ $cache = $info[0]; - $cacheKey = [ - __CLASS__, - $method, - $fetchMode, - $this->db->dsn, - $this->db->username, - $rawSql ?: $rawSql = $this->getRawSql(), - ]; + $rawSql = $rawSql ?: $this->getRawSql(); + $cacheKey = $this->getCacheKey($method, $fetchMode, $rawSql); $result = $cache->get($cacheKey); if (is_array($result) && isset($result[0])) { Yii::debug('Query result served from cache', 'yii\db\Command::query'); @@ -1187,6 +1181,28 @@ protected function queryInternal($method, $fetchMode = null) return $result; } + /** + * Returns the cache key for the query. + * + * @param string $method method of PDOStatement to be called + * @param int $fetchMode the result fetch mode. Please refer to [PHP manual](http://www.php.net/manual/en/function.PDOStatement-setFetchMode.php) + * for valid fetch modes. + * @param string $rawSql the raw SQL with parameter values inserted into the corresponding placeholders + * @return array the cache key + * @since 2.0.16 + */ + protected function getCacheKey($method, $fetchMode, $rawSql) + { + return [ + __CLASS__, + $method, + $fetchMode, + $this->db->dsn, + $this->db->username, + $rawSql, + ]; + } + /** * Marks a specified table schema to be refreshed after command execution. * @param string $name name of the table, which schema should be refreshed. From 1246e5feb3e7e017603179c282d95fd3e0d57ab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=88=B9=E6=AD=8C?= Date: Sat, 28 Jul 2018 00:41:38 +0800 Subject: [PATCH 192/902] Fixes #16514: Fixed `yii\di\Container::resolveCallableDependencies` to support callable object --- framework/CHANGELOG.md | 1 + framework/di/Container.php | 2 ++ tests/data/base/CallableClass.php | 16 ++++++++++++++++ tests/framework/BaseYiiTest.php | 3 +++ 4 files changed, 22 insertions(+) create mode 100644 tests/data/base/CallableClass.php diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 11ceede67d8..2526525ab66 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -39,6 +39,7 @@ Yii Framework 2 Change Log - Bug #16322: Fixed strings were not were not compared using timing attack resistant approach while CSRF token validation (samdark, Felix Wiedemann) - Chg #16192: `yii\db\Command::logQuery()` is now protected, extracted `getCacheKey()` from `queryInternal()` (drlibra) - Bug #16377: Fixed `yii\base\Event:off()` undefined index error when event handler does not match (razvanphp) +- Bug #16514: Fixed `yii\di\Container::resolveCallableDependencies` to support callable object (wi1dcard) 2.0.15.1 March 21, 2018 ----------------------- diff --git a/framework/di/Container.php b/framework/di/Container.php index 61fa6910b37..4a31a345400 100644 --- a/framework/di/Container.php +++ b/framework/di/Container.php @@ -523,6 +523,8 @@ public function resolveCallableDependencies(callable $callback, $params = []) { if (is_array($callback)) { $reflection = new \ReflectionMethod($callback[0], $callback[1]); + } elseif (is_object($callback)) { + $reflection = new \ReflectionMethod($callback, '__invoke'); } else { $reflection = new \ReflectionFunction($callback); } diff --git a/tests/data/base/CallableClass.php b/tests/data/base/CallableClass.php new file mode 100644 index 00000000000..42f4cf37ff3 --- /dev/null +++ b/tests/data/base/CallableClass.php @@ -0,0 +1,16 @@ +assertTrue(Yii::createObject(function (Singer $singer, $a = 3) { return true; })); + + $this->assertTrue(Yii::createObject(new CallableClass())); } public function testCreateObjectEmptyArrayException() From 901d249c4586e9d2898b20fa6feaca44ff5545f6 Mon Sep 17 00:00:00 2001 From: jaaf Date: Sat, 28 Jul 2018 17:47:46 +0200 Subject: [PATCH 193/902] synchronized fr/intro-upgrade-from-v1.md and fr/start-installation.md with EN version and added first translation for fr/start-prerequisites.md [skip ci] (#16570) --- docs/guide-fr/intro-upgrade-from-v1.md | 6 +- docs/guide-fr/start-installation.md | 147 +++++++++++++++++++------ docs/guide-fr/start-prerequisites.md | 19 ++++ 3 files changed, 136 insertions(+), 36 deletions(-) create mode 100644 docs/guide-fr/start-prerequisites.md diff --git a/docs/guide-fr/intro-upgrade-from-v1.md b/docs/guide-fr/intro-upgrade-from-v1.md index d7a77d164c4..40337a2ce83 100644 --- a/docs/guide-fr/intro-upgrade-from-v1.md +++ b/docs/guide-fr/intro-upgrade-from-v1.md @@ -61,7 +61,7 @@ Composants et objets Yii 2.0 décompose la classe `CComponent` 1.1 en deux classes: [[yii\base\BaseObject]] et [[yii\base\Component]]. Le classe [[yii\base\BaseObject|BaseObject]] est une classe de base légère qui permet de définir les [Propriétés de l'objet](concept-properties.md) via des accesseurs. La classe [[yii\base\Component|Component]] est une -sous classe de [[yii\base\BaseObject|BaseObject]] et prend en charge les [Evénements](concept events.md) et les +sous classe de [[yii\base\BaseObject|BaseObject]] et prend en charge les [Événements](concept events.md) et les [Comportements](concept-behaviors.md). Si votre classe n'a pas besoin des événements et des comportements, vous devriez envisager d'utiliser @@ -134,7 +134,7 @@ $component->on($eventName, $handler); // Pour détacher le gestionnaire, utilisez : // $component->off($eventName, $handler); ``` -Il y a de nombreuses améliorations dans la gestion des événements. Pour plus de détails, reportez-vous à la section [Evénements](concept-events.md). +Il y a de nombreuses améliorations dans la gestion des événements. Pour plus de détails, reportez-vous à la section [Événements](concept-events.md). Alias @@ -503,7 +503,7 @@ Au lieu de cela, vous devez implémenter [[yii\web\IdentityInterface]] qui est b Le modèle de projet avancé fournit un exemple. Reportez-vous aux sections [Authentification](security-authentication.md), [Authorisation](security-authorization.md), et -[Modèle de projet avancé](tutorial-advanced-app.md) pour en savoir plus. +[Modèle de projet avancé](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) pour en savoir plus. Gestion des URL diff --git a/docs/guide-fr/start-installation.md b/docs/guide-fr/start-installation.md index dabba80eee8..6422c64ec28 100644 --- a/docs/guide-fr/start-installation.md +++ b/docs/guide-fr/start-installation.md @@ -1,34 +1,64 @@ Installer Yii ============= -Vous pouvez installer Yii de deux façons, en utilisant [Composer](https://getcomposer.org/) ou en téléchargeant une archive. -La première méthode est conseillée, étant donné qu'elle permet d'installer de nouvelles [extensions](extend-creating-extensions.md) ou de mettre à jour Yii en éxécutant simplement une commande. +Vous pouvez installer Yii de deux façons, en utilisant le gestionnaire de paquets [Composer](https://getcomposer.org/) ou en téléchargeant une archive. +La première méthode est conseillée, étant donné qu'elle permet d'installer de nouvelles [extensions](extend-creating-extensions.md) ou de mettre Yii à jour en exécutant simplement une commande. -> Note: contrairement à Yii 1, les installations standards de Yii 2 auront pour résultat le téléchargement et l'installation du framework, ainsi que d'un squelette d'application. +Les installations standard de Yii provoquent le téléchargement et l'installation d'un modèle de projet. Un modèle de projet et un projet Yii fonctionnel qui met en œuvre quelques fonctionnalités de base, telles que la connexion, le formulaire de contact, etc. +Son code est organisé de la façon recommandée. En conséquence, c'est un bon point de départ pour vos propres projets. + +Dans cette section et quelques-unes de ses suivantes, nous décrirons comment installer Yii avec le modèle baptisé *Basic Project Template* (modèle de projet de base) et comment mettre en œuvre de nouvelles fonctionnalités sur cette base. Yii vous offre également un autre modèle de projet appelé [Advanced Project Template ](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide) (modèle de projet avancé) qui convient mieux à un environnement de développement en équipe impliquant des tiers multiples. + +> Note: le modèle de projet de base conviendra à 90 pourcent des application Web. Il diffère du modèle de projet avancé essentiellement sur la manière dont le code est organisé. Si vous débutez avec Yii, nous vous conseillons fortement de vous en tenir au modèle de projet de base pour sa simplicité tout en disposant des fonctionnalités suffisantes. Installer via Composer ---------------------- -Si vous n'avez pas déjà installé Composer, vous pouvez le faire en suivant les instructions sur le site [getcomposer.org](https://getcomposer.org/download/). -Sous Linux et Mac OS X, vous pouvez éxécuter les commandes : +###Installer Composer +Si vous n'avez pas déjà installé Composer, vous pouvez le faire en suivant les instructions du site [getcomposer.org](https://getcomposer.org/download/). +Sous Linux et Mac OS X, vous pouvez exécuter les commandes : + +```bash curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer +``` + +Sous Windows, téléchargez et exécutez [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). + +En cas de problèmes, consultez la [section Troubleshooting (résolution des problèmes) de la documentation de Composer](https://getcomposer.org/doc/articles/troubleshooting.md), + +Si vous débutez avec Composer, nous vous recommandons au minimum la lecture de la section [Basic usage (utilisation de base)](https://getcomposer.org/doc/01-basic-usage.md) de la documentation de Composer + +Dans ce guide, toutes les commandes de Composer suppose que vous avez installé Composer [globalement](https://getcomposer.org/doc/00-intro.md#globally) et qu'il est disponible par la commande `composer`. Si, au lieu de cela, vous utilisez `composer.phar` depuis un dossier local, vous devez adapter les exemples fournis en conséquence. -Sous Windows, téléchargez et éxécutez [Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). +Si Composer était déjà installé auparavant, assurez-vous d'utiliser une version à jour. Vous pouvez mettre Composer à jour avec la commande `composer self-update`. -Merci de consulter la [Documentation de Composer](https://getcomposer.org/doc/) en cas de problèmes, ou si vous souhaitez en savoir d'avantage sur l'utilisation de Composer. +> Note: durant l'installation de Yii, Composer aura besoin d'obtenir de nombreuses informations de l'API de Github. Le nombre de requêtes dépend du nombre de dépendances de votre application et peut excéder la **Github API rate limit**. Si vous arrivez à cette limite, Composer peut vous demander vos identifiants de connexion pour obtenir un jeton d'accès à l'API de Github. Avec une connexion rapide, vous pouvez atteindre cette limite plus vite que Composer n'est capable de gérer. C'est pourquoi, nous vous recommandons de configurer ce jeton d'accès avant d'installer Yii. +> Reportez-vous à la [documentation de Composer sur les jetons de l'API Github](https://getcomposer.org/doc/articles/troubleshooting.md#api-rate-limit-and-oauth-tokens) +> pour savoir comment procéder. -Avec Composer installé, vous pouvez installer Yii en éxécutant la commande suivante dans un dossier accessible via le Web : +###Installer Yii + +Avec Composer installé, vous pouvez installer le modèle de projet Yii en exécutant la commande suivante dans un dossier accessible via le Web : +```bash composer create-project --prefer-dist yiisoft/yii2-app-basic basic +``` + +Cette commande installera la dernière version stable du modèle de projet Yii dans le dossier `basic`. Vous êtes libre de choisir un autre dossier si vous le désirez. + +> Note: si la commande `composer create-project` échoue, reportez-vous à la section +> [Troubleshooting (résolution des problèmes) de la documentation de Composer](https://getcomposer.org/doc/articles/troubleshooting.md) +> pour les erreurs communes. Une fois l'erreur corrigée, vous pouvez reprendre l'installation avortée en exécutant `composer update` dans le dossier `basic` (ou celui que vous aviez choisi). -Cette commande installera Yii dans le dossier `basic`. > Tip: si vous souhaitez installer la dernière version de développement de Yii, vous pouvez utiliser la commande suivante qui ajoutera l'[option stability](https://getcomposer.org/doc/04-schema.md#minimum-stability) : > -> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic +>```bash +> composer create-project --prefer-dist --stability=dev yiisoft/yii2-app-basic basic +>``` > > Notez que la version de développement de Yii ne doit pas être utilisée en production, vu qu'elle pourrait *casser* votre code existant. @@ -36,34 +66,73 @@ Cette commande installera Yii dans le dossier `basic`. Installer depuis une archive ---------------------------- -Installer Yii depuis une archive se fait en deux étapes : +Installer Yii depuis une archive se fait en trois étapes : -1. Téléchargez l'archive sur le site [yiiframework.com](http://www.yiiframework.com/download/). -2. Décompressez l'archive dans un dossier accessible via le Web. +1. Télécharger l'archive sur le site [yiiframework.com](http://www.yiiframework.com/download/). +2. Décompresser l'archive dans un dossier accessible via le Web. +3. Modifier le fichier `config/web.php` en entrant une clé secrète pour la configuration de `cookieValidationKey` (cela est fait automatiquement si vous installez Yii avec Composer) : + + ```php + // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation + 'cookieValidationKey' => 'enter your secret key here', + ``` Autres options d'installation ----------------------------- -Les instructions d'installation ci-dessus montrent comment installer Yii, ce qui installe également une application Web de base qui fonctionne *out of the box*. -Cette approche est un bon point de départ pour les petits projets, ou pour quand vous commencer à apprendre Yii. +Les instructions d'installation ci-dessus montrent comment installer Yii, ce qui installe également une application Web de base qui fonctionne *out of the box* (sans configuration supplémentaire). +Cette approche est un bon point de départ pour les petits projets, en particulier si vous débutez avec Yii. Mais il y a d'autres options d'installation disponibles : -* Si vous voulez installer uniquement le framework et que vous souhaitez créer une application à partir de zéro, vous pouvez suivre les instructions dans la partie [Construire une application à partir de zéro](tutorial-start-from-scratch.md). -* Si vous voulez commencer par une application plus sophistiquée, mieux adaptée aux environnements d'équipe de développement, vous pouvez envisager l'installation du [Modèle d'application avancée](tutorial-advanced-app.md). +* Si vous voulez installer uniquement le framework et que vous souhaitez créer une application à partir de zéro, vous pouvez suivre les instructions dans la partie [Créer votre propre structure d'application](tutorial-start-from-scratch.md). +* Si vous voulez commencer par une application plus sophistiquée, mieux adaptée aux environnements d'équipe de développement, vous pouvez envisager l'installation du [Modèle d'application avancée](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/README.md). + +Installer les Assets (ici bibliothèques CSS et JavaScript) +----------------- + +Yii s'appuie sur les paquets [Bower](http://bower.io/) et/ou [NPM](https://www.npmjs.org/) pour l'installation des bibliothèques CSS et JavaScript. + +Il utilise Composer pour les obtenir, permettant ainsi aux versions de paquet de PHP et à celles de CSS/JavaScript, d'être résolues en même temps. +Cela peut être obtenue soit en utilisant [asset-packagist.org](https://asset-packagist.org) ou [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/). +Reportez-vous à la documentation sur les [Assets](structure-assets.md) pour plus de détail. + +Vous pouvez souhaiter gérer vos « assets », soit via le client natif Bower/NPM, soit via CDN, soit éviter totalement leur installation. +Afin d'empêcher l'installation des « assets » via Composer, ajoutez les lignes suivantes à votre fichier 'composer.json' : + +```json +"replace": { + "bower-asset/jquery": ">=1.11.0", + "bower-asset/inputmask": ">=3.2.0", + "bower-asset/punycode": ">=1.3.0", + "bower-asset/yii2-pjax": ">=2.0.0" +}, +``` + +> Note: en cas de neutralisation de l'installation des « assets » via Composer, c'est à vous d'en assurer l'installation et de résoudre les problèmes de collision de versions. Attendez-vous à des incohérences possibles parmi les fichiers d'assets issus de vos différentes extensions. Vérifier l'installation ----------------------- -Après l'installation, vous pouvez utiliser votre navigateur pour accéder à l'application Yii avec l'URL suivante : +Après l'installation, vous pouvez, soit configurer votre serveur Web (voir section suivante), soit utiliser le [serveur PHP web incorporé](https://secure.php.net/manual/fr/features.commandline.webserver.php) en utilisant la commande en console suivante depuis le dossier `web` de votre projet : + +```bash +php yii serve +``` + +> Note: par défaut le serveur HTTP écoute le port 8080. Néanmoins, si ce port est déjà utilisé ou si vous voulez servir plusieurs applications de cette manière, vous pouvez spécifier le port à utiliser en ajoutant l'argument --port à la commande : + +```bash +php yii serve --port=8888 +``` +Pour accéder à l'application Yii pointez votre navigateur sur l'URL suivante : ``` -http://localhost/basic/web/index.php +http://localhost:8080/ ``` -Cette URL suppose que vous avez installé Yii dans un dossier nommé `basic`, directement dans le dossier racine du serveur Web, et que le serveur Web est en cours d'exécution sur votre machine locale (`localhost`). Vous devrez peut-être ajuster cette URL à votre environnement d'installation. ![Successful Installation of Yii](images/start-app-installed.png) @@ -72,12 +141,12 @@ Vous devriez voir dans votre navigateur la page ci-dessus. Sinon, merci de véri * Utilisez un navigateur pour accéder à l'URL `http://localhost/basic/requirements.php` * Exécutez les commandes suivantes: - ``` + ```bash cd basic php requirements.php ``` -Vous devez configurer votre installation de PHP afin qu'elle réponde aux exigences minimales de Yii. Le plus important étant que vous ayez PHP 5.4 ou plus. Si votre application a besoin d'une base de données, vous devez également installer l'[extension PHP PDO](http://www.php.net/manual/en/pdo.installation.php) ainsi qu'un pilote correspondant à votre système de base de données (par exemple `pdo_mysql` pour MySQL). +Vous devez configurer votre installation de PHP afin qu'elle réponde aux exigences minimales de Yii. Le plus important étant que vous ayez PHP 5.4 ou plus, idéalement PHP 7. Si votre application a besoin d'une base de données, vous devez également installer l'[extension PHP PDO](http://www.php.net/manual/fr/pdo.installation.php) ainsi qu'un pilote correspondant à votre système de base de données (par exemple `pdo_mysql` pour MySQL). Configuration du serveur Web @@ -85,25 +154,29 @@ Configuration du serveur Web > Note: si vous voulez juste tester Yii sans intention de l'utiliser sur un serveur de production, vous pouvez ignorer ce paragraphe. -L'application installée selon les instructions ci-dessus devrait fonctionner *out of the box* avec le [serveur HTTP Apache](http://httpd.apache.org/) ou le [serveur HTTP Nginx](http://nginx.org/), sous Windows, Mac OX X, ou linux. +L'application installée selon les instructions ci-dessus devrait fonctionner *out of the box* (sans configuration supplémentaire) avec le [serveur HTTP Apache](http://httpd.apache.org/) ou le [serveur HTTP Nginx](http://nginx.org/), sous Windows, Mac OX X, ou Linux avec PHP 5.4 ou plus récent. Yii 2.0 est aussi compatible avec +[HHVM](http://hhvm.com/) de Facebook. Cependant, il existe des cas marginaux pour lesquels HHVM se comporte différemment du PHP natif; c'est pourquoi vous devez faire plus attention en utilisant HHVM.. Sur un serveur de production, vous pouvez configurer votre serveur Web afin que l'application soit accessible via l'URL `http://www.example.com/index.php` au lieu de `http://www.example.com/basic/web/index.php`. Cela implique que le dossier racine de votre serveur Web pointe vers le dossier `basic/web`. Vous pouvez également cacher `index.php` dans l'URL, comme décrit dans la partie [Génération et traitement des URL](runtime-url-handling.md), vous y apprendrez comment configurer votre serveur Apache ou Nginx pour atteindre ces objectifs. > Note: en utilisant `basic/web` comme dossier racine, vous empêchez également aux utilisateurs finaux d'accéder à votre code d'application privé et fichiers de données sensibles qui sont stockés dans le dossier `basic`. Refuser l'accès à ces ressources est une amélioration de la sécurité. -> Note: si votre application s'exécute dans un environnement d'hébergement mutualisé où vous n'avez pas la permission de modifier la configuration du serveur Web, vous pouvez ajuster la structure de votre application pour une meilleure sécurité. Merci de lire la partie [Environnement d'hébergement mutualisé](tutorial-shared-hosting.md) pour en savoir plus. +> Note: si votre application s'exécute dans un environnement d'hébergement mutualisé où vous n'avez pas la permission de modifier la configuration du serveur Web, vous pouvez ajuster la structure de votre application pour une meilleure sécurité. Reportez-vous à la partie [Environnement d'hébergement mutualisé](tutorial-shared-hosting.md) pour en savoir plus. +> Note: si vous exécutez votre application Yii derrière un mandataire inverse, vous pourriez avoir besoin de configurer les +> [mandataires de confiance et entêtes](runtime-requests.md#trusted-proxies) dans le composant « request ». ### Configuration Apache recommandée -Utilisez la configuration suivante dans `httpd.conf`, ou dans la configuration de votre hôte virtuel. Notez que vous devez remplacer `path/to/basic/web` par le chemin vers le dossier `basic/web`. +Utilisez la configuration suivante dans le fichier `httpd.conf`, ou dans la configuration de votre hôte virtuel. Notez que vous devez remplacer `path/to/basic/web` par le chemin vers le dossier `basic/web`. -``` +```apache # Configuration du dossier racine DocumentRoot "path/to/basic/web" + # utiliser mod_rewrite pour la prise en charge des URL élégantes ("pretty URL") RewriteEngine on # Si le dossier ou fichier existe, répondre directement @@ -112,6 +185,9 @@ DocumentRoot "path/to/basic/web" # Sinon on redirige vers index.php RewriteRule . index.php + # si $showScriptName est à "false" dans UrlManager, ne pas autoriser l'accès aux URL incluant le nom du script + RewriteRule ^index.php/ - [L,R=404] + # ...other settings... ``` @@ -122,32 +198,37 @@ DocumentRoot "path/to/basic/web" Pour utiliser Nginx, vous devez avoir installé PHP en utilisant [FPM SAPI](http://php.net/install.fpm). Utilisez la configuration Nginx suivante, en remplaçant `path/to/basic/web` par le chemin vers le dossier `basic/web` et `mysite.test` par le nom d'hôte de votre serveur. -``` +```nginx server { charset utf-8; client_max_body_size 128M; - listen 80; ## port pour ipv4 - #listen [::]:80 default_server ipv6only=on; ## port pour ipv6 + listen 80; ## listen for ipv4 + #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 server_name mysite.test; root /path/to/basic/web; index index.php; - access_log /path/to/basic/log/access.log main; + access_log /path/to/basic/log/access.log; error_log /path/to/basic/log/error.log; location / { - # Test fichier/dossier, sinon redirection vers index.php - try_files $uri $uri/ /index.php?$args; + # Rediriger tout ce qui n'est pas un fichier réel index.php + try_files $uri $uri/ /index.php$is_args$args; } - # décommentez ces lignes pour évitez que Yii ne gère les requêtes vers des fichiers statiques inexistants + # enlevez les commentaires de ces lignes pour évitez que Yii ne gère les requêtes vers des fichiers statiques inexistants #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ { # try_files $uri =404; #} #error_page 404 /404.html; + + # refuser l'accès aux fichiers php pour le dossier /assets + location ~ ^/assets/.*\.php$ { + deny all; + location ~ \.php$ { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; diff --git a/docs/guide-fr/start-prerequisites.md b/docs/guide-fr/start-prerequisites.md new file mode 100644 index 00000000000..c0ccc8a9c7a --- /dev/null +++ b/docs/guide-fr/start-prerequisites.md @@ -0,0 +1,19 @@ +# Que devez-vous connaître + +La courbe d'apprentissage de Yii n’est pas aussi raide que celle des autres framework. Cependant, il y a un certain nombre de choses que vous devriez connaître avant de vous lancer avec Yii. + +## PHP + +Yii un framework (base structurée de développement) en PHP. C’est pourquoi vous devez vous assurer de [maîtriser ce langage en comprenant sa référence](http://php.net/manual/fr/langref.php). +Lors de votre développement avec Yii, vous écrirez du code dans le style « orienté objet ». Vous devez donc être familiarisé avec les [Classes et Objets](https://secure.php.net/manual/fr/language.oop5.basic.php), ainsi qu'avec les [espaces de noms](https://secure.php.net/manual/fr/language.namespaces.php). + +## Programmation orientée Objet + +Une compréhension de base de la programmation orientée objet est requise. Si vous n’êtes pas familiarisé avec elle, orientez-vous vers l’un des nombreux tutoriels disponibles tels que [celui de tuts+](https://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762). + +Notez que plus votre application sera complexe, plus vous devrez en savoir pour gérer cette complexité avec succès. + +## Ligne de commande et composer + +Yii utilise abondamment le gestionnaire de paquet [Composer](https://getcomposer.org/) qui est un standard de fait. Vous devez donc lire et comprendre son [guide](https://getcomposer.org/doc/01-basic-usage.md). Si vous n’êtes pas encore familiarisé avec la ligne de commande, c’est le moment de vous y essayer. Une fois les bases acquises, vous ne saurez plus vous en passer. + From 9d03667b40e8727e50f692ee6164d8a201130ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9A=D0=B0=D1=81=D1=8C=D1=8F=D0=BD=D0=BE=D0=B2?= Date: Sat, 28 Jul 2018 20:50:22 +0500 Subject: [PATCH 194/902] Fixes #16527: Fixed return content for `\yii\widgets\ActiveForm::run()` --- framework/CHANGELOG.md | 2 +- framework/widgets/ActiveForm.php | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 2526525ab66..81193184b1d 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -3,7 +3,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ - +- Bug #16527: Fixed return content for `\yii\widgets\ActiveForm::run()` (carono) - Bug #15826: Fixed JavaScript compareValidator in `yii.validation.js` for attributes not in rules (mgrechanik) - Enh #16365: Added $filterOnFocusOut option for GridView (s1lver) - Enh #14289: Added `yii\db\Command::executeResetSequence()` to work with Oracle (CedricYii) diff --git a/framework/widgets/ActiveForm.php b/framework/widgets/ActiveForm.php index 7da1da90ce1..1d5fdc6dbe4 100644 --- a/framework/widgets/ActiveForm.php +++ b/framework/widgets/ActiveForm.php @@ -221,14 +221,15 @@ public function run() } $content = ob_get_clean(); - echo Html::beginForm($this->action, $this->method, $this->options); - echo $content; + $html = Html::beginForm($this->action, $this->method, $this->options); + $html .= $content; if ($this->enableClientScript) { $this->registerClientScript(); } - echo Html::endForm(); + $html .= Html::endForm(); + return $html; } /** From 4b772f1bd061ed527a6e04719ee130710aabddc9 Mon Sep 17 00:00:00 2001 From: jaaf Date: Sat, 28 Jul 2018 17:52:12 +0200 Subject: [PATCH 195/902] Intro yii some minor changes (#16566) [skip ci] --- docs/guide-fr/intro-yii.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/guide-fr/intro-yii.md b/docs/guide-fr/intro-yii.md index 6cb94cf2f8f..32ce2e5d073 100644 --- a/docs/guide-fr/intro-yii.md +++ b/docs/guide-fr/intro-yii.md @@ -1,32 +1,32 @@ -Qu'est ce que Yii +Qu'est ce que Yii ? ================= Yii est un framework PHP hautes performances à base de composants qui permet de développer rapidement des applications Web modernes. -Le nom Yii (pronnoncée `Yee` ou `[ji:]`) signifie "simple et évolutif" en Chinois. Il peut également +Le nom Yii (prononcer `Yee` ou `[ji:]`) signifie "simple et évolutif" en Chinois. Il peut également être considéré comme un acronyme de **Yes It Is**! -Pour quel usage Yii est il optimal? +Pour quel usage Yii est il optimal ? ----------------------------------- Yii est un framework Web générique, c'est à dire qu'il peut être utilisé pour développer tous types d'applications Web basées sur PHP. De par son architecture à base de composants et son système de cache sophistiqué, il est particulièrement adapté au développement d'applications à forte audience telles que des portails, des forums, -des systèmes de gestion de contenu (CMS), des sites e-commerce, services Web RESTFul, etc. +des systèmes de gestion de contenu (CMS), des sites e-commerce, des services Web RESTFul, etc. -Comment se positionne Yii vis-à-vis des autres Frameworks? +Comment se positionne Yii vis-à-vis des autres Frameworks ? ---------------------------------------------------------- -- Comme la plupart des frameworks PHP, Yii est basé sur le modèle de conception MVC et encourage une +- Comme la plupart des frameworks PHP, Yii est basé sur le modèle de conception MVC (Modèle-Vue-Contrôleur) et encourage à une organisation du code basée sur ce modèle. - Yii repose sur l'idée que le code doit être écrit de façon simple et élégante. Il ne sera jamais question de -surcharger le code de Yii uniquement pour respecter un modèle de conception. +compliquer le code de Yii uniquement pour respecter un modèle de conception. - Yii est un framework complet offrant de nombreuses caractéristiques éprouvées et prêtes à l'emploi, telles que: -constructeur de requêtes et ActiveRecord, à la fois pour les bases de données relationnelles et NoSQL; support RESTful API; -support cache multi-niveaux; et plus. +constructeur de requêtes et ActiveRecord, à la fois pour les bases de données relationnelles et NoSQL; prise en charge RESTful API; +prise en charge de caches multi-niveaux; et plus. - Yii est extrêmement flexible. Vous pouvez personnaliser ou remplacer presque chaque partie du code du noyau. Vous pouvez également -profiter de son architecture extensible solide, afin d'utiliser ou développer des extensions redistribuables. +profiter de son architecture extensible solide, afin d'utiliser ou développer des extensions distribuables. - La haute performance est toujours un des principaux objectifs de Yii. Yii n'est pas un one-man show, il est soutenu par une [solide équipe de développement du noyau][about_yii] ainsi que d'une grande communauté @@ -40,9 +40,7 @@ via des interfaces simples et élégantes. Versions de Yii --------------- -Yii a actuellement deux versions majeures disponibles : 1.1 et 2.0. La version 1.1 est l'ancienne génération et est maintenant en mode maintenance. La version 2.0 est une réécriture complète de Yii, adoptant les dernières -technologies et protocoles, y compris Composer, PSR, les espaces de noms, les traits, et ainsi de suite. la version 2.0 est la dernière -génération du framework et recevra nos principaux efforts de développement dans les prochaines années. +Yii est actuellement disponible en deux versions majeures : 1.1 et 2.0. La version 1.1, l'ancienne génération, est désormais en mode maintenance. La version 2.0 est une réécriture complète de Yii, adoptant les dernières technologies et protocoles, y compris Composer, PSR, les espaces de noms, les traits, et ainsi de suite. La version 2.0 est la dernière génération du framework et recevra nos principaux efforts de développement dans les prochaines années. Ce guide est principalement pour la version 2.0. From bf5476f253633925a5dfb51dda1f286081d578ce Mon Sep 17 00:00:00 2001 From: Alexey Date: Sat, 28 Jul 2018 19:07:09 +0300 Subject: [PATCH 196/902] Fixes #15889: Fixed override `yii\helpers\Html::setActivePlaceholder` --- framework/CHANGELOG.md | 1 + framework/helpers/BaseHtml.php | 4 ++-- tests/framework/helpers/HtmlTest.php | 28 ++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 81193184b1d..f2ef76f41ce 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -40,6 +40,7 @@ Yii Framework 2 Change Log - Chg #16192: `yii\db\Command::logQuery()` is now protected, extracted `getCacheKey()` from `queryInternal()` (drlibra) - Bug #16377: Fixed `yii\base\Event:off()` undefined index error when event handler does not match (razvanphp) - Bug #16514: Fixed `yii\di\Container::resolveCallableDependencies` to support callable object (wi1dcard) +- Bug #15889: Fixed override `yii\helpers\Html::setActivePlaceholder` (lesha724) 2.0.15.1 March 21, 2018 ----------------------- diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index fdf5b1b4323..eb0226a8b50 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -1325,7 +1325,7 @@ public static function activeInput($type, $model, $attribute, $options = []) $options['id'] = static::getInputId($model, $attribute); } - self::setActivePlaceholder($model, $attribute, $options); + static::setActivePlaceholder($model, $attribute, $options); return static::input($type, $name, $value, $options); } @@ -1502,7 +1502,7 @@ public static function activeTextarea($model, $attribute, $options = []) $options['id'] = static::getInputId($model, $attribute); } self::normalizeMaxLength($model, $attribute, $options); - self::setActivePlaceholder($model, $attribute, $options); + static::setActivePlaceholder($model, $attribute, $options); return static::textarea($name, $value, $options); } diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index e00b1f15c58..8e4923e5b6a 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -1729,6 +1729,34 @@ public function testActiveTextInput_placeholderFillFromModelTabular() $this->assertContains('placeholder="Name"', $html); } + public function testOverrideSetActivePlaceholder() + { + $model = new HtmlTestModel(); + + $html = MyHtml::activeTextInput($model, 'name', ['placeholder' => true]); + + $this->assertContains('placeholder="My placeholder: Name"', $html); + } +} + +/** + * Class MyHtml + * @package yiiunit\framework\helpers + */ +class MyHtml extends Html{ + + /** + * @param \yii\base\Model $model + * @param string $attribute + * @param array $options + */ + protected static function setActivePlaceholder($model, $attribute, &$options = []) + { + if (isset($options['placeholder']) && $options['placeholder'] === true) { + $attribute = static::getAttributeName($attribute); + $options['placeholder'] = 'My placeholder: '. $model->getAttributeLabel($attribute); + } + } } /** From 101b26c0f44c983b6b32279b9836cef1d24f20a3 Mon Sep 17 00:00:00 2001 From: teo1978 Date: Sat, 28 Jul 2018 18:47:17 +0200 Subject: [PATCH 197/902] Update start-workflow.md (#16573) [skip ci] It's not only possible, but quite normal, that an action loads more than one data model. Using the singular, suggesting that it (necessarily or typically) loads only one model, is confusing. You may want to consider these alternatives: - "The action loads zero or more data models" - "The action optionally loads one or more data models" but I guess "some models" is clear enough. --- docs/guide/start-workflow.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/start-workflow.md b/docs/guide/start-workflow.md index bd91e739de8..454b07e2de3 100644 --- a/docs/guide/start-workflow.md +++ b/docs/guide/start-workflow.md @@ -95,8 +95,8 @@ The following diagram shows how an application handles a request. 5. The controller creates an [action](structure-controllers.md) instance and performs the filters for the action. 6. If any filter fails, the action is cancelled. 7. If all filters pass, the action is executed. -8. The action loads a data model, possibly from a database. -9. The action renders a view, providing it with the data model. +8. The action loads some data models, possibly from a database. +9. The action renders a view, providing it with the data models. 10. The rendered result is returned to the [response](runtime-responses.md) application component. 11. The response component sends the rendered result to the user's browser. From 708b18fbcf39158d4618f244cde1b1fa91f14cdd Mon Sep 17 00:00:00 2001 From: jaaf Date: Sun, 29 Jul 2018 13:47:45 +0200 Subject: [PATCH 198/902] =?UTF-8?q?Jaaf=2028=207=20b=20synchronize=20fr/st?= =?UTF-8?q?art-workflow.md=20with=20EN=C2=A0version=20(#16574)=20[skip=20c?= =?UTF-8?q?i]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guide-fr/start-databases.md | 57 +++++++++++----------- docs/guide-fr/start-gii.md | 72 ++++++++++------------------ docs/guide-fr/start-looking-ahead.md | 39 ++++++++------- docs/guide-fr/start-workflow.md | 41 ++++++++-------- 4 files changed, 94 insertions(+), 115 deletions(-) diff --git a/docs/guide-fr/start-databases.md b/docs/guide-fr/start-databases.md index 666b9d132be..23e4158983b 100644 --- a/docs/guide-fr/start-databases.md +++ b/docs/guide-fr/start-databases.md @@ -1,4 +1,4 @@ -Travailler avec les bases de données +Travailler avec des bases de données ====================== Cette section décrit comment créer une nouvelle page qui affiche des données pays récupérées dans une table de base @@ -10,22 +10,21 @@ Au long de ce tutoriel, vous apprendrez comment : * Configurer une connexion à une base de données * Définir une classe Active Record -* Requêter des données en utilisant la classe Active Record +* Demander des données en utilisant la classe Active Record (enregistrement actif) * Afficher des données dans une vue paginée -Notez que pour finir cette section, vous aurez besoin d'avoir une connaissance basique des bases de données. -En particulier, vous devez savoir créer une base de données, et exécuter des déclarations SQL en utilisant un client de +Notez que, pour finir cette section, vous aurez besoin d'avoir une connaissance basique des bases de données. +En particulier, vous devez savoir créer une base de données et exécuter des déclarations SQL en utilisant un client de gestion de bases de données. Préparer la Base de Données -------------------- -Pour commencer, créez une base de données appelée `yii2basic`, depuis laquelle vous irez chercher les données dans -votre application. -Vous pouvez créer une base de données SQLite, MySQL, PostgreSQL, MSSQL ou Oracle, car Yii gère nativement de nombreuses -applications de base de données. Par simplicité, nous supposerons que vous utilisez MySQL dans les descriptions qui -suivent. +Pour commencer, créez une base de données appelée `yii2basic`, depuis laquelle vous irez chercher les données dans votre application. +Vous pouvez créer une base de données SQLite, MySQL, PostgreSQL, MSSQL ou Oracle, car Yii gère nativement de nombreuses applications de base de données. Pour simplifier, nous supposerons que vous utilisez MySQL dans les descriptions qui suivent. + +>Note : bien que MariaDB a été un remplacement direct de MySQL, cela n'est plus complètement vrai. Dans le cas où vous auriez besoin de fonctionnalités avancées telles que la prise en charge de `JSON`, jetez un coup d'œil à la liste des extensions de MariaDB ci-dessous. Créez maintenant une table nommée `country` dans la base de données et insérez-y quelques données exemples. Vous pouvez exécuter l'instruction SQL suivante pour le faire : @@ -48,15 +47,14 @@ INSERT INTO `country` VALUES ('RU','Russia',146519759); INSERT INTO `country` VALUES ('US','United States',322976000); ``` -Vous avez désormais une base de données appelée `yii2basic` conmprenant une table `country` comportant trois colonnes et contenant dix lignes de données. +Vous avez désormais une base de données appelée `yii2basic` comprenant une table `country` comportant trois colonnes et contenant dix lignes de données. Configurer une Connexion à la BDD --------------------------- Avant de continuer, vérifiez que vous avez installé à la fois l'extension PHP [PDO](http://www.php.net/manual/fr/book.pdo.php) et le pilote PDO pour la base de données que vous utilisez (c'est -à dire `pdo_mysql` pour MySQL). C'est une exigence de base si votre application utilise une base de données -relationnelle. +à dire `pdo_mysql` pour MySQL). C'est une exigence de base si votre application utilise une base de données relationnelle. Une fois ces éléments installés, ouvrez le fichier `config/db.php` et modifiez les paramètres pour qu'ils correspondent à votre base de données. Par défaut, le fichier contient ce qui suit : @@ -72,18 +70,20 @@ return [ ]; ``` -Le fichier `config/db.php` est un exemple type d'outil de [configuration](concept-configurations.md) basé sur un -fichier. Ce fichier de configuration en particulier spécifie les paramètres nécessaires à la création et -l'initialisation d'une instance de [[yii\db\Connection]] grâce à laquelle vous pouvez effectuer des requêtes SQL -dans la base de données sous-jacente. +Le fichier `config/db.php` est un exemple type d'outil de [configuration](concept-configurations.md) basé sur un fichier. Ce fichier de configuration en particulier spécifie les paramètres nécessaires à la création et l'initialisation d'une instance de [[yii\db\Connection]] grâce à laquelle vous pouvez effectuer des requêtes SQL dans la base de données sous-jacente. -On peut accéder à connexion à la BDD configurée ci-dessus depuis le code de l'application vial'expression -`Yii::$app->db`. +On peut accéder à connexion à la BDD configurée ci-dessus depuis le code de l'application via l'expression `Yii::$app->db`. > Info: le fichier `config/db.php` sera inclus par la configuration principale de l'application `config/web.php`, - qui spécifie comment l'instante d'[application](structure-applications.md) doit être initialisée. + qui spécifie comment l'instance d'[application](structure-applications.md) doit être initialisée. Pour plus d'informations, reportez-vous à la section [Configurations](concept-configurations.md). +Si vous avez besoin de fonctionnalités de base de données dont la prise en charge n'est pas comprise dans Yii, examinez les extensions suivantes: + +- [Informix](https://github.com/edgardmessias/yii2-informix) +- [IBM DB2](https://github.com/edgardmessias/yii2-ibm-db2) +- [Firebird](https://github.com/edgardmessias/yii2-firebird) +- [MariaDB](https://github.com/sam-it/yii2-mariadb) Créer un Active Record ------------------------- @@ -102,8 +102,7 @@ class Country extends ActiveRecord } ``` -La classe `Country` étend [[yii\db\ActiveRecord]]. Vous n'avez pas besoin d'y écrire le moindre code ! Simplement, avec -le code ci-dessus, Yii devine le nom de la table associée au nom de la classe. +La classe `Country` étend [[yii\db\ActiveRecord]]. Vous n'avez pas besoin d'y écrire le moindre code ! Simplement, avec le code ci-dessus, Yii devine le nom de la table associée au nom de la classe. > Info: si aucune correspondance directe ne peut être faite à partir du nom de la classe, vous pouvez outrepasser la méthode [[yii\db\ActiveRecord::tableName()]] pour spécifier explicitement un nom de table. @@ -126,10 +125,8 @@ $country->name = 'U.S.A.'; $country->save(); ``` -> Info: Active Record est un moyen puissant pour accéder et manipuler des données d'une base de manière orientée objet. -Vous pouvez trouver plus d'informations dans la section [Active Record](db-active-record.md). Sinon, vous pouvez -également interagir avec une base de données en utilisant une méthode de plus bas niveau d'accès aux données appelée -[Data Access Objects](db-dao.md). +> Info: Active Record (enregistrement actif) est un moyen puissant pour accéder et manipuler des données d'une base de manière orientée objet. +Vous pouvez trouver plus d'informations dans la section [Active Record](db-active-record.md). Sinon, vous pouvez également interagir avec une base de données en utilisant une méthode de plus bas niveau d'accès aux données appelée [Database Access Objects](db-dao.md). Créer une Action @@ -204,7 +201,7 @@ use yii\widgets\LinkPager;