Browse Source

Merge branch 'master' into 9899-cache-bug

9899-cache-bug
Alexander Makarov 4 years ago committed by GitHub
parent
commit
20e0c8e1f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .appveyor.yml
  2. 2
      .github/FUNDING.yml
  3. 2
      .github/SECURITY.md
  4. 24
      .github/move.yml
  5. 113
      .github/workflows/build.yml
  6. 103
      .github/workflows/ci-mssql.yml
  7. 80
      .github/workflows/ci-mysql.yml
  8. 91
      .github/workflows/ci-oracle.yml
  9. 84
      .github/workflows/ci-pgsql.yml
  10. 1
      .gitignore
  11. 5
      .gitlab-ci.yml
  12. 1
      .scrutinizer.yml
  13. 223
      .travis.yml
  14. 4
      Dockerfile
  15. 3
      README.md
  16. 3
      build/controllers/DevController.php
  17. 2
      build/controllers/MimeTypeController.php
  18. 78
      build/controllers/PhpDocController.php
  19. 2
      build/controllers/ReleaseController.php
  20. 6
      build/controllers/TranslationController.php
  21. 18
      composer.json
  22. 886
      composer.lock
  23. 2
      docs/guide-fr/concept-di-container.md
  24. 2
      docs/guide-fr/runtime-requests.md
  25. 5
      docs/guide-fr/start-installation.md
  26. 2
      docs/guide-fr/structure-filters.md
  27. 62
      docs/guide-ja/concept-di-container.md
  28. 18
      docs/guide-ja/db-dao.md
  29. 26
      docs/guide-ja/db-query-builder.md
  30. 8
      docs/guide-ja/helper-html.md
  31. 4
      docs/guide-ja/input-validation.md
  32. 1
      docs/guide-ja/output-data-widgets.md
  33. 4
      docs/guide-ja/rest-quick-start.md
  34. 4
      docs/guide-ja/rest-resources.md
  35. 2
      docs/guide-ja/rest-response-formatting.md
  36. 4
      docs/guide-ja/runtime-logging.md
  37. 24
      docs/guide-ja/runtime-requests.md
  38. 6
      docs/guide-ja/runtime-sessions-cookies.md
  39. 11
      docs/guide-ja/start-databases.md
  40. 2
      docs/guide-ja/start-hello.md
  41. 90
      docs/guide-ja/start-installation.md
  42. 2
      docs/guide-ja/start-looking-ahead.md
  43. 9
      docs/guide-ja/tutorial-mailing.md
  44. 2
      docs/guide-ja/tutorial-performance-tuning.md
  45. 4
      docs/guide-pl/input-validation.md
  46. 1
      docs/guide-pl/start-forms.md
  47. 4
      docs/guide-ru/caching-data.md
  48. 2
      docs/guide-ru/caching-fragment.md
  49. 6
      docs/guide-ru/caching-http.md
  50. 2
      docs/guide-ru/caching-page.md
  51. 2
      docs/guide-ru/concept-aliases.md
  52. 2
      docs/guide-ru/concept-autoloading.md
  53. 2
      docs/guide-ru/concept-behaviors.md
  54. 2
      docs/guide-ru/concept-configurations.md
  55. 9
      docs/guide-ru/concept-di-container.md
  56. 2
      docs/guide-ru/concept-events.md
  57. 2
      docs/guide-ru/concept-service-locator.md
  58. 12
      docs/guide-ru/db-active-record.md
  59. 6
      docs/guide-ru/db-dao.md
  60. 10
      docs/guide-ru/db-migrations.md
  61. 20
      docs/guide-ru/db-query-builder.md
  62. 14
      docs/guide-ru/glossary.md
  63. 4
      docs/guide-ru/helper-array.md
  64. 12
      docs/guide-ru/helper-html.md
  65. 4
      docs/guide-ru/helper-url.md
  66. 2
      docs/guide-ru/input-form-javascript.md
  67. 6
      docs/guide-ru/input-forms.md
  68. 8
      docs/guide-ru/intro-upgrade-from-v1.md
  69. 2
      docs/guide-ru/intro-yii.md
  70. 4
      docs/guide-ru/output-data-providers.md
  71. 2
      docs/guide-ru/rest-error-handling.md
  72. 4
      docs/guide-ru/rest-resources.md
  73. 2
      docs/guide-ru/rest-response-formatting.md
  74. 2
      docs/guide-ru/rest-routing.md
  75. 4
      docs/guide-ru/runtime-logging.md
  76. 8
      docs/guide-ru/runtime-requests.md
  77. 8
      docs/guide-ru/runtime-responses.md
  78. 4
      docs/guide-ru/runtime-routing.md
  79. 6
      docs/guide-ru/security-authorization.md
  80. 2
      docs/guide-ru/start-forms.md
  81. 6
      docs/guide-ru/start-hello.md
  82. 14
      docs/guide-ru/structure-applications.md
  83. 28
      docs/guide-ru/structure-assets.md
  84. 6
      docs/guide-ru/structure-controllers.md
  85. 8
      docs/guide-ru/structure-models.md
  86. 2
      docs/guide-ru/structure-modules.md
  87. 4
      docs/guide-ru/test-environment-setup.md
  88. 8
      docs/guide-ru/test-fixtures.md
  89. 2
      docs/guide-ru/test-overview.md
  90. 3
      docs/guide-ru/test-unit.md
  91. 4
      docs/guide-ru/tutorial-i18n.md
  92. 6
      docs/guide-ru/tutorial-performance-tuning.md
  93. 2
      docs/guide-ru/tutorial-yii-as-micro-framework.md
  94. 2
      docs/guide-vi/intro-yii.md
  95. 8
      docs/guide-zh-CN/README.md
  96. 4
      docs/guide-zh-CN/concept-di-container.md
  97. 6
      docs/guide-zh-CN/concept-properties.md
  98. 2
      docs/guide-zh-CN/rest-response-formatting.md
  99. 4
      docs/guide-zh-CN/test-environment-setup.md
  100. 63
      docs/guide/concept-di-container.md
  101. Some files were not shown because too many files have changed in this diff Show More

1
.appveyor.yml

@ -1,6 +1,5 @@
build: false
version: dev-{build}
shallow_clone: true
clone_folder: C:\projects\yii2
environment:

2
.github/FUNDING.yml

@ -1,3 +1,5 @@
# These are supported funding model platforms
open_collective: yiisoft
github: [yiisoft]
tidelift: "packagist/yiisoft/yii2"

2
.github/SECURITY.md

@ -3,4 +3,4 @@
Please use the [security issue form](https://www.yiiframework.com/security) to report to us any security issue you find in Yii.
DO NOT use the issue tracker or discuss it in the public forum as it will cause more damage than help.
Please note that as a non-commerial OpenSource project we are not able to pay bounties at the moment.
Please note that as a non-commercial OpenSource project we are not able to pay bounties at the moment.

24
.github/move.yml

@ -1,24 +0,0 @@
# Configuration for move-issues - https://github.com/dessant/move-issues
# Delete the command comment when it contains no other content
deleteCommand: true
# Close the source issue after moving
closeSourceIssue: true
# Lock the source issue after moving
lockSourceIssue: false
# Mention issue and comment authors
mentionAuthors: true
# Preserve mentions in the issue content
keepContentMentions: false
# Set custom aliases for targets
# aliases:
# r: repo
# or: owner/repo
# Repository to extend settings from
# _extends: repo

113
.github/workflows/build.yml

@ -0,0 +1,113 @@
name: build
on: [push, pull_request]
env:
DEFAULT_COMPOSER_FLAGS: "--prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi"
PHPUNIT_EXCLUDE_GROUP: mssql,oci,wincache,xcache,zenddata,cubrid
XDEBUG_MODE: coverage, develop
jobs:
phpunit:
name: PHP ${{ matrix.php }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
services:
mysql:
image: mysql:5.7
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: yiitest
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
postgres:
image: postgres:9.6
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: yiitest
ports:
- 5432:5432
options: --name=postgres --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
php: ['5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0']
steps:
- name: Generate french locale
run: sudo locale-gen fr_FR.UTF-8
- name: Checkout
uses: actions/checkout@v2
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
tools: pecl
extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached, mysql, pdo, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, sqlite
ini-values: date.timezone='UTC', session.save_path="${{ runner.temp }}"
- name: Install Memcached
uses: niden/actions-memcached@v7
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies
uses: actions/cache@v1
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install dependencies
run: composer update $DEFAULT_COMPOSER_FLAGS
- name: PHP Unit tests for PHP 7.1
run: vendor/bin/phpunit --verbose --coverage-clover=coverage.clover --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always
if: matrix.php == '7.1'
- name: PHP Unit tests for PHP >= 7.2
run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always
env:
PHPUNIT_EXCLUDE_GROUP: oci,wincache,xcache,zenddata,cubrid
if: matrix.php >= '7.2'
- name: PHP Unit tests for PHP <= 7.0
run: vendor/bin/phpunit --verbose --exclude-group $PHPUNIT_EXCLUDE_GROUP --colors=always
if: matrix.php <= '7.0'
- name: Code coverage
run: |
wget https://scrutinizer-ci.com/ocular.phar
php ocular.phar code-coverage:upload --format=php-clover coverage.clover
if: matrix.php == '7.1'
continue-on-error: true # if is fork
npm:
name: NPM 6 on ubuntu-latest
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
php-version: 7.2
ini-values: session.save_path=${{ runner.temp }}
- name: Get composer cache directory
id: composer-cache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache composer dependencies
uses: actions/cache@v1
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install dependencies
run: composer update $DEFAULT_COMPOSER_FLAGS
- name: Install node.js
uses: actions/setup-node@v1
with:
node-version: 6
- name: Tests
run: |
npm install
npm test
# env:
# CI: true

103
.github/workflows/ci-mssql.yml

@ -0,0 +1,103 @@
on:
- pull_request
- push
name: ci-mssql
jobs:
tests:
name: PHP ${{ matrix.php }}-mssql-${{ matrix.mssql }}
env:
key: cache
runs-on: ubuntu-latest
strategy:
matrix:
include:
- php: '7.0'
extensions: pdo, pdo_sqlsrv-5.8.1
mssql: 'server:2017-latest'
- php: '7.1'
extensions: pdo, pdo_sqlsrv-5.8.1
mssql: 'server:2017-latest'
- php: '7.2'
extensions: pdo, pdo_sqlsrv-5.8.1
mssql: 'server:2017-latest'
- php: '7.3'
extensions: pdo, pdo_sqlsrv-5.8.1
mssql: 'server:2017-latest'
- php: '7.4'
extensions: pdo, pdo_sqlsrv
mssql: 'server:2017-latest'
- php: '7.4'
extensions: pdo, pdo_sqlsrv
mssql: 'server:2019-latest'
- php: '8.0'
extensions: pdo, pdo_sqlsrv
mssql: 'server:2017-latest'
- php: '8.0'
extensions: pdo, pdo_sqlsrv
mssql: 'server:2019-latest'
services:
mssql:
image: mcr.microsoft.com/mssql/${{ matrix.mssql }}
env:
SA_PASSWORD: YourStrong!Passw0rd
ACCEPT_EULA: Y
MSSQL_PID: Developer
ports:
- 1433:1433
options: --name=mssql --health-cmd="/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: Checkout
uses: actions/checkout@v2.3.4
- name: Create MS SQL Database
run: docker exec -i mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest'
- name: Install PHP with extensions
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ matrix.extensions }}
ini-values: date.timezone='UTC'
tools: composer:v2, pecl
- name: Determine composer cache directory on Linux
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV
- name: Cache dependencies installed with composer
uses: actions/cache@v2
with:
path: ${{ env.COMPOSER_CACHE_DIR }}
key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }}
restore-keys: |
php${{ matrix.php }}-composer-
- name: Update composer
run: composer self-update
- name: Install dependencies with composer
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
- name: Install dependencies with composer php 8.0
if: matrix.php == '8.0'
run: composer update --ignore-platform-reqs --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
- name: PHP Unit tests for PHP 7.1
run: vendor/bin/phpunit --coverage-clover=coverage.clover --group mssql --colors=always
if: matrix.php == '7.1'
- name: Run tests with phpunit without coverage
run: vendor/bin/phpunit --group mssql --colors=always
- name: Code coverage
run: |
wget https://scrutinizer-ci.com/ocular.phar
php ocular.phar code-coverage:upload --format=php-clover coverage.clover
if: matrix.php == '7.1'
continue-on-error: true # if is fork

80
.github/workflows/ci-mysql.yml

@ -0,0 +1,80 @@
on:
- pull_request
- push
name: ci-mysql
jobs:
tests:
name: PHP ${{ matrix.php-version }}-mysql-${{ matrix.mysql-version }}
env:
extensions: curl, intl, pdo, pdo_mysql
key: cache-v1
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
php-version:
- "7.4"
mysql-version:
- "latest"
services:
mysql:
image: mysql:${{ matrix.mysql-version }}
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: yiitest
ports:
- 3306:3306
options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup cache environment
id: cache-env
uses: shivammathur/cache-extensions@v1
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ env.extensions }}
key: ${{ env.key }}
- name: Cache extensions
uses: actions/cache@v1
with:
path: ${{ steps.cache-env.outputs.dir }}
key: ${{ steps.cache-env.outputs.key }}
restore-keys: ${{ steps.cache-env.outputs.key }}
- name: Install PHP with extensions
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ env.extensions }}
ini-values: date.timezone='UTC'
coverage: pcov
- name: Determine composer cache directory
if: matrix.os == 'ubuntu-latest'
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV
- name: Cache dependencies installed with composer
uses: actions/cache@v1
with:
path: ${{ env.COMPOSER_CACHE_DIR }}
key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
restore-keys: |
php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-
- name: Install dependencies with composer
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
- name: Run mysql tests with phpunit
run: vendor/bin/phpunit --group mysql --colors=always

91
.github/workflows/ci-oracle.yml

@ -0,0 +1,91 @@
on:
- pull_request
- push
name: ci-oracle
jobs:
tests:
name: PHP ${{ matrix.php }}-${{ matrix.os }}
env:
extensions: oci8, pdo, pdo_oci
key: cache-v1
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
php:
- "7.4"
services:
oci:
image: wnameless/oracle-xe-11g-r2:latest
ports:
- 1521:1521
options: --name=oci
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup cache environment
id: cache-env
uses: shivammathur/cache-extensions@v1
with:
php-version: ${{ matrix.php }}
extensions: ${{ env.extensions }}
key: ${{ env.key }}
- name: Cache extensions
uses: actions/cache@v1
with:
path: ${{ steps.cache-env.outputs.dir }}
key: ${{ steps.cache-env.outputs.key }}
restore-keys: ${{ steps.cache-env.outputs.key }}
- name: Install PHP with extensions
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
extensions: ${{ env.extensions }}
ini-values: date.timezone='UTC'
coverage: pcov
tools: composer:v2, pecl
- name: Determine composer cache directory
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV
- name: Cache dependencies installed with composer
uses: actions/cache@v2
with:
path: ${{ env.COMPOSER_CACHE_DIR }}
key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }}
restore-keys: |
php${{ matrix.php }}-composer-
- name: Install dependencies with composer php 7.4
if: matrix.php == '7.4'
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
- name: Install dependencies with composer php 8.0
if: matrix.php == '8.0'
run: composer update --ignore-platform-reqs --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
- name: PHP Unit tests for PHP 7.4
run: vendor/bin/phpunit --coverage-clover=coverage.clover --group oci --colors=always
if: matrix.php == '7.4'
- name: Run tests with phpunit without coverage
run: vendor/bin/phpunit --group oci --colors=always
- name: Code coverage
run: |
wget https://scrutinizer-ci.com/ocular.phar
php ocular.phar code-coverage:upload --format=php-clover coverage.clover
if: matrix.php == '7.4'
continue-on-error: true # if is fork

84
.github/workflows/ci-pgsql.yml

@ -0,0 +1,84 @@
on:
- pull_request
- push
name: ci-pgsql
jobs:
tests:
name: PHP ${{ matrix.php-version }}-pgsql-${{ matrix.pgsql-version }}
env:
extensions: curl, intl, pdo, pdo_pgsql
key: cache-v1
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
php-version:
- "7.4"
pgsql-version:
- "10"
- "11"
- "12"
- "13"
services:
postgres:
image: postgres:${{ matrix.pgsql-version }}
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: yiitest
ports:
- 5432:5432
options: --name=postgres --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup cache environment
id: cache-env
uses: shivammathur/cache-extensions@v1
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ env.extensions }}
key: ${{ env.key }}
- name: Cache extensions
uses: actions/cache@v1
with:
path: ${{ steps.cache-env.outputs.dir }}
key: ${{ steps.cache-env.outputs.key }}
restore-keys: ${{ steps.cache-env.outputs.key }}
- name: Install PHP with extensions
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ env.extensions }}
ini-values: date.timezone='UTC'
coverage: pcov
- name: Determine composer cache directory
if: matrix.os == 'ubuntu-latest'
run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV
- name: Cache dependencies installed with composer
uses: actions/cache@v1
with:
path: ${{ env.COMPOSER_CACHE_DIR }}
key: php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-${{ hashFiles('**/composer.json') }}
restore-keys: |
php${{ matrix.php-version }}-composer-${{ matrix.dependencies }}-
- name: Install dependencies with composer
run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi
- name: Run pgsql tests with phpunit
run: vendor/bin/phpunit --group pgsql --colors=always

1
.gitignore vendored

@ -1,5 +1,6 @@
# phpstorm project files
.idea
*.iml
# netbeans project files
nbproject

5
.gitlab-ci.yml

@ -4,13 +4,12 @@ services:
- docker:dind
variables:
DOCKER_YII2_PHP_IMAGE: yiisoftware/yii2-php:7.1-apache
DOCKER_YII2_PHP_IMAGE: yiisoftware/yii2-php:7.4-apache
DOCKER_MYSQL_IMAGE: percona:5.7
DOCKER_POSTGRES_IMAGE: postgres:9.3
before_script:
- apk add --no-cache python py2-pip git
- pip install --no-cache-dir docker-compose==1.16.0
- apk add --no-cache git curl docker-compose
- docker info
- cd tests

1
.scrutinizer.yml

@ -16,4 +16,5 @@ filter:
tools:
external_code_coverage:
runs: 3
timeout: 2100 # Timeout in seconds.

223
.travis.yml

@ -1,223 +0,0 @@
dist: xenial
# faster builds on new travis setup not using sudo
# temporary disable, see https://github.com/travis-ci/travis-ci/issues/6842
#sudo: false
sudo: required
group: edge
# build only on master branches
# commented as this prevents people from running builds on their forks:
# https://github.com/yiisoft/yii2/commit/bd87be990fa238c6d5e326d0a171f38d02dc253a
#branches:
# only:
# - master
# - 2.1
#
# Test Matrix
#
language: php
env:
global:
- DEFAULT_COMPOSER_FLAGS="--prefer-dist --no-interaction --no-progress --optimize-autoloader"
- TASK_TESTS_PHP=1
- TASK_TESTS_JS=0
- TASK_TESTS_COVERAGE=0
- TRAVIS_SECOND_USER=travis_two
- PHPUNIT_EXCLUDE_GROUP=mssql,oci,wincache,xcache,zenddata,cubrid
services:
- memcached
- postgresql
- docker
# cache vendor dirs
cache:
directories:
- vendor
- $HOME/.composer/cache
- $HOME/.npm
# try running against postgres 9.6
addons:
postgresql: "9.6"
code_climate:
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
matrix:
fast_finish: true
include:
- php: "7.3"
env: PHPUNIT_EXCLUDE_GROUP=oci,wincache,xcache,zenddata,cubrid
- php: "7.2"
env: PHPUNIT_EXCLUDE_GROUP=oci,wincache,xcache,zenddata,cubrid
# run tests coverage on PHP 7.1
- php: "7.1"
env:
- TASK_TESTS_COVERAGE=1
- PHPUNIT_EXCLUDE_GROUP=oci,wincache,xcache,zenddata,cubrid
- php: "7.0"
- php: "5.6"
- php: "5.5"
dist: trusty
- php: "5.4"
dist: trusty
# Test against HHVM 3.21 LTS version by using trusty
- php: hhvm-3.21
sudo: true
addons:
code_climate:
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
postgresql: "9.6"
services:
- mysql
- postgresql
# 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:
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
postgresql: "9.6"
services:
- mysql
- postgresql
- php: nightly
services:
- mysql
- postgresql
# have a separate branch for javascript tests
- language: node_js
node_js: "6"
env: TASK_TESTS_PHP=0 TASK_TESTS_JS=1
# overwrite services used for PHP tests
services:
allow_failures:
- php: nightly
- php: hhvm-3.21
- php: hhvm-3.24
install:
- |
if [[ $TASK_TESTS_COVERAGE != 1 && $TRAVIS_PHP_VERSION != hhv* ]]; then
# disable xdebug for performance reasons when code coverage is not needed. note: xdebug on hhvm is disabled by default
phpenv config-rm xdebug.ini || echo "xdebug is not installed"
fi
# install composer dependencies
- travis_retry composer self-update
- export PATH="$HOME/.composer/vendor/bin:$PATH"
- travis_retry composer install $DEFAULT_COMPOSER_FLAGS
# setup PHP extension
- |
if [[ $TASK_TESTS_PHP == 1 && $TRAVIS_PHP_VERSION != nightly ]]; then
tests/data/travis/apc-setup.sh
tests/data/travis/memcache-setup.sh
tests/data/travis/imagick-setup.sh
source tests/data/travis/mysql-setup.sh
source tests/data/travis/mssql-setup.sh
fi
# setup JS test
- |
if [ $TASK_TESTS_JS == 1 ]; then
travis_retry npm install
fi
# Needed for FileCacheTest
- sudo useradd $TRAVIS_SECOND_USER --gid $(id -g) -M
before_script:
#
# Disable:
# 1) the HHVM JIT for faster testing;
# 2) the session GC for testing stability.
#
# The second allows to avoid accidental unpredictable failings with message:
# `ps_files_cleanup_dir: opendir(/var/lib/hhvm/sessions) failed: Permission denied (13)`
#
- if [[ $TRAVIS_PHP_VERSION = hhv* ]]; then
echo 'hhvm.jit = 0' >> /etc/hhvm/php.ini;
echo 'session.gc_probability = 0' >> /etc/hhvm/php.ini;
fi
# show some versions and env information
- php --version
- composer --version
- |
if [ $TASK_TESTS_PHP == 1 ]; then
php -r "echo INTL_ICU_VERSION . \"\n\";"
php -r "echo INTL_ICU_DATA_VERSION . \"\n\";"
psql --version
mysql --version
sudo mysql_upgrade || echo "MySQL is already up to date"
fi
- |
if [ $TASK_TESTS_JS == 1 ]; then
node --version
npm --version
fi
# initialize databases
- |
if [ $TASK_TESTS_PHP == 1 ]; then
travis_retry mysql -h 127.0.0.1 -u root -proot -e 'CREATE DATABASE `yiitest`;';
mysql -h 127.0.0.1 -u root -proot -e "SET GLOBAL sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';";
mysql -h 127.0.0.1 -u root -proot -e "CREATE USER 'travis'@'localhost' IDENTIFIED WITH mysql_native_password;";
mysql -h 127.0.0.1 -u root -proot -e "GRANT ALL PRIVILEGES ON *.* TO 'travis'@'localhost' WITH GRANT OPTION;";
psql -U postgres -c 'CREATE DATABASE yiitest;';
fi
# enable code coverage
- |
if [ $TASK_TESTS_COVERAGE == 1 ]; then
PHPUNIT_FLAGS="--coverage-clover=coverage.clover"
fi
# Disable DEPRECATE messages during PHPUnit initialization on PHP 7.2. To fix them, PHPUnit should be updated to 6.*
# For Yii2 tests, messages will be enabled by tests/bootstrap.php
- |
if [[ $TRAVIS_PHP_VERSION == 7.2 || $TRAVIS_PHP_VERSION == 7.3 || $TRAVIS_PHP_VERSION = nightly ]]; then
echo 'Disabled DEPRECATED notifications for PHP >= 7.2';
echo 'error_reporting = E_ALL & ~E_DEPRECATED' >> /tmp/php-config.ini;
phpenv config-add /tmp/php-config.ini;
fi
script:
# PHP tests
- |
if [ $TASK_TESTS_PHP == 1 ]; then
vendor/bin/phpunit --verbose $PHPUNIT_FLAGS --exclude-group $PHPUNIT_EXCLUDE_GROUP
fi
# JS tests
- |
if [ $TASK_TESTS_JS == 1 ]; then
npm test
fi
after_script:
- |
if [ $TASK_TESTS_COVERAGE == 1 ]; then
travis_retry wget https://scrutinizer-ci.com/ocular.phar
php ocular.phar code-coverage:upload --format=php-clover coverage.clover
fi

4
Dockerfile

@ -4,6 +4,10 @@ FROM ${DOCKER_YII2_PHP_IMAGE}
# Project source-code
WORKDIR /project
ADD composer.* /project/
# Apply testing patches
ADD tests/phpunit_mock_objects.patch /project/tests/phpunit_mock_objects.patch
ADD tests/phpunit_getopt.patch /project/tests/phpunit_getopt.patch
# Install packgaes
RUN /usr/local/bin/composer install --prefer-dist
ADD ./ /project
ENV PATH /project/vendor/bin:${PATH}

3
README.md

@ -11,10 +11,9 @@ 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)](https://travis-ci.org/yiisoft/yii2)
[![Build Status](https://github.com/yiisoft/yii2/workflows/build/badge.svg)](https://github.com/yiisoft/yii2/actions)
[![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)
Installation
------------

3
build/controllers/DevController.php

@ -51,6 +51,7 @@ class DevController extends Controller
'apidoc' => 'git@github.com:yiisoft/yii2-apidoc.git',
'authclient' => 'git@github.com:yiisoft/yii2-authclient.git',
'bootstrap' => 'git@github.com:yiisoft/yii2-bootstrap.git',
'bootstrap4' => 'git@github.com:yiisoft/yii2-bootstrap4.git',
'codeception' => 'git@github.com:yiisoft/yii2-codeception.git',
'composer' => 'git@github.com:yiisoft/yii2-composer.git',
'debug' => 'git@github.com:yiisoft/yii2-debug.git',
@ -334,7 +335,7 @@ class DevController extends Controller
continue;
}
// ignore hidden directories
if ($file[0] === '.') {
if (strpos($file, '.') === 0) {
continue;
}
if (is_dir("$dir/$file")) {

2
build/controllers/MimeTypeController.php

@ -85,7 +85,7 @@ class MimeTypeController extends Controller
$mimeMap = [];
foreach (explode("\n", $content) as $line) {
$line = trim($line);
if (empty($line) || $line[0] === '#') { // skip comments and empty lines
if (empty($line) || strpos($line, '#') === 0) { // skip comments and empty lines
continue;
}
$parts = preg_split('/\s+/', $line);

78
build/controllers/PhpDocController.php

@ -329,16 +329,16 @@ class PhpDocController extends Controller
$tag = false;
} elseif ($docBlock) {
$line = ltrim($line);
if (isset($line[0]) && $line[0] === '*') {
if (strpos($line, '*') === 0) {
$line = substr($line, 1);
}
if (isset($line[0]) && $line[0] === ' ') {
if (strpos($line, ' ') === 0) {
$line = substr($line, 1);
}
$docLine = str_replace("\t", ' ', rtrim($line));
if (empty($docLine)) {
$listIndent = '';
} elseif ($docLine[0] === '@') {
} elseif (strpos($docLine, '@') === 0) {
$listIndent = '';
$codeBlock = false;
$tag = true;
@ -453,15 +453,15 @@ class PhpDocController extends Controller
$endofPrivate = $i;
$property = 'Private';
$level = 0;
} elseif (substr($line, 0, 6) === 'const ') {
} elseif (strpos($line, 'const ') === 0) {
$endofConst = $i;
$property = false;
} elseif (substr($line, 0, 4) === 'use ') {
} elseif (strpos($line, 'use ') === 0) {
$endofUse = $i;
$property = false;
} elseif (!empty($line) && $line[0] === '*') {
} elseif (strpos($line, '*') === 0) {
$property = false;
} elseif (!empty($line) && $line[0] !== '*' && strpos($line, 'function ') !== false || $line === '}') {
} elseif (strpos($line, '*') !== 0 && strpos($line, 'function ') !== false || $line === '}') {
break;
}
@ -504,11 +504,19 @@ class PhpDocController extends Controller
protected function updateClassPropertyDocs($file, $className, $propertyDoc)
{
if ($this->shouldSkipClass($className)) {
$this->stderr("[INFO] Skipping class $className.\n", Console::FG_BLUE, Console::BOLD);
return false;
}
try {
$ref = new \ReflectionClass($className);
} catch (\Exception $e) {
$this->stderr("[ERR] Unable to create ReflectionClass for class '$className': " . $e->getMessage() . "\n", Console::FG_RED);
return false;
} catch (\Error $e) {
$this->stderr("[ERR] Unable to create ReflectionClass for class '$className': " . $e->getMessage() . "\n", Console::FG_RED);
return false;
}
if ($ref->getFileName() != $file) {
$this->stderr("[ERR] Unable to create ReflectionClass for class: $className loaded class is not from file: $file\n", Console::FG_RED);
@ -612,9 +620,9 @@ class PhpDocController extends Controller
$propertyPosition = false;
foreach ($lines as $i => $line) {
$line = trim($line);
if (strncmp($line, '* @property ', 12) === 0) {
if (strncmp($line, '* @property', 11) === 0) {
$propertyPart = true;
} elseif ($propertyPart && $line == '*') {
} elseif ($propertyPart && $line === '*') {
$propertyPosition = $i;
$propertyPart = false;
}
@ -627,7 +635,7 @@ class PhpDocController extends Controller
}
}
// if no properties or other tags where present add properties at the end
// if no properties or other tags were present add properties at the end
if ($propertyPosition === false) {
$propertyPosition = \count($lines) - 2;
}
@ -649,8 +657,12 @@ class PhpDocController extends Controller
$file = str_replace("\r", '', str_replace("\t", ' ', file_get_contents($fileName, true)));
$ns = $this->match('#\nnamespace (?<name>[\w\\\\]+);\n#', $file);
$namespace = reset($ns);
if ($namespace === false) {
$namespace = '\\';
} else {
$namespace = $namespace['name'];
$classes = $this->match('#\n(?:abstract )(?:final )?class (?<name>\w+)( extends .+)?( implements .+)?\n\{(?<content>.*)\n\}(\n|$)#', $file);
}
$classes = $this->match('#\n(?:abstract )?(?:final )?class (?<name>\w+)( extends .+)?( implements .+)?\n\{(?<content>.*)\n\}(\n|$)#', $file);
if (\count($classes) > 1) {
$this->stderr("[ERR] There should be only one class in a file: $fileName\n", Console::FG_RED);
@ -710,44 +722,46 @@ class PhpDocController extends Controller
];
}
if (\count($props) === 0) {
continue;
}
ksort($props);
if (\count($props) > 0) {
$phpdoc .= " *\n";
foreach ($props as $propName => &$prop) {
$docline = ' * @';
$docline .= 'property'; // Do not use property-read and property-write as few IDEs support complex syntax.
$docLine = ' * @property';
$note = '';
if (isset($prop['get'], $prop['set'])) {
if ($prop['get']['type'] != $prop['set']['type']) {
$note = ' Note that the type of this property differs in getter and setter.'
. ' See [[get' . ucfirst($propName) . '()]] and [[set' . ucfirst($propName) . '()]] for details.';
. ' See [[get' . ucfirst($propName) . '()]]'
. ' and [[set' . ucfirst($propName) . '()]] for details.';
}
} elseif (isset($prop['get'])) {
if (!$this->hasSetterInParents($className, $propName)) {
$note = ' This property is read-only.';
//$docline .= '-read';
$docLine .= '-read';
}
} elseif (isset($prop['set'])) {
if (!$this->hasGetterInParents($className, $propName)) {
$note = ' This property is write-only.';
//$docline .= '-write';
$docLine .= '-write';
}
} else {
continue;
}
$docline .= ' ' . $this->getPropParam($prop, 'type') . " $$propName ";
$docLine .= ' ' . $this->getPropParam($prop, 'type') . " $$propName ";
$comment = explode("\n", $this->getPropParam($prop, 'comment') . $note);
foreach ($comment as &$cline) {
$cline = ltrim($cline, '* ');
}
$docline = wordwrap($docline . implode(' ', $comment), 110, "\n * ") . "\n";
$docLine = wordwrap($docLine . implode(' ', $comment), 110, "\n * ") . "\n";
$phpdoc .= $docline;
$phpdoc .= $docLine;
}
$phpdoc .= " *\n";
}
}
return [$className, $phpdoc];
}
@ -783,7 +797,7 @@ class PhpDocController extends Controller
return '';
}
return strtoupper(substr($str, 0, 1)) . substr($str, 1) . ($str[\strlen($str) - 1] != '.' ? '.' : '');
return strtoupper(substr($str, 0, 1)) . substr($str, 1) . ($str[\strlen($str) - 1] !== '.' ? '.' : '');
}
protected function getPropParam($prop, $param)
@ -812,12 +826,18 @@ class PhpDocController extends Controller
protected function hasGetterInParents($className, $propName)
{
$class = $className;
try {
while ($parent = get_parent_class($class)) {
if (method_exists($parent, 'get' . ucfirst($propName))) {
return true;
}
$class = $parent;
}
} catch (\Throwable $t) {
$this->stderr("[ERR] Error when getting parents for $className\n", Console::FG_RED);
return false;
}
return false;
}
@ -829,12 +849,18 @@ class PhpDocController extends Controller
protected function hasSetterInParents($className, $propName)
{
$class = $className;
try {
while ($parent = get_parent_class($class)) {
if (method_exists($parent, 'set' . ucfirst($propName))) {
return true;
}
$class = $parent;
}
} catch (\Throwable $t) {
$this->stderr("[ERR] Error when getting parents for $className\n", Console::FG_RED);
return false;
}
return false;
}
@ -851,4 +877,12 @@ class PhpDocController extends Controller
}
return !$isDepreceatedObject && !$ref->isSubclassOf('yii\base\BaseObject') && $className !== 'yii\base\BaseObject';
}
private function shouldSkipClass($className)
{
if (PHP_VERSION_ID > 70100) {
return $className === 'yii\base\Object';
}
return false;
}
}

2
build/controllers/ReleaseController.php

@ -223,7 +223,7 @@ class ReleaseController extends Controller
}
$this->stdout("- other issues with code changes?\n\n git diff -w $gitVersion.. ${gitDir}\n\n");
$travisUrl = reset($what) === 'framework' ? '' : '-' . reset($what);
$this->stdout("- are unit tests passing on travis? https://travis-ci.org/yiisoft/yii2$travisUrl/builds\n");
$this->stdout("- are unit tests passing on travis? https://travis-ci.com/yiisoft/yii2$travisUrl/builds\n");
$this->stdout("- also make sure the milestone on github is complete and no issues or PRs are left open.\n\n");
$this->printWhatUrls($what, $versions);
$this->stdout("\n");

6
build/controllers/TranslationController.php

@ -126,11 +126,11 @@ class TranslationController extends Controller
{
$lines = explode("\n", $diff);
foreach ($lines as $key => $val) {
if (mb_substr($val, 0, 1, 'utf-8') === '@') {
if (strpos($val, '@') === 0) {
$lines[$key] = '<span class="info">' . Html::encode($val) . '</span>';
} elseif (mb_substr($val, 0, 1, 'utf-8') === '+') {
} elseif (strpos($val, '+') === 0) {
$lines[$key] = '<ins>' . Html::encode($val) . '</ins>';
} elseif (mb_substr($val, 0, 1, 'utf-8') === '-') {
} elseif (strpos($val, '-') === 0) {
$lines[$key] = '<del>' . Html::encode($val) . '</del>';
} else {
$lines[$key] = Html::encode($val);

18
composer.json

@ -75,12 +75,13 @@
"yiisoft/yii2-composer": "~2.0.4",
"ezyang/htmlpurifier": "~4.6",
"cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0",
"bower-asset/jquery": "3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
"bower-asset/jquery": "3.5.*@stable | 3.4.*@stable | 3.3.*@stable | 3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
"bower-asset/inputmask": "~3.2.2 | ~3.3.5",
"bower-asset/punycode": "1.3.*",
"bower-asset/yii2-pjax": "~2.0.1"
},
"require-dev": {
"cweagans/composer-patches": "^1.7",
"phpunit/phpunit": "4.8.34",
"cebe/indent": "~1.0.2",
"friendsofphp/php-cs-fixer": "~2.2.3",
@ -101,6 +102,11 @@
"yii\\cs\\": "cs/src/"
}
},
"autoload-dev": {
"files": [
"tests/bootstrap.php"
]
},
"config": {
"platform": {"php": "5.4"}
},
@ -110,6 +116,16 @@
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
},
"composer-exit-on-patch-failure": true,
"patches": {
"phpunit/phpunit-mock-objects": {
"Fix PHP 7 and 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_mock_objects.patch"
},
"phpunit/phpunit": {
"Fix PHP 7 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php7.patch",
"Fix PHP 8 compatibility": "https://yiisoft.github.io/phpunit-patches/phpunit_php8.patch"
}
}
}
}

886
composer.lock generated

File diff suppressed because it is too large Load Diff

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

@ -410,7 +410,7 @@ $container->setDefinitions([
]
]);
$reader = $container->get('app\storage\DocumentsReader);
$reader = $container->get('app\storage\DocumentsReader');
// Se comporte exactement comme l'exemple précédent
```

2
docs/guide-fr/runtime-requests.md

@ -93,7 +93,7 @@ et avant le nom du script d'entrée.
## Enntêtes HTTP <span id="http-headers"></span>
## Entêtes HTTP <span id="http-headers"></span>
Vous pouvez obtenir les entêtes HTTP via la [[yii\web\HeaderCollection|collection d'entêtes]] qui est retournée par la propriété [[yii\web\Request::headers]]. Par exemple :

5
docs/guide-fr/start-installation.md

@ -41,8 +41,8 @@ Si Composer était déjà installé auparavant, assurez-vous d'utiliser une vers
### Installer Yii <span id="installing-from-composer"></span>
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
```
@ -53,7 +53,6 @@ Cette commande installera la dernière version stable du modèle de projet Yii d
> [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).
> 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) :
>
>```bash
@ -116,7 +115,7 @@ Afin d'empêcher l'installation des « assets » via Composer, ajoutez les lig
Vérifier l'installation <span id="verifying-installation"></span>
-----------------------
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 :
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 racine de votre projet :
```bash
php yii serve

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

@ -88,6 +88,7 @@ Yii fournit un jeu de filtres couramment utilisés, que l'on trouve en premier l
*AccessControl* (contrôle d'accès) fournit un contrôle d'accès simple basé sur un jeu de [[yii\filters\AccessControl::rules|règles]]. En particulier, avant qu'une action ne soit exécutée, *AccessControl* examine les règles listées et trouve la première qui correspond aux variables du contexte courant (comme l'adresse IP, l'état de connexion de l'utilisateur, etc.). La règle qui correspond détermine si l'exécution de l'action requise doit être autorisée ou refusée. Si aucune des règles ne correspond, l'accès est refusé.
L'exemple suivant montre comment autoriser les utilisateurs authentifiés à accéder aux actions `create` et `update` tout en refusant l'accès à ces actions aux autres utilisateurs.
```php
use yii\filters\AccessControl;
@ -141,6 +142,7 @@ Les filtres de méthode d'authentification sont communément utilisés dans la m
*ContentNegotiator* (négociateur de contenu) prend en charge la négociation des formats de réponse et la négociation de langue d'application. Il essaye de déterminer le format de la réponse et/ou la langue en examinant les paramètres de la méthode `GET` et ceux de l'entête HTTP `Accept`.
Dans l'exemple qui suit, le filtre *ContentNegotiator* est configuré pour prendre en charge JSON et XML en tant que formats de réponse, et anglais (États-Unis) et allemand en tant que langues.
```php
use yii\filters\ContentNegotiator;
use yii\web\Response;

62
docs/guide-ja/concept-di-container.md

@ -169,6 +169,9 @@ $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');
// Connection のインスタンスを作成できます
$container->set('foo', 'yii\db\Connection');
// `Instance::of` を使ってエイリアスの登録。
$container->set('bar', Instance::of('foo'));
// 構成情報をともなうクラスの登録。クラスが get() でインスタンス化
// されるとき構成情報が適用されます
$container->set('yii\db\Connection', [
@ -179,7 +182,7 @@ $container->set('yii\db\Connection', [
]);
// クラスの構成情報をともなうエイリアス名の登録
// この場合、クラスを指定する "class" 要素が必要です
// この場合、クラスを指定する "class" または "__class" 要素が必要です
$container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
@ -188,11 +191,12 @@ $container->set('db', [
'charset' => 'utf8',
]);
// PHP コーラブルの登録
// コーラブルなクロージャまたは配列の登録
// このコーラブルは $container->get('db') が呼ばれるたびに実行されます
$container->set('db', function ($container, $params, $config) {
return new \yii\db\Connection($config);
});
$container->set('db', ['app\db\DbFactory', 'create']);
// コンポーネント・インスタンスの登録
// $container->get('pageCache') は呼ばれるたびに毎回同じインスタンスを返します
@ -215,7 +219,6 @@ $container->setSingleton('yii\db\Connection', [
]);
```
依存を解決する <span id="resolving-dependencies"></span>
--------------
@ -372,6 +375,24 @@ class HotelController extends Controller
これで、あなたが再びコントローラにアクセスするときは、`app\components\BookingService`
のインスタンスが作成され、コントローラのコンストラクタに3番目のパラメータとして注入されるようになります。
Yii 2.0.36 以降は、PHP 7 を使う場合に、ウェブおよびコンソール両方のコントローラでアクション・インジェクションを利用することが出来ます。
```php
namespace app\controllers;
use yii\web\Controller;
use app\components\BookingInterface;
class HotelController extends Controller
{
public function actionBook($id, BookingInterface $bookingService)
{
$result = $bookingService->book($id);
// ...
}
}
```
高度な実際の使用方法 <span id="advanced-practical-usage"></span>
--------------------
@ -427,7 +448,7 @@ $container->setDefinitions([
}
]);
$reader = $container->get('app\storage\DocumentsReader);
$reader = $container->get('app\storage\DocumentsReader');
// 構成情報に書かれている依存とともに DocumentReader オブジェクトが生成されます
```
@ -440,32 +461,27 @@ $reader = $container->get('app\storage\DocumentsReader);
[依存を解決する](#resolving-dependencies) のセクションで説明したように、[[yii\di\Container::set()|set()]] と [[yii\di\Container::setSingleton()|setSingleton()]] は、
オプションで、第三の引数として依存のコンストラクタのパラメータを取ることが出来ます。
コンストラクタのパラメータを設定するために、以下の構成情報配列の形式を使うことが出来ます。
- `key`: クラス名、インタフェイス名、または、エイリアス名。
このキーが [[yii\di\Container::set()|set()]] メソッドの最初の引数 `$class` として渡されます。
- `value`: 二つの要素を持つ配列。最初の要素は [[set()]] メソッドに二番目のパラメータ `$definition`
として渡され、第二の要素が `$params` として渡されます。
コンストラクタのパラメータを設定するために、`__construct()` オプションを使うことが出来ます。
では、私たちの例を修正しましょう。
```php
$container->setDefinitions([
'tempFileStorage' => [ // 便利なようにエイリアスを作りました
['class' => 'app\storage\FileStorage'],
['/var/tempfiles'] // 何らかの構成ファイルから抽出することも可能
'class' => 'app\storage\FileStorage',
'__construct()' => ['/var/tempfiles'], // 何らかの構成ファイルから抽出することも可能
],
'app\storage\DocumentsReader' => [
['class' => 'app\storage\DocumentsReader'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsReader',
'__construct()' => [Instance::of('tempFileStorage')],
],
'app\storage\DocumentsWriter' => [
['class' => 'app\storage\DocumentsWriter'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsWriter',
'__construct()' => [Instance::of('tempFileStorage')]
]
]);
$reader = $container->get('app\storage\DocumentsReader);
$reader = $container->get('app\storage\DocumentsReader');
// 前の例と全く同じオブジェクトが生成されます
```
@ -488,19 +504,19 @@ $reader = $container->get('app\storage\DocumentsReader);
```php
$container->setSingletons([
'tempFileStorage' => [
['class' => 'app\storage\FileStorage'],
['/var/tempfiles']
'class' => 'app\storage\FileStorage',
'__construct()' => ['/var/tempfiles']
],
]);
$container->setDefinitions([
'app\storage\DocumentsReader' => [
['class' => 'app\storage\DocumentsReader'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsReader',
'__construct()' => [Instance::of('tempFileStorage')],
],
'app\storage\DocumentsWriter' => [
['class' => 'app\storage\DocumentsWriter'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsWriter',
'__construct()' => [Instance::of('tempFileStorage')],
]
]);

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

@ -19,12 +19,6 @@ Yii 2.0 では、DAO は下記の DBMS のサポートを内蔵しています
- [Oracle](http://www.oracle.com/us/products/database/overview/index.html)
- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): バージョン 2008 以上。
> Info: Yii 2.1 以降では、CUBRID、Oracle および MSSQL に対する DAO サポートは、フレームワーク内蔵のコア・コンポーネント
としては提供されていません。それらは、独立した [エクステンション](structure-extensions.md) としてインストールされる
必要があります。[yiisoft/yii2-oracle](https://www.yiiframework.com/extension/yiisoft/yii2-oracle) および
[yiisoft/yii2-mssql](https://www.yiiframework.com/extension/yiisoft/yii2-mssql) が
[公式エクステンション](https://www.yiiframework.com/extensions/official) として提供されています。
> Note: PHP 7 用の pdo_oci の新しいバージョンは、現在、ソース・コードとしてのみ存在します。
[コミュニティによる説明](https://github.com/yiisoft/yii2/issues/10975#issuecomment-248479268) に従ってコンパイルするか、
または、[PDO エミュレーション・レイヤ](https://github.com/taq/pdooci) を使って下さい。
@ -113,6 +107,18 @@ ODBC 経由でデータベースに接続しようとする場合は、[[yii\db\
> ]
> ```
MS SQL Server でバイナリ・データを正しく処理するためには追加の接続オプションが必要になります。
```php
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'sqlsrv:Server=localhost;Database=mydatabase',
'attributes' => [
\PDO::SQLSRV_ATTR_ENCODING => \PDO::SQLSRV_ENCODING_SYSTEM
]
],
```
## SQL クエリを実行する <span id="executing-sql-queries"></span>

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

@ -230,7 +230,7 @@ $query->where(['id' => $userQuery]);
ハッシュ形式を使う場合、Yii は内部的にパラメータ・バインディングを使用します。
従って、[文字列形式](#string-format) とは対照的に、ここでは手動でパラメータを追加する必要はありません。ただし、Yii はカラム名を決してエスケープしないことに注意して下さい。
従って、ユーザから取得した変数を何ら追加のチェックをすることなくカラム名として渡すと、SQL インジェクション攻撃に対して脆弱になります。
アプリケーションを安全に保つためには、カラム名として変数を使わないこと、または、変数をホワイト・リストによってフィルターすることが必要です。
アプリケーションを安全に保つためには、カラム名として変数を使わないこと、または、変数を許容リストによってフィルターすることが必要です。
カラム名をユーザから取得する必要がある場合は、ガイドの [データをフィルタリングする](output-data-widgets.md#filtering-data) という記事を読んで下さい。
例えば、次のコードは脆弱です。
@ -321,7 +321,7 @@ $query->where([$column => $value]);
演算子形式を使う場合、Yii は値に対して内部的にパラメータ・バインディングを使用します。
従って、[文字列形式](#string-format) とは対照的に、ここでは手動でパラメータを追加する必要はありません。
ただし、Yii はカラム名を決してエスケープしないことに注意して下さい。従って、変数をカラム名として渡すと、アプリケーションは SQL インジェクション攻撃に対して脆弱になります。
アプリケーションを安全に保つためには、カラム名として変数を使わないこと、または、変数をホワイト・リストによってフィルターすることが必要です。
アプリケーションを安全に保つためには、カラム名として変数を使わないこと、または、変数を許容リストによってフィルターすることが必要です。
カラム名をユーザから取得する必要がある場合は、ガイドの [データをフィルタリングする](output-data-widgets.md#filtering-data) という記事を読んで下さい。
例えば、次のコードは脆弱です。
@ -602,6 +602,28 @@ $query1->union($query2);
[[yii\db\Query::union()|union()]] を複数回呼んで、`UNION` 句をさらに追加することが出来ます。
### [[yii\db\Query::withQuery()|withQuery()]] <span id="with-query"></span>
[[yii\db\Query::withQuery()|withQuery()]] メソッドは SQL クエリの `WITH` プレフィックスを指定するものです。サブクエリの代りに `WITH` を使うと読みやすさを向上させ、ユニークな機能(再帰 CTE)を利用することが出来ます。詳細は [modern-sql](https://modern-sql.com/feature/with) を参照して下さい。例えば、次のクエリは `admin` の持つ権限をその子も含めて全て再帰的に取得します。
```php
$initialQuery = (new \yii\db\Query())
->select(['parent', 'child'])
->from(['aic' => 'auth_item_child'])
->where(['parent' => 'admin']);
$recursiveQuery = (new \yii\db\Query())
->select(['aic.parent', 'aic.child'])
->from(['aic' => 'auth_item_child'])
->innerJoin('t1', 't1.child = aic.parent');
$mainQuery = (new \yii\db\Query())
->select(['parent', 'child'])
->from('t1')
->withQuery($initialQuery->union($recursiveQuery), 't1', true);
```
[[yii\db\Query::withQuery()|withQuery()]] を複数回呼び出してさらなる CTE をメイン・クエリに追加することが出来ます。クエリはアタッチされたのと同じ順序でプリペンドされます。クエリのうちの一つが再帰的である場合は CTE 全体が再帰的になります。
## クエリ・メソッド <span id="query-methods"></span>

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

@ -327,18 +327,18 @@ echo Html::getAttributeName('dates[0]');
埋め込みのスタイルとスクリプトをラップするタグを生成するメソッドが二つあります。
```php
<?= Html::style('.danger { color: #f00; }') ?>
<?= Html::style('.danger { color: #f00; }', ['media' => 'print']) ?>
これは次の HTML を生成します。
<style>.danger { color: #f00; }</style>
<style media="print">.danger { color: #f00; }</style>
<?= Html::script('alert("こんにちは!");', ['defer' => true]) ?>
<?= Html::script('alert("こんにちは!");') ?>
これは次の HTML を生成します。
<script defer>alert("こんにちは!");</script>
<script>alert("こんにちは!");</script>
```
CSS ファイルの外部スタイルをリンクしたい場合は、次のようにします。

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

@ -355,8 +355,10 @@ Yii のリリースに含まれている [コア・バリデータ](tutorial-cor
* @param mixed $params 規則に与えられる "params" の値
* @param \yii\validators\InlineValidator $validator 関係する InlineValidator のインスタンス。
* このパラメータは、バージョン 2.0.11 以降で利用可能。
* @param mixed $current 現在検証されている属性の値
* このパラメータは、バージョン 2.0.36 以降で利用可能。
*/
function ($attribute, $params, $validator)
function ($attribute, $params, $validator, $current)
```
属性が検証に失敗した場合は、メソッド/関数 は [[yii\base\Model::addError()]] を呼んでエラー・メッセージをモデルに保存し、

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

@ -335,6 +335,7 @@ GridView に CheckboxColumn を追加するためには、以下のようにし
```php
echo GridView::widget([
'id' => 'grid',
'dataProvider' => $dataProvider,
'columns' => [
// ...

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

@ -162,7 +162,9 @@ Content-Type: application/xml
次のコマンドは、JSON 形式でユーザのデータを持つ POST リクエストを送信して、新しいユーザを作成します。
```
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XPOST "http://localhost/users" -d '{"username": "example", "email": "user@example.com"}'
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" \
-XPOST "http://localhost/users" \
-d '{"username": "example", "email": "user@example.com"}'
HTTP/1.1 201 Created
...

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

@ -81,8 +81,8 @@ public function fields()
];
}
// いくつかのフィールドを除去する方法。親の実装を継承しつつ、公開すべきでないフィールドを
// 除外したいときに適している。
// いくつかのフィールドを除去する方法。親の実装を継承しつつ、
// 公開すべきでないフィールドを除外したいときに適している。
public function fields()
{
$fields = parent::fields();

2
docs/guide-ja/rest-response-formatting.md

@ -154,7 +154,7 @@ JSON 形式のレスポンスを生成する [[yii\web\JsonResponseFormatter|Jso
例えば、[[yii\web\JsonResponseFormatter::$prettyPrint|$prettyPrint]] オプションは、より読みやすいレスポンスのためのもので、開発時に有用なオプションです。
また、[[yii\web\JsonResponseFormatter::$encodeOptions|$encodeOptions]] によって JSON エンコーディングの出力を制御することが出来ます。
フォーマッタは、以下のように、アプリケーションの [構成情報](concept-configuration.md) の中で、`response` アプリケーション・コンポーネントの [[yii\web\Response::formatters|formatters]] プロパティの中で構成することが出来ます。
フォーマッタは、以下のように、アプリケーションの [構成情報](concept-configurations.md) の中で、`response` アプリケーション・コンポーネントの [[yii\web\Response::formatters|formatters]] プロパティの中で構成することが出来ます。
```php
'response' => [

4
docs/guide-ja/runtime-logging.md

@ -142,8 +142,8 @@ Yii は下記のログ・ターゲットをあらかじめ内蔵しています
[[yii\log\Target::categories|categories]] プロパティを指定しない場合は、
ターゲットが *全ての* カテゴリのメッセージを処理することを意味します。
カテゴリを [[yii\log\Target::categories|categories]] プロパティでホワイト・リストとして登録する以外に、
一定のカテゴリを [[yii\log\Target::except|except]] プロパティによってブラック・リストとして登録することも可能です。
処理するカテゴリを [[yii\log\Target::categories|categories]] プロパティで指定する以外に、
処理から除外するカテゴリを [[yii\log\Target::except|except]] プロパティによって指定することも可能です。
カテゴリの名前がこの配列にあるか、または配列にあるパターンに合致する場合は、メッセージはターゲットによって処理されません。
次のターゲットの構成は、ターゲットが、`yii\db\*` または `yii\web\HttpException:*` に合致するカテゴリ名を持つエラーおよび警告のメッセージだけを処理すべきこと、

24
docs/guide-ja/runtime-requests.md

@ -200,3 +200,27 @@ Yii アプリケーションに渡されるからです。
信頼できるプロキシからのリクエストである場合にのみ、`X-ProxyUser-Ip` と `Front-End-Https` ヘッダが受け入れられます。
その場合、前者は `ipHeaders` で構成されているようにユーザの IP を読み出すために使用され、
後者は [[yii\web\Request::getIsSecureConnection()]] の結果を決定するために使用されます。
2.0.31 以降、[RFC 7239](https://tools.ietf.org/html/rfc7239) の `Forwarded` ヘッダがサポートされています。
有効にするためには、ヘッダ名を `secureHeaders` に追加する必要があります。
あなたのプロキシにそれを設定させることを忘れないで下さい。さもないと、エンド・ユーザが IP とプロトコルを盗み見ることが可能になります。
### 解決済みのユーザ IP<span id="already-respolved-user-ip"></span>
ユーザの IP アドレスが Yii アプリケーション以前に解決済みである場合(例えば、`ngx_http_realip_module` など) は、
`request` コンポーネントは下記の構成で正しく動作します。
```php
'request' => [
// ...
'trustedHosts' => [
'0.0.0.0/0',
],
'ipHeaders' => [],
],
```
この場合、[[yii\web\Request::userIP|userIP]] の値は `$_SERVER['REMOTE_ADDR']` に等しくなります。
同時に、HTTP ヘッダから解決されるプロパティも正しく動作します (例えば、[[yii\web\Request::getIsSecureConnection()]])。
> 注意: `trustedHosts=['0.0.0.0/0']` の設定は、全ての IP が信頼できることを前提としています。

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

@ -397,3 +397,9 @@ Yii 2.0.21 以降、[[yii\web\Cookie::sameSite]] 設定がサポートされて
```
> Note: 今はまだ `sameSite` 設定をサポートしていないブラウザもありますので、
[追加の CSRF 保護](security-best-practices.md#avoiding-csrf) を行うことを強く推奨します。
## セッションに関する php.ini の設定
[PHP マニュアル](https://www.php.net/manual/ja/session.security.ini.php) で示されているように、`php.ini` にはセッションのセキュリティに関する重要な設定があります。
推奨される設定を必ず適用して下さい。特に、PHP インストールのデフォルトでは有効にされていない
`session.use_strict_mode` を有効にして下さい。

11
docs/guide-ja/start-databases.md

@ -178,8 +178,9 @@ class CountryController extends Controller
上記のコードを `controllers/CountryController.php` というファイルに保存します。
`index` アクションは `Country::find()` を呼び出します。このアクティブ・レコードのメソッドは `country` テーブルから全てのデータを読み出すことが可能な DB クエリを構築します。
一回のリクエストで返される国の数を制限するために、クエリは [[yii\data\Pagination]] オブジェクトの助けを借りてページ付けされます。
最初に `index` アクションは `Country::find()` を呼び出します。この [find()](https://www.yiiframework.com/doc/api/2.0/yii-db-activerecord#find()-detail) メソッドが `country` テーブルからデータを取得するメソッドを提供する [ActiveQuery](https://www.yiiframework.com/doc/api/2.0/yii-db-activequery) クエリ・オブジェクトオブジェクトを生成します。
一回のリクエストで返される国の数を制限するために、クエリ・オブジェクトは [[yii\data\Pagination]] オブジェクトの助けを借りてページ付けされます。
`Pagination` オブジェクトは二つの目的に奉仕します。
* クエリによって表現される SQL 文に `offset` 句と `limit` 句をセットして、
@ -187,8 +188,10 @@ class CountryController extends Controller
* 次の項で説明されるように、一連のページ・ボタンからなるページャを
ビューに表示するために使われます。
コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングしています。
このとき、国データだけでなく、そのページネーション情報がビューに渡されます。
次に、[all()](https://www.yiiframework.com/doc/api/2.0/yii-db-activequery#all()-detail) メソッドがクエリ結果に基づいて全ての `country` レコードを返します。
コードの最後で、`index` アクションは `index` と言う名前のビューをレンダリングします。
このときに、返された国データとそのページネーション情報がビューに渡されます。
ビューを作成する <span id="creating-view"></span>

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

@ -56,7 +56,7 @@ Yii はコントローラ・クラスの中で、アクション・メソッド
アクション ID は常に小文字で参照されます。
アクション ID が複数の単語を必要とするときは、単語がダッシュ (-) で連結されます (例えば、`create-comment`)。
アクション・メソッドの名前は、アクション ID からダッシュを全て削除し、各単語の先頭の文字を大文字にした結果に `action` という接頭辞を付けたものになります。
例えば、アクション ID `create-comment` に対応するアクション・メソッド名は `actionCreateComment` となります。
例えば、アクション ID `create-comment` はアクション・メソッド名 `actionCreateComment` に対応します。
私たちの例では、アクション・メソッドは `$message` というパラメータを取り、そのデフォルト値は `"こんにちは"` です
(PHP で関数やメソッドの引数にデフォルト値を設定するのと全く同じ方法です)。

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

@ -290,3 +290,93 @@ server {
また、HTTPS サーバを走らせている場合には、安全な接続であることを Yii が正しく検知できるように、
`fastcgi_param HTTPS on;` を追加しなければならないことにも注意を払ってください。
### 推奨される NGINX Unit の構成<span id="recommended-nginx-unit-configuration"></span>
[NGINX Unit](https://unit.nginx.org/) と PHP 言語モジュールを使って Yii ベースのアプリを走らせることが出来ます。
その構成のサンプルです。
```json
{
"listeners": {
"*:80": {
"pass": "routes/yii"
}
},
"routes": {
"yii": [
{
"match": {
"uri": [
"!/assets/*",
"*.php",
"*.php/*"
]
},
"action": {
"pass": "applications/yii/direct"
}
},
{
"action": {
"share": "/path/to/app/web/",
"fallback": {
"pass": "applications/yii/index"
}
}
}
]
},
"applications": {
"yii": {
"type": "php",
"user": "www-data",
"targets": {
"direct": {
"root": "/path/to/app/web/"
},
"index": {
"root": "/path/to/app/web/",
"script": "index.php"
}
}
}
}
}
```
また、自分の PHP 環境を [セットアップ](https://unit.nginx.org/configuration/#php) したり、この同じ構成でカスタマイズした `php.ini` を提供したりすることも出来ます。
### IIS の構成 <span id="iis-configuration"></span>
ドキュメント・ルートが `path/to/app/web` フォルダを指し、PHP を実行するように構成された仮想ホスト (ウェブ・サイト) でアプリケーションをホストすることを推奨します。その `web` フォルダに `web.config` という名前のファイル、すなわち `path/to/app/web/web.config` を配置しなければなりません。ファイルの内容は以下の通りです。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<directoryBrowse enabled="false" />
<rewrite>
<rules>
<rule name="Hide Yii Index" stopProcessing="true">
<match url="." ignoreCase="false" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile"
ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory"
ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="index.php" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
```
また、IIS 上で PHP を構成するためには、以下にリストした Microsoft の公式リソースが有用でしょう。
1. [IIS の最初の Web サイトを構成する方法](https://support.microsoft.com/ja-jp/help/323972/how-to-set-up-your-first-iis-web-site)
2. [Configure a PHP Website on IIS](https://docs.microsoft.com/en-us/iis/application-frameworks/scenario-build-a-php-website-on-iis/configure-a-php-website-on-iis)

2
docs/guide-ja/start-looking-ahead.md

@ -27,7 +27,7 @@ Gii をコード生成に使うと、ウェブ開発のプロセスの大部分
* コミュニティ
- フォーラム: <http://www.yiiframework.com/forum/>
- IRC チャット: freenode ネットワーク (<irc://irc.freenode.net/yii>) の #yii チャンネル
- Slack チャンネル: <https://yii.slack.com>
- Slack チャンネル: <https://join.slack.com/t/yii/shared_invite/enQtMzQ4MDExMDcyNTk2LTc0NDQ2ZTZhNjkzZDgwYjE4YjZlNGQxZjFmZDBjZTU3NjViMDE4ZTMxNDRkZjVlNmM1ZTA1ODVmZGUwY2U3NDA>
- Gitter チャット: <https://gitter.im/yiisoft/yii2>
- GitHub: <https://github.com/yiisoft/yii2>
- Facebook: <https://www.facebook.com/groups/yiitalk/>

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

@ -23,6 +23,15 @@ return [
'components' => [
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'encryption' => 'tls',
'host' => 'your_mail_server_host',
'port' => 'your_smtp_port',
'username' => 'your_username',
'password' => 'your_password',
],
],
],
];

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

@ -222,4 +222,4 @@ composer dumpautoload -o
## アプリケーションをスケーラブルなものにする覚悟を決める
何をやっても助けにならないときは、あなたのアプリケーションをスケーラブルにすることを試みましょう。良い導入記事が [Configuring a Yii 2 Application for an Autoscaling Stack (Yii 2 アプリケーションを自動スケール環境のために構成する)](https://github.com/samdark/yii2-cookbook/blob/master/book/scaling.md) の中で提供されています。更に詳しく知りたい場合は [Web apps performance and scaling (ウェブ・アプリのパフォーマンスとスケーリング)](http://thehighload.com/) を参照して下さい。
何をやっても助けにならないときは、あなたのアプリケーションをスケーラブルにすることを試みましょう。良い導入記事が [Configuring a Yii 2 Application for an Autoscaling Stack (Yii 2 アプリケーションを自動スケール環境のために構成する)](https://github.com/samdark/yii2-cookbook/blob/master/book/scaling.md) の中で提供されています。

4
docs/guide-pl/input-validation.md

@ -319,8 +319,10 @@ Wbudowany walidator jest zdefiniowaną w modelu metodą lub funkcją anonimową.
* @param mixed $params wartość parametru podanego w zasadzie walidacji
* @param \yii\validators\InlineValidator $validator powiązana instancja InlineValidator
* Ten parametr jest dostępny od wersji 2.0.11.
* @param mixed $current aktualnie walidowana wartość atrybutu.
* Ten parametr jest dostępny od wersji 2.0.36.
*/
function ($attribute, $params, $validator)
function ($attribute, $params, $validator, $current)
```
Jeśli atrybut nie przejdzie walidacji, metoda/funkcja powinna wywołać metodę [[yii\base\Model::addError()|addError()]] do zapisania wiadomości o błędzie w modelu,

1
docs/guide-pl/start-forms.md

@ -12,7 +12,6 @@ W tym poradniku nauczysz się jak:
* utworzyć [model](structure-models.md) reprezentujący dane wprowadzone przez użytkownika przez formularz,
* zadeklarować zasady do sprawdzenia wprowadzonych danych,
* zbudować formularz HTML w [widoku](structure-views.md).
* build an HTML form in a [view](structure-views.md).
Tworzenie modelu <span id="creating-model"></span>

4
docs/guide-ru/caching-data.md

@ -32,7 +32,7 @@ $data = $cache->getOrSet($key, function () {
```
Если в кэше есть данные по ключу `$key`, они будут сразу возвращены.
Иначе, будет вызвана переданная анонимная функция, вычисляющаяя значение, которое будет сохранено в кэш и возвращено
Иначе, будет вызвана переданная анонимная функция, вычисляющая значение, которое будет сохранено в кэш и возвращено
из метода.
В случае, когда анонимной функции требуются данные из внешней области видимости, можно передать их с помощью
@ -45,7 +45,7 @@ $data = $cache->getOrSet($key, function () use ($user_id) {
});
```
> Note: В [[yii\caching\Cache::getOrSet()|getOrSet()]] можно передать срока действия и зависимости кэша.
> Note: В [[yii\caching\Cache::getOrSet()|getOrSet()]] можно передать срок действия и зависимости кэша.
Прочтите [Срок действия кэша](#cache-expiration) и [Зависимости кеша](#cache-dependencies) чтобы узнать больше.

2
docs/guide-ru/caching-fragment.md

@ -17,7 +17,7 @@ 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::endCache()|endCache()]], то сгенерированное содержимое будет записано и сохранено в кэше.
Так же как и [кэширование данных](caching-data.md), для кэширования фрагментов требуется уникальный идентификатор для определения кэшируемого фрагмента.

6
docs/guide-ru/caching-http.md

@ -12,7 +12,7 @@ HTTP кэширование
## Заголовок `Last-Modified` <span id="last-modified"></span>
Заголовок `Last-Modified` использует временную метку timestamp, чтобы показать была ли страница изменена после того, как клиент закэшировал её.
Заголовок `Last-Modified` использует временную метку timestamp, чтобы показать, была ли страница изменена после того, как клиент закэшировал её.
Вы можете настроить свойство [[yii\filters\HttpCache::lastModified]], чтобы включить отправку заголовка `Last-Modified`. Свойство должно содержать PHP-функцию, возвращающую временную метку UNIX timestamp времени последнего изменения страницы. Сигнатура PHP-функции должна совпадать со следующей,
@ -44,7 +44,7 @@ public function behaviors()
```
Приведенный выше код устанавливает, что HTTP кэширование должно быть включено только для действия `index`. Он
генерирует `Last-Modified` HTTP заголовок на основе времени последнего сообщения. Когда браузер в первый раз посещает страницу `index`, то страница будет сгенерирована на сервере и отправлена в браузер; если браузер снова зайдёт на эту страницу и с тех пор ни один пост не обновится, то сервер не будет пересоздавать страницу и браузер будет использовать закэшированную на стороне клиента версию. В результате, будет пропущено как создание страницы на стороне сервера, так и передача содержания страницы клиенту.
генерирует `Last-Modified` HTTP заголовок на основе времени последнего сообщения. Когда браузер в первый раз посещает страницу `index`, то страница будет сгенерирована на сервере и отправлена в браузер; если браузер снова зайдёт на эту страницу и с тех пор ни один пост не обновится, то сервер не будет пересоздавать страницу и браузер будет использовать закэшированную на стороне клиента версию. В результате будет пропущено как создание страницы на стороне сервера, так и передача содержания страницы клиенту.
## Заголовок `ETag` <span id="etag"></span>
@ -81,7 +81,7 @@ public function behaviors()
```
Приведенный выше код устанавливает, что HTTP кэширование должно быть включено только для действия `view`. Он
генерирует `ETag` HTTP заголовок на основе заголовка и содержания последнего сообщения. Когда браузер в первый раз посещает страницу `view`, то страница будет сгенерирована на сервере и отправлена в браузер; если браузер снова зайдёт на эту страницу и с тех пор ни один пост не обновится, то сервер не будет пересоздавать страницу и браузер будет использовать закэшированную на стороне клиента версию. В результате, будет пропущено как создание страницы на стороне сервера, так и передача содержание страницы клиенту.
генерирует `ETag` HTTP заголовок на основе заголовка и содержания последнего сообщения. Когда браузер в первый раз посещает страницу `view`, то страница будет сгенерирована на сервере и отправлена в браузер; если браузер снова зайдёт на эту страницу и с тех пор ни один пост не обновится, то сервер не будет пересоздавать страницу и браузер будет использовать закэшированную на стороне клиента версию. В результате будет пропущено как создание страницы на стороне сервера, так и передача содержание страницы клиенту.
ETags позволяет применять более сложные и/или более точные стратегии кэширования, чем заголовок `Last-Modified`.
Например, ETag станет невалидным (некорректным), если на сайте была включена другая тема

2
docs/guide-ru/caching-page.md

@ -2,7 +2,7 @@
=================
Кэширование страниц — это кэширование всего содержимого страницы на стороне сервера. Позже, когда эта страница
будет снова запрошена, сервер вернет её из кэша вместо того чтобы генерировать её заново.
будет снова запрошена, сервер вернет её из кэша вместо того, чтобы генерировать её заново.
Кэширование страниц осуществляется при помощи [фильтра действия](structure-filters.md) [[yii\filters\PageCache]] и
может быть использовано в классе контроллера следующим образом:

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

@ -97,7 +97,7 @@ $cache = new FileCache([
]);
```
Для того, чтобы узнать поддерживает ли метод или свойство псевдонимы, обратитесь к документации API.
Для того, чтобы узнать, поддерживает ли метод или свойство псевдонимы, обратитесь к документации API.
Заранее определённые псевдонимы <span id="predefined-aliases"></span>

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

@ -75,7 +75,7 @@ require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';
```
Вы можете использовать автозагрузчик Composer без автозагрузчика Yii. Однако, скорость автозагрузки в этом случае
Вы можете использовать автозагрузчик Composer без автозагрузчика Yii. Однако скорость автозагрузки в этом случае
может уменьшится. Также вам будет необходимо следовать правилам автозагрузчика Composer.
> Info: Если вы не хотите использовать автозагрузчик Yii, создайте свою версию файла `Yii.php`

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

@ -348,7 +348,7 @@ $user->touch('login_time');
### Плюсы поведений <span id="pros-for-behaviors"></span>
Поведения, как и любые другие классы, поддерживают наследование. Трейты же можно рассматривать как копипейст
Поведения, как и любые другие классы, поддерживают наследование. Трейты можно рассматривать как копипейст
на уровне языка. Они наследование не поддерживают.
Поведения могут быть прикреплены и отвязаны от компонента динамически, без необходимости модифицирования класса

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

@ -55,7 +55,7 @@ Yii::configure($object, $config);
созданные через геттеры и сеттеры.
* Элементы `on eventName` указывают на то, какие обработчики должны быть прикреплены к [событиям](concept-events.md) объекта.
Обратите внимание, что ключи массива начинаются с `on `. Чтобы узнать весь список поддерживаемых видов
обработчиков событий обратитесь в раздел [события](concept-events.md)
обработчиков событий, обратитесь в раздел [события](concept-events.md)
* Элементы `as behaviorName` указывают на то, какие [поведения](concept-behaviors.md) должны быть внедрены в объект.
Обратите внимание, что ключи массива начинаются с `as `; а `$behaviorConfig` представляет собой конфигурацию для
создания [поведения](concept-behaviors.md), похожую на все остальные конфигурации.

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

@ -110,7 +110,7 @@ $container->get('Foo', [], [
Допустим, мы работаем над API и у нас есть:
- `app\components\Request`, наследуемый от `yii\web\Request` и реализующий дополнительные возможности.
- `app\components\Response`, наследуемый от `yii\web\Response` с свойством `format`, по умолчанию инициализируемом как `json`.
- `app\components\Response`, наследуемый от `yii\web\Response` со свойством `format`, по умолчанию инициализируемом как `json`.
- `app\storage\FileStorage` и `app\storage\DocumentsReader`, где реализована некая логика для работы с документами в
неком файловом хранилище:
@ -358,8 +358,11 @@ $container->setSingleton('yii\db\Connection', [
// "db" ранее зарегистрированный псевдоним
$db = $container->get('db');
// эквивалентно: $engine = new \app\components\SearchEngine($apiKey, ['type' => 1]);
$engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1]);
// эквивалентно: $engine = new \app\components\SearchEngine($apiKey, $apiSecret, ['type' => 1]);
$engine = $container->get('app\components\SearchEngine', [$apiKey, $apiSecret], ['type' => 1]);
// эквивалентно: $api = new \app\components\Api($host, $apiKey);
$api = $container->get('app\components\Api', ['host' => $host, 'apiKey' => $apiKey]);
```
За кулисами, контейнер внедрения зависимостей делает гораздо больше работы, чем просто создание нового объекта.

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

@ -280,7 +280,7 @@ Event::trigger(Dog::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Developer::className(), DanceEventInterface::EVENT_DANCE);
```
Однако, невозможно инициализировать событие во всех классах, которые реализуют интерфейс:
Однако невозможно инициализировать событие во всех классах, которые реализуют интерфейс:
```php
// НЕ БУДЕТ РАБОТАТЬ

2
docs/guide-ru/concept-service-locator.md

@ -8,7 +8,7 @@ Service Locator является объектом, предоставляющи
В Yii Service Locator является экземпляром класса [[yii\di\ServiceLocator]] или его дочернего класса.
Наиболее часто используемый Service Locator в Yii — это объект *приложения*, который можно получить через `\Yii::$app`.
Предоставляемые им службы, такие, как компоненты `request`, `response`, `urlManager`, называют *компонентами приложения*.
Предоставляемые им службы такие, как компоненты `request`, `response`, `urlManager`, называют *компонентами приложения*.
Благодаря Service Locator вы легко можете настроить эти компоненты или даже заменить их собственными реализациями.
Помимо объекта приложения, объект каждого модуля также является Service Locator.

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

@ -61,7 +61,7 @@ Yii поддерживает работу с Active Record для следующ
[[yii\db\Connection::$tablePrefix|tablePrefix]] задан как `tbl_`, `Customer` преобразуется в `tbl_customer`, а
`OrderItem` в `tbl_order_item`.
Если имя таблицы указано в формате `{{%TableName}}`, символ `%` заменяется префиксом. Например, , `{{%post}}` становится
Если имя таблицы указано в формате `{{%TableName}}`, символ `%` заменяется префиксом. Например `{{%post}}` становится
`{{tbl_post}}`. Фигуриные скобки используются для [экранирования в SQL-запросах](db-dao.md#quoting-table-and-column-names).
В нижеследующем примере мы объявляем класс Active Record с названием `Customer` для таблицы `customer`.
@ -385,7 +385,7 @@ $customer->save();
Метод [[yii\db\ActiveRecord::save()|save()]] может вставить или обновить строку данных в зависимости от состояния
Active Record объекта. Если объект создан с помощью оператора `new`, вызов метода [[yii\db\ActiveRecord::save()|save()]]
приведёт к вставке новой строки данных; если же объект был получен с помощью запроса на получение данных, вызов
приведёт к вставке новой строки данных; если объект был получен с помощью запроса на получение данных, вызов
[[yii\db\ActiveRecord::save()|save()]] обновит строку таблицы, соответствующую объекту Active Record.
Вы можете различать два состояния Active Record объекта с помощью проверки значения его свойства
@ -841,7 +841,7 @@ class Order extends ActiveRecord
ключи массива - столбцы связанных данных.
Есть простой способ запомнить это правило: как вы можете увидеть в примере выше, столбец связной Active Record
указывается сразу же после указания самого класса Active Record. Вы видите, что `customer_id` - это свойство класса
указывается сразу после указания самого класса Active Record. Вы видите, что `customer_id` - это свойство класса
`Order`, а `id` - свойство класса `Customer`.
@ -932,7 +932,7 @@ $orders = $customer->bigOrders;
При проектировании баз данных, когда между двумя таблицами имеется кратность связи many-to-many, обычно вводится
[промежуточная таблица](http://en.wikipedia.org/wiki/Junction_table). Например, таблицы `order` и `item` могут быть
связаны посредством промежуточной таблицы с названием `order_item`. Один заказ будет соотносится с несколькими товарами,
связаны посредством промежуточной таблицы с названием `order_item`. Один заказ будет соотноситься с несколькими товарами,
в то время как один товар будет также соотноситься с несколькими заказами.
При объявлении подобных связей вы можете пользоваться методом [[yii\db\ActiveQuery::via()|via()]] или методом
@ -1147,7 +1147,7 @@ $customers = Customer::find()
По умолчанию, метод [[yii\db\ActiveQuery::joinWith()|joinWith()]] будет использовать конструкцию `LEFT JOIN` для
объединения основной таблицы со связной. Вы можете указать другой тип операции JOIN (например, `RIGHT JOIN`) с помощью
третьего параметра этого метода - `$joinType`. Если же вам нужен `INNER JOIN`, вы можете вместо этого просто вызвать
третьего параметра этого метода - `$joinType`. Если вам нужен `INNER JOIN`, вы можете вместо этого просто вызвать
метод [[yii\db\ActiveQuery::innerJoinWith()|innerJoinWith()]].
Вызов метода [[yii\db\ActiveQuery::joinWith()|joinWith()]] будет [жадно загружать](#lazy-eager-loading) связные данные
@ -1214,7 +1214,7 @@ $query->joinWith([
$query->joinWith(['orders o'])->orderBy('o.id');
```
Этот синтаксис работает для простых связей. Если же необходимо использовать связующую таблицу, например
Этот синтаксис работает для простых связей. Если необходимо использовать связующую таблицу, например
`$query->joinWith(['orders.product'])`, то вызовы joinWith вкладываются друг в друга:
```php

6
docs/guide-ru/db-dao.md

@ -202,7 +202,7 @@ $post2 = $command->queryOne();
```
Обратите внимание что вы связываете маркер `$id` с переменной перед выполнением запроса, и затем меняете это значение
перед каждым последующим выполнением (часто это делается в цикле). Выполнении запросов таким образом может быть значительно
перед каждым последующим выполнением (часто это делается в цикле). Выполнение запросов таким образом может быть значительно
более эффективным, чем выполнение запроса для каждого значения параметра.
### Выполнение Не-SELECT запросов <span id="non-select-queries"></span>
@ -596,7 +596,7 @@ $rows = Yii::$app->db->useMaster(function ($db) {
## Работа со схемой базы данных <span id="database-schema"></span>
Yii DAO предоставляет целый набор методов для управления схемой базы данных, таких как создание новых таблиц, удаление
столбцов из таблицы, и т.д.. Эти методы описаны ниже:
столбцов из таблицы, и т.д. Эти методы описаны ниже:
* [[yii\db\Command::createTable()|createTable()]]: создание таблицы
* [[yii\db\Command::renameTable()|renameTable()]]: переименование таблицы
@ -632,5 +632,5 @@ $table = Yii::$app->db->getTableSchema('post');
```
Метод вернёт объект [[yii\db\TableSchema]], который содержит информацию о столбцах таблицы, первичных ключах, внешних
ключах, и т.д.. Вся эта информация используется главным образом для [построителя запросов](db-query-builder.md) и
ключах, и т.д. Вся эта информация используется главным образом для [построителя запросов](db-query-builder.md) и
[active record](db-active-record.md), чтоб помочь вам писать независимый от базы данных код.

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

@ -47,7 +47,7 @@ yii migrate/create create_news_table
> Note: Поскольку аргумент `name` будет использован как часть имени класса создаваемой миграции, он должен содержать только буквы, цифры и/или символы подчеркивания.
Приведенная выше команда создаст новый PHP класс с именем файла `m150101_185401_create_news_table.php` в директории `@app/migrations`. Файл содержит следующий код, который главным образом декларирует класс миграции `m150101_185401_create_news_table` с следующим каркасом кода:
Приведенная выше команда создаст новый PHP класс с именем файла `m150101_185401_create_news_table.php` в директории `@app/migrations`. Файл содержит следующий код, который главным образом декларирует класс миграции `m150101_185401_create_news_table` со следующим каркасом кода:
```php
<?php
@ -446,7 +446,7 @@ class m150811_220037_drop_position_column_from_post_table extends Migration
### Добавление промежуточной таблицы
Если имя миграции задано как `create_junction_table_for_xxx_and_yyy_tables`, файл будет содержать код для создания промежуточной таблцы.
Если имя миграции задано как `create_junction_table_for_xxx_and_yyy_tables`, файл будет содержать код для создания промежуточной таблицы.
```php
yii migrate/create create_junction_table_for_post_and_tag_tables
@ -553,7 +553,7 @@ class m160328_041642_create_junction_table_for_post_and_tag_tables extends Migra
При выполнении сложных миграций баз данных, важно обеспечить каждую миграцию либо успехом, либо ошибкой, в целом так, чтобы база данных могла поддерживать целостность и непротиворечивость. Для достижения данной цели рекомендуется, заключить операции каждой миграции базы данных в [транзакции](db-dao.md#performing-transactions).
Самый простой способ реализации транзакций миграций это прописать код миграций в методы `safeUp()` и `safeDown()`. Эти два метода отличаются от методов `up()` и `down()` тем, что они неявно заключены в транзакции. В результате, если какая-либо операция в этих методах не удается, все предыдущие операции будут отменены автоматически.
Самый простой способ реализации транзакций миграций это прописать код миграций в методы `safeUp()` и `safeDown()`. Эти два метода отличаются от методов `up()` и `down()` тем, что они неявно заключены в транзакции. В результате если какая-либо операция в этих методах не удается, все предыдущие операции будут отменены автоматически.
В следующем примере, помимо создания таблицы `news` мы также вставляем в этой таблице начальную строку.
@ -628,7 +628,7 @@ class m150101_185401_create_news_table extends Migration
> Info: [[yii\db\Migration]] не предоставляет методы запросов к базе данных. Это потому, что обычно не требуется отображать дополнительные сообщения об извлечении данных из базы данных. Это также, потому, что можно использовать более мощный [Построитель Запросов](db-query-builder.md) для построения и выполнения сложных запросов.
> Note: при обработке данных внутри миграции, может показаться, что использование существующих классов [Active Record](db-active-record.md), со всей их готовой бизнес логикой, будет разумным решением и упросит код миграции. Однако, следует помнить, что код миграций не должен меняться, по определению. В отличии от миграций, бизнес логика приложений часто изменяется. Это может привести к нарушению работы миграции при определённых изменениях на уровне Active Record. Поэтому рекомендуется делать миграции независимыми от других частей приложения, таких как классы Active Record.
> Note: при обработке данных внутри миграции, может показаться, что использование существующих классов [Active Record](db-active-record.md), со всей их готовой бизнес логикой, будет разумным решением и упросит код миграции. Однако следует помнить, что код миграций не должен меняться, по определению. В отличие от миграций, бизнес логика приложений часто изменяется. Это может привести к нарушению работы миграции при определённых изменениях на уровне Active Record. Поэтому рекомендуется делать миграции независимыми от других частей приложения, таких как классы Active Record.
## Применение Миграций <span id="applying-migrations"></span>
@ -731,7 +731,7 @@ yii migrate/mark 1392853618 # используя вре
Обратите внимание, что данный каталог должен существовать, иначе команда будет выдавать ошибку.
* `migrationTable`: строка - string (по умолчанию `migration`). Определяет имя таблицы в базе данных в которой хранится
информация о истории миграций. Эта таблица будет автоматически создана командой миграции, если её не существует.
информация об истории миграций. Эта таблица будет автоматически создана командой миграции, если её не существует.
Вы также можете создать её вручную, используя структуру `version varchar(255) primary key, apply_time integer`.
* `db`: строка - string (по умолчанию `db`). Определяет ID базы данных [компонента приложения](structure-application-components.md).

20
docs/guide-ru/db-query-builder.md

@ -384,7 +384,7 @@ $query->orderBy('id ASC, name DESC');
> Note: Вы должны использовать массив для указания `ORDER BY` содержащих выражения БД.
Вы можете вызывать [[yii\db\Query::addOrderBy()|addOrderBy()]] для добавления столбцов в фрагмент `ORDER BY`.
Вы можете вызывать [[yii\db\Query::addOrderBy()|addOrderBy()]] для добавления столбцов во фрагмент `ORDER BY`.
```php
$query->orderBy('id ASC')
@ -410,8 +410,8 @@ $query->groupBy('id, status');
> Note: Вы должны использовать массив для указания `GROUP BY` содержащих выражения БД.
Вы можете вызывать [[yii\db\Query::addGroupBy()|addGroupBy()]] для добавления имён столбцов в фрагмент `GROUP BY`.
For example,
Вы можете вызывать [[yii\db\Query::addGroupBy()|addGroupBy()]] для добавления имён столбцов во фрагмент `GROUP BY`.
Например,
```php
$query->groupBy(['id', 'status'])
@ -429,10 +429,10 @@ $query->groupBy(['id', 'status'])
$query->having(['status' => 1]);
```
Пожалуйста, обратитесь к документации для [where()](#where) для более подробной информации о определении условий.
Пожалуйста, обратитесь к документации для [where()](#where) для более подробной информации об определении условий.
Вы можете вызывать [[yii\db\Query::andHaving()|andHaving()]] или [[yii\db\Query::orHaving()|orHaving()]] для добавления
дополнительных условий в фрагмент `HAVING`.
дополнительных условий во фрагмент `HAVING`.
```php
// ... HAVING (`status` = 1) AND (`age` > 30)
@ -471,7 +471,7 @@ $query->join('LEFT JOIN', 'post', 'post.user_id = user.id');
- `$type`: тип объединения, например, `'INNER JOIN'`, `'LEFT JOIN'`.
- `$table`: имя таблицы, которая должна быть присоединена.
- `$on`: необязательное условие объединения, то есть фрагмент `ON`. Пожалуйста, обратитесь к документации для
[where()](#where) для более подробной информации о определении условий. Отметим, что синтаксис массивов **не работает**
[where()](#where) для более подробной информации об определении условий. Отметим, что синтаксис массивов **не работает**
для задания условий для столбцов, то есть `['user.id' => 'comment.userId']` будет означать условие, где ID пользователя
должен быть равен строке `'comment.userId'`. Вместо этого стоит указывать условие в виде строки `'user.id = comment.userId'`.
- `$params`: необязательные параметры присоединяемые к условию объединения.
@ -498,7 +498,7 @@ $subQuery = (new \yii\db\Query())->from('post');
$query->leftJoin(['u' => $subQuery], 'u.id = author_id');
```
В этом случае, вы должны передать подзапросы в массиве и использовать ключи для определения алиасов.
В этом случае вы должны передать подзапросы в массиве и использовать ключи для определения алиасов.
### [[yii\db\Query::union()|union()]] <span id="union"></span>
@ -554,7 +554,7 @@ $row = (new \yii\db\Query())
> Note: метод [[yii\db\Query::one()|one()]] вернёт только первую строку результата запроса. Он НЕ добавляет
`LIMIT 1` в генерируемый SQL. Это хорошо и предпочтительно если вы знаете, что запрос вернёт только одну или несколько
строк данных (например, при запросе по первичному ключу). Однако, если запрос потенциально может вернут много
строк данных (например, при запросе по первичному ключу). Однако если запрос потенциально может вернут много
строк данных, вы должны вызвать `limit(1)` для повышения производительности, Например,
`(new \yii\db\Query())->from('user')->limit(1)->one()`.
@ -574,7 +574,7 @@ $count = (new \yii\db\Query())
При вызове методов выборки [[yii\db\Query]], внутри на самом деле проводится следующая работа:
* Вызывается [[yii\db\QueryBuilder]] для генерации SQL запроса на основе текущего [[yii\db\Query]];
* Создаёт объект [[yii\db\Command]] с сгенерированным SQL запросом;
* Создаёт объект [[yii\db\Command]] со сгенерированным SQL запросом;
* Вызывается выбирающий метод (например [[yii\db\Command::queryAll()|queryAll()]]) из [[yii\db\Command]] для выполнения SQL запроса и извлечения данных.
Иногда вы можете захотеть увидеть или использовать SQL запрос построенный из объекта [[yii\db\Query]]. Этой цели можно
@ -662,7 +662,7 @@ SQL запрос к базе данных. Данные будут выбира
По сравнению с [[yii\db\Query::all()]], пакетная выборка загружает только по 100 строк данных за раз в память.
Если вы обрабатываете данные и затем сразу выбрасываете их, пакетная выборка может помочь уменьшить использование памяти.
Если указать индексный столбец через [[yii\db\Query::indexBy()]], в пакетной выборке индекс будет сохранятся.
Если указать индексный столбец через [[yii\db\Query::indexBy()]], в пакетной выборке индекс будет сохраняться.
Например,
```php

14
docs/guide-ru/glossary.md

@ -2,13 +2,15 @@
## alias
Alias это строка которую Yii использует чтобы указывать на класс или директорию, например '@app/vendor'.
Alias - это строка, с помощью которой Yii указывает на класс или директорию, например '@app/vendor'.
## application
Приложение является центральным объектом на протяжении HTTP запроса. Оно сожержит несколько компонентов и с ними получает информацию из запроса и отправляет ее для дальнейшей обработки.
Приложение является центральным объектом на протяжении HTTP запроса. Оно содержит несколько компонентов и с ними
получает информацию из запроса и отправляет ее для дальнейшей обработки.
Объект приложения создается в виде синглтона входным скриптом. Объект приложения доступен из любого места через `\Yii::$app`.
Объект приложения создается в виде Singleton(шаблон проектирования Одиночка) входным скриптом.
Объект приложения доступен из любого места через `\Yii::$app`.
## assets
@ -34,19 +36,19 @@ Bundle, известный как пакет в Yii 1.1, относится к
## extension
Расширения это набор классов, комплект ресурсов и конфигураций, которые добавляют приложению функциональность.
Расширения - это набор классов, комплект ресурсов и конфигураций, которые добавляют приложению функциональность.
# I
## installation
Установка это процесс подготовки чего-либо к работе либо путем чтения readme файла или выполнением подготовленного сценария. В случае Yii он устанавливает разрешения и необходимые зависимости.
Установка - это процесс подготовки чего-либо к работе либо путем чтения readme файла или выполнением подготовленного сценария. В случае Yii он устанавливает разрешения и необходимые зависимости.
# M
## module
Модуль это подпрограмма которая содержит элементы MVC, такие как модели, представления, контроллеры и т.д. и может быть использована без главного приложения. Обычно пробрасывая запросы в модуль вместо обработки контроллером.
Модуль - это подпрограмма, которая содержит элементы MVC: модели, представления, контроллеры и т.д. Может быть использована без главного приложения. Обычно пробрасывая запросы в модуль вместо обработки контроллером.
# N

4
docs/guide-ru/helper-array.md

@ -1,11 +1,11 @@
ArrayHelper
===========
Вдобавок к [богатому набору функций](https://secure.php.net/manual/ru/book.array.php) для работы с массивами, которые есть в самом PHP, хелпер Yii Array предоставляет свои статические функции, которые могут быть вам полезны.
Вдобавок к [богатому набору функций](https://secure.php.net/manual/ru/book.array.php) для работы с массивами, которые есть в самом PHP, хелпер Yii Array предоставляет свои статические функции - возможно они могут быть вам полезны.
## Получение значений <span id="getting-values"></span>
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сперва вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
Извлечение значений из массива, объекта или структуры состоящей из них обоих с помощью стандартных средств PHP является довольно скучным занятием. Сначала вам нужно проверить есть ли соответствующий ключ с помощью `isset`, и если есть – получить, если нет – подставить значение по умолчанию.
```php
class User

12
docs/guide-ru/helper-html.md

@ -101,7 +101,7 @@ echo Html::tag('div', 'Сохранить', $options);
// выведет '<div class="btn btn-success btn-lg">Сохранить</div>'
```
`Html::addCssClass()` предотвращает дублирование классов, поэтому можно не беспокоиться о том, что какой-либо класс
`Html::addCssClass()` предотвращает дублирование классов, поэтому можно не беспокоиться, что какой-либо класс
будет добавлен дважды:
```php
@ -272,7 +272,7 @@ $decodedUserName = Html::decode($userName);
<?= Html::activeCheckboxList($user, 'role', ArrayHelper::map($roleModels, 'id', 'name')) ?>
```
Если же нет, используйте радио-переключатель:
Если нет, используйте радио-переключатель:
```php
<?= Html::radioList('roles', [16, 42], ArrayHelper::map($roleModels, 'id', 'name')) ?>
@ -347,18 +347,18 @@ echo Html::getAttributeName('dates[0]');
Для формирования встроенных скриптов и стилей есть два метода:
```php
<?= Html::style('.danger { color: #f00; }') ?>
<?= Html::style('.danger { color: #f00; }', ['media' => 'print']) ?>
Результатом будет:
<style>.danger { color: #f00; }</style>
<style media="print">.danger { color: #f00; }</style>
<?= Html::script('alert("Привет!");', ['defer' => true]) ?>
<?= Html::script('alert("Привет!");') ?>
Результатом будет:
<script defer>alert("Привет!");</script>
<script>alert("Привет!");</script>
```
Если вы хотите подключить внешний CSS-файл:

4
docs/guide-ru/helper-url.md

@ -30,7 +30,7 @@ $httpsAbsoluteBaseUrl = Url::base('https');
## Создание URL <span id="creating-urls"></span>
Чтобы создать URL для соответствующего роута используйте метод `Url::toRoute()`. Метод использует [[\yii\web\UrlManager]].
Чтобы создать URL для соответствующего роута, используйте метод `Url::toRoute()`. Метод использует [[\yii\web\UrlManager]].
Для того чтобы создать URL:
```php
@ -62,7 +62,7 @@ $url = Url::toRoute(['product/view', 'id' => 42]);
- Если роут начинается не со слеша (например, `site/index`), то он будет считаться относительным роутом текущего модуля
и будет определен с помощью [[\yii\base\Module::uniqueId|uniqueId]].
Начиная с версии 2.0.2, вы можете задавать роуты с помощью [псевдонимов](concept-aliases.md). В этом случае, сначала
Начиная с версии 2.0.2, вы можете задавать роуты с помощью [псевдонимов](concept-aliases.md). В этом случае сначала
псевдоним будет сконвертирован в соответствующий роут, который будет преобразован в абсолютный в соответствии с вышеописанными
правилами.

2
docs/guide-ru/input-form-javascript.md

@ -105,7 +105,7 @@ function (event)
### `ajaxBeforeSend`
`ajaxBeforeSend` cобытие инициируется перед отправкой AJAX запроса для проверки основанной на AJAX.
`ajaxBeforeSend` событие инициируется перед отправкой AJAX запроса для проверки основанной на AJAX.
Сигнатура обработчика события должна быть:

6
docs/guide-ru/input-forms.md

@ -58,7 +58,7 @@ $form = ActiveForm::begin([
и [[yii\widgets\ActiveForm::end()|ActiveForm::end()]], будет завёрнут в HTML-тег `<form>`. Вы можете изменить некоторые
настройки виджета через передачу массива в его `begin` метод, так же как и в любом другом виджете. В этом случае дополнительный CSS-класс и идентификатор будет прикреплён к открывающемуся тегу `<form>`. Для просмотра всех доступных настроек, пожалуйста, обратитесь к документации 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
// элемент формы для ввода пароля
@ -94,7 +94,7 @@ echo $form->field($model, 'items[]')->checkboxList(['a' => 'Item A', 'b' => 'Ite
Дополнительные 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: Если вы используете Twitter Bootstrap CSS в своём приложении, то воспользуйтесь [[yii\bootstrap\ActiveForm]] вместо [[yii\widgets\ActiveForm]]. Он добавит к ActiveForm дополнительные стили, которые сработают в рамках bootstrap CSS.
> Tip: для добавления "звёздочки" к обязательным элементам формы, воспользуйтесь следующим CSS:
>
@ -153,7 +153,7 @@ Pjax::begin([
ActiveForm::end();
Pjax::end();
```
> Tip: Будьте осторожны с ссылками внутри виджета [[yii\widgets\Pjax|Pjax]] так как ответ будет
> Tip: Будьте осторожны со ссылками внутри виджета [[yii\widgets\Pjax|Pjax]] так как ответ будет
> также отображаться внутри виджета. Чтобы ссылка работала без PJAX, добавьте к ней HTML-атрибут
> `data-pjax="0"`.

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

@ -8,7 +8,7 @@
Если прежде вы не использовали Yii 1.1, вы можете сразу перейти к разделу «[Начало работы](start-installation.md)».
Также учтите, что в Yii 2.0 гораздо больше новых возможностей, чем описано далее. Настоятельно рекомендуется, изучить
всё руководство. Вполне возможно, что то, что раньше приходилось разрабатывать самостоятельно теперь является частью
всё руководство. Вполне возможно, что-то, что раньше приходилось разрабатывать самостоятельно теперь является частью
фреймворка.
@ -16,7 +16,7 @@
--------
Yii 2.0 широко использует [Composer](https://getcomposer.org/), который является основным менеджером зависимостей для PHP.
Установка как фреймворка, так и расширений, осуществляется через Composer. Подробно о установке Yii 2.0 вы можете узнать
Установка как фреймворка, так и расширений, осуществляется через Composer. Подробно об установке Yii 2.0 вы можете узнать
из раздела «[Установка Yii](start-installation.md)». О том, как создавать расширения для Yii 2.0 или адаптировать
уже имеющиеся расширения от версии 1.1, вы можете узнать из раздела «[Создание расширений](structure-extensions.md#creating-extensions)».
@ -260,7 +260,7 @@ ActiveForm::end();
В Yii 2.0 темы работают совершенно по-другому. Теперь они основаны на механизме сопоставления путей исходного файла
представления с темизированным файлом. Например, если используется сопоставление путей `['/web/views' => '/web/themes/basic']`,
то темизированная версия файла представления `/web/views/site/index.php` будет находится в `/web/themes/basic/site/index.php`.
то темизированная версия файла представления `/web/views/site/index.php` будет находиться в `/web/themes/basic/site/index.php`.
По этой причине темы могут быть применены к любому файлу представления, даже к представлению, отрендеренному внутри контекста
контроллера или виджета. Также, больше не существует компонента `CThemeManager`. Вместо этого, `theme` является конфигурируемым
свойством компонента приложения `view`.
@ -399,7 +399,7 @@ Active Record
построение запросов и работу со связями.
Класс `CDbCriteria` версии 1.1 был заменен [[yii\db\ActiveQuery]]. Этот класс наследуется от [[yii\db\Query]] и таким
образом получает все методы, необходимые для построения запроса. Чтобы начать строить запрос следует вызвать метод
образом получает все методы, необходимые для построения запроса. Чтобы начать строить запрос, следует вызвать метод
[[yii\db\ActiveRecord::find()]]:
```php

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

@ -42,7 +42,7 @@ Yii — не проект одного человека. Он поддержив
Требования к ПО и знаниям
-------------------------
Yii 2.0 требует PHP 5.4.0 и выше и наилучшим образом работает на последней версии PHP 7. Чтобы узнать требования для отдельных возможностей вы можете запустить скрипт проверки
Yii 2.0 требует PHP 5.4.0 и выше и наилучшим образом работает на последней версии PHP 7. Чтобы узнать требования для отдельных возможностей, вы можете запустить скрипт проверки
требований, который поставляется с каждым релизом фреймворка.
Для разработки на Yii потребуется общее понимание ООП, так как фреймворк полностью следует этой парадигме. Также стоит

4
docs/guide-ru/output-data-providers.md

@ -170,8 +170,8 @@ $provider = new ArrayDataProvider([
$rows = $provider->getModels();
```
> Note: Сравнивая с [Active Data Provider](#active-data-provider) и [SQL Data Provider](#sql-data-provider),
ArrayDataProvider менее эффективный потому, что требует загрузки *всех* данных в память.
> Note: По сравнению с [Active Data Provider](#active-data-provider) и [SQL Data Provider](#sql-data-provider),
ArrayDataProvider менее эффективный, потому что требует загрузки *всех* данных в память.
## Принципы работы с ключами данных <span id="working-with-keys"></span>

2
docs/guide-ru/rest-error-handling.md

@ -3,7 +3,7 @@
Если при обработке запроса к RESTful API в запросе пользователя обнаруживается ошибка или происходит
что-то непредвиденное на сервере, вы можете просто выбрасывать исключение, чтобы уведомить пользователя о нештатной ситуации.
Если же вы можете установить конкретную причину ошибки (например, запрошенный ресурс не существует), вам следует подумать
Если вы можете установить конкретную причину ошибки (например, запрошенный ресурс не существует), вам следует подумать
о том, чтобы выбрасывать исключение с соответствующим кодом состояния HTTP (например, [[yii\web\NotFoundHttpException]],
соответствующее коду состояния 404). Yii отправит ответ с соответствующим
HTTP-кодом и текстом. Он также включит в тело ответа сериализованное представление

4
docs/guide-ru/rest-resources.md

@ -14,7 +14,7 @@ RESTful API строятся вокруг доступа к *ресурсам*
В этом разделе, мы сосредоточимся на том, как при помощи класса ресурса, наследуемого от [[yii\base\Model]]
(или дочерних классов) задать какие данные будут возвращаться RESTful API. Если класс ресурса не наследуется от
[[yii\base\Model]], возвращаются всего его public свойства.
[[yii\base\Model]], возвращаются все его public свойства.
## Поля <span id="fields"></span>
@ -22,7 +22,7 @@ RESTful API строятся вокруг доступа к *ресурсам*
Когда ресурс включается в ответ RESTful API, необходимо сериализовать его в строку. Yii разбивает этот процесс на два этапа.
Сначала ресурс конвертируется в массив при помощи [[yii\rest\Serializer]]. На втором этапе массив сериализуется в строку
заданного формата (например, JSON или XML) при помощи [[yii\web\ResponseFormatterInterface|форматтера ответа]].
Именно на этом стоит сосредоточится при разработке класса ресурса.
Именно на этом стоит сосредоточиться при разработке класса ресурса.
Вы можете указать какие данные включать в представление ресурса в виде массива путём переопределения методов
[[yii\base\Model::fields()|fields()]] и/или [[yii\base\Model::extraFields()|extraFields()]]. Разница между ними в том,

2
docs/guide-ru/rest-response-formatting.md

@ -164,7 +164,7 @@ Content-Type: application/json; charset=UTF-8
может пригодиться для более тонкой настройки кодирования.
Свойство [[yii\web\Response::formatters|formatters]] компонента приложения `response` может быть
[сконфигурировано](concept-configuration.md) следующим образом:
[сконфигурировано](concept-configurations.md) следующим образом:
```php
'response' => [

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

@ -50,7 +50,7 @@
* `OPTIONS /users/123`: список HTTP-методов, поддерживаемые точкой входа `/users/123`.
Вы можете настроить опции `only` и `except`, явно указав для них список действий, которые поддерживаются или
которые должны быть отключены, соответственно. Например:
должны быть отключены, соответственно. Например:
```php
[

4
docs/guide-ru/runtime-logging.md

@ -17,7 +17,7 @@ Yii предоставляет мощную, гибко настраиваему
* [[Yii::debug()]]: записывает сообщения для отслеживания выполнения кода приложения. Используется, в основном, при разработке.
* [[Yii::info()]]: записывает сообщение, содержащее какую-либо полезную информацию.
* [[Yii::warning()]]: записывает *тревожное* сообщение при возникновении неожиданного события.
* [[Yii::error()]]: записывает критическую ошибку, на которую нужно, как можно скорее, обратить внимаение.
* [[Yii::error()]]: записывает критическую ошибку, на которую нужно, как можно скорее, обратить внимание.
Эти методы позволяют записывать сообщения разных *уровней важности* и *категорий*. Они имеют одинаковое описание функции `function ($message, $category = 'application')`, где `$message` передает сообщение для записи, а `$category` - категорию сообщения. В следующем примере будет записано *trace* сообщение с категорией по умолчанию `application`:
@ -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 [

8
docs/guide-ru/runtime-requests.md

@ -45,7 +45,7 @@ $params = $request->bodyParams;
$param = $request->getBodyParam('id');
```
> Info: В отличии от `GET` параметров, параметры, которые были переданы через `POST`, `PUT`, `PATCH` и д.р. отправляются в теле запроса.
> Info: В отличие от `GET` параметров, параметры, которые были переданы через `POST`, `PUT`, `PATCH` и д.р. отправляются в теле запроса.
Компонент `request` будет обрабатывать эти параметры, когда вы попробуете к ним обратиться через методы, описанные выше.
Вы можете настроить способ обработки этих параметров через настройку свойства [[yii\web\Request::parsers]].
@ -75,7 +75,7 @@ if ($request->isPut) { /* текущий запрос является PUT за
* [[yii\web\Request::absoluteUrl|absoluteUrl]]: вернёт адрес `http://example.com/admin/index.php/product?id=100`,
который содержит полный URL, включая имя хоста.
* [[yii\web\Request::hostInfo|hostInfo]]: вернёт адрес `http://example.com`, который содержит только имя хоста.
* [[yii\web\Request::pathInfo|pathInfo]]: вернёт адрес `/product`, который содержит часть между адресом начального скрипта и параметрами запроса, которые идут после знака вопроса.
* [[yii\web\Request::pathInfo|pathInfo]]: вернёт адрес `/product`, который содержит часть между адресом начального скрипта и параметрами запроса, идущих после знака вопроса.
* [[yii\web\Request::queryString|queryString]]: вернёт адрес `id=100`, который содержит часть URL после знака вопроса.
* [[yii\web\Request::baseUrl|baseUrl]]: вернёт адрес `/admin`, который является частью URL после информации о хосте и перед именем входного скрипта.
* [[yii\web\Request::scriptUrl|scriptUrl]]: вернёт адрес `/admin/index.php`, который содержит URL без информации о хосте и параметрах запроса.
@ -138,7 +138,7 @@ $userIP = Yii::$app->request->userIP;
[[yii\web\Request::ipHeaders|ipHeaders]] и
[[yii\web\Request::secureProtocolHeaders|secureProtocolHeaders]]
Ниже приведена конфигурация компонента `request` для приложения, которое работает за рядом обратных прокси, которые расположены в IP-сети `10.0.2.0/24`:
Ниже приведена конфигурация компонента `request` для приложения, которое работает за рядом обратных прокси, расположенных в IP-сети `10.0.2.0/24`:
```php
'request' => [
@ -176,4 +176,4 @@ IP-адрес, по умолчанию, отправляется прокси-с
],
```
В приведенной выше конфигурации все заголовки, перечисленные в `secureHeaders`, отфильтровываются из запроса, кроме заголовков `X-ProxyUser-Ip` и `Front-End-Https` в случае, если запрос создан прокси.
В этом случае, первый используется для получения IP-адреса пользователя, настроенного в `ipHeaders`, а последний будет использоваться для определения результата [[yii\web\Request::getIsSecureConnection()]].
В этом случае первый используется для получения IP-адреса пользователя, настроенного в `ipHeaders`, а последний будет использоваться для определения результата [[yii\web\Request::getIsSecureConnection()]].

8
docs/guide-ru/runtime-responses.md

@ -24,7 +24,7 @@ Yii::$app->response->statusCode = 200;
```
Однако в большинстве случаев явная установка не требуется так как значение [[yii\web\Response::statusCode]]
по умолчанию равно 200. Если же вам нужно показать, что запрос не удался, вы можете выбросить соответствующее
по умолчанию равно 200. Если вам нужно показать, что запрос не удался, вы можете выбросить соответствующее
HTTP-исключение:
```php
@ -216,8 +216,8 @@ public function actionDownload()
}
```
При вызове метода отправки файла вне методов действий чтобы быть уверенным, что к ответу не будет добавлено никакое
нежелательное содержимое, следует вызвать сразу после него [[yii\web\Response::send()]].
Чтобы быть уверенным, что к ответу не будет добавлено никакое
нежелательное содержимое, при вызове метода [[yii\web\Response::sendFile()]] вне методов action, следует вызвать сразу после него [[yii\web\Response::send()]].
```php
\Yii::$app->response->sendFile('path/to/file.txt')->send();
@ -239,7 +239,7 @@ Web-серверов:
## Отправка ответа <span id="sending-response"></span>
Содержимое ответа не отправляется пользователю до вызова метода [[yii\web\Response::send()]]. По умолчанию он вызывается
автоматически в конце метода [[yii\base\Application::run()]]. Однако, чтобы ответ был отправлен немедленно, вы можете
автоматически в конце метода [[yii\base\Application::run()]]. Однако чтобы ответ был отправлен немедленно, вы можете
вызвать этот метод явно.
Для отправки ответа метод [[yii\web\Response::send()]] выполняет следующие шаги:

4
docs/guide-ru/runtime-routing.md

@ -453,8 +453,8 @@ echo Url::previous();
]
```
> Note: по умолчанию [[yii\web\UrlManager::$normalizer|UrlManager::$normalizer]] отключен. Чтобы использовать
нормализацию его необходимо сконфигурировать.
> Note: По умолчанию [[yii\web\UrlManager::$normalizer|UrlManager::$normalizer]] отключен. Чтобы использовать
нормализацию, его необходимо сконфигурировать.
### Методы HTTP <span id="http-methods"></span>

6
docs/guide-ru/security-authorization.md

@ -224,6 +224,10 @@ return [
];
```
> Примечание: Если вы используете шаблон проекта basic, компонент `authManager` необходимо настроить как в `config/web.php`, так и в
> [конфигурации консольного приложения](tutorial-console.md#configuration) `config/console.php`.
> При использовании шаблона проекта advanced `authManager` достаточно настроить единожды в `common/config/main.php`.
`DbManager` использует четыре таблицы для хранения данных:
- [[yii\rbac\DbManager::$itemTable|itemTable]]: таблица для хранения авторизационных элементов. По умолчанию "auth_item".
@ -539,7 +543,7 @@ $auth->addChild($admin, $author);
// ... add permissions as children of $admin ...
```
Обратите внимание, так как "author" добавлен как дочерняя роль к "admin", следовательно в реализации метода `execute()`
Обратите внимание, так как "author" добавлен как дочерняя роль к "admin", следовательно, в реализации метода `execute()`
класса правила вы должны учитывать эту иерархию. Именно поэтому для роли "author" метод `execute()` вернёт истину,
если пользователь принадлежит к группам 1 или 2 (это означает, что пользователь находится в группе
администраторов или авторов)

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

@ -18,7 +18,7 @@
---------------------------------------------
В файле `models/EntryForm.php` создайте класс модели `EntryForm` как показано ниже. Он будет использоваться для
хранения данных, введённых пользователем. Подробно о именовании файлов классов читайте в разделе
хранения данных, введённых пользователем. Подробно об именовании файлов классов читайте в разделе
«[Автозагрузка классов](concept-autoloading.md)».
```php

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

@ -109,10 +109,10 @@ http://hostname/index.php?r=site%2Fsay&message=Привет+мир
Параметр `r` в нашем URL требует дополнительных пояснений. Он связан с [маршрутом (route)](runtime-routing.md), который представляет
собой уникальный идентификатор, указывающий на действие. Его формат `ControllerID/ActionID`. Когда приложение получает
запрос, оно проверяет параметр `r` и, используя `ControllerID`, определяет какой контроллер следует использовать для
обработки запроса. Затем, контроллер использует часть `ActionID`, чтобы определить какое действие выполняет реальную работу.
запрос, оно проверяет параметр `r` и, используя `ControllerID`, определяет какой контроллер использовать для
обработки запроса. Затем, контроллер использует часть `ActionID`, чтобы определить, какое действие выполняет реальную работу.
В нашем случае маршрут `site/say` будет соответствовать контроллеру `SiteController` и его действию `say`.
В результате, для обработки запроса будет вызван метод `SiteController::actionSay()`.
В результате для обработки запроса будет вызван метод `SiteController::actionSay()`.
> Info: Как и действия, контроллеры также имеют идентификаторы, которые однозначно определяют их в приложении.
Идентификаторы контроллеров используют те же правила именования, что и идентификаторы действий. Имена классов

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

@ -56,7 +56,7 @@ $config = require __DIR__ . '/../config/web.php';
#### [[yii\base\Application::basePath|basePath]] <span id="basePath"></span>
Свойство [[yii\base\Application::basePath|basePath]] указывает на корневую директорию приложения. Эта директория содержит
весь защищенный исходный код приложения. В данной директории обычно могут находится поддиректории `models`, `views`,
весь защищенный исходный код приложения. В данной директории обычно могут находиться поддиректории `models`, `views`,
`controllers`, содержащие код, соответствующий шаблону проектирования MVC.
Вы можете задать свойство [[yii\base\Application::basePath|basePath]] используя путь к директории или используя
@ -71,7 +71,7 @@ $config = require __DIR__ . '/../config/web.php';
### Важные свойства <span id="important-properties"></span>
Свойства, указанные в этом подразделе, часто нуждаются в преднастройке т.к. они разнятся от приложения к приложению.
Свойства, указанные в этом подразделе, часто нуждаются в предварительной настройке т.к. они разнятся от приложения к приложению.
#### [[yii\base\Application::aliases|aliases]] <span id="aliases"></span>
@ -373,7 +373,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
#### [[yii\base\Application::charset|charset]] <span id="charset"></span>
Свойство указывает кодировку, которую использует приложение. По-умолчанию значение равно `'UTF-8'`, которое должно быть
Свойство указывает кодировку, которую использует приложение. По-умолчанию значение равно `'UTF-8'` - должно быть
оставлено как есть для большинства приложения, только если вы не работаете с устаревшим кодом, который использует большее
количество данных не юникода.
@ -509,7 +509,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] <span id="beforeRequest"></span>
Данное событие возникает *до* того как приложение начинает обрабатывать входящий запрос.
Данное событие возникает *до* того, как приложение начинает обрабатывать входящий запрос.
Настоящее имя события - `beforeRequest`.
На момент возникновения данного события, объект приложения уже создан и проинициализирован. Таким образом, это
@ -520,7 +520,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] <span id="afterRequest"></span>
Данное событие возникает *после* того как приложение заканчивает обработку запроса, но *до* того как произойдет
Данное событие возникает *после* того, как приложение заканчивает обработку запроса, но *до* того как произойдет
отправка ответа. Настоящее имя события - `afterRequest`.
На момент возникновения данного события, обработка запроса завершена и вы можете воспользоваться этим для произведения постобработки
@ -532,7 +532,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] <span id="beforeAction"></span>
Событие возникает *до* того как будет выполнено [действие контроллера](structure-controllers.md).
Событие возникает *до* того, как будет выполнено [действие контроллера](structure-controllers.md).
Настоящее имя события - `beforeAction`.
Событие является объектом [[yii\base\ActionEvent]]. Обработчик события может устанавливать
@ -571,7 +571,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
[
'on afterAction' => function ($event) {
if (некоторое условие) {
// modify $event->result
// обрабатываем $event->result
} else {
}
},

28
docs/guide-ru/structure-assets.md

@ -124,12 +124,38 @@ class FontAwesomeAsset extends AssetBundle
public $css = [
'css/font-awesome.min.css',
];
public $publishOptions = [
'only' => [
'fonts/*',
'css/*',
]
];
}
```
Более сложную логику можно реализовать с помощью переопределения `init()`. Ниже указан пример публикации поддиректорий этим способом:
```php
<?php
namespace app\assets;
use yii\web\AssetBundle;
class FontAwesomeAsset extends AssetBundle
{
public $sourcePath = '@bower/font-awesome';
public $css = [
'css/font-awesome.min.css',
];
public function init()
{
parent::init();
$this->publishOptions['beforeCopy'] = function ($from, $to) {
$dirname = basename(dirname($from));
if (basename(dirname($from)) !== 'font-awesome') {
return true;
}
$dirname = basename($from);
return $dirname === 'fonts' || $dirname === 'css';
};
}

6
docs/guide-ru/structure-controllers.md

@ -240,7 +240,7 @@ class SiteController extends Controller
Например, `index` соответствует `actionIndex`, а `hello-world` соответствует `actionHelloWorld`.
> Note: Названия имен действий являются *регистрозависимыми*. Если у вас есть метод `ActionIndex`, он не будет
учтен как метод действия, таким образом, запрос к действию `index` приведет к выбросу исключению. Также следует учесть, что методы действий
учтен как метод действия, таким образом, запрос к действию `index` приведет к выбросу исключения. Также следует учесть, что методы действий
должны иметь область видимости public. Методы имеющие область видимости private или protected НЕ определяют методы встроенных действий.
@ -305,7 +305,7 @@ class HelloWorldAction extends Action
в качестве ответа.
* Для [[yii\web\Application|Веб приложений]], возвращаемое значение также может быть произвольными данными, которые будут
присвоены [[yii\web\Response::data]], а затем сконвертированы в строку, представляющую тело ответа.
присвоены [[yii\web\Response::data]], а затем конвертированы в строку, представляющую тело ответа.
* Для [[yii\console\Application|Консольных приложений]], возвращаемое значение также может быть числом, представляющим
[[yii\console\Response::exitStatus|статус выхода]] исполнения команды.
@ -367,7 +367,7 @@ public function actionView(array $id, $version = null)
Теперь, если запрос будет содержать URL `http://hostname/index.php?r=post/view&id[]=123`, то параметр `$id` примет значение
`['123']`. Если запрос будет содержать URL `http://hostname/index.php?r=post/view&id=123`, то параметр `$id` все равно будет
содержать массив, т. к. скалярное значение `'123'` будет автоматически сконвертировано в массив.
содержать массив, т. к. скалярное значение `'123'` будет автоматически конвертировано в массив.
Вышеприведенные примеры в основном показывают как параметры действий работают для Веб приложений. Больше информации
о параметрах консольных приложений представлено в секции [Консольные команды](tutorial-console.md).

8
docs/guide-ru/structure-models.md

@ -143,7 +143,7 @@ $model = new User(['scenario' => User::SCENARIO_LOGIN]);
```
По умолчанию сценарии, поддерживаемые моделью, определяются [правилами валидации](#validation-rules) объявленными
в модели. Однако, Вы можете изменить это поведение путем переопределения метода [[yii\base\Model::scenarios()]] как показано ниже:
в модели. Однако Вы можете изменить это поведение путем переопределения метода [[yii\base\Model::scenarios()]] как показано ниже:
```php
namespace app\models;
@ -169,7 +169,7 @@ class User extends ActiveRecord
Метод `scenarios()` возвращает массив, ключами которого являются имена сценариев, а значения - соответствующие *активные атрибуты*. Активные атрибуты могут быть [массово присвоены](#massive-assignment) и подлежат [валидации](#validation-rules). В приведенном выше примере, атрибуты `username` и `password` это активные атрибуты сценария `login`, а в сценарии `register` так же активным атрибутом является `email` вместе с `username` и `password`.
По умолчанию реализация `scenarios()` вернёт все найденные сценарии в правилах валидации задекларированных в методе [[yii\base\Model::rules()]]. При переопределении метода `scenarios()`, если Вы хотите ввести новые сценарии помимо стандартных, Вы можете написать код на основе следующего примера:
По умолчанию реализация `scenarios()` вернёт все найденные сценарии в правилах валидации, задекларированных в методе [[yii\base\Model::rules()]]. При переопределении метода `scenarios()`, если Вы хотите ввести новые сценарии помимо стандартных, Вы можете написать код на основе следующего примера:
```php
namespace app\models;
@ -326,14 +326,14 @@ $model->secret = $secret;
Часто нужно экспортировать модели в различные форматы. Например, может потребоваться преобразовать коллекцию моделей в JSON или Excel формат. Процесс экспорта может быть разбит на два самостоятельных шага. На первом этапе модели преобразуются в массивы; на втором этапе массивы преобразуются в целевые форматы. Вы можете сосредоточиться только на первом шаге потому, что второй шаг может быть достигнут путем универсального инструмента форматирования данных, такого как [[yii\web\JsonResponseFormatter]].
Самый простой способ преобразования модели в массив - использовать свойство [[yii\base\Model::$attributes]].
Например,
Например
```php
$post = \app\models\Post::findOne(100);
$array = $post->attributes;
```
По умолчанию, свойство [[yii\base\Model::$attributes]] возвращает значения *всех* атрибутов объявленных в [[yii\base\Model::attributes()]].
По умолчанию свойство [[yii\base\Model::$attributes]] возвращает значения *всех* атрибутов объявленных в [[yii\base\Model::attributes()]].
Более гибкий и мощный способ конвертирования модели в массив - использовать метод [[yii\base\Model::toArray()]]. Его поведение по умолчанию такое же как и у [[yii\base\Model::$attributes]]. Тем не менее, он позволяет выбрать, какие элементы данных, называемые *полями*, поставить в результирующий массив и как они должны быть отформатированы. На самом деле, этот способ экспорта моделей по умолчанию применяется при разработке в RESTful Web service, как описано в [Response Formatting](rest-response-formatting.md).

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

@ -1,7 +1,7 @@
Модули
=======
Модули - это законченные программные блоки, состоящие из [моделей](structure-models.md), [представлений](structure-views.md), [контроллеров](structure-controllers.md) и других вспомогательных компонентов. При установке модулей в [приложение](structure-applications.md), конечный пользователь получает доступ к их контроллерам. По этой причине модули часто рассматриваются как миниатюрные приложения. В отличии от [приложений](structure-applications.md), модули нельзя развертывать отдельно. Модули должны находиться внутри приложений.
Модули - это законченные программные блоки, состоящие из [моделей](structure-models.md), [представлений](structure-views.md), [контроллеров](structure-controllers.md) и других вспомогательных компонентов. При установке модулей в [приложение](structure-applications.md), конечный пользователь получает доступ к их контроллерам. По этой причине модули часто рассматриваются как миниатюрные приложения. В отличие от [приложений](structure-applications.md), модули нельзя развертывать отдельно. Модули должны находиться внутри приложений.
## Создание модулей <span id="creating-modules"></span>

4
docs/guide-ru/test-environment-setup.md

@ -14,7 +14,7 @@ Yii 2 официально поддерживает интеграцию с фр
[`yii2-basic`](https://github.com/yiisoft/yii2-app-basic) и
[`yii2-advanced`](https://github.com/yiisoft/yii2-app-advanced).
Для того, чтобы запустить тесты необходимо установить [Codeception](https://github.com/Codeception/Codeception).
Для того, чтобы запустить тесты, необходимо установить [Codeception](https://github.com/Codeception/Codeception).
Сделать это можно как локально, то есть только для текущего проекта, так и глобально для компьютера разработчика.
Для локальной установки используйте следующие команды:
@ -53,7 +53,7 @@ Changed current directory to <directory>
Если вы используете Apache и настроили его как описано в разделе «[Установка Yii](start-installation.md)», то для тестов вам необходимо создать отдельный виртуальный хост который будет работать с той же папкой, но использовать входной скрипт `index-test.php`:
```
<VirtualHost *:80>
DocumentRoot "path/to/basic/webb"
DocumentRoot "path/to/basic/web"
ServerName mysite-test
<Directory "path/to/basic/web">
Order Allow,Deny

8
docs/guide-ru/test-fixtures.md

@ -11,7 +11,7 @@
загружаете один или несколько объектов фикстур перед запуском теста и выгружаете их после его завершения.
Фикстура может зависеть от других фикстур, заданных через свойство [[yii\test\Fixture::depends]].
Когда фикстура загружается, фикстуры от которых она зависит будут автоматически загружены ДО нее, а когда она
Когда фикстура загружается, фикстуры, от которых она зависит, будут автоматически загружены ДО нее, а когда она
выгружается все зависимые фикстуры будут выгружены ПОСЛЕ нее.
@ -49,7 +49,7 @@ class UserFixture extends ActiveFixture
Данные для фикстуры `ActiveFixture`, как правило, находятся в файле `FixturePath/data/TableName.php`,
где `FixturePath` указывает на директорию, в которой располагается файл класса фикстуры, а `TableName` на имя таблицы,
с которой она ассоциируется. Для примера выше, данные должны должны быть в файле `@app/tests/fixtures/data/user.php`.
с которой она ассоциируется. Для примера выше, данные должны быть в файле `@app/tests/fixtures/data/user.php`.
Данный файл должен вернуть массив данных для строк, которые будут вставлены в таблицу пользователей. Например
```php
@ -295,7 +295,7 @@ return [
Класс фикстур должны содержать суффикс `Fixture`. По умолчанию поиск фикстур выполняется в пространстве имен `tests\unit\fixtures`, но вы можете изменить это поведение
через конфигурационный файл или параметры команды. Вы можете исключить некоторые фикстуры из загрузки или выгрузки добавив `-` перед их именем, например `-User`.
Чтобы загрузить фикстуру, выполните следующую команду::
Чтобы загрузить фикстуру, выполните следующую команду:
```
yii fixture/load <fixture_name>
@ -308,7 +308,7 @@ yii fixture/load <fixture_name>
// загрузить фикстуру `User`
yii fixture/load User
// то же что и выше, т.к. "load" является действие по умолчанию для команды "fixture"
// то же что и выше, т.к. "load" является действием по умолчанию для команды "fixture"
yii fixture User
// загрузить нескольких фикстур

2
docs/guide-ru/test-overview.md

@ -14,7 +14,7 @@
Процесс разработки фичи следующий:
- Создать новый тест, который описывает функцию, которая будет реализована.
- Создать новый тест, описывающий функцию, которая будет реализована.
- Запустить новый тест и убедиться, что он терпит неудачу. Это ожидаемо, т.к. на данный момент еще нет конкретной реализации.
- Написать простой код, чтобы новый тест отрабатывал без ошибок.
- Запустить все тесты и убедиться, что они отрабатывают без ошибок

3
docs/guide-ru/test-unit.md

@ -15,7 +15,8 @@
Запуск тестов шаблонов проектов basic и advanced
------------------------------------------------
Следуйте инструкциям в `apps/advanced/tests/README.md` и `apps/basic/tests/README.md`.
- [Инструкции для шаблона advanced](https://github.com/yiisoft/yii2-app-advanced/blob/master/docs/guide/start-testing.md).
- [Инструкции для шаблона basic](https://github.com/yiisoft/yii2-app-basic/blob/master/README.md#testing).
Модульные тесты фреймворка
--------------------------

4
docs/guide-ru/tutorial-i18n.md

@ -497,7 +497,7 @@ class TranslationEventHandler
Переводы могут храниться в [[yii\i18n\PhpMessageSource|PHP-файлах]], [[yii\i18n\GettextMessageSource|файлах .po]] или в [[yii\i18n\DbMessageSource|базе данных]]. См. соответствующие классы для дополнительных опций.
Прежде всего, вам необходимо создать конфигурационный файл. Решите где вы хотите хранить его и затем выполните команду
Прежде всего, вам необходимо создать конфигурационный файл. Решите, где вы хотите хранить его и затем выполните команду
```bash
./yii message/config-template path/to/config.php
@ -557,7 +557,7 @@ class TranslationEventHandler
Для работы с большей частью функций интернационализации Yii использует [PHP-расширение intl](https://secure.php.net/manual/ru/book.intl.php).
Например, это расширение используют классы, отвечающие за форматирование чисел и дат [[yii\i18n\Formatter]] и за форматирование
строк [[yii\i18n\MessageFormatter]]. Оба класса поддерживают базовый функционал даже в том случае, если расширение `intl` не
установлено. Однако, этот запасной вариант более-менее будет работать только для сайтов на английском языке, хотя даже для
установлено. Однако этот запасной вариант более или менее будет работать только для сайтов на английском языке, хотя даже для
них большая часть широких возможностей расширения `intl` не будет доступна, поэтому его установка настоятельно рекомендуется.
[PHP-расширение intl](https://secure.php.net/manual/ru/book.intl.php) основано на [библиотеке ICU](http://site.icu-project.org/), которая

6
docs/guide-ru/tutorial-performance-tuning.md

@ -19,7 +19,7 @@
При запуске приложения в производственном режиме, вам нужно отключить режим отладки. Yii использует значение константы
`YII_DEBUG` чтобы указать, следует ли включить режим отладки. Когда режим отладки включен, Yii тратит дополнительное
время чтобы создать и записать отладочную информацию.
время, чтобы создать и записать отладочную информацию.
Вы можете разместить следующую строку кода в начале [входного скрипта](structure-entry-scripts.md) чтобы
отключить режим отладки:
@ -154,7 +154,7 @@ CREATE TABLE session (
## Использование обычных массивов <span id="using-arrays"></span>
Хотя [Active Record](db-active-record.md) очень удобно использовать, это не так эффективно, как использование простых
массивов, когда вам нужно получить большое количество данных из БД. В этом случае, вы можете вызвать `asArray()` при
массивов, когда вам нужно получить большое количество данных из БД. В этом случае вы можете вызвать `asArray()` при
использовании Active Record для получения данных, чтобы извлеченные данные были представлены в виде массивов вместо
громоздких записей Active Record. Например,
@ -189,7 +189,7 @@ composer dumpautoload -o
## Асинхронная обработка данных <span id="processing-data-offline"></span>
Когда запрос включает в себя некоторые ресурсоемкие операции, вы должны подумать о том, чтобы выполнить эти операции
Когда запрос включает в себя некоторые ресурсоёмкие операции, вы должны подумать о том, чтобы выполнить эти операции
асинхронно, не заставляя пользователя ожидать их окончания.
Существует два метода асинхронной обработки данных: pull и push.

2
docs/guide-ru/tutorial-yii-as-micro-framework.md

@ -122,7 +122,7 @@ micro-app/
## Создание REST API
Чтобы продемонстрировать использование нашей "микроархитектуры" мы создадим простой REST API для сообщений.
Чтобы продемонстрировать использование нашей "микроархитектуры", мы создадим простой REST API для сообщений.
Чтобы этот API обслуживал некоторые данные, нам нужна база данных. Добавим конфигурацию подключения базы данных
к конфигурации приложения:

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

@ -2,7 +2,7 @@ Yii là gì
===========
Yii là một PHP Framework mã nguồn mở và hoàn toàn miễn phí, có hiệu năng xử lý cao, phát triển tốt nhất trên các ứng dụng Web 2.0, sử dụng tối đa các thành phần (component-based PHP framework) để tăng tốc độ viết ứng dụng.
Tên Yii (được phát âm là `Yee` hoặc `[ji:]`) ở Trung Quốc có nghĩa là "thật đơn giản và luôn phát triển". Nghĩa thứ hai có thể đọc ngắn gọn là **Yes It Is**!
Tên Yii (được phát âm là `Yee` hoặc `[ji:]`) ở Trung Quốc có nghĩa là "thật đơn giản và luôn phát triển" (Hán tự "易", âm "dịch"). Nghĩa thứ hai có thể đọc ngắn gọn là **Yes It Is**!
Yii thích hợp nhất để làm gì?

8
docs/guide-zh-CN/README.md

@ -79,10 +79,10 @@ Yii 2.0 权威指南
* [查询生成器(Query Builder)](db-query-builder.md): 使用简单抽象层查询数据库
* [活动记录(Active Record)](db-active-record.md): 活动记录对象关系映射(ORM),检索和操作记录、定义关联关系
* [数据库迁移(Migrations)](db-migrations.md): 在团体开发中对你的数据库使用版本控制
* [Sphinx](https://github.com/yiisoft/yii2-sphinx/blob/master/docs/guide-zh-CN/README.md)
* [Redis(yii2-redis)](yii2-redis.md): yii2-redis 扩展详解
* [MongoDB](https://github.com/yiisoft/yii2-mongodb/blob/master/docs/guide-zh-CN/README.md)
* [ElasticSearch](https://github.com/yiisoft/yii2-elasticsearch/blob/master/docs/guide-zh-CN/README.md)
* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide)
* [Redis(yii2-redis)](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide/2.0/zh-cn): yii2-redis 扩展详解
* [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide)
* [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide)
接收用户数据(Getting Data from Users)

4
docs/guide-zh-CN/concept-di-container.md

@ -427,7 +427,7 @@ $container->setDefinitions([
}
]);
$reader = $container->get('app\storage\DocumentsReader);
$reader = $container->get('app\storage\DocumentsReader');
// 将按照配置中的描述创建 DocumentReader 对象及其依赖关系
```
@ -465,7 +465,7 @@ $container->setDefinitions([
]
]);
$reader = $container->get('app\storage\DocumentsReader);
$reader = $container->get('app\storage\DocumentsReader');
// 将与前面示例中的行为完全相同。
```

6
docs/guide-zh-CN/concept-properties.md

@ -16,11 +16,11 @@ $object->label = trim($label);
就不得不修改所有给 `label` 属性赋值的代码。这种代码的重复会导致 bug,
这种实践显然需要尽可能避免。
为解决该问题,Yii 引入了一个名为 [[yii\base\Object]] 的基类,
为解决该问题,Yii 引入了一个名为 [[yii\base\BaseObject]] 的基类,
它支持基于类内的 *getter**setter*(读取器和设定器)方法来定义属性。
如果某类需要支持这个特性,只需要继承 [[yii\base\Object]] 或其子类即可。
如果某类需要支持这个特性,只需要继承 [[yii\base\BaseObject]] 或其子类即可。
> Info: 几乎每个 Yii 框架的核心类都继承自 [[yii\base\Object]] 或其子类。
> Info: 几乎每个 Yii 框架的核心类都继承自 [[yii\base\BaseObject]] 或其子类。
这意味着只要在核心类中见到 getter 或 setter 方法,就可以像调用属性一样调用它。
getter 方法是名称以 `get` 开头的方法,而 setter 方法名以 `set` 开头。

2
docs/guide-zh-CN/rest-response-formatting.md

@ -164,7 +164,7 @@ JSON 响应将由 [[yii\web\JsonResponseFormatter|JsonResponseFormatter]] 类来
比如 [[yii\web\JsonResponseFormatter::$prettyPrint|$prettyPrint]],这对于开发更好的可读式响应更有用,
或者用 [[yii\web\JsonResponseFormatter::$encodeOptions|$encodeOptions]] 去控制 JSON 编码的输出。
格式化程序可以在 [configuration](concept-configuration.md) 的 `response` 应用程序组件 [[yii\web\Response::formatters|formatters]] 的属性进行配置,
格式化程序可以在 [configuration](concept-configurations.md) 的 `response` 应用程序组件 [[yii\web\Response::formatters|formatters]] 的属性进行配置,
如下所示:
```php

4
docs/guide-zh-CN/test-environment-setup.md

@ -8,8 +8,8 @@ Yii 2 官方兼容 [`Codeception`](https://github.com/Codeception/Codeception)
- [功能测试](test-functional.md) - 在浏览器模拟器中以用户视角来验证期望的场景是否发生
- [验收测试](test-acceptance.md) - 在真实的浏览器中以用户视角验证期望的场景是否发生。
Yii 为包括 [`yii2-basic`](https://github.com/yiisoft/yii2/tree/master/apps/basic) 和
[`yii2-advanced`](https://github.com/yiisoft/yii2/tree/master/apps/advanced)
Yii 为包括 [`yii2-basic`](https://github.com/yiisoft/yii2-app-basic) 和
[`yii2-advanced`](https://github.com/yiisoft/yii2-app-advanced)
在内的应用模板脚手架提供全部三种类型的即用测试套件。
Codeception 预装了基本和高级项目模板。

63
docs/guide/concept-di-container.md

@ -169,6 +169,9 @@ $container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');
// to create an instance of Connection
$container->set('foo', 'yii\db\Connection');
// register an alias with `Instance::of`
$container->set('bar', Instance::of('foo'));
// register a class with configuration. The configuration
// will be applied when the class is instantiated by get()
$container->set('yii\db\Connection', [
@ -179,7 +182,7 @@ $container->set('yii\db\Connection', [
]);
// register an alias name with class configuration
// In this case, a "class" element is required to specify the class
// In this case, a "class" or "__class" element is required to specify the class
$container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
@ -188,11 +191,12 @@ $container->set('db', [
'charset' => 'utf8',
]);
// register a PHP callable
// register callable closure or array
// The callable will be executed each time when $container->get('db') is called
$container->set('db', function ($container, $params, $config) {
return new \yii\db\Connection($config);
});
$container->set('db', ['app\db\DbFactory', 'create']);
// register a component instance
// $container->get('pageCache') will return the same instance each time it is called
@ -215,7 +219,6 @@ $container->setSingleton('yii\db\Connection', [
]);
```
Resolving Dependencies <span id="resolving-dependencies"></span>
----------------------
@ -238,6 +241,9 @@ $db = $container->get('db');
// equivalent to: $engine = new \app\components\SearchEngine($apiKey, $apiSecret, ['type' => 1]);
$engine = $container->get('app\components\SearchEngine', [$apiKey, $apiSecret], ['type' => 1]);
// equivalent to: $api = new \app\components\Api($host, $apiKey);
$api = $container->get('app\components\Api', ['host' => $host, 'apiKey' => $apiKey]);
```
Behind the scene, the DI container does much more work than just creating a new object.
@ -372,6 +378,24 @@ cannot be instantiated. This is because you need to tell the DI container how to
Now if you access the controller again, an instance of `app\components\BookingService` will be
created and injected as the 3rd parameter to the controller's constructor.
Since Yii 2.0.36 when using PHP 7 action injection is available for both web and console controllers:
```php
namespace app\controllers;
use yii\web\Controller;
use app\components\BookingInterface;
class HotelController extends Controller
{
public function actionBook($id, BookingInterface $bookingService)
{
$result = $bookingService->book($id);
// ...
}
}
```
Advanced Practical Usage <span id="advanced-practical-usage"></span>
---------------
@ -440,32 +464,27 @@ we shall copy-paste the line that creates `FileStorage` object, that is not the
As described in the [Resolving Dependencies](#resolving-dependencies) subsection, [[yii\di\Container::set()|set()]]
and [[yii\di\Container::setSingleton()|setSingleton()]] can optionally take dependency's constructor parameters as
a third argument. To set the constructor parameters, you may use the following configuration array format:
- `key`: class name, interface name or alias name. The key will be passed to the
[[yii\di\Container::set()|set()]] method as a first argument `$class`.
- `value`: array of two elements. The first element will be passed to the [[yii\di\Container::set()|set()]] method as the
second argument `$definition`, the second one — as `$params`.
a third argument. To set the constructor parameters, you may use the `__construct()` option:
Let's modify our example:
```php
$container->setDefinitions([
'tempFileStorage' => [ // we've created an alias for convenience
['class' => 'app\storage\FileStorage'],
['/var/tempfiles'] // could be extracted from some config files
'class' => 'app\storage\FileStorage',
'__construct()' => ['/var/tempfiles'], // could be extracted from some config files
],
'app\storage\DocumentsReader' => [
['class' => 'app\storage\DocumentsReader'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsReader',
'__construct()' => [Instance::of('tempFileStorage')],
],
'app\storage\DocumentsWriter' => [
['class' => 'app\storage\DocumentsWriter'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsWriter',
'__construct()' => [Instance::of('tempFileStorage')]
]
]);
$reader = $container->get('app\storage\DocumentsReader);
$reader = $container->get('app\storage\DocumentsReader');
// Will behave exactly the same as in the previous example.
```
@ -488,19 +507,19 @@ create its instance once and use it multiple times.
```php
$container->setSingletons([
'tempFileStorage' => [
['class' => 'app\storage\FileStorage'],
['/var/tempfiles']
'class' => 'app\storage\FileStorage',
'__construct()' => ['/var/tempfiles']
],
]);
$container->setDefinitions([
'app\storage\DocumentsReader' => [
['class' => 'app\storage\DocumentsReader'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsReader',
'__construct()' => [Instance::of('tempFileStorage')],
],
'app\storage\DocumentsWriter' => [
['class' => 'app\storage\DocumentsWriter'],
[Instance::of('tempFileStorage')]
'class' => 'app\storage\DocumentsWriter',
'__construct()' => [Instance::of('tempFileStorage')],
]
]);

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

Loading…
Cancel
Save