Full Code of yiisoft/yii2 for AI

master f59774fd3b65 cached
2161 files
18.8 MB
4.0M tokens
3757 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (16,154K chars total). Download the full file to get everything.
Repository: yiisoft/yii2
Branch: master
Commit: f59774fd3b65
Files: 2161
Total size: 18.8 MB

Directory structure:
gitextract_0uomsu8b/

├── .appveyor.yml
├── .codecov.yml
├── .dockerignore
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SECURITY.md
│   ├── actions/
│   │   ├── php-setup/
│   │   │   └── action.yml
│   │   └── phpunit/
│   │       └── action.yml
│   └── workflows/
│       ├── build.yml
│       ├── ci-mariadb.yml
│       ├── ci-mssql.yml
│       ├── ci-mysql.yml
│       ├── ci-node.yml
│       ├── ci-oracle.yml
│       ├── ci-pgsql.yml
│       ├── ci-sqlite.yml
│       ├── linter.yaml
│       └── static.yml
├── .gitignore
├── .gitlab-ci.yml
├── .well-known/
│   └── funding-manifest-urls
├── Dockerfile
├── LICENSE.md
├── README.md
├── ROADMAP.md
├── build/
│   ├── .htaccess
│   ├── build
│   ├── build.bat
│   ├── build.xml
│   └── controllers/
│       ├── ClassmapController.php
│       ├── DevController.php
│       ├── MimeTypeController.php
│       ├── PhpDocController.php
│       ├── ReleaseController.php
│       ├── TranslationController.php
│       ├── Utf8Controller.php
│       └── views/
│           └── translation/
│               └── report_html.php
├── code-of-conduct.md
├── composer.json
├── contrib/
│   └── completion/
│       ├── bash/
│       │   └── yii
│       └── zsh/
│           └── _yii
├── docs/
│   ├── documentation_style_guide.md
│   ├── guide/
│   │   ├── README.md
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-json.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-filtering-collections.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-ar/
│   │   ├── README.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   └── start-workflow.md
│   ├── guide-de/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   └── translators.json
│   ├── guide-es/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-multiple-models.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-pagination.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-fr/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── translators.json
│   │   └── tutorial-i18n.md
│   ├── guide-id/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-overview.md
│   │   └── translators.json
│   ├── guide-it/
│   │   ├── README.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   └── start-installation.md
│   ├── guide-ja/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-json.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-filtering-collections.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-pl/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── db-active-record.md
│   │   ├── db-migrations.md
│   │   ├── glossary.md
│   │   ├── helper-overview.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-pagination.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-overview.md
│   │   ├── security-overview.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-overview.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   └── tutorial-yii-as-micro-framework.md
│   ├── guide-pt-BR/
│   │   ├── README.md
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-data-providers.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-overview.md
│   │   ├── translators.json
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-shared-hosting.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-ru/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-json.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-filtering-collections.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-tr/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── intro-yii.md
│   │   ├── start-prerequisites.md
│   │   └── translators.json
│   ├── guide-uk/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-fragment.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-models.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── tutorial-console.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-uz/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-page.md
│   │   ├── images/
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-workflow.md
│   │   └── structure-controllers.md
│   ├── guide-vi/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   └── structure-views.md
│   ├── guide-zh-CN/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── documentation_style_guide.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── internals/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── exception_hierarchy.vsd
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── schema-builder-patterns.xlsx
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-es/
│   │   └── translation-workflow.md
│   ├── internals-fa/
│   │   └── core-code-style.md
│   ├── internals-ja/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── exception_hierarchy.vsd
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── schema-builder-patterns.xlsx
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-pl/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── exception_hierarchy.vsd
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── schema-builder-patterns.xlsx
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-pt-BR/
│   │   └── translation-workflow.md
│   ├── internals-ru/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── blocktypes.json
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-sr-Latn/
│   │   ├── automation.md
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── report-an-issue.md
│   │   └── translation-workflow.md
│   ├── internals-uk/
│   │   ├── automation.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── report-an-issue.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   └── internals-uz/
│       └── translation-workflow.md
├── eslint.config.js
├── framework/
│   ├── .github/
│   │   ├── CONTRIBUTING.md
│   │   ├── FUNDING.yml
│   │   ├── PULL_REQUEST_TEMPLATE.md
│   │   └── SECURITY.md
│   ├── .gitignore
│   ├── .htaccess
│   ├── .meta-storm/
│   │   ├── active-record.meta-storm.xml
│   │   ├── array.meta-storm.xml
│   │   ├── controller.meta-storm.xml
│   │   ├── db.meta-storm.xml
│   │   ├── html.meta-storm.xml
│   │   ├── model.meta-storm.xml
│   │   ├── view.meta-storm.xml
│   │   └── widgets.meta-storm.xml
│   ├── .phpstorm.meta.php
│   ├── BaseYii.php
│   ├── CHANGELOG.md
│   ├── LICENSE.md
│   ├── README.md
│   ├── UPGRADE.md
│   ├── Yii.php
│   ├── assets/
│   │   ├── yii.activeForm.js
│   │   ├── yii.captcha.js
│   │   ├── yii.gridView.js
│   │   ├── yii.js
│   │   └── yii.validation.js
│   ├── base/
│   │   ├── Action.php
│   │   ├── ActionEvent.php
│   │   ├── ActionFilter.php
│   │   ├── Application.php
│   │   ├── ArrayAccessTrait.php
│   │   ├── Arrayable.php
│   │   ├── ArrayableTrait.php
│   │   ├── BaseObject.php
│   │   ├── Behavior.php
│   │   ├── BootstrapInterface.php
│   │   ├── Component.php
│   │   ├── Configurable.php
│   │   ├── Controller.php
│   │   ├── DynamicContentAwareInterface.php
│   │   ├── DynamicContentAwareTrait.php
│   │   ├── DynamicModel.php
│   │   ├── ErrorException.php
│   │   ├── ErrorHandler.php
│   │   ├── Event.php
│   │   ├── Exception.php
│   │   ├── ExitException.php
│   │   ├── InlineAction.php
│   │   ├── InvalidArgumentException.php
│   │   ├── InvalidCallException.php
│   │   ├── InvalidConfigException.php
│   │   ├── InvalidParamException.php
│   │   ├── InvalidRouteException.php
│   │   ├── InvalidValueException.php
│   │   ├── Model.php
│   │   ├── ModelEvent.php
│   │   ├── Module.php
│   │   ├── NotSupportedException.php
│   │   ├── Request.php
│   │   ├── Response.php
│   │   ├── Security.php
│   │   ├── StaticInstanceInterface.php
│   │   ├── StaticInstanceTrait.php
│   │   ├── Theme.php
│   │   ├── UnknownClassException.php
│   │   ├── UnknownMethodException.php
│   │   ├── UnknownPropertyException.php
│   │   ├── UserException.php
│   │   ├── View.php
│   │   ├── ViewContextInterface.php
│   │   ├── ViewEvent.php
│   │   ├── ViewNotFoundException.php
│   │   ├── ViewRenderer.php
│   │   ├── Widget.php
│   │   ├── WidgetEvent.php
│   │   └── package.json
│   ├── behaviors/
│   │   ├── AttributeBehavior.php
│   │   ├── AttributeTypecastBehavior.php
│   │   ├── AttributesBehavior.php
│   │   ├── BlameableBehavior.php
│   │   ├── CacheableWidgetBehavior.php
│   │   ├── OptimisticLockBehavior.php
│   │   ├── SluggableBehavior.php
│   │   └── TimestampBehavior.php
│   ├── caching/
│   │   ├── ApcCache.php
│   │   ├── ArrayCache.php
│   │   ├── Cache.php
│   │   ├── CacheInterface.php
│   │   ├── CallbackDependency.php
│   │   ├── ChainedDependency.php
│   │   ├── DbCache.php
│   │   ├── DbDependency.php
│   │   ├── DbQueryDependency.php
│   │   ├── Dependency.php
│   │   ├── DummyCache.php
│   │   ├── ExpressionDependency.php
│   │   ├── FileCache.php
│   │   ├── FileDependency.php
│   │   ├── MemCache.php
│   │   ├── MemCacheServer.php
│   │   ├── TagDependency.php
│   │   ├── WinCache.php
│   │   └── migrations/
│   │       ├── m150909_153426_cache_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── captcha/
│   │   ├── Captcha.php
│   │   ├── CaptchaAction.php
│   │   ├── CaptchaAsset.php
│   │   ├── CaptchaValidator.php
│   │   └── SpicyRice.md
│   ├── classes.php
│   ├── composer.json
│   ├── console/
│   │   ├── Application.php
│   │   ├── Controller.php
│   │   ├── ErrorHandler.php
│   │   ├── Exception.php
│   │   ├── ExitCode.php
│   │   ├── Markdown.php
│   │   ├── Request.php
│   │   ├── Response.php
│   │   ├── UnknownCommandException.php
│   │   ├── controllers/
│   │   │   ├── AssetController.php
│   │   │   ├── BaseMigrateController.php
│   │   │   ├── CacheController.php
│   │   │   ├── FixtureController.php
│   │   │   ├── HelpController.php
│   │   │   ├── MessageController.php
│   │   │   ├── MigrateController.php
│   │   │   └── ServeController.php
│   │   ├── runtime/
│   │   │   └── .gitignore
│   │   └── widgets/
│   │       └── Table.php
│   ├── data/
│   │   ├── ActiveDataFilter.php
│   │   ├── ActiveDataProvider.php
│   │   ├── ArrayDataProvider.php
│   │   ├── BaseDataProvider.php
│   │   ├── DataFilter.php
│   │   ├── DataProviderInterface.php
│   │   ├── Pagination.php
│   │   ├── Sort.php
│   │   └── SqlDataProvider.php
│   ├── db/
│   │   ├── ActiveQuery.php
│   │   ├── ActiveQueryInterface.php
│   │   ├── ActiveQueryTrait.php
│   │   ├── ActiveRecord.php
│   │   ├── ActiveRecordInterface.php
│   │   ├── ActiveRelationTrait.php
│   │   ├── AfterSaveEvent.php
│   │   ├── ArrayExpression.php
│   │   ├── BaseActiveRecord.php
│   │   ├── BatchQueryResult.php
│   │   ├── CheckConstraint.php
│   │   ├── ColumnSchema.php
│   │   ├── ColumnSchemaBuilder.php
│   │   ├── Command.php
│   │   ├── Connection.php
│   │   ├── Constraint.php
│   │   ├── ConstraintFinderInterface.php
│   │   ├── ConstraintFinderTrait.php
│   │   ├── DataReader.php
│   │   ├── DefaultValueConstraint.php
│   │   ├── Exception.php
│   │   ├── Expression.php
│   │   ├── ExpressionBuilder.php
│   │   ├── ExpressionBuilderInterface.php
│   │   ├── ExpressionBuilderTrait.php
│   │   ├── ExpressionInterface.php
│   │   ├── ForeignKeyConstraint.php
│   │   ├── IndexConstraint.php
│   │   ├── IntegrityException.php
│   │   ├── JsonExpression.php
│   │   ├── Migration.php
│   │   ├── MigrationInterface.php
│   │   ├── PdoValue.php
│   │   ├── PdoValueBuilder.php
│   │   ├── Query.php
│   │   ├── QueryBuilder.php
│   │   ├── QueryExpressionBuilder.php
│   │   ├── QueryInterface.php
│   │   ├── QueryTrait.php
│   │   ├── Schema.php
│   │   ├── SchemaBuilderTrait.php
│   │   ├── SqlToken.php
│   │   ├── SqlTokenizer.php
│   │   ├── StaleObjectException.php
│   │   ├── TableSchema.php
│   │   ├── Transaction.php
│   │   ├── ViewFinderTrait.php
│   │   ├── conditions/
│   │   │   ├── AndCondition.php
│   │   │   ├── BetweenColumnsCondition.php
│   │   │   ├── BetweenColumnsConditionBuilder.php
│   │   │   ├── BetweenCondition.php
│   │   │   ├── BetweenConditionBuilder.php
│   │   │   ├── ConditionInterface.php
│   │   │   ├── ConjunctionCondition.php
│   │   │   ├── ConjunctionConditionBuilder.php
│   │   │   ├── ExistsCondition.php
│   │   │   ├── ExistsConditionBuilder.php
│   │   │   ├── HashCondition.php
│   │   │   ├── HashConditionBuilder.php
│   │   │   ├── InCondition.php
│   │   │   ├── InConditionBuilder.php
│   │   │   ├── LikeCondition.php
│   │   │   ├── LikeConditionBuilder.php
│   │   │   ├── NotCondition.php
│   │   │   ├── NotConditionBuilder.php
│   │   │   ├── OrCondition.php
│   │   │   ├── SimpleCondition.php
│   │   │   └── SimpleConditionBuilder.php
│   │   ├── cubrid/
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── QueryBuilder.php
│   │   │   ├── Schema.php
│   │   │   └── conditions/
│   │   │       └── LikeConditionBuilder.php
│   │   ├── mssql/
│   │   │   ├── ColumnSchema.php
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── DBLibPDO.php
│   │   │   ├── PDO.php
│   │   │   ├── QueryBuilder.php
│   │   │   ├── Schema.php
│   │   │   ├── SqlsrvPDO.php
│   │   │   ├── TableSchema.php
│   │   │   └── conditions/
│   │   │       ├── InConditionBuilder.php
│   │   │       └── LikeConditionBuilder.php
│   │   ├── mysql/
│   │   │   ├── ColumnSchema.php
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── JsonExpressionBuilder.php
│   │   │   ├── QueryBuilder.php
│   │   │   └── Schema.php
│   │   ├── oci/
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── Command.php
│   │   │   ├── QueryBuilder.php
│   │   │   ├── Schema.php
│   │   │   └── conditions/
│   │   │       ├── InConditionBuilder.php
│   │   │       └── LikeConditionBuilder.php
│   │   ├── pgsql/
│   │   │   ├── ArrayExpressionBuilder.php
│   │   │   ├── ArrayParser.php
│   │   │   ├── ColumnSchema.php
│   │   │   ├── JsonExpressionBuilder.php
│   │   │   ├── QueryBuilder.php
│   │   │   └── Schema.php
│   │   └── sqlite/
│   │       ├── ColumnSchemaBuilder.php
│   │       ├── Command.php
│   │       ├── QueryBuilder.php
│   │       ├── Schema.php
│   │       ├── SqlTokenizer.php
│   │       └── conditions/
│   │           ├── InConditionBuilder.php
│   │           └── LikeConditionBuilder.php
│   ├── di/
│   │   ├── Container.php
│   │   ├── Instance.php
│   │   ├── NotInstantiableException.php
│   │   └── ServiceLocator.php
│   ├── filters/
│   │   ├── AccessControl.php
│   │   ├── AccessRule.php
│   │   ├── AjaxFilter.php
│   │   ├── ContentNegotiator.php
│   │   ├── Cors.php
│   │   ├── HostControl.php
│   │   ├── HttpCache.php
│   │   ├── PageCache.php
│   │   ├── RateLimitInterface.php
│   │   ├── RateLimiter.php
│   │   ├── VerbFilter.php
│   │   └── auth/
│   │       ├── AuthInterface.php
│   │       ├── AuthMethod.php
│   │       ├── CompositeAuth.php
│   │       ├── HttpBasicAuth.php
│   │       ├── HttpBearerAuth.php
│   │       ├── HttpHeaderAuth.php
│   │       └── QueryParamAuth.php
│   ├── grid/
│   │   ├── ActionColumn.php
│   │   ├── CheckboxColumn.php
│   │   ├── Column.php
│   │   ├── DataColumn.php
│   │   ├── GridView.php
│   │   ├── GridViewAsset.php
│   │   ├── RadioButtonColumn.php
│   │   └── SerialColumn.php
│   ├── helpers/
│   │   ├── ArrayHelper.php
│   │   ├── BaseArrayHelper.php
│   │   ├── BaseConsole.php
│   │   ├── BaseFileHelper.php
│   │   ├── BaseFormatConverter.php
│   │   ├── BaseHtml.php
│   │   ├── BaseHtmlPurifier.php
│   │   ├── BaseInflector.php
│   │   ├── BaseIpHelper.php
│   │   ├── BaseJson.php
│   │   ├── BaseMarkdown.php
│   │   ├── BaseStringHelper.php
│   │   ├── BaseUrl.php
│   │   ├── BaseVarDumper.php
│   │   ├── Console.php
│   │   ├── FileHelper.php
│   │   ├── FormatConverter.php
│   │   ├── Html.php
│   │   ├── HtmlPurifier.php
│   │   ├── Inflector.php
│   │   ├── IpHelper.php
│   │   ├── Json.php
│   │   ├── Markdown.php
│   │   ├── ReplaceArrayValue.php
│   │   ├── StringHelper.php
│   │   ├── UnsetArrayValue.php
│   │   ├── Url.php
│   │   ├── VarDumper.php
│   │   ├── mimeAliases.php
│   │   ├── mimeExtensions.php
│   │   └── mimeTypes.php
│   ├── i18n/
│   │   ├── DbMessageSource.php
│   │   ├── Formatter.php
│   │   ├── GettextFile.php
│   │   ├── GettextMessageSource.php
│   │   ├── GettextMoFile.php
│   │   ├── GettextPoFile.php
│   │   ├── I18N.php
│   │   ├── Locale.php
│   │   ├── MessageFormatter.php
│   │   ├── MessageSource.php
│   │   ├── MissingTranslationEvent.php
│   │   ├── PhpMessageSource.php
│   │   └── migrations/
│   │       ├── m150207_210500_i18n_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── log/
│   │   ├── DbTarget.php
│   │   ├── Dispatcher.php
│   │   ├── EmailTarget.php
│   │   ├── FileTarget.php
│   │   ├── LogRuntimeException.php
│   │   ├── Logger.php
│   │   ├── SyslogTarget.php
│   │   ├── Target.php
│   │   └── migrations/
│   │       ├── m141106_185632_log_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── mail/
│   │   ├── BaseMailer.php
│   │   ├── BaseMessage.php
│   │   ├── MailEvent.php
│   │   ├── MailerInterface.php
│   │   └── MessageInterface.php
│   ├── messages/
│   │   ├── af/
│   │   │   └── yii.php
│   │   ├── ar/
│   │   │   └── yii.php
│   │   ├── az/
│   │   │   └── yii.php
│   │   ├── be/
│   │   │   └── yii.php
│   │   ├── bg/
│   │   │   └── yii.php
│   │   ├── bs/
│   │   │   └── yii.php
│   │   ├── ca/
│   │   │   └── yii.php
│   │   ├── config.php
│   │   ├── cs/
│   │   │   └── yii.php
│   │   ├── da/
│   │   │   └── yii.php
│   │   ├── de/
│   │   │   └── yii.php
│   │   ├── el/
│   │   │   └── yii.php
│   │   ├── es/
│   │   │   └── yii.php
│   │   ├── et/
│   │   │   └── yii.php
│   │   ├── fa/
│   │   │   └── yii.php
│   │   ├── fi/
│   │   │   └── yii.php
│   │   ├── fr/
│   │   │   └── yii.php
│   │   ├── ga/
│   │   │   └── yii.php
│   │   ├── he/
│   │   │   └── yii.php
│   │   ├── hi/
│   │   │   └── yii.php
│   │   ├── hr/
│   │   │   └── yii.php
│   │   ├── hu/
│   │   │   └── yii.php
│   │   ├── hy/
│   │   │   └── yii.php
│   │   ├── id/
│   │   │   └── yii.php
│   │   ├── it/
│   │   │   └── yii.php
│   │   ├── ja/
│   │   │   └── yii.php
│   │   ├── ka/
│   │   │   └── yii.php
│   │   ├── kk/
│   │   │   └── yii.php
│   │   ├── ko/
│   │   │   └── yii.php
│   │   ├── kz/
│   │   │   └── yii.php
│   │   ├── lt/
│   │   │   └── yii.php
│   │   ├── lv/
│   │   │   └── yii.php
│   │   ├── ms/
│   │   │   └── yii.php
│   │   ├── mt/
│   │   │   └── yii.php
│   │   ├── nb-NO/
│   │   │   └── yii.php
│   │   ├── nl/
│   │   │   └── yii.php
│   │   ├── pl/
│   │   │   └── yii.php
│   │   ├── pt/
│   │   │   └── yii.php
│   │   ├── pt-BR/
│   │   │   └── yii.php
│   │   ├── ro/
│   │   │   └── yii.php
│   │   ├── ru/
│   │   │   └── yii.php
│   │   ├── sk/
│   │   │   └── yii.php
│   │   ├── sl/
│   │   │   └── yii.php
│   │   ├── sr/
│   │   │   └── yii.php
│   │   ├── sr-Latn/
│   │   │   └── yii.php
│   │   ├── sv/
│   │   │   └── yii.php
│   │   ├── tg/
│   │   │   └── yii.php
│   │   ├── th/
│   │   │   └── yii.php
│   │   ├── tr/
│   │   │   └── yii.php
│   │   ├── uk/
│   │   │   └── yii.php
│   │   ├── uz/
│   │   │   └── yii.php
│   │   ├── uz-Cy/
│   │   │   └── yii.php
│   │   ├── vi/
│   │   │   └── yii.php
│   │   ├── zh/
│   │   │   └── yii.php
│   │   └── zh-TW/
│   │       └── yii.php
│   ├── mutex/
│   │   ├── DbMutex.php
│   │   ├── FileMutex.php
│   │   ├── Mutex.php
│   │   ├── MysqlMutex.php
│   │   ├── OracleMutex.php
│   │   ├── PgsqlMutex.php
│   │   └── RetryAcquireTrait.php
│   ├── rbac/
│   │   ├── Assignment.php
│   │   ├── BaseManager.php
│   │   ├── CheckAccessInterface.php
│   │   ├── DbManager.php
│   │   ├── Item.php
│   │   ├── ManagerInterface.php
│   │   ├── Permission.php
│   │   ├── PhpManager.php
│   │   ├── Role.php
│   │   ├── Rule.php
│   │   └── migrations/
│   │       ├── m140506_102106_rbac_init.php
│   │       ├── m170907_052038_rbac_add_index_on_auth_assignment_user_id.php
│   │       ├── m180523_151638_rbac_updates_indexes_without_prefix.php
│   │       ├── m200409_110543_rbac_update_mssql_trigger.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── requirements/
│   │   ├── YiiRequirementChecker.php
│   │   ├── requirements.php
│   │   └── views/
│   │       ├── console/
│   │       │   └── index.php
│   │       └── web/
│   │           ├── css.php
│   │           └── index.php
│   ├── rest/
│   │   ├── Action.php
│   │   ├── ActiveController.php
│   │   ├── Controller.php
│   │   ├── CreateAction.php
│   │   ├── DeleteAction.php
│   │   ├── IndexAction.php
│   │   ├── OptionsAction.php
│   │   ├── Serializer.php
│   │   ├── UpdateAction.php
│   │   ├── UrlRule.php
│   │   └── ViewAction.php
│   ├── test/
│   │   ├── ActiveFixture.php
│   │   ├── ArrayFixture.php
│   │   ├── BaseActiveFixture.php
│   │   ├── DbFixture.php
│   │   ├── FileFixtureTrait.php
│   │   ├── Fixture.php
│   │   ├── FixtureTrait.php
│   │   └── InitDbFixture.php
│   ├── validators/
│   │   ├── BooleanValidator.php
│   │   ├── CompareValidator.php
│   │   ├── DateValidator.php
│   │   ├── DefaultValueValidator.php
│   │   ├── EachValidator.php
│   │   ├── EmailValidator.php
│   │   ├── ExistValidator.php
│   │   ├── FileValidator.php
│   │   ├── FilterValidator.php
│   │   ├── ImageValidator.php
│   │   ├── InlineValidator.php
│   │   ├── IpValidator.php
│   │   ├── NumberValidator.php
│   │   ├── PunycodeAsset.php
│   │   ├── RangeValidator.php
│   │   ├── RegularExpressionValidator.php
│   │   ├── RequiredValidator.php
│   │   ├── SafeValidator.php
│   │   ├── StringValidator.php
│   │   ├── TrimValidator.php
│   │   ├── UniqueValidator.php
│   │   ├── UrlValidator.php
│   │   ├── ValidationAsset.php
│   │   └── Validator.php
│   ├── views/
│   │   ├── _addColumns.php
│   │   ├── _addComments.php
│   │   ├── _addForeignKeys.php
│   │   ├── _createTable.php
│   │   ├── _dropColumns.php
│   │   ├── _dropForeignKeys.php
│   │   ├── _dropTable.php
│   │   ├── _foreignTables.php
│   │   ├── addColumnMigration.php
│   │   ├── createJunctionMigration.php
│   │   ├── createTableMigration.php
│   │   ├── dropColumnMigration.php
│   │   ├── dropTableMigration.php
│   │   ├── errorHandler/
│   │   │   ├── callStackItem.php
│   │   │   ├── error.php
│   │   │   ├── exception.php
│   │   │   └── previousException.php
│   │   ├── messageConfig.php
│   │   └── migration.php
│   ├── web/
│   │   ├── Application.php
│   │   ├── AssetBundle.php
│   │   ├── AssetConverter.php
│   │   ├── AssetConverterInterface.php
│   │   ├── AssetManager.php
│   │   ├── BadRequestHttpException.php
│   │   ├── CacheSession.php
│   │   ├── CompositeUrlRule.php
│   │   ├── ConflictHttpException.php
│   │   ├── Controller.php
│   │   ├── Cookie.php
│   │   ├── CookieCollection.php
│   │   ├── DbSession.php
│   │   ├── ErrorAction.php
│   │   ├── ErrorHandler.php
│   │   ├── ForbiddenHttpException.php
│   │   ├── GoneHttpException.php
│   │   ├── GroupUrlRule.php
│   │   ├── HeaderCollection.php
│   │   ├── HeadersAlreadySentException.php
│   │   ├── HtmlResponseFormatter.php
│   │   ├── HttpException.php
│   │   ├── IdentityInterface.php
│   │   ├── JqueryAsset.php
│   │   ├── JsExpression.php
│   │   ├── JsonParser.php
│   │   ├── JsonResponseFormatter.php
│   │   ├── Link.php
│   │   ├── Linkable.php
│   │   ├── MethodNotAllowedHttpException.php
│   │   ├── MultiFieldSession.php
│   │   ├── MultipartFormDataParser.php
│   │   ├── NotAcceptableHttpException.php
│   │   ├── NotFoundHttpException.php
│   │   ├── RangeNotSatisfiableHttpException.php
│   │   ├── Request.php
│   │   ├── RequestParserInterface.php
│   │   ├── Response.php
│   │   ├── ResponseFormatterInterface.php
│   │   ├── ServerErrorHttpException.php
│   │   ├── Session.php
│   │   ├── SessionHandler.php
│   │   ├── SessionIterator.php
│   │   ├── TooManyRequestsHttpException.php
│   │   ├── UnauthorizedHttpException.php
│   │   ├── UnprocessableEntityHttpException.php
│   │   ├── UnsupportedMediaTypeHttpException.php
│   │   ├── UploadedFile.php
│   │   ├── UrlManager.php
│   │   ├── UrlNormalizer.php
│   │   ├── UrlNormalizerRedirectException.php
│   │   ├── UrlRule.php
│   │   ├── UrlRuleInterface.php
│   │   ├── User.php
│   │   ├── UserEvent.php
│   │   ├── View.php
│   │   ├── ViewAction.php
│   │   ├── XmlResponseFormatter.php
│   │   ├── YiiAsset.php
│   │   └── migrations/
│   │       ├── m160313_153426_session_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── widgets/
│   │   ├── ActiveField.php
│   │   ├── ActiveForm.php
│   │   ├── ActiveFormAsset.php
│   │   ├── BaseListView.php
│   │   ├── Block.php
│   │   ├── Breadcrumbs.php
│   │   ├── ContentDecorator.php
│   │   ├── DetailView.php
│   │   ├── FragmentCache.php
│   │   ├── InputWidget.php
│   │   ├── LinkPager.php
│   │   ├── LinkSorter.php
│   │   ├── ListView.php
│   │   ├── MaskedInput.php
│   │   ├── MaskedInputAsset.php
│   │   ├── Menu.php
│   │   ├── Pjax.php
│   │   ├── PjaxAsset.php
│   │   └── Spaceless.php
│   ├── yii
│   └── yii.bat
├── package.json
├── phpcs.xml.dist
├── phpstan-7x.dist.neon
├── phpstan-baseline-7x.neon
├── phpstan-baseline.neon
├── phpstan.dist.neon
├── phpunit.xml.dist
└── tests/
    ├── .env-dist
    ├── .gitignore
    ├── .hhconfig
    ├── Dockerfile.caching
    ├── Dockerfile.mssql
    ├── IsOneOfAssert.php
    ├── README.md
    ├── ResultPrinter.php
    ├── TestCase.php
    ├── assets/
    │   └── .gitignore
    ├── bootstrap.php
    ├── data/
    │   ├── ar/
    │   │   ├── ActiveRecord.php
    │   │   ├── Alpha.php
    │   │   ├── Animal.php
    │   │   ├── Beta.php
    │   │   ├── BitValues.php
    │   │   ├── Cat.php
    │   │   ├── Category.php
    │   │   ├── CroppedType.php
    │   │   ├── Customer.php
    │   │   ├── CustomerQuery.php
    │   │   ├── CustomerWithAlias.php
    │   │   ├── CustomerWithConstructor.php
    │   │   ├── DefaultMultiplePk.php
    │   │   ├── DefaultPk.php
    │   │   ├── Department.php
    │   │   ├── Document.php
    │   │   ├── Dog.php
    │   │   ├── Dossier.php
    │   │   ├── Employee.php
    │   │   ├── EnumTypeInCustomSchema.php
    │   │   ├── Item.php
    │   │   ├── NoAutoLabels.php
    │   │   ├── NullValues.php
    │   │   ├── Order.php
    │   │   ├── OrderItem.php
    │   │   ├── OrderItemWithConstructor.php
    │   │   ├── OrderItemWithNullFK.php
    │   │   ├── OrderWithConstructor.php
    │   │   ├── OrderWithNullFK.php
    │   │   ├── Profile.php
    │   │   ├── ProfileWithConstructor.php
    │   │   ├── Storage.php
    │   │   ├── TestTrigger.php
    │   │   ├── TestTriggerAlert.php
    │   │   └── Type.php
    │   ├── base/
    │   │   ├── ArrayAccessObject.php
    │   │   ├── CallableClass.php
    │   │   ├── InvalidRulesModel.php
    │   │   ├── RulesModel.php
    │   │   ├── Singer.php
    │   │   ├── Speaker.php
    │   │   └── TraversableObject.php
    │   ├── cache/
    │   │   └── MockDependency.php
    │   ├── codeclimate/
    │   │   └── phpmd_ruleset.xml
    │   ├── config-docker.php
    │   ├── config.php
    │   ├── console/
    │   │   ├── controllers/
    │   │   │   ├── FakeController.php
    │   │   │   ├── FakeEmptyController.php
    │   │   │   ├── FakeNoDefaultController.php
    │   │   │   └── fixtures/
    │   │   │       ├── DependentActiveFixture.php
    │   │   │       ├── FirstFixture.php
    │   │   │       ├── FirstIndependentActiveFixture.php
    │   │   │       ├── FixtureStorage.php
    │   │   │       ├── GlobalFixture.php
    │   │   │       ├── SecondFixture.php
    │   │   │       ├── SecondIndependentActiveFixture.php
    │   │   │       └── subdir/
    │   │   │           ├── FirstFixture.php
    │   │   │           └── SecondFixture.php
    │   │   └── migrate_create/
    │   │       ├── add_columns_fk.php
    │   │       ├── add_columns_prefix.php
    │   │       ├── add_columns_test.php
    │   │       ├── add_two_columns_test.php
    │   │       ├── create_field_with_colon_default_values.php
    │   │       ├── create_fields.php
    │   │       ├── create_fields_with_col_method_after_default_value.php
    │   │       ├── create_foreign_key.php
    │   │       ├── create_id_field_not_as_pk.php
    │   │       ├── create_id_pk.php
    │   │       ├── create_prefix.php
    │   │       ├── create_products_from_store_table.php
    │   │       ├── create_test.php
    │   │       ├── create_title_pk.php
    │   │       ├── create_title_with_comma_default_values.php
    │   │       ├── create_unsigned_big_pk.php
    │   │       ├── create_unsigned_pk.php
    │   │       ├── default.php
    │   │       ├── drop_columns_test.php
    │   │       ├── drop_fields.php
    │   │       ├── drop_products_from_store_table.php
    │   │       ├── drop_test.php
    │   │       └── junction_test.php
    │   ├── controllers/
    │   │   └── TestController.php
    │   ├── cubrid.sql
    │   ├── helpers/
    │   │   └── CustomDebugInfo.php
    │   ├── i18n/
    │   │   ├── messages/
    │   │   │   ├── de/
    │   │   │   │   └── test.php
    │   │   │   ├── de-DE/
    │   │   │   │   └── test.php
    │   │   │   ├── en-150/
    │   │   │   │   └── test.php
    │   │   │   ├── en-US/
    │   │   │   │   └── test.php
    │   │   │   └── ru/
    │   │   │       └── test.php
    │   │   ├── test.mo
    │   │   └── test.po
    │   ├── modules/
    │   │   └── magic/
    │   │       ├── Module.php
    │   │       └── controllers/
    │   │           ├── ETagController.php
    │   │           └── subFolder/
    │   │               └── SubController.php
    │   ├── mssql.sql
    │   ├── mysql.sql
    │   ├── oci/
    │   │   └── optimize_for_tests.sql
    │   ├── oci.sql
    │   ├── postgres.sql
    │   ├── postgres10.sql
    │   ├── postgres12.sql
    │   ├── rbac/
    │   │   └── UserID.php
    │   ├── sqlite.sql
    │   ├── validators/
    │   │   ├── TestValidator.php
    │   │   └── models/
    │   │       ├── FakedValidationModel.php
    │   │       ├── FakedValidationTypedModel.php
    │   │       ├── ValidatorTestEachAndInlineMethodModel.php
    │   │       ├── ValidatorTestFunctionModel.php
    │   │       ├── ValidatorTestMainModel.php
    │   │       ├── ValidatorTestRefModel.php
    │   │       └── ValidatorTestTypedPropModel.php
    │   ├── views/
    │   │   ├── error.php
    │   │   ├── errorHandler.php
    │   │   ├── errorHandlerForAssetFiles.php
    │   │   ├── layout.php
    │   │   ├── pageCacheLayout.php
    │   │   ├── rawlayout.php
    │   │   ├── simple.php
    │   │   └── widgets/
    │   │       ├── GridView/
    │   │       │   └── gridview.php
    │   │       └── ListView/
    │   │           └── item.php
    │   └── web/
    │       ├── assetSources/
    │       │   ├── css/
    │       │   │   └── stub.css
    │       │   └── js/
    │       │       └── jquery.js
    │       ├── assets/
    │       │   └── .gitignore
    │       └── data.txt
    ├── docker-compose.caching.yml
    ├── docker-compose.mssql.yml
    ├── docker-compose.mysql.yml
    ├── docker-compose.oracle.yml
    ├── docker-compose.pgsql.yml
    ├── docker-compose.yml
    ├── framework/
    │   ├── BaseYiiTest.php
    │   ├── ChangeLogTest.php
    │   ├── ar/
    │   │   └── ActiveRecordTestTrait.php
    │   ├── base/
    │   │   ├── ActionFilterTest.php
    │   │   ├── ApplicationTest.php
    │   │   ├── ArrayableTraitTest.php
    │   │   ├── BaseObjectTest.php
    │   │   ├── BehaviorTest.php
    │   │   ├── ComponentTest.php
    │   │   ├── ControllerTest.php
    │   │   ├── DynamicModelTest.php
    │   │   ├── ErrorExceptionTest.php
    │   │   ├── EventTest.php
    │   │   ├── ExposedSecurity.php
    │   │   ├── ModelTest.php
    │   │   ├── ModuleTest.php
    │   │   ├── SecurityTest.php
    │   │   ├── StaticInstanceTraitTest.php
    │   │   ├── ThemeTest.php
    │   │   ├── ViewTest.php
    │   │   ├── WidgetTest.php
    │   │   ├── fixtures/
    │   │   │   └── themes/
    │   │   │       ├── basic/
    │   │   │       │   └── views/
    │   │   │       │       └── site/
    │   │   │       │           └── index.php
    │   │   │       └── christmas/
    │   │   │           └── views/
    │   │   │               └── site/
    │   │   │                   ├── index.php
    │   │   │                   └── main.php
    │   │   └── stub/
    │   │       ├── AnonymousComponentClass.php
    │   │       └── AnonymousModelClass.php
    │   ├── behaviors/
    │   │   ├── AttributeBehaviorTest.php
    │   │   ├── AttributeTypecastBehaviorTest.php
    │   │   ├── AttributesBehaviorTest.php
    │   │   ├── BlameableBehaviorConsoleTest.php
    │   │   ├── BlameableBehaviorTest.php
    │   │   ├── CacheableWidgetBehaviorTest.php
    │   │   ├── OptimisticLockBehaviorTest.php
    │   │   ├── SluggableBehaviorTest.php
    │   │   └── TimestampBehaviorTest.php
    │   ├── caching/
    │   │   ├── ApcCacheTest.php
    │   │   ├── ArrayCacheTest.php
    │   │   ├── CacheTestCase.php
    │   │   ├── CallbackDependencyTest.php
    │   │   ├── DbCacheTest.php
    │   │   ├── DbDependencyTest.php
    │   │   ├── DbQueryDependencyTest.php
    │   │   ├── DependencyTest.php
    │   │   ├── FileCacheTest.php
    │   │   ├── MemCacheTest.php
    │   │   ├── MemCachedTest.php
    │   │   ├── MssqlCacheTest.php
    │   │   ├── PgSQLCacheTest.php
    │   │   ├── TagDependencyTest.php
    │   │   └── WinCacheTest.php
    │   ├── console/
    │   │   ├── ControllerTest.php
    │   │   ├── FakeController.php
    │   │   ├── FakeHelpController.php
    │   │   ├── FakeHelpControllerWithoutOutput.php
    │   │   ├── FakePhp71Controller.php
    │   │   ├── RequestTest.php
    │   │   ├── UnknownCommandExceptionTest.php
    │   │   ├── controllers/
    │   │   │   ├── AssetControllerTest.php
    │   │   │   ├── BaseMessageControllerTest.php
    │   │   │   ├── CacheControllerTest.php
    │   │   │   ├── DbMessageControllerTest.php
    │   │   │   ├── EchoMigrateController.php
    │   │   │   ├── FixtureControllerTest.php
    │   │   │   ├── HelpControllerTest.php
    │   │   │   ├── MigrateControllerTest.php
    │   │   │   ├── MigrateControllerTestTrait.php
    │   │   │   ├── PHPMessageControllerTest.php
    │   │   │   ├── POMessageControllerTest.php
    │   │   │   ├── ServeControllerTest.php
    │   │   │   ├── SilencedCacheController.php
    │   │   │   ├── StdOutBufferControllerTrait.php
    │   │   │   └── stub/
    │   │   │       └── index.php
    │   │   ├── stubs/
    │   │   │   └── DummyService.php
    │   │   └── widgets/
    │   │       └── TableTest.php
    │   ├── data/
    │   │   ├── ActiveDataFilterTest.php
    │   │   ├── ActiveDataProviderCloningTest.php
    │   │   ├── ActiveDataProviderTest.php
    │   │   ├── ArrayDataProviderTest.php
    │   │   ├── BaseDataProviderTest.php
    │   │   ├── DataFilterTest.php
    │   │   ├── PaginationTest.php
    │   │   ├── SortTest.php
    │   │   └── SqlDataProviderTest.php
    │   ├── db/
    │   │   ├── ActiveQueryModelConnectionTest.php
    │   │   ├── ActiveQueryTest.php
    │   │   ├── ActiveRecordTest.php
    │   │   ├── AnyCaseValue.php
    │   │   ├── AnyValue.php
    │   │   ├── BaseActiveRecordTest.php
    │   │   ├── BatchQueryResultTest.php
    │   │   ├── ColumnSchemaBackedEnumTest.php
    │   │   ├── ColumnSchemaBuilderTest.php
    │   │   ├── ColumnSchemaTest.php
    │   │   ├── CommandTest.php
    │   │   ├── CompareValue.php
    │   │   ├── ConnectionTest.php
    │   │   ├── DatabaseTestCase.php
    │   │   ├── GetTablesAliasTestTrait.php
    │   │   ├── QueryBuilderTest.php
    │   │   ├── QueryTest.php
    │   │   ├── SchemaBuilderTraitTest.php
    │   │   ├── SchemaTest.php
    │   │   ├── SqlTokenTest.php
    │   │   ├── UnqueryableQueryMock.php
    │   │   ├── cubrid/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   └── UniqueValidatorTest.php
    │   │   ├── enums/
    │   │   │   ├── Status.php
    │   │   │   ├── StatusTypeInt.php
    │   │   │   └── StatusTypeString.php
    │   │   ├── mssql/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── DbMessageSourceTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryCacheTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   └── type/
    │   │   │       ├── BooleanTest.php
    │   │   │       └── VarbinaryTest.php
    │   │   ├── mysql/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BaseActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   ├── connection/
    │   │   │   │   └── DeadLockTest.php
    │   │   │   └── type/
    │   │   │       └── JsonTest.php
    │   │   ├── oci/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   └── UniqueValidatorTest.php
    │   │   ├── pgsql/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── ArrayParserTest.php
    │   │   │   ├── BaseActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   └── type/
    │   │   │       └── BooleanTest.php
    │   │   ├── sqlite/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── SqlTokenizerTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   ├── conditions/
    │   │   │   │   └── InconditionBuilderTest.php
    │   │   │   └── type/
    │   │   │       └── BooleanTest.php
    │   │   ├── stubs/
    │   │   │   └── BackedEnumStubs.php
    │   │   └── testBatchInsertWithYield.php
    │   ├── di/
    │   │   ├── ContainerTest.php
    │   │   ├── InstanceTest.php
    │   │   ├── ServiceLocatorTest.php
    │   │   ├── stubs/
    │   │   │   ├── AbstractColor.php
    │   │   │   ├── Alpha.php
    │   │   │   ├── Bar.php
    │   │   │   ├── BarSetter.php
    │   │   │   ├── Beta.php
    │   │   │   ├── Car.php
    │   │   │   ├── Color.php
    │   │   │   ├── Corge.php
    │   │   │   ├── Foo.php
    │   │   │   ├── FooBaz.php
    │   │   │   ├── FooProperty.php
    │   │   │   ├── Kappa.php
    │   │   │   ├── Qux.php
    │   │   │   ├── QuxAnother.php
    │   │   │   ├── QuxFactory.php
    │   │   │   ├── QuxInterface.php
    │   │   │   ├── StaticMethodsWithIntersectionTypes.php
    │   │   │   ├── StaticMethodsWithUnionTypes.php
    │   │   │   ├── UnionTypeNotNull.php
    │   │   │   ├── UnionTypeNull.php
    │   │   │   ├── UnionTypeWithClass.php
    │   │   │   ├── Variadic.php
    │   │   │   └── Zeta.php
    │   │   └── testContainerWithVariadicCallable.php
    │   ├── filters/
    │   │   ├── AccessRuleTest.php
    │   │   ├── AjaxFilterTest.php
    │   │   ├── ContentNegotiatorTest.php
    │   │   ├── CorsTest.php
    │   │   ├── HostControlTest.php
    │   │   ├── HttpCacheTest.php
    │   │   ├── PageCacheTest.php
    │   │   ├── RateLimiterTest.php
    │   │   ├── auth/
    │   │   │   ├── AuthMethodTest.php
    │   │   │   ├── AuthTest.php
    │   │   │   ├── BasicAuthTest.php
    │   │   │   └── CompositeAuthTest.php
    │   │   └── stubs/
    │   │       ├── ExposedLogger.php
    │   │       ├── MockAuthManager.php
    │   │       ├── RateLimit.php
    │   │       └── UserIdentity.php
    │   ├── grid/
    │   │   ├── ActionColumnTest.php
    │   │   ├── CheckboxColumnTest.php
    │   │   ├── DataColumnTest.php
    │   │   ├── GridViewTest.php
    │   │   ├── RadiobuttonColumnTest.php
    │   │   └── SerialColumnTest.php
    │   ├── helpers/
    │   │   ├── ArrayHelperTest.php
    │   │   ├── BaseConsoleTest.php
    │   │   ├── BaseUrlTest.php
    │   │   ├── ConsoleStub.php
    │   │   ├── ConsoleTest.php
    │   │   ├── FallbackInflector.php
    │   │   ├── FileHelperTest.php
    │   │   ├── FormatConverterTest.php
    │   │   ├── HtmlTest.php
    │   │   ├── InflectorTest.php
    │   │   ├── IpHelperTest.php
    │   │   ├── JsonTest.php
    │   │   ├── MarkdownTest.php
    │   │   ├── ReplaceArrayValueTest.php
    │   │   ├── StringHelperTest.php
    │   │   ├── UnsetArrayValueTest.php
    │   │   ├── UrlTest.php
    │   │   └── VarDumperTest.php
    │   ├── i18n/
    │   │   ├── DbMessageSourceTest.php
    │   │   ├── FallbackMessageFormatterTest.php
    │   │   ├── FormatterDateTest.php
    │   │   ├── FormatterNumberTest.php
    │   │   ├── FormatterTest.php
    │   │   ├── GettextMessageSourceTest.php
    │   │   ├── GettextMoFileTest.php
    │   │   ├── GettextPoFileTest.php
    │   │   ├── I18NTest.php
    │   │   ├── IntlTestHelper.php
    │   │   ├── LocaleTest.php
    │   │   └── MessageFormatterTest.php
    │   ├── log/
    │   │   ├── ArrayTarget.php
    │   │   ├── DbTargetTest.php
    │   │   ├── DispatcherTest.php
    │   │   ├── EmailTargetTest.php
    │   │   ├── FileTargetTest.php
    │   │   ├── LoggerTest.php
    │   │   ├── MySQLTargetTest.php
    │   │   ├── PgSQLTargetTest.php
    │   │   ├── SqliteTargetTest.php
    │   │   ├── SyslogTargetTest.php
    │   │   ├── TargetTest.php
    │   │   └── mocks/
    │   │       ├── CustomLogger.php
    │   │       ├── TargetMock.php
    │   │       └── typed_error.php
    │   ├── mail/
    │   │   ├── BaseMailerTest.php
    │   │   └── BaseMessageTest.php
    │   ├── models/
    │   │   └── JsonModel.php
    │   ├── mutex/
    │   │   ├── FileMutexTest.php
    │   │   ├── MutexTestTrait.php
    │   │   ├── MysqlMutexTest.php
    │   │   ├── PgsqlMutexTest.php
    │   │   ├── RetryAcquireTraitTest.php
    │   │   └── mocks/
    │   │       └── DumbMutex.php
    │   ├── rbac/
    │   │   ├── ActionRule.php
    │   │   ├── AuthorRule.php
    │   │   ├── DbManagerTestCase.php
    │   │   ├── ExposedPhpManager.php
    │   │   ├── ManagerTestCase.php
    │   │   ├── MySQLManagerCacheTest.php
    │   │   ├── MySQLManagerTest.php
    │   │   ├── PgSQLManagerCacheTest.php
    │   │   ├── PgSQLManagerTest.php
    │   │   ├── PhpManagerTest.php
    │   │   └── SqliteManagerTest.php
    │   ├── requirements/
    │   │   └── YiiRequirementCheckerTest.php
    │   ├── rest/
    │   │   ├── IndexActionTest.php
    │   │   ├── SerializerTest.php
    │   │   └── UrlRuleTest.php
    │   ├── test/
    │   │   ├── ActiveFixtureTest.php
    │   │   ├── ArrayFixtureTest.php
    │   │   ├── FixtureTest.php
    │   │   ├── custom/
    │   │   │   └── customer.php
    │   │   └── data/
    │   │       ├── array_fixture.php
    │   │       ├── customer.php
    │   │       └── profile.php
    │   ├── validators/
    │   │   ├── BooleanValidatorTest.php
    │   │   ├── CompareValidatorTest.php
    │   │   ├── DateValidatorTest.php
    │   │   ├── DefaultValueValidatorTest.php
    │   │   ├── EachValidatorTest.php
    │   │   ├── EmailValidatorTest.php
    │   │   ├── ExistValidatorTest.php
    │   │   ├── FileValidatorTest.php
    │   │   ├── FilterValidatorTest.php
    │   │   ├── IpValidatorTest.php
    │   │   ├── NumberValidatorTest.php
    │   │   ├── RangeValidatorTest.php
    │   │   ├── RegularExpressionValidatorTest.php
    │   │   ├── RequiredValidatorTest.php
    │   │   ├── SafeValidatorTest.php
    │   │   ├── StringValidatorTest.php
    │   │   ├── TrimValidatorTest.php
    │   │   ├── UniqueValidatorTest.php
    │   │   ├── UrlValidatorTest.php
    │   │   ├── ValidatorTest.php
    │   │   └── data/
    │   │       └── mimeType/
    │   │           ├── test.odt
    │   │           ├── test.tar.xz
    │   │           ├── test.txt
    │   │           └── test.xml
    │   ├── web/
    │   │   ├── AssetBundleTest.php
    │   │   ├── AssetConverterTest.php
    │   │   ├── ControllerTest.php
    │   │   ├── CookieCollectionTest.php
    │   │   ├── ErrorActionTest.php
    │   │   ├── ErrorHandlerTest.php
    │   │   ├── FakeController.php
    │   │   ├── FakePhp71Controller.php
    │   │   ├── FakePhp7Controller.php
    │   │   ├── FakePhp80Controller.php
    │   │   ├── FormatterTest.php
    │   │   ├── GroupUrlRuleTest.php
    │   │   ├── HeaderCollectionTest.php
    │   │   ├── JsonResponseFormatterTest.php
    │   │   ├── LinkTest.php
    │   │   ├── MultipartFormDataParserTest.php
    │   │   ├── Post.php
    │   │   ├── RequestTest.php
    │   │   ├── ResponseTest.php
    │   │   ├── UploadedFileTest.php
    │   │   ├── UrlManagerCreateUrlTest.php
    │   │   ├── UrlManagerParseUrlTest.php
    │   │   ├── UrlManagerTest.php
    │   │   ├── UrlNormalizerTest.php
    │   │   ├── UrlRuleTest.php
    │   │   ├── UserIdentity.php
    │   │   ├── UserTest.php
    │   │   ├── ViewTest.php
    │   │   ├── XmlResponseFormatterTest.php
    │   │   ├── mocks/
    │   │   │   └── TestRequestComponent.php
    │   │   ├── session/
    │   │   │   ├── AbstractDbSessionTest.php
    │   │   │   ├── CacheSessionTest.php
    │   │   │   ├── SessionTest.php
    │   │   │   ├── SessionTestTrait.php
    │   │   │   ├── mssql/
    │   │   │   │   └── DbSessionTest.php
    │   │   │   ├── mysql/
    │   │   │   │   └── DbSessionTest.php
    │   │   │   ├── pgsql/
    │   │   │   │   └── DbSessionTest.php
    │   │   │   └── sqlite/
    │   │   │       └── DbSessionTest.php
    │   │   └── stubs/
    │   │       ├── CachedUrlRule.php
    │   │       ├── ModelBindingStub.php
    │   │       ├── ModelStub.php
    │   │       └── VendorImage.php
    │   └── widgets/
    │       ├── ActiveFieldTest.php
    │       ├── ActiveFormTest.php
    │       ├── BlockTest.php
    │       ├── BreadcrumbsTest.php
    │       ├── ContentDecoratorTest.php
    │       ├── DetailViewTest.php
    │       ├── FragmentCacheTest.php
    │       ├── LinkPagerTest.php
    │       ├── LinkSorterTest.php
    │       ├── ListViewTest.php
    │       ├── MenuTest.php
    │       ├── PjaxTest.php
    │       └── SpacelessTest.php
    ├── js/
    │   ├── data/
    │   │   ├── yii.activeForm.html
    │   │   ├── yii.gridView.html
    │   │   └── yii.html
    │   └── tests/
    │       ├── yii.activeForm.test.js
    │       ├── yii.captcha.test.js
    │       ├── yii.gridView.test.js
    │       ├── yii.test.js
    │       └── yii.validation.test.js
    ├── runtime/
    │   └── .gitignore
    └── test-local.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .appveyor.yml
================================================
build: false
version: dev-{build}
clone_folder: C:\projects\yii2

environment:
    matrix:
      - php_ver: 7.4.0

cache:
    - '%APPDATA%\Composer'
    - '%LOCALAPPDATA%\Composer'
    - C:\tools\php -> .appveyor.yml
    - C:\tools\composer.phar -> .appveyor.yml

init:
    - SET PATH=C:\tools\php;%PATH%

install:
    - ps: Set-Service wuauserv -StartupType Manual
    - IF NOT EXIST C:\tools\php (choco install --yes --allow-empty-checksums php --version %php_ver% --params '/InstallDir:C:\tools\php')
    - cd C:\tools\php
    - copy php.ini-production php.ini
    - echo date.timezone="UTC" >> php.ini
    - echo memory_limit=512M >> php.ini
    - echo extension_dir=ext >> php.ini
    - echo extension=php_curl.dll >> php.ini
    - echo extension=php_fileinfo.dll >> php.ini
    - echo extension=php_gd2.dll >> php.ini
    - echo extension=php_intl.dll >> php.ini
    - echo extension=php_mbstring.dll >> php.ini
    - echo extension=php_openssl.dll >> php.ini
    - echo extension=php_pdo_sqlite.dll >> php.ini
    - IF NOT EXIST C:\tools\composer.phar (cd C:\tools && appveyor DownloadFile https://getcomposer.org/download/2.6.3/composer.phar)

before_test:
    - cd C:\projects\yii2
    - php C:\tools\composer.phar update --no-interaction --no-progress --prefer-stable --no-ansi

test_script:
    - cd C:\projects\yii2
    - vendor\bin\phpunit --exclude-group mssql,mysql,pgsql,sqlite,db,oci,wincache,cubrid


================================================
FILE: .codecov.yml
================================================
ignore:
  - "framework/classes.php"
  - "framework/views/messageConfig.php"


================================================
FILE: .dockerignore
================================================
.git
vendor
docs

================================================
FILE: .editorconfig
================================================
# editorconfig.org

root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[*.yml]
indent_size = 2


================================================
FILE: .git-blame-ignore-revs
================================================
# Reformat code to be PSR-2 compatible
b5f8a4dc22d5f8188405a2099d85fc154226c9b2
# Added php-cs-fixer coding standards validation to Travis CI
ba0ab403b52124c941dbeb46fbd9efdc12252a5d
# Coding style fixes
9d327baa8b2c80b53d4d405678f03e6b89ff6e38
# Add visibility for all class elements
c82da8dc829d557e82b12edbed9e37003dfcc9a3
# Fix codestyle in build and tests
909396074eef92d62dd34b4709bb7351e722bec3
# Add void return to method in tests
d71f7309aeec1ac0fef223840cb65bbbf96f1f99
# Use `::class` instead of `::className()` in tests
c960f93dfeefe760eb44bcdfa4463dcc7b29cc43
# Replace deprecated PHPUnit mock builder `setMethods()` usage with `createPartialMock()`, `onlyMethods()` and `addMethods()` methods
80545100b3f40423118b5cd413fcdb9c7dd7fa5e
# Make test data providers static and declare array return types
da20adc82aef3eb5ae0bad3889fe6695e6424f06
# Fix codestyle in `tests`
2f8e62d6b64324099b44cbac69395fef0e53b13e
# Short array syntax
1f6a8230732d829cdf2f3ca6755e4ac32f2c6f4f
# CS fixes.
7a7d2a9c06c099de8064729ca3fc95fb24241b75
# Fixed error PHPCS latest version in `PHP 8.5`
f66d5c8864712aef233b8131c2f99721101f61d0


================================================
FILE: .gitattributes
================================================
# Autodetect text files
* text=auto eol=lf

# ...Unless the name matches the following overriding patterns

# Definitively text files
*.php  text
*.css  text
*.js   text
*.txt  text
*.md   text
*.xml  text
*.json text
*.bat  text
*.sql  text
*.yml  text

# Ensure those won't be messed up with
*.png  binary
*.jpg  binary
*.gif  binary
*.ttf  binary

# Ignore some meta files when creating an archive of this repository
# We do not ignore any content, because this repo represents the
# `yiisoft/yii2-dev` package, which is expected to ship all tests and docs.
/.appveyor.yml              export-ignore
/.github                    export-ignore
/.editorconfig              export-ignore
/.git-blame-ignore-revs     export-ignore
/.gitattributes             export-ignore
/.gitignore                 export-ignore

# Avoid merge conflicts in CHANGELOG
# https://about.gitlab.com/2015/02/10/gitlab-reduced-merge-conflicts-by-90-percent-with-changelog-placeholders/
/framework/CHANGELOG.md		merge=union



================================================
FILE: .github/CONTRIBUTING.md
================================================
Contributing to Yii 2
=====================

- [Report an issue](../docs/internals/report-an-issue.md)
- [Translate documentation or messages](../docs/internals/translation-workflow.md)
- [Give us feedback or start a design discussion](https://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/)
- [Contribute to the core code or fix bugs](../docs/internals/git-workflow.md)


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

open_collective: yiisoft
github: [yiisoft]
tidelift: "packagist/yiisoft/yii2"


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
<!--
Please use this issue tracker for bugs and feature requests only. In case you need support please use one of
Yii communities listed at https://github.com/yiisoft/yii2/wiki/communities
-->

### What steps will reproduce the problem?

### What is the expected result?

### What do you get instead?


### Additional info

| Q                | A
| ---------------- | ---
| Yii version      | 2.0.?
| PHP version      | 
| Operating system |


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
| Q             | A
| ------------- | ---
| Is bugfix?    | ✔️/❌
| New feature?  | ✔️/❌
| Breaks BC?    | ✔️/❌
| Fixed issues  | <!-- comma-separated list of tickets # fixed by the PR, if any -->


================================================
FILE: .github/SECURITY.md
================================================
# Security Policy

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-commercial OpenSource project we are not able to pay bounties at the moment.


================================================
FILE: .github/actions/php-setup/action.yml
================================================
---
name: PHP setup with composer.
description: Setup PHP environment with composer and install dependencies.

inputs:
  composer-command:
    description: Composer command (install or update) to run.
    default: update
    required: false
    type: string
  composer-flags:
    description: Additional composer flags
    default: >-
      --prefer-dist
      --no-interaction
      --no-progress
      --optimize-autoloader
      --ansi
    required: false
    type: string
  composer-version:
    description: Composer version to use.
    default:
    required: false
    type: string
  coverage-driver:
    description: Code coverage driver to use (pcov, xdebug).
    default: none
    required: false
    type: string
  extensions:
    description: List of extensions to PHP.
    default:
    required: false
    type: string
  ignore-platform-reqs:
    description: Whether to add --ignore-platform-reqs to composer command.
    default: false
    required: false
    type: boolean
  ini-values:
    description: Initial values for PHP configuration.
    default: date.timezone='UTC'
    required: false
    type: string
  php-version:
    description: PHP versions as a JSON array string '["8.4"]'.
    default: '["7.4","8.0","8.1","8.2","8.3","8.4"]'
    required: false
    type: string
  tools:
    description: Tools to test, separated by comma.
    default: pie
    required: false
    type: string

runs:
  using: composite
  steps:
    - name: Install PHP
      uses: shivammathur/setup-php@v2
      with:
        coverage: ${{ inputs.coverage-driver }}
        extensions: ${{ inputs.extensions }}
        ini-values: ${{ inputs.ini-values }}
        php-version: ${{ inputs.php-version }}
        tools: ${{ inputs.tools }}

    - name: Update composer.
      shell: bash
      run: composer self-update ${{ inputs.composer-version }}

    - name: Install dependencies with composer.
      shell: bash
      run: >-
        composer
        ${{ inputs.composer-command }}
        ${{ inputs.composer-flags }}
        ${{
          inputs.ignore-platform-reqs == 'true'
          && '--ignore-platform-reqs'
          || ''
        }}


================================================
FILE: .github/actions/phpunit/action.yml
================================================
---
name: PHPUnit Test Runner.
description: Run PHPUnit tests with coverage and configurable options.

inputs:
  additional-args:
    description: Additional PHPUnit arguments.
    default: "--log-junit junit.xml --verbose"
    required: false
    type: string
  configuration:
    description: PHPUnit configuration file.
    default: ""
    required: false
    type: string
  coverage-driver:
    description: Code coverage driver to use (pcov, xdebug, none).
    default: none
    required: false
    type: string
  coverage-file:
    description: Coverage output file name.
    default: coverage.xml
    required: false
    type: string
  coverage-format:
    description: Coverage report format (clover, html, xml).
    default: clover
    required: false
    type: string
  coverage-token:
    description: Codecov token for uploading coverage.
    default: ""
    required: false
    type: string
  debug:
    description: Display warnings in phpunit.
    default: ""
    required: false
    type: string
  exclude-group:
    description: Exclude group from phpunit.
    default: ""
    required: false
    type: string
  group:
    description: Include specific group in phpunit.
    default: ""
    required: false
    type: string
  path:
    description: Path to PHPUnit executable.
    default: vendor/bin/phpunit
    required: false
    type: string
  test-suite:
    description: Specific test suite to run.
    default: ""
    required: false
    type: string

runs:
  using: composite
  steps:
    - name: Build PHPUnit command.
      id: build-cmd
      shell: bash
      run: |
        PATH_INPUT="${{ inputs.path }}"
        CONFIG_INPUT="${{ inputs.configuration }}"
        SUITE_INPUT="${{ inputs.test-suite }}"
        GROUP_INPUT="${{ inputs.group }}"
        EXCLUDE_GROUP_INPUT="${{ inputs.exclude-group }}"
        DEBUG_INPUT="${{ inputs.debug }}"
        ADDITIONAL_ARGS="${{ inputs.additional-args }}"
        COVERAGE_DRIVER="${{ inputs.coverage-driver }}"
        COVERAGE_FORMAT="${{ inputs.coverage-format }}"
        COVERAGE_FILE="${{ inputs.coverage-file }}"

        PHPUNIT_CMD="$PATH_INPUT --colors=always"

        add_param() {
          if [ -n "$2" ]; then
            PHPUNIT_CMD="$PHPUNIT_CMD $1 $2"
          fi
        }

        if [ -n "$COVERAGE_DRIVER" ] && [ "$COVERAGE_DRIVER" != "none" ]; then
          PHPUNIT_CMD="$PHPUNIT_CMD --coverage-$COVERAGE_FORMAT=$COVERAGE_FILE"
        fi

        add_param "--configuration" "$CONFIG_INPUT"
        add_param "--testsuite" "$SUITE_INPUT"
        add_param "--group" "$GROUP_INPUT"
        add_param "--exclude-group" "$EXCLUDE_GROUP_INPUT"

        if [ -n "$DEBUG_INPUT" ]; then
          PHPUNIT_CMD="$PHPUNIT_CMD $DEBUG_INPUT"
        fi

        if [ -n "$ADDITIONAL_ARGS" ]; then
          PHPUNIT_CMD="$PHPUNIT_CMD $ADDITIONAL_ARGS"
        fi

        echo "command=$PHPUNIT_CMD" >> $GITHUB_OUTPUT
        echo "PHPUnit command: $PHPUNIT_CMD"

    - name: Run PHPUnit tests on Linux.
      shell: bash
      if: runner.os != 'Windows'
      run: ${{ steps.build-cmd.outputs.command }}

    - name: Run PHPUnit tests on Windows.
      shell: pwsh
      if: runner.os == 'Windows'
      run: Invoke-Expression "${{ steps.build-cmd.outputs.command }}"

    - name: Upload test results to Codecov.
      if: ${{ !cancelled() && inputs.coverage-driver != 'none' }}
      uses: codecov/test-results-action@v1
      with:
        token: ${{ inputs.coverage-token }}

    - name: Upload coverage to Codecov.
      if: ${{ !cancelled() && inputs.coverage-driver != 'none' }}
      uses: codecov/codecov-action@v5
      with:
        files: ./${{ inputs.coverage-file }}
        token: ${{ inputs.coverage-token }}


================================================
FILE: .github/workflows/build.yml
================================================
---
name: build

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  PHP_EXTENSIONS: curl, dom, imagick, intl, mbstring, mcrypt, memcached
  PHP_INI_VALUES: apc.enabled=1,apc.shm_size=32M,apc.enable_cli=1, date.timezone='UTC'
  PHPUNIT_EXCLUDE_GROUP: db,wincache
  XDEBUG_MODE: coverage

jobs:
  phpunit:
    name: PHP ${{ matrix.php }}

    env:
      COVERAGE_DRIVER: ${{ matrix.php < 8.1 && 'xdebug' || 'pcov' }}
      IGNORE_PLATFORM_REQS: false

    runs-on: ubuntu-22.04

    services: &memcached-service
      memcached:
        image: memcached:latest
        ports:
          - 11211:11211
        options: >-
          --health-cmd "timeout 5 bash -c 'cat < /dev/null > /dev/tcp/127.0.0.1/11211'"
          --health-interval 10s
          --health-retries 5
          --health-timeout 5s

    strategy:
      fail-fast: false
      matrix:
        php: [7.4, 8.0, 8.1, 8.2, 8.3, 8.4, 8.5]

    steps: &build-steps
      - name: Checkout.
        uses: actions/checkout@v5

      - name: Generate french locale.
        run: sudo locale-gen fr_FR.UTF-8

      - name: Setup PHP with Composer.
        uses: ./.github/actions/php-setup
        with:
          coverage-driver: ${{ env.COVERAGE_DRIVER }}
          extensions: ${{ matrix.php < 8.0 && 'apc' || 'apcu' }}, ${{ env.PHP_EXTENSIONS }}
          ignore-platform-reqs: ${{ env.IGNORE_PLATFORM_REQS }}
          ini-values: ${{ env.PHP_INI_VALUES }}, session.save_path="${{ runner.temp }}"
          php-version: ${{ matrix.php }}

      - name: Run PHPUnit tests.
        uses: ./.github/actions/phpunit
        with:
          coverage-driver: ${{ env.COVERAGE_DRIVER }}
          coverage-token: ${{ secrets.CODECOV_TOKEN }}
          exclude-group: ${{ env.PHPUNIT_EXCLUDE_GROUP }}

  phpunit-dev:
    name: PHP ${{ matrix.php }}

    env:
      COVERAGE_DRIVER: none
      IGNORE_PLATFORM_REQS: true

    runs-on: ubuntu-22.04

    services: *memcached-service

    strategy:
      fail-fast: false
      matrix:
        php: [8.6]

    steps: *build-steps


================================================
FILE: .github/workflows/ci-mariadb.yml
================================================
name: ci-mariadb

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  tests:
    name: MariaDB tests with coverage
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: mariadb-${{ github.ref }}
      coverage-driver: xdebug
      database-env: '{"MARIADB_ROOT_PASSWORD":"root","MARIADB_DATABASE":"yiitest"}'
      database-health-cmd: mariadb-admin ping
      database-image: mariadb
      database-port: "3306"
      database-type: mysql
      database-versions: '["10.4","latest"]'
      extensions: curl, intl, pdo, pdo_mysql
      os: '["ubuntu-22.04"]'
      php-version: '["7.4","8.5"]'
      phpunit-group: mysql
    secrets:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  tests-dev:
    name: MariaDB tests
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: mariadb-dev-${{ github.ref }}
      coverage-driver: none
      database-env: '{"MARIADB_ROOT_PASSWORD":"root","MARIADB_DATABASE":"yiitest"}'
      database-health-cmd: mariadb-admin ping
      database-image: mariadb
      database-port: "3306"
      database-type: mysql
      database-versions: '["latest"]'
      extensions: curl, intl, pdo, pdo_mysql
      os: '["ubuntu-22.04"]'
      php-version: '["8.0","8.1","8.2","8.3","8.4"]'
      phpunit-group: mysql


================================================
FILE: .github/workflows/ci-mssql.yml
================================================
name: ci-mssql

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  tests:
    name: MSSQL tests with coverage
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: mssql-${{ github.ref }}
      coverage-driver: xdebug
      database-env: '{"SA_PASSWORD":"YourStrong!Passw0rd","ACCEPT_EULA":"Y","MSSQL_PID":"Developer"}'
      database-health-cmd: /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'
      database-image: mcr.microsoft.com/mssql/server
      database-port: "1433"
      database-type: mssql
      database-versions: '["2019-latest","2022-latest"]'
      extensions: curl, intl, pdo, pdo_sqlsrv
      hook: |
        sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
        docker exec -i database /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U SA -P 'YourStrong!Passw0rd' -Q "IF DB_ID(N'yiitest') IS NULL CREATE DATABASE yiitest;"
      os: '["ubuntu-22.04"]'
      php-version: '["7.4","8.5"]'
      phpunit-group: mssql
    secrets:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  tests-dev:
    name: MSSQL tests
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: mssql-dev-${{ github.ref }}
      coverage-driver: none
      database-env: '{"SA_PASSWORD":"YourStrong!Passw0rd","ACCEPT_EULA":"Y","MSSQL_PID":"Developer"}'
      database-health-cmd: /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'
      database-image: mcr.microsoft.com/mssql/server
      database-port: "1433"
      database-type: mssql
      database-versions: '["2022-latest"]'
      extensions: curl, intl, pdo, pdo_sqlsrv
      hook: |
        sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18
        docker exec -i database /opt/mssql-tools18/bin/sqlcmd -C -S localhost -U SA -P 'YourStrong!Passw0rd' -Q "IF DB_ID(N'yiitest') IS NULL CREATE DATABASE yiitest;"
      os: '["ubuntu-22.04"]'
      php-version: '["8.0","8.1","8.2","8.3","8.4"]'
      phpunit-group: mssql


================================================
FILE: .github/workflows/ci-mysql.yml
================================================
name: ci-mysql

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  tests:
    name: MySQL tests with coverage
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: mysql-${{ github.ref }}
      coverage-driver: xdebug
      database-env: '{"MYSQL_ROOT_PASSWORD":"root","MYSQL_DATABASE":"yiitest"}'
      database-health-cmd: mysqladmin ping
      database-image: mysql
      database-port: "3306"
      database-type: mysql
      database-versions: '["5.7","latest"]'
      extensions: curl, intl, pdo, pdo_mysql
      os: '["ubuntu-22.04"]'
      php-version: '["7.4","8.5"]'
      phpunit-group: mysql
    secrets:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  tests-dev:
    name: MySQL tests
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: mysql-dev-${{ github.ref }}
      coverage-driver: none
      database-env: '{"MYSQL_ROOT_PASSWORD":"root","MYSQL_DATABASE":"yiitest"}'
      database-health-cmd: mysqladmin ping
      database-image: mysql
      database-port: "3306"
      database-type: mysql
      database-versions: '["latest"]'
      extensions: curl, intl, pdo, pdo_mysql
      os: '["ubuntu-22.04"]'
      php-version: '["8.0","8.1","8.2","8.3","8.4"]'
      phpunit-group: mysql


================================================
FILE: .github/workflows/ci-node.yml
================================================
name: build-node

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

env:
  DEFAULT_COMPOSER_FLAGS: "--prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi"

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    name: NPM 10 on ubuntu-22.04

    runs-on: ubuntu-22.04

    steps:
      - name: Monitor action permissions.
        if: runner.os != 'Windows'
        uses: GitHubSecurityLab/actions-permissions/monitor@v1

      - name: Checkout.
        uses: actions/checkout@v5

      - name: Install dependencies.
        run: composer update $DEFAULT_COMPOSER_FLAGS

      - name: Install JQuery `3.6.*@stable` for tests.
        run: composer require "bower-asset/jquery:3.6.*@stable"

      - name: Install node.js.
        uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Tests.
        run: |
          npm install
          npm run lint
          npm test


================================================
FILE: .github/workflows/ci-oracle.yml
================================================
name: ci-oracle

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  tests:
    name: Oracle tests with coverage
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: oracle-${{ github.ref }}
      coverage-driver: xdebug
      database-env: '{"ORACLE_PASSWORD":"oracle"}'
      database-health-cmd: "healthcheck.sh"
      database-health-retries: 10
      database-image: gvenzl/oracle-free
      database-port: "1521"
      database-type: oracle
      database-versions: '["slim-faststart"]'
      extensions: curl, intl, oci8, pdo, pdo_oci
      hook: docker exec -i database sqlplus -s system/oracle@//localhost/FREE < tests/data/oci/optimize_for_tests.sql
      os: '["ubuntu-22.04"]'
      php-version: '["7.4","8.5"]'
      phpunit-group: oci
    secrets:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}


================================================
FILE: .github/workflows/ci-pgsql.yml
================================================
name: ci-pgsql

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  tests:
    name: PostgreSQL tests with coverage
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: pgsql-${{ github.ref }}
      coverage-driver: xdebug
      database-env: '{"POSTGRES_USER":"postgres","POSTGRES_PASSWORD":"postgres","POSTGRES_DB":"yiitest"}'
      database-health-cmd: pg_isready
      database-image: postgres
      database-port: "5432"
      database-type: pgsql
      database-versions: '["10","11","12","13","14","15","16","17","latest"]'
      extensions: curl, intl, pdo, pdo_pgsql
      os: '["ubuntu-22.04"]'
      php-version: '["7.4","8.5"]'
      phpunit-group: pgsql
    secrets:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  tests-dev:
    name: PostgreSQL tests
    uses: yiisoft/yii2-actions/.github/workflows/database.yml@master
    with:
      concurrency-group: pgsql-dev-${{ github.ref }}
      coverage-driver: none
      database-env: '{"POSTGRES_USER":"postgres","POSTGRES_PASSWORD":"postgres","POSTGRES_DB":"yiitest"}'
      database-health-cmd: pg_isready
      database-image: postgres
      database-port: "5432"
      database-type: pgsql
      database-versions: '["latest"]'
      extensions: curl, intl, pdo, pdo_pgsql
      os: '["ubuntu-22.04"]'
      php-version: '["8.0","8.1","8.2","8.3","8.4"]'
      phpunit-group: pgsql


================================================
FILE: .github/workflows/ci-sqlite.yml
================================================
name: ci-sqlite

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  tests:
    name: SQLite tests with coverage
    uses: yiisoft/yii2-actions/.github/workflows/phpunit.yml@master
    with:
      concurrency-group: sqlite-${{ github.ref }}
      coverage-driver: xdebug
      enable-concurrency: true
      extensions: curl, intl, pdo, pdo_sqlite
      os: '["ubuntu-22.04","windows-latest"]'
      php-version: '["7.4","8.5"]'
      phpunit-group: sqlite
    secrets:
      CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  tests-dev:
    name: SQLite tests
    uses: yiisoft/yii2-actions/.github/workflows/phpunit.yml@master
    with:
      concurrency-group: sqlite-dev-${{ github.ref }}
      coverage-driver: none
      enable-concurrency: true
      extensions: curl, intl, pdo, pdo_sqlite
      os: '["ubuntu-22.04"]'
      php-version: '["8.0","8.1","8.2","8.3","8.4"]'
      phpunit-group: sqlite


================================================
FILE: .github/workflows/linter.yaml
================================================
name: linter

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  phpcs:
    uses: yiisoft/yii2-actions/.github/workflows/linter.yml@master
    with:
      php-version: '["7.4", "8.5"]'


================================================
FILE: .github/workflows/static.yml
================================================
name: static analysis

permissions:
  contents: read
  pull-requests: write

on:
  pull_request: &ignore-paths
    paths-ignore:
      - ".appveyor.yml"
      - ".dockerignore"
      - ".editorconfig"
      - ".git-blame-ignore-revs"
      - ".gitattributes"
      - ".github/CONTRIBUTING.md"
      - ".github/FUNDING.yml"
      - ".github/ISSUE_TEMPLATE.md"
      - ".github/PULL_REQUEST_TEMPLATE.md"
      - ".github/SECURITY.md"
      - ".gitignore"
      - ".gitlab-ci.yml"
      - "code-of-conduct.md"
      - "docs/**"
      - "framework/.gitignore"
      - "framework/.phpstorm.meta.php"
      - "framework/CHANGELOG.md"
      - "framework/LICENSE.md"
      - "framework/README.md"
      - "framework/UPGRADE.md"
      - "eslint.config.js"
      - "LICENSE.md"
      - "README.md"
      - "ROADMAP.md"

  push: *ignore-paths

jobs:
  phpstan:
    uses: yiisoft/yii2-actions/.github/workflows/phpstan.yml@master
    with:
      configuration: phpstan.dist.neon
      concurrency-group: phpstan-${{ github.ref }}
      extensions: apcu, curl, dom, imagick, intl, mbstring, mcrypt, memcached
      php-version: '["8.5"]'

  phpstan-7x:
    uses: yiisoft/yii2-actions/.github/workflows/phpstan.yml@master
    with:
      configuration: phpstan-7x.dist.neon
      concurrency-group: phpstan7x-${{ github.ref }}
      extensions: apc, curl, dom, imagick, intl, mbstring, mcrypt, memcached
      php-version: '["7.4"]'


================================================
FILE: .gitignore
================================================
# phpstorm project files
.idea
*.iml

# netbeans project files
nbproject

# zend studio for eclipse project files
.buildpath
.project
.settings

# sublime text project / workspace files
*.sublime-project
*.sublime-workspace

# visual studio code project files
.vscode

# windows thumbnail cache
Thumbs.db

# composer vendor dir
/vendor
# cubrid install dir
/cubrid

# composer itself is not needed
composer.phar

# composer.lock in applications is ignored since it's automatically created by composer when application is installed
/apps/*/composer.lock

# Mac DS_Store Files
.DS_Store

# phpunit itself is not needed
phpunit.phar
# local phpunit config
/phpunit.xml
.phpunit.result.cache

# ignore dev installed apps and extensions
/apps
/extensions
/packages

# NPM packages
/node_modules
.env
package-lock.json

# local phpstan config
phpstan.neon


================================================
FILE: .gitlab-ci.yml
================================================
image: docker:latest

services:
  - docker:dind

variables:
  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 git curl docker-compose
  - docker info
  - cd tests

stages:
  - travis
  - test
  - cleanup

test:
  stage: test
  script:
    - docker-compose up --build -d
    - docker-compose run --rm php vendor/bin/phpunit -v --exclude caching,db,data --log-junit tests/_junit/test.xml

caching:
  stage: test
  only:
    - tests/caching
    - tests/full
  script:
    - export COMPOSE_FILE=docker-compose.yml:docker-compose.${CI_BUILD_NAME}.yml
    - docker-compose up --build -d
    - docker-compose run --rm php vendor/bin/phpunit -v --group caching --exclude db

db:
  stage: test
  only:
    - tests/mysql
    - tests/full
  script:
    - docker-compose up --build -d
    - docker-compose run --rm php vendor/bin/phpunit -v --group db --exclude caching,mysql,pgsql,mssql,cubrid,oci


mysql:
  stage: test
  only:
    - tests/mysql
    - tests/full
  script:
    - export COMPOSE_FILE=docker-compose.yml:docker-compose.${CI_BUILD_NAME}.yml
    - docker-compose up --build -d
    # wait for db (retry X times)
    - docker-compose run --rm php bash -c "while ! curl mysql:3306; do ((c++)) && ((c==30)) && break; sleep 2; done"
    - docker-compose run --rm php vendor/bin/phpunit -v --group mysql


pgsql:
  stage: test
  only:
    - tests/pgsql
    - tests/full
  script:
    - export COMPOSE_FILE=docker-compose.yml:docker-compose.${CI_BUILD_NAME}.yml
    - docker-compose up --build -d
    # wait for db (retry X times)
    - docker-compose run --rm php bash -c 'while [ true ]; do curl postgres:5432; if [ $? == 52 ]; then break; fi; ((c++)) && ((c==25)) && break; sleep 2; done'
    - docker-compose run --rm php vendor/bin/phpunit -v --group pgsql


cubrid:
  stage: test
  only:
    - tests/cubrid
    - tests/extra
  script:
    - cd cubrid
    - docker-compose up --build -d
    # wait for db (retry X times)
    - docker-compose run --rm php bash -c 'while [ true ]; do curl cubrid:1523; if [ $? == 56 ]; then break; fi; ((c++)) && ((c==20)) && break; sleep 3; done'
    - sleep 5
    - docker-compose run --rm php /project/vendor/bin/phpunit -v --group cubrid


mssql:
  stage: test
  only:
    - tests/mssql
    - tests/extra
  script:
    - cd mssql
    - docker-compose up --build -d
    # wait for db (retry X times)
    - docker-compose run --rm php bash -c 'while [ true ]; do curl mssql:1433; if [ $? == 52 ]; then break; fi; ((c++)) && ((c==15)) && break; sleep 5; done'
    - sleep 3
    # Note: Password has to be the last parameter
    - docker-compose run --rm sqlcmd sh -c 'sqlcmd -S mssql -U sa -Q "CREATE DATABASE yii2test" -P Microsoft-12345'
    - docker-compose run --rm php vendor/bin/phpunit -v --group mssql


travis:
  stage: travis
  only:
    - travis
  script:
    - export COMPOSE_FILE=docker-compose.yml:docker-compose.mysql.yml:docker-compose.pgsql.yml
    - docker-compose up --build -d
    # wait for dbs ...
    - sleep 10
    - docker-compose run --rm php vendor/bin/phpunit -v --exclude mssql,cubrid,oci,wincache,cubrid



================================================
FILE: .well-known/funding-manifest-urls
================================================
https://www.yiiframework.com/funding.json


================================================
FILE: Dockerfile
================================================
ARG DOCKER_YII2_PHP_IMAGE
FROM ${DOCKER_YII2_PHP_IMAGE}

# Project source-code
WORKDIR /project
ADD composer.* /project/
# Install packages
RUN /usr/local/bin/composer install --prefer-dist
ADD ./ /project
ENV PATH /project/vendor/bin:${PATH}


================================================
FILE: LICENSE.md
================================================
Copyright © 2008 by Yii Software (https://www.yiiframework.com/)
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

 * Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in
   the documentation and/or other materials provided with the
   distribution.
 * Neither the name of Yii Software nor the names of its
   contributors may be used to endorse or promote products derived
   from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.


================================================
FILE: README.md
================================================
<p align="center">
    <a href="https://www.yiiframework.com/" target="_blank">
        <picture>
            <source media="(prefers-color-scheme: dark)" srcset="https://www.yiiframework.com/image/design/logo/yii3_full_for_dark.svg">
            <source media="(prefers-color-scheme: light)" srcset="https://www.yiiframework.com/image/design/logo/yii3_full_for_light.svg">
            <img src="https://www.yiiframework.com/image/design/logo/yii3_full_for_light.svg" alt="Yii Framework" height="100">
        </picture>
    </a>
</p>

Yii 2 is a modern framework designed to be a solid foundation for your PHP application.

It is fast, secure and efficient and works right out of the box pre-configured with reasonable defaults.
The framework is easy to adjust to meet your needs, because Yii has been designed to be flexible.

[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2.svg?logo=packagist&style=for-the-badge&label=Stable)](https://packagist.org/packages/yiisoft/yii2)
[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2.svg?style=for-the-badge)](https://packagist.org/packages/yiisoft/yii2)
[![Build Status](https://img.shields.io/github/actions/workflow/status/yiisoft/yii2/build.yml?style=for-the-badge&logo=github&label=Build)](https://github.com/yiisoft/yii2/actions/workflows/build.yml)
[![Static Analysis](https://img.shields.io/github/actions/workflow/status/yiisoft/yii2/static.yml?style=for-the-badge&label=Static&logo=github)](https://github.com/yiisoft/yii2/actions/workflows/static.yml)
[![codecov](https://img.shields.io/codecov/c/github/yiisoft/yii2.svg?style=for-the-badge&logo=codecov&logoColor=white&label=Codecov)](https://codecov.io/gh/yiisoft/yii2)

Installation
------------

> [!IMPORTANT]
> - The minimum required [PHP](https://www.php.net/) version of Yii is PHP `7.4`.
> - It works best with PHP `8`.

- [Follow the Definitive Guide](https://www.yiiframework.com/doc-2.0/guide-start-installation.html)
in order to get step by step instructions.

Documentation
-------------

- A [Definitive Guide](https://www.yiiframework.com/doc/guide/2.0) and 
a [Class Reference](https://www.yiiframework.com/doc/api/2.0) cover every detail
of the framework.
- There is a [PDF version](https://www.yiiframework.com/doc/download/yii-guide-2.0-en.pdf) of the Definitive Guide
and a [Definitive Guide Mirror](http://stuff.cebe.cc/yii2docs/) which is updated every 15 minutes.
- For Yii 1.1 users, there is [Upgrading from Yii 1.1](https://www.yiiframework.com/doc/guide/2.0/en/intro-upgrade-from-v1)
to get an idea of what has changed in 2.0.

Versions & PHP compatibility
----------------------------

> [!NOTE]
> See ["Release Cycle" at the website](https://www.yiiframework.com/release-cycle) for detailed information about supported versions.

Community
---------

- Participate in [discussions at forums](https://www.yiiframework.com/forum/).
- [Community Slack](https://join.slack.com/t/yii/shared_invite/MjIxMjMxMTk5MTU1LTE1MDE3MDAwMzMtM2VkMTMyMjY1Ng) and [Chat in IRC](https://www.yiiframework.com/chat/).
- Follow us on [Facebook](https://www.facebook.com/groups/yiitalk/), [Twitter](https://twitter.com/yiiframework)
and [GitHub](https://github.com/yiisoft/yii2).
- Check [other communities](https://github.com/yiisoft/yii2/wiki/communities).

Contributing
------------

The framework is [Open Source](LICENSE.md) powered by [an excellent community](https://github.com/yiisoft/yii2/graphs/contributors).

You may join us and:

- [Report an issue](docs/internals/report-an-issue.md)
- [Translate documentation or messages](docs/internals/translation-workflow.md)
- [Give us feedback or start a design discussion](https://www.yiiframework.com/forum/index.php/forum/42-general-discussions-for-yii-20/)
- [Contribute to the core code or fix bugs](docs/internals/git-workflow.md)
- [Become a sponsor](#sponsoring)

### Reporting Security issues

> [!WARNING]
> Please do not report security vulnerabilities through public GitHub issues.

Please refer to a [special page at the website](https://www.yiiframework.com/security/)
describing proper workflow for security issue reports.

### Directory Structure

```
build/               internally used build tools
docs/                documentation
framework/           core framework code
tests/               tests of the core framework code
```

### Spreading the Word

Acknowledging or citing Yii 2 is as important as direct contributions.

**In presentations**

If you are giving a presentation or talk featuring work that makes use of Yii 2 and would like to acknowledge it,
we suggest using [our logo](https://www.yiiframework.com/logo/) on your title slide.

**In projects**

If you are using Yii 2 as part of an OpenSource project, a way to acknowledge it is to
[use a special badge](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=for-the-badge&logo=yii) in your README:    

[![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=for-the-badge&logo=yii)](https://www.yiiframework.com/)

If your code is hosted at GitHub, you can place the following in your README.md file to get the badge:

```
[![Yii2](https://img.shields.io/badge/Powered_by-Yii_Framework-green.svg?style=for-the-badge&logo=yii)](https://www.yiiframework.com/)
```

### Sponsoring

Support this project by becoming a sponsor or a backer. 

[![Open Collective sponsors](https://img.shields.io/opencollective/sponsors/yiisoft?style=for-the-badge&logo=opencollective)](https://opencollective.com/yiisoft) 
[![Open Collective backers](https://img.shields.io/opencollective/backers/yiisoft?style=for-the-badge&logo=opencollective)](https://opencollective.com/yiisoft)


================================================
FILE: ROADMAP.md
================================================
> Roadmap for Yii 3.0 and further was moved to [yiisoft/docs](https://github.com/yiisoft/docs/blob/master/003-roadmap.md).

- Enhancements are not accepted for framework version 2.0.
- Enhancements are accepted for 2.0 extensions.
- Bug and security fixes are expected.
- Pull requests and maintainers are very welcome.

Above would stand as it is [for two years after Yii 3.0 release](https://www.yiiframework.com/release-cycle).

## Additional releases

While we focus on 3.0, we tag 2.0 releases and extension releases [about once in a week](https://www.yiiframework.com/release-cycle).


## 2.0.16+ (since 2019 till 3.0 release + 2 years)

- Bugfixes.

## 2.0.15 (2nd quarter of 2018)

- Since this release main focus is bug fixing.
- No full-branch merges into 3.0.
- No enhancements are accepted.

## 2.0.14 (1st quarter of 2018)

Will be last release with features and enhancements the last one that will be merged into 3.0 directly.


================================================
FILE: build/.htaccess
================================================
deny from all


================================================
FILE: build/build
================================================
#!/usr/bin/env php
<?php
/**
 * build script file.
 *
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

define('YII_DEBUG', true);

$composerAutoload = [
    __DIR__ . '/../vendor/autoload.php', // yii2 as the root package
    __DIR__ . '/../../../autoload.php', // yii2-basic or yii2-advanced as the root package
];

foreach ($composerAutoload as $autoload) {
    if (file_exists($autoload)) {
        require $autoload;
        $vendorPath = dirname($autoload);
        break;
    }
}

if (!isset($vendorPath)) {
	echo "composer autoloader could not be found.\nYou should run `composer install` in repo root directory.\n";
	exit(1);
}
require __DIR__ . '/../framework/Yii.php';

Yii::setAlias('@yii/build', __DIR__);

$application = new yii\console\Application([
	'id' => 'yii-build',
	'basePath' => __DIR__,
	'controllerNamespace' => 'yii\build\controllers',
	'enableCoreCommands' => false,
]);
$application->run();


================================================
FILE: build/build.bat
================================================
@echo off

rem -------------------------------------------------------------
rem  build script for Windows.
rem
rem  This is the bootstrap script for running build on Windows.
rem
rem  @author Qiang Xue <qiang.xue@gmail.com>
rem  @link https://www.yiiframework.com/
rem  @copyright 2008 Yii Software LLC
rem  @license https://www.yiiframework.com/license/
rem  @version $Id$
rem -------------------------------------------------------------

@setlocal

set BUILD_PATH=%~dp0

if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe

%PHP_COMMAND% "%BUILD_PATH%build" %*

@endlocal


================================================
FILE: build/build.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
 * Phing build file for Yii 2.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link https://www.yiiframework.com/
 * @copyright 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */
-->
<project name="yii" basedir="." default="help">
  <!-- task definitions -->
  <taskdef name="yii-init-build" classname="YiiInitTask" classpath="tasks" />
  <!--
  <taskdef name="yii-pear" classname="YiiPearTask" classpath="tasks"/>
  -->

  <!-- init yii.version, yii.revision and yii.winbuild -->
  <yii-init-build />

  <!-- these are required external commands -->
  <property name="php" value="php" /> <!-- PHP parser -->
  <property name="composer" value="composer" /> <!-- composer -->
  <property name="pdflatex" value="pdflatex" />  <!-- generates PDF from LaTex -->

  <property name="pkgname" value="${phing.project.name}-${yii.version}.${yii.revision}"/>
  <property name="docname" value="${phing.project.name}-docs-${yii.version}.${yii.revision}"/>
  <property name="pearname" value="${phing.project.name}-${yii.release}.tgz" />

  <!-- directory definitions -->
  <property name="build.base.dir" value="release"/>
  <property name="build.dist.dir" value="${build.base.dir}/dist"/>
  <property name="build.src.dir" value="${build.base.dir}/${pkgname}"/>
  <property name="build.pear.src.dir" value="${build.src.dir}/framework" />
  <property name="build.doc.dir" value="${build.base.dir}/${docname}"/>
  <property name="build.web.dir" value="${build.base.dir}/web"/>

  <tstamp>
    <format property="DATE" pattern="%b %e %Y" />
  </tstamp>

  <if>
    <equals arg1="${yii.winbuild}" arg2="true"/>
    <then>
      <property name="build" value="build"/>
    </then>
    <else>
      <property name="build" value="php build"/>
    </else>
  </if>

  <!-- source files in the framework -->
  <fileset dir=".." id="framework">
    <exclude name="**/.gitignore"/>
    <exclude name="**/*.bak"/>
    <exclude name="**/*~"/>
    <include name="framework/**/*"/>
    <include name="requirements/**/*"/>
    <include name="demos/**/*"/>
    <include name="CHANGELOG"/>
    <include name="UPGRADE"/>
    <include name="LICENSE"/>
    <include name="README"/>
  </fileset>

  <!-- doc files -->
  <fileset dir="../docs" id="docs">
    <exclude name="**/.gitignore"/>
    <exclude name="**/*.bak"/>
    <exclude name="**/*~"/>
    <include name="guide/**/*"/>
    <include name="blog/**/*"/>
  </fileset>

  <fileset dir="../docs/guide" id="docs-guide">
    <exclude name="**/.gitignore"/>
    <exclude name="**/*.bak"/>
    <exclude name="**/*~"/>
    <include name="**/*"/>
  </fileset>

  <fileset dir="../docs/blog" id="docs-blog">
    <exclude name="**/.gitignore"/>
    <exclude name="**/*.bak"/>
    <exclude name="**/*~"/>
    <include name="**/*"/>
  </fileset>

  <fileset dir="." id="writables">
    <include name="${build.src.dir}/**/runtime" />
    <include name="${build.src.dir}/**/assets" />
    <include name="${build.src.dir}/demos/**/data" />
  </fileset>

  <fileset dir="." id="executables">
    <include name="${build.src.dir}/**/yii" />
  </fileset>

  <target name="src" depends="sync">
    <echo>Building package ${pkgname}...</echo>
    <echo>Copying files to build directory...</echo>
    <copy todir="${build.src.dir}">
      <fileset refid="framework"/>
    </copy>

    <echo>Changing file permissions...</echo>
    <chmod mode="0777">
      <fileset refid="writables" />
    </chmod>
    <chmod mode="0755">
      <fileset refid="executables" />
    </chmod>

    <echo>Generating source release file...</echo>
    <mkdir dir="${build.dist.dir}" />
    <if>
      <equals arg1="${yii.winbuild}" arg2="true"/>
      <then>
        <tar destfile="${build.dist.dir}/${pkgname}.tar.gz" compression="gzip">
          <fileset dir="${build.base.dir}">
            <include name="${pkgname}/**/*"/>
          </fileset>
        </tar>
      </then>
      <else>
        <exec command="tar czpf ${pkgname}.tar.gz ${pkgname}" dir="${build.base.dir}"/>
        <move file="${build.base.dir}/${pkgname}.tar.gz" todir="${build.dist.dir}" />
      </else>
    </if>
    <zip destfile="${build.dist.dir}/${pkgname}.zip">
      <fileset dir="${build.base.dir}">
        <include name="${pkgname}/**/*"/>
      </fileset>
    </zip>
  </target>

  <target name="doc" depends="sync">
    <echo>Building documentation...</echo>

    <echo>Building Guide PDF...</echo>
    <exec command="${build} guideLatex" dir="." passthru="true" />
    <exec command="${pdflatex} guide.tex -interaction=nonstopmode -max-print-line=120" dir="commands/guide" passthru="true"/>
    <exec command="${pdflatex} guide.tex -interaction=nonstopmode -max-print-line=120" dir="commands/guide" passthru="true"/>
    <exec command="${pdflatex} guide.tex -interaction=nonstopmode -max-print-line=120" dir="commands/guide" passthru="true"/>
    <move file="commands/guide/guide.pdf" tofile="${build.doc.dir}/yii-guide-${yii.version}.pdf" />

    <echo>Building Blog PDF...</echo>
    <exec command="${build} blogLatex" dir="." passthru="true" />
    <exec command="${pdflatex} blog.tex -interaction=nonstopmode -max-print-line=120" dir="commands/blog" passthru="true"/>
    <exec command="${pdflatex} blog.tex -interaction=nonstopmode -max-print-line=120" dir="commands/blog" passthru="true"/>
    <exec command="${pdflatex} blog.tex -interaction=nonstopmode -max-print-line=120" dir="commands/blog" passthru="true"/>
    <move file="commands/blog/blog.pdf" tofile="${build.doc.dir}/yii-blog-${yii.version}.pdf" />

    <echo>Building API...</echo>
    <exec command="${build} api ${build.doc.dir}" dir="." passthru="true" />

    <!--
    <echo>Building API CHM...</echo>
    <exec command="${hhc} ${build.doc.dir}/api/manual.hhp" />
    <move file="${build.doc.dir}/api/manual.chm" tofile="${build.doc.dir}/yii-api-${yii.version}.chm" />
    <delete>
      <fileset dir="${build.doc.dir}/api">
        <include name="manual.*" />
      </fileset>
    </delete>
    -->

    <echo>Generating doc release file...</echo>
    <mkdir dir="${build.dist.dir}" />
    <tar destfile="${build.dist.dir}/${docname}.tar.gz" compression="gzip">
      <fileset dir="${build.base.dir}">
        <include name="${docname}/**/*"/>
      </fileset>
    </tar>
    <zip destfile="${build.dist.dir}/${docname}.zip">
      <fileset dir="${build.base.dir}">
        <include name="${docname}/**/*"/>
      </fileset>
    </zip>
  </target>

  <target name="web" depends="sync">

    <echo>Building online API...</echo>
    <mkdir dir="${build.web.dir}/common/data/${yii.version}" />
    <exec command="${build} api ${build.web.dir}/common/data/${yii.version} online" dir="." passthru="true" />

    <echo>Copying tutorials...</echo>
    <copy todir="${build.web.dir}/common/data/${yii.version}/tutorials/guide">
      <fileset refid="docs-guide"/>
    </copy>
    <copy todir="${build.web.dir}/common/data/${yii.version}/tutorials/blog">
      <fileset refid="docs-blog"/>
    </copy>

	<echo>Copying release text files...</echo>
    <mkdir dir="${build.web.dir}/frontend/www/files" />
	<copy file="../CHANGELOG" tofile="${build.web.dir}/frontend/www/files/CHANGELOG-${yii.version}.txt" />
	<copy file="../UPGRADE" tofile="${build.web.dir}/frontend/www/files/UPGRADE-${yii.version}.txt" />

	<echo>

Finished building Web files.
Please update yiisite/common/data/versions.php file with the following code:

    '1.1'=>array(
        'version'=>'${yii.version}',
        'revision'=>'${yii.revision}',
        'date'=>'${yii.date}',
        'latest'=>true,
    ),

	</echo>
  </target>

  <target name="sync">
    <echo>Synchronizing code changes for ${pkgname}...</echo>

    <echo>Building autoload map...</echo>
    <exec command="${build} autoload" dir="." passthru="true"/>

    <echo>Building yiilite.php...</echo>
    <exec command="${build} lite" dir="." passthru="true"/>
  </target>

  <target name="message">
    <echo>Extracting i18n messages...</echo>
    <exec command="${build} message ../framework/messages/config.php" dir="." passthru="true"/>
  </target>

  <!--
  <target name="pear" depends="clean,build">
    <echo>Generating pear package for ${phing.project.name}-${yii.release}</echo>
    <mkdir dir="${build.dist.dir}" />
    <yii-pear   pkgdir="${build.pear.src.dir}"
                channel="pear.php.net"
                version="${yii.release}"
                state="stable"
                category="framework"
                package="${phing.project.name}"
                summary="Yii PHP Framework"
                pkgdescription="Yii PHP Framework: Best for Web 2.0 Development"
                notes="https://www.yiiframework.com/files/CHANGELOG-${yii.release}.txt"
                license="BSD"
                />
    <exec command="pear package" dir="${build.pear.src.dir}" passthru="true" />
    <move file="${build.pear.src.dir}/${pearname}" tofile="${build.dist.dir}/${pearname}" />
  </target>
  -->

  <target name="clean">
    <echo>Cleaning up the build...</echo>
    <delete dir="${build.base.dir}"/>
  </target>

  <target name="help">
    <echo>

    Welcome to use Yii build script!
    --------------------------------
    You may use the following command format to build a target:

              phing   &lt;target name&gt;

    where &lt;target name&gt; can be one of the following:

    - sync    : synchronize yiilite.php and BaseYii.php
    - message : extract i18n messages of the framework
    - src     : build source release
    - doc     : build documentation release (Windows only)
    - clean   : clean up the build

    </echo>
  </target>
</project>


================================================
FILE: build/controllers/ClassmapController.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use yii\console\Application;
use yii\console\Controller;
use yii\console\Exception;
use yii\helpers\FileHelper;

/**
 * Creates a class map for the core Yii classes.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 *
 * @extends Controller<Application>
 */
class ClassmapController extends Controller
{
    public $defaultAction = 'create';

    /**
     * Creates a class map for the core Yii classes.
     * @param string $root    the root path of Yii framework. Defaults to YII2_PATH.
     * @param string $mapFile the file to contain the class map. Defaults to YII2_PATH . '/classes.php'.
     */
    public function actionCreate($root = null, $mapFile = null)
    {
        if ($root === null) {
            $root = YII2_PATH;
        }
        $root = FileHelper::normalizePath($root);
        if ($mapFile === null) {
            $mapFile = YII2_PATH . '/classes.php';
        }
        $options = [
            'filter' => function ($path) {
                if (is_file($path)) {
                    $file = basename($path);
                    if ($file[0] < 'A' || $file[0] > 'Z') {
                        return false;
                    }
                }

                return null;
            },
            'only' => ['*.php'],
            'except' => [
                '/Yii.php',
                '/BaseYii.php',
                '/console/',
                '/requirements/',
            ],
        ];
        $files = FileHelper::findFiles($root, $options);
        $map = [];
        foreach ($files as $file) {
            if (strpos($file, $root) !== 0) {
                throw new Exception("Something wrong: $file\n");
            }
            $path = str_replace('\\', '/', substr($file, \strlen($root)));
            $map[$path] = "  'yii" . substr(str_replace('/', '\\', $path), 0, -4) . "' => YII2_PATH . '$path',";
        }
        ksort($map);
        $map = implode("\n", $map);
        $output = <<<EOD
<?php
/**
 * Yii core class map.
 *
 * This file is automatically generated by the "build classmap" command under the "build" folder.
 * Do not modify it directly.
 *
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

return [
$map
];

EOD;
        if (is_file($mapFile) && file_get_contents($mapFile) === $output) {
            echo "Nothing changed.\n";
        } else {
            file_put_contents($mapFile, $output);
            echo "Class map saved in $mapFile\n";
        }
    }
}


================================================
FILE: build/controllers/DevController.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use Yii;
use yii\base\InvalidParamException;
use yii\console\Application;
use yii\console\Controller;
use yii\console\ExitCode;
use yii\helpers\Console;
use yii\helpers\FileHelper;

/**
 * This command helps to set up a dev environment with all extensions and applications.
 *
 * It will clone an extension or app repo and link the yii2 dev installation to the contained applications/extensions vendor dirs
 * to help to work on yii using the application to test it.
 *
 * @author Carsten Brandt <mail@cebe.cc>
 * @since 2.0
 *
 * @extends Controller<Application>
 */
class DevController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public $defaultAction = 'all';
    /**
     * @var bool whether to use HTTP when cloning GitHub repositories
     */
    public $useHttp = false;
    /**
     * @var bool whether to use --no-progress option when running composer
     */
    public $composerNoProgress = false;
    /**
     * @var array
     */
    public $apps = [
        'basic' => 'git@github.com:yiisoft/yii2-app-basic.git',
        'advanced' => 'git@github.com:yiisoft/yii2-app-advanced.git',
        'benchmark' => 'git@github.com:yiisoft/yii2-app-benchmark.git',
    ];
    /**
     * @var array
     */
    public $extensions = [
        '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',
        'bootstrap5' => 'git@github.com:yiisoft/yii2-bootstrap5.git',
        'composer' => 'git@github.com:yiisoft/yii2-composer.git',
        'debug' => 'git@github.com:yiisoft/yii2-debug.git',
        'elasticsearch' => 'git@github.com:yiisoft/yii2-elasticsearch.git',
        'faker' => 'git@github.com:yiisoft/yii2-faker.git',
        'gii' => 'git@github.com:yiisoft/yii2-gii.git',
        'httpclient' => 'git@github.com:yiisoft/yii2-httpclient.git',
        'imagine' => 'git@github.com:yiisoft/yii2-imagine.git',
        'jui' => 'git@github.com:yiisoft/yii2-jui.git',
        'mongodb' => 'git@github.com:yiisoft/yii2-mongodb.git',
        'queue' => 'git@github.com:yiisoft/yii2-queue.git',
        'redis' => 'git@github.com:yiisoft/yii2-redis.git',
        'shell' => 'git@github.com:yiisoft/yii2-shell.git',
        'smarty' => 'git@github.com:yiisoft/yii2-smarty.git',
        'sphinx' => 'git@github.com:yiisoft/yii2-sphinx.git',
        'swiftmailer' => 'git@github.com:yiisoft/yii2-swiftmailer.git',
        'symfonymailer' => 'git@github.com:yiisoft/yii2-symfonymailer.git',
        'twig' => 'git@github.com:yiisoft/yii2-twig.git',
    ];


    /**
     * Install all extensions and advanced + basic app.
     */
    public function actionAll()
    {
        if (!$this->confirm('Install all applications and all extensions now?')) {
            return 1;
        }

        foreach ($this->extensions as $ext => $repo) {
            $ret = $this->actionExt($ext);
            if ($ret !== 0) {
                return $ret;
            }
        }

        foreach ($this->apps as $app => $repo) {
            $ret = $this->actionApp($app);
            if ($ret !== 0) {
                return $ret;
            }
        }

        return 0;
    }

    /**
     * Runs a command in all extension and application directories.
     *
     * Can be used to run e.g. `git pull`.
     *
     *     ./build/build dev/run git pull
     *
     * @param string $command the command to run
     */
    public function actionRun($command)
    {
        $command = implode(' ', \func_get_args());

        // root of the dev repo
        $base = \dirname(\dirname(__DIR__));
        $dirs = $this->listSubDirs("$base/extensions");
        $dirs = array_merge($dirs, $this->listSubDirs("$base/apps"));
        asort($dirs);

        $oldcwd = getcwd();
        foreach ($dirs as $dir) {
            $displayDir = substr($dir, \strlen($base));
            $this->stdout("Running '$command' in $displayDir...\n", Console::BOLD);
            chdir($dir);
            passthru($command);
            $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);
        }
        chdir($oldcwd);
    }

    /**
     * This command installs a project template in the `apps` directory and links the framework and extensions.
     *
     * It basically runs the following commands in the dev repo root:
     *
     * - Run `composer update`
     * - `rm -rf apps/basic/vendor/yiisoft/yii2`
     * - `rm -rf apps/basic/vendor/yiisoft/yii2-*`
     *
     * And replaces them with symbolic links to the extensions and framework path in the dev repo.
     *
     * Extensions required by the application are automatically installed using the `ext` action.
     *
     * @param string $app the application name e.g. `basic` or `advanced`.
     * @param string $repo url of the git repo to clone if it does not already exist.
     * @return int return code
     */
    public function actionApp($app, $repo = null)
    {
        // root of the dev repo
        $base = \dirname(\dirname(__DIR__));
        $appDir = "$base/apps/$app";

        if (!file_exists($appDir)) {
            if (empty($repo)) {
                if (isset($this->apps[$app])) {
                    $repo = $this->apps[$app];
                    if ($this->useHttp) {
                        $repo = str_replace('git@github.com:', 'https://github.com/', $repo);
                    }
                } else {
                    $this->stderr("Repo argument is required for app '$app'.\n", Console::FG_RED);
                    return 1;
                }
            }

            $this->stdout("cloning application repo '$app' from '$repo'...\n", Console::BOLD);
            passthru('git clone ' . escapeshellarg($repo) . ' ' . $appDir, $returnVar);
            if ($returnVar !== 0) {
                $this->stdout("Error occurred while cloning repository.\n", Console::BOLD, Console::FG_RED);
                return 1;
            }
            $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);
        }

        // cleanup
        $this->stdout("cleaning up application '$app' vendor directory...\n", Console::BOLD);
        $this->cleanupVendorDir($appDir);
        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);

        // composer update
        $this->stdout("updating composer for app '$app'...\n", Console::BOLD);
        chdir($appDir);
        $command = 'composer update --prefer-dist';
        if ($this->composerNoProgress) {
            $command .= ' --no-progress';
        }
        passthru($command);
        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);

        // link directories
        $this->stdout("linking framework and extensions to '$app' app vendor dir...\n", Console::BOLD);
        $this->linkFrameworkAndExtensions($appDir, $base);
        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);

        return 0;
    }

    /**
     * This command installs an extension in the `extensions` directory and links the framework and other extensions.
     *
     * @param string $extension the application name e.g. `basic` or `advanced`.
     * @param string $repo url of the git repo to clone if it does not already exist.
     *
     * @return int
     */
    public function actionExt($extension, $repo = null)
    {
        // root of the dev repo
        $base = \dirname(\dirname(__DIR__));
        $extensionDir = "$base/extensions/$extension";

        if (!file_exists($extensionDir)) {
            if (empty($repo)) {
                if (isset($this->extensions[$extension])) {
                    $repo = $this->extensions[$extension];
                    if ($this->useHttp) {
                        $repo = str_replace('git@github.com:', 'https://github.com/', $repo);
                    }
                } else {
                    $this->stderr("Repo argument is required for extension '$extension'.\n", Console::FG_RED);
                    return 1;
                }
            }

            $this->stdout("cloning extension repo '$extension' from '$repo'...\n", Console::BOLD);
            passthru('git clone ' . escapeshellarg($repo) . ' ' . $extensionDir);
            $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);
        }

        // cleanup
        $this->stdout("cleaning up extension '$extension' vendor directory...\n", Console::BOLD);
        $this->cleanupVendorDir($extensionDir);
        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);

        // composer update
        $this->stdout("updating composer for extension '$extension'...\n", Console::BOLD);
        chdir($extensionDir);
        $command = 'composer update --prefer-dist';
        if ($this->composerNoProgress) {
            $command .= ' --no-progress';
        }
        passthru($command);
        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);

        // link directories
        $this->stdout("linking framework and extensions to '$extension' vendor dir...\n", Console::BOLD);
        $this->linkFrameworkAndExtensions($extensionDir, $base);
        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);

        return 0;
    }

    /**
     * {@inheritdoc}
     */
    public function options($actionID)
    {
        $options = parent::options($actionID);
        if (\in_array($actionID, ['ext', 'app', 'all'], true)) {
            $options[] = 'useHttp';
            $options[] = 'composerNoProgress';
        }

        return $options;
    }


    /**
     * Remove all symlinks in the vendor subdirectory of the directory specified.
     * @param string $dir base directory
     */
    protected function cleanupVendorDir($dir)
    {
        if (is_link($link = "$dir/vendor/yiisoft/yii2")) {
            $this->stdout("Removing symlink $link.\n");
            FileHelper::unlink($link);
        }
        $extensions = $this->findDirs("$dir/vendor/yiisoft");
        foreach ($extensions as $ext) {
            if (is_link($link = "$dir/vendor/yiisoft/yii2-$ext")) {
                $this->stdout("Removing symlink $link.\n");
                FileHelper::unlink($link);
            }
        }
    }

    /**
     * Creates symlinks to framework and extension sources for the application.
     * @param string $dir application directory
     * @param string $base Yii sources base directory
     *
     * @return int
     */
    protected function linkFrameworkAndExtensions($dir, $base)
    {
        if (is_dir($link = "$dir/vendor/yiisoft/yii2")) {
            $this->stdout("Removing dir $link.\n");
            FileHelper::removeDirectory($link);
            $this->stdout("Creating symlink for $link.\n");
            symlink("$base/framework", $link);
        }
        $extensions = $this->findDirs("$dir/vendor/yiisoft");
        foreach ($extensions as $ext) {
            if (is_dir($link = "$dir/vendor/yiisoft/yii2-$ext")) {
                $this->stdout("Removing dir $link.\n");
                FileHelper::removeDirectory($link);
                $this->stdout("Creating symlink for $link.\n");
                if (!file_exists("$base/extensions/$ext")) {
                    $ret = $this->actionExt($ext);
                    if ($ret !== 0) {
                        return $ret;
                    }
                }
                symlink("$base/extensions/$ext", $link);
            }
        }

        return ExitCode::OK;
    }

    /**
     * Get a list of subdirectories for directory specified.
     * @param string $dir directory to read
     *
     * @return array list of subdirectories
     */
    protected function listSubDirs($dir)
    {
        $list = [];
        $handle = opendir($dir);
        if ($handle === false) {
            throw new InvalidParamException("Unable to open directory: $dir");
        }
        while (($file = readdir($handle)) !== false) {
            if ($file === '.' || $file === '..') {
                continue;
            }
            // ignore hidden directories
            if (strpos($file, '.') === 0) {
                continue;
            }
            if (is_dir("$dir/$file")) {
                $list[] = "$dir/$file";
            }
        }
        closedir($handle);
        return $list;
    }

    /**
     * Finds linkable applications.
     *
     * @param string $dir directory to search in
     * @return array list of applications command can link
     */
    protected function findDirs($dir)
    {
        $list = [];
        $handle = @opendir($dir);
        if ($handle === false) {
            return [];
        }
        while (($file = readdir($handle)) !== false) {
            if ($file === '.' || $file === '..') {
                continue;
            }
            $path = $dir . DIRECTORY_SEPARATOR . $file;
            if (is_dir($path) && preg_match('/^yii2-(.*)$/', $file, $matches)) {
                $list[] = $matches[1];
            }
        }
        closedir($handle);

        foreach ($list as $i => $e) {
            if ($e === 'composer') { // skip composer to not break composer update
                unset($list[$i]);
            }
        }

        return $list;
    }
}


================================================
FILE: build/controllers/MimeTypeController.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use Yii;
use yii\console\Application;
use yii\console\Controller;
use yii\helpers\Console;
use yii\helpers\VarDumper;

/**
 * MimeTypeController generates a map of file extensions to MIME types.
 *
 * It uses `mime.types` file from apache http located under
 * https://raw.githubusercontent.com/apache/httpd/refs/heads/trunk/docs/conf/mime.types
 *
 * This file has been placed in the public domain for unlimited redistribution,
 * so we can use it and ship it with Yii.
 *
 * @author Carsten Brandt <mail@cebe.cc>
 * @since 2.0
 *
 * @extends Controller<Application>
 */
class MimeTypeController extends Controller
{
    /**
     * @var array MIME type aliases
     */
    private $_aliases = [
        'text/rtf' => 'application/rtf',
        'text/xml' => 'application/xml',
        'image/svg' => 'image/svg+xml',
        'image/x-bmp' => 'image/bmp',
        'image/x-bitmap' => 'image/bmp',
        'image/x-xbitmap' => 'image/bmp',
        'image/x-win-bitmap' => 'image/bmp',
        'image/x-windows-bmp' => 'image/bmp',
        'image/ms-bmp' => 'image/bmp',
        'image/x-ms-bmp' => 'image/bmp',
        'application/bmp' => 'image/bmp',
        'application/x-bmp' => 'image/bmp',
        'application/x-win-bitmap' => 'image/bmp',
    ];

    /**
     * @var array MIME types to add to the ones parsed from Apache files
     */
    private $_additionalMimeTypes = [
        'apng' => 'image/apng',
        'avif' => 'image/avif',
        'jfif' => 'image/jpeg',
        'mjs' => 'text/javascript',
        'pjp' => 'image/jpeg',
        'pjpeg' => 'image/jpeg',
    ];

    /**
     * @param string $outFile the mime file to update. Defaults to @yii/helpers/mimeTypes.php
     * @param string $aliasesOutFile the aliases file to update. Defaults to @yii/helpers/mimeAliases.php
     */
    public function actionIndex($outFile = null, $aliasesOutFile = null, $extensionsOutFile = null)
    {
        if ($outFile === null) {
            $outFile = Yii::getAlias('@yii/helpers/mimeTypes.php');
        }

        if ($aliasesOutFile === null) {
            $aliasesOutFile = Yii::getAlias('@yii/helpers/mimeAliases.php');
        }

        if ($extensionsOutFile === null) {
            $extensionsOutFile = Yii::getAlias('@yii/helpers/mimeExtensions.php');
        }

        $this->stdout('Downloading mime-type file from apache httpd repository...');
        if ($apacheMimeTypesFileContent = file_get_contents('https://raw.githubusercontent.com/apache/httpd/refs/heads/trunk/docs/conf/mime.types')) {
            $this->stdout("Done.\n", Console::FG_GREEN);
            $this->generateMimeTypesFile($outFile, $apacheMimeTypesFileContent);
            $this->generateMimeAliasesFile($aliasesOutFile);
            $this->generateMimeExtensionsFile($extensionsOutFile, $apacheMimeTypesFileContent);
        } else {
            $this->stderr("Failed to download mime.types file from apache Git.\n");
        }
    }

    /**
     * @param string $outFile
     * @param string $content
     */
    private function generateMimeTypesFile($outFile, $content)
    {
        $this->stdout("Generating file $outFile...");
        $mimeMap = [];
        foreach (explode("\n", $content) as $line) {
            $line = trim($line);
            if (empty($line) || strpos($line, '#') === 0) { // skip comments and empty lines
                continue;
            }
            $parts = preg_split('/\s+/', $line);
            $mime = array_shift($parts);
            foreach ($parts as $ext) {
                if (!empty($ext)) {
                    $mimeMap[$ext] = $mime;
                }
            }
        }
        $mimeMap = array_replace($mimeMap, $this->_additionalMimeTypes);
        ksort($mimeMap, SORT_STRING);
        $array = VarDumper::export($mimeMap);

        $content = <<<EOD
<?php
/**
 * MIME types.
 *
 * This file contains most commonly used MIME types
 * according to file extension names.
 * Its content is generated from the apache http mime.types file.
 * https://raw.githubusercontent.com/apache/httpd/refs/heads/trunk/docs/conf/mime.types
 * This file has been placed in the public domain for unlimited redistribution.
 *
 * All extra changes made to this file must be committed to /build/controllers/MimeTypeController.php
 * otherwise they will be lost on next build.
 */
\$mimeTypes = $array;

# fix for bundled libmagic bug, see also https://github.com/yiisoft/yii2/issues/19925
if ((PHP_VERSION_ID >= 80100 && PHP_VERSION_ID < 80122) || (PHP_VERSION_ID >= 80200 && PHP_VERSION_ID < 80209)) {
    \$mimeTypes = array_replace(\$mimeTypes, ['xz' => 'application/octet-stream']);
}

return \$mimeTypes;

EOD;
        file_put_contents($outFile, $content);
        $this->stdout("done.\n", Console::FG_GREEN);
    }

    /**
     * @param string $outFile
     */
    private function generateMimeAliasesFile($outFile)
    {
        $this->stdout("generating file $outFile...");
        $array = VarDumper::export($this->_aliases);
        $content = <<<EOD
<?php
/**
 * MIME aliases.
 *
 * This file contains aliases for MIME types.
 *
 * All extra changes made to this file must be committed to /build/controllers/MimeTypeController.php
 * otherwise they will be lost on next build.
 */
return $array;

EOD;
        file_put_contents($outFile, $content);
        $this->stdout("done.\n", Console::FG_GREEN);
    }

    /**
     * @param string $outFile
     * @param string $content
     */
    private function generateMimeExtensionsFile($outFile, $content)
    {
        $this->stdout("Generating file $outFile...");

        $extensionMap = [];
        foreach (explode("\n", $content) as $line) {
            $line = trim($line);
            if (empty($line) || strpos($line, '#') === 0) { // skip comments and empty lines
                continue;
            }
            $parts = preg_split('/\s+/', $line);
            $mime = array_shift($parts);
            if (!empty($parts)) {
                $extensionMap[$mime] = [];
                foreach ($parts as $ext) {
                    if (!empty($ext)) {
                        $extensionMap[$mime][] = $ext;
                    }
                }
            }
        }

        foreach ($this->_additionalMimeTypes as $ext => $mime) {
            if (!array_key_exists($mime, $extensionMap)) {
                $extensionMap[$mime] = [];
            }
            $extensionMap[$mime][] = $ext;
        }

        foreach ($extensionMap as $mime => $extensions) {
            if (count($extensions) === 1) {
                $extensionMap[$mime] = $extensions[0];
            }
        }

        ksort($extensionMap, SORT_STRING);
        $array = VarDumper::export($extensionMap);

        $content = <<<EOD
<?php
/**
 * MIME type extensions.
 *
 * This file contains most commonly used extensions for MIME types.
 * If there are multiple extensions for a singe MIME type
 * they are ordered from most to least common.
 * Its content is generated from the apache http mime.types file.
 * https://raw.githubusercontent.com/apache/httpd/refs/heads/trunk/docs/conf/mime.types
 * This file has been placed in the public domain for unlimited redistribution.
 *
 * All extra changes made to this file must be committed to /build/controllers/MimeTypeController.php
 * otherwise they will be lost on next build.
 */
return $array;

EOD;
        file_put_contents($outFile, $content);
        $this->stdout("done.\n", Console::FG_GREEN);
    }
}


================================================
FILE: build/controllers/PhpDocController.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use Yii;
use yii\base\Model;
use yii\base\Module;
use yii\console\Application;
use yii\console\Controller as ConsoleController;
use yii\db\QueryBuilder;
use yii\helpers\Console;
use yii\helpers\FileHelper;
use yii\helpers\Json;
use yii\log\Dispatcher;
use yii\log\Target;
use yii\web\Controller as WebController;
use yii\web\Request as WebRequest;

/**
 * PhpDocController is there to help to maintain PHPDoc annotation in class files.
 *
 * @author Carsten Brandt <mail@cebe.cc>
 * @author Alexander Makarov <sam@rmcreative.ru>
 * @since 2.0
 *
 * @extends ConsoleController<Application>
 */
class PhpDocController extends ConsoleController
{
    /**
     * Manually added PHPDoc properties that do not need to be removed or changed.
     *
     * @var array<class-string, string[]>
     */
    private const MANUALLY_ADDED_PROPERTIES = [
        WebController::class => [
            'request',
            'response',
            'view',
        ],
        ConsoleController::class => [
            'request',
            'response',
            'help',
        ],
        Model::class => [
            'errors',
        ],
        Module::class => [
            'aliases',
        ],
        Dispatcher::class => [
            'flushInterval',
            'logger',
        ],
        Target::class => [
            'enabled',
        ],
        WebRequest::class => [
            'hostInfo',
        ],
        QueryBuilder::class => [
            'conditionClasses',
        ],
    ];

    private const PROPERTIES_ENCLOSURE = " *\n";

    private const TYPE_REG_EXP = '\??[\w\\\-]+(?:<(?:[^<>]+|<[^<>]*>)*>|\{[^{}]*\}|\([^()]*\)(?:\s*:\s*[^()\s]+)?)?(?:\[\])*(?:\s*(?:\||&|\?|:)\s*\??[\w\\\-]+(?:<[^<>]*>)?(?:\[\])*)*';

    /**
     * {@inheritdoc}
     */
    public $defaultAction = 'property';
    /**
     * @var bool whether to update class docs directly. Setting this to false will just output docs
     * for copy and paste.
     */
    public $updateFiles = true;
    /**
     * @var bool whether to add copyright header to php files. This should be skipped in application code.
     */
    public $skipFrameworkRequirements = false;


    /**
     * Generates `@property` annotations in class files from getters and setters.
     *
     * Property description will be taken from getter or setter or from an `@property` annotation
     * in the getters docblock if there is one defined.
     *
     * See https://github.com/yiisoft/yii2/wiki/Core-framework-code-style#documentation for details.
     *
     * @param string $root the directory to parse files from. Defaults to YII2_PATH.
     */
    public function actionProperty($root = null)
    {
        $files = $this->findFiles($root);

        $nFilesTotal = 0;
        $nFilesUpdated = 0;
        foreach ($files as $file) {
            $result = $this->generateClassPropertyDocs($file);
            if ($result !== false) {
                list($className, $phpdoc) = $result;
                if ($this->updateFiles) {
                    if ($this->updateClassPropertyDocs($file, $className, $phpdoc)) {
                        $nFilesUpdated++;
                    }
                } elseif (!empty($phpdoc)) {
                    $this->stdout("\n[ " . $file . " ]\n\n", Console::BOLD);
                    $this->stdout($phpdoc);
                }
            }
            $nFilesTotal++;
        }

        $this->stdout("\nParsed $nFilesTotal files.\n");
        $this->stdout("Updated $nFilesUpdated files.\n");
    }

    /**
     * Fix some issues with PHPDoc in files.
     *
     * @param string $root the directory to parse files from. Defaults to YII2_PATH.
     */
    public function actionFix($root = null)
    {
        $files = $this->findFiles($root, false);

        $nFilesTotal = 0;
        $nFilesUpdated = 0;
        foreach ($files as $file) {
            $contents = file_get_contents($file);
            $hash = $this->hash($contents);

            // fix line endings
            $lines = preg_split('/(\r\n|\n|\r)/', $contents);

            if (!$this->skipFrameworkRequirements) {
                $this->fixFileDoc($lines);
            }
            $this->fixDocBlockIndentation($lines);
            $lines = array_values($this->fixLineSpacing($lines));

            $newContent = implode("\n", $lines);
            if ($hash !== $this->hash($newContent)) {
                file_put_contents($file, $newContent);
                $nFilesUpdated++;
            }
            $nFilesTotal++;
        }

        $this->stdout("\nParsed $nFilesTotal files.\n");
        $this->stdout("Updated $nFilesUpdated files.\n");
    }

    /**
     * {@inheritdoc}
     */
    public function options($actionID)
    {
        return array_merge(parent::options($actionID), ['updateFiles', 'skipFrameworkRequirements']);
    }

    /**
     * @param string $root
     * @param bool $needsInclude
     * @return array list of files.
     */
    protected function findFiles($root, $needsInclude = true)
    {
        $except = [];
        if ($needsInclude) {
            $extensionExcept = [
                'apidoc' => [
                    '/helpers/PrettyPrinter.php',
                    '/extensions/apidoc/helpers/ApiIndexer.php',
                    '/extensions/apidoc/helpers/ApiMarkdownLaTeX.php',
                ],
                'codeception' => [
                    '/TestCase.php',
                    '/DbTestCase.php',
                ],
                'gii' => [
                    '/components/DiffRendererHtmlInline.php',
                    '/generators/extension/default/AutoloadExample.php',
                ],
                'swiftmailer' => [
                    'src/Logger.php',
                ],
                'twig' => [
                    '/Extension.php',
                    '/Optimizer.php',
                    '/Template.php',
                    '/TwigSimpleFileLoader.php',
                    '/ViewRendererStaticClassProxy.php',
                ],
            ];
        } else {
            $extensionExcept = [];
        }

        if ($root === null) {
            $root = \dirname(YII2_PATH);
            $extensionPath = "$root/extensions";
            $this->setUpExtensionAliases($extensionPath);

            $except = [
                '/apps/',
                '/build/',
                '/docs/',
                '/extensions/composer/',
                '/framework/BaseYii.php',
                '/framework/Yii.php',
                'assets/',
                'tests/',
                'vendor/',
            ];
            foreach ($extensionExcept as $ext => $paths) {
                foreach ($paths as $path) {
                    $except[] = "/extensions/$ext$path";
                }
            }
        } elseif (preg_match('~extensions/([\w-]+)[\\\\/]?$~', $root, $matches)) {
            $extensionPath = \dirname(rtrim($root, '\\/'));
            $this->setUpExtensionAliases($extensionPath);

            list(, $extension) = $matches;
            Yii::setAlias("@yii/$extension", (string)$root);
            if (is_file($autoloadFile = Yii::getAlias("@yii/$extension/vendor/autoload.php"))) {
                include $autoloadFile;
            }

            if (isset($extensionExcept[$extension])) {
                foreach ($extensionExcept[$extension] as $path) {
                    $except[] = $path;
                }
            }
            $except[] = '/vendor/';
            $except[] = '/tests/';
            $except[] = '/docs/';

            //            // composer extension does not contain yii code
            //            if ($extension === 'composer') {
            //                return [];
            //            }
        } elseif (preg_match('~apps/([\w-]+)[\\\\/]?$~', $root, $matches)) {
            $extensionPath = \dirname(\dirname(rtrim($root, '\\/'))) . '/extensions';
            $this->setUpExtensionAliases($extensionPath);

            list(, $appName) = $matches;
            Yii::setAlias("@app-$appName", (string)$root);
            if (is_file($autoloadFile = Yii::getAlias("@app-$appName/vendor/autoload.php"))) {
                include $autoloadFile;
            }

            $except[] = '/runtime/';
            $except[] = '/vendor/';
            $except[] = '/tests/';
            $except[] = '/docs/';
        }
        $root = FileHelper::normalizePath($root);
        $options = [
            'filter' => function ($path) {
                if (is_file($path)) {
                    $file = basename($path);
                    if ($file[0] < 'A' || $file[0] > 'Z') {
                        return false;
                    }
                }

                return null;
            },
            'only' => ['*.php'],
            'except' => array_merge($except, [
                '.git/',
                'views/',
                'requirements/',
                'gii/generators/',
                'vendor/',
                '_support/',
            ]),
        ];

        return FileHelper::findFiles($root, $options);
    }

    /**
     * @param string $extensionPath root path containing extension repositories.
     */
    private function setUpExtensionAliases($extensionPath)
    {
        foreach (scandir($extensionPath) as $extension) {
            if (ctype_alpha($extension) && is_dir($extensionPath . '/' . $extension)) {
                Yii::setAlias("@yii/$extension", "$extensionPath/$extension");

                $composerConfigFile = $extensionPath . '/' . $extension . '/composer.json';
                if (file_exists($composerConfigFile)) {
                    $composerConfig = Json::decode(file_get_contents($composerConfigFile));
                    if (isset($composerConfig['autoload']['psr-4'])) {
                        foreach ($composerConfig['autoload']['psr-4'] as $namespace => $subPath) {
                            $alias = '@' . str_replace('\\', '/', $namespace);
                            $path = rtrim("$extensionPath/$extension/$subPath", '/');
                            Yii::setAlias($alias, $path);
                        }
                    }
                }
            }
        }
    }

    /**
     * Fix file PHPDoc.
     */
    protected function fixFileDoc(&$lines)
    {
        // find namespace
        $namespace = false;
        $namespaceLine = '';
        $contentAfterNamespace = false;
        foreach ($lines as $i => $line) {
            $line = trim($line);
            if (!empty($line)) {
                if (strncmp($line, 'namespace', 9) === 0) {
                    $namespace = $i;
                    $namespaceLine = $line;
                } elseif ($namespace !== false) {
                    $contentAfterNamespace = $i;
                    break;
                }
            }
        }

        if ($namespace !== false && $contentAfterNamespace !== false) {
            while ($contentAfterNamespace > 0) {
                array_shift($lines);
                $contentAfterNamespace--;
            }
            $lines = array_merge([
                '<?php',
                '/**',
                ' * @link https://www.yiiframework.com/',
                ' * @copyright Copyright (c) 2008 Yii Software LLC',
                ' * @license https://www.yiiframework.com/license/',
                ' */',
                '',
                $namespaceLine,
                '',
            ], $lines);
        }
    }

    /**
     * Markdown aware fix of whitespace issues in doc comments.
     * @param array $lines
     */
    protected function fixDocBlockIndentation(&$lines)
    {
        $docBlock = false;
        $codeBlock = false;
        $listIndent = '';
        $tag = false;
        $indent = '';
        foreach ($lines as $i => $line) {
            if (preg_match('~^(\s*)/\*\*$~', $line, $matches)) {
                $docBlock = true;
                $indent = $matches[1];
            } elseif (preg_match('~^(\s*)\*+/~', $line)) {
                if ($docBlock) { // could be the end of normal comment
                    $lines[$i] = $indent . ' */';
                }
                $docBlock = false;
                $codeBlock = false;
                $listIndent = '';
                $tag = false;
            } elseif ($docBlock) {
                $line = ltrim($line);
                if (strpos($line, '*') === 0) {
                    $line = substr($line, 1);
                }
                if (strpos($line, ' ') === 0) {
                    $line = substr($line, 1);
                }
                $docLine = str_replace("\t", '    ', rtrim($line));
                if (empty($docLine)) {
                    $listIndent = '';
                } elseif (strpos($docLine, '@') === 0) {
                    $listIndent = '';
                    $codeBlock = false;
                    $tag = true;
                    $docLine = preg_replace('/\s+/', ' ', $docLine);
                    $docLine = $this->fixParamTypes($docLine);
                } elseif (preg_match('/^(~~~|```)/', $docLine)) {
                    $codeBlock = !$codeBlock;
                    $listIndent = '';
                } elseif (preg_match('/^(\s*)([0-9]+\.|-|\*|\+) /', $docLine, $matches)) {
                    $listIndent = str_repeat(' ', \strlen($matches[0]));
                    $tag = false;
                    $lines[$i] = $indent . ' * ' . $docLine;
                    continue;
                }
                if ($codeBlock) {
                    $lines[$i] = rtrim($indent . ' * ' . $docLine);
                } else {
                    $lines[$i] = rtrim($indent . ' * ' . (empty($listIndent) && !$tag ? $docLine : ($listIndent . ltrim($docLine))));
                }
            }
        }
    }

    /**
     * @param string $line
     * @return string
     */
    protected function fixParamTypes($line)
    {
        return preg_replace_callback('~@(param|return) ([\w\\|]+)~i', function ($matches) {
            $types = explode('|', $matches[2]);
            foreach ($types as $i => $type) {
                switch ($type) {
                    case 'integer':
                        $types[$i] = 'int';
                        break;
                    case 'boolean':
                        $types[$i] = 'bool';
                        break;
                }
            }

            return '@' . $matches[1] . ' ' . implode('|', $types);
        }, $line);
    }

    /**
     * Fixes line spacing code style for properties and constants.
     * @param string[] $lines
     * @return string[]
     */
    protected function fixLineSpacing($lines)
    {
        $propertiesOnly = false;
        // remove blank lines between properties
        $skip = true;
        $level = 0;
        foreach ($lines as $i => $line) {
            if (strpos($line, 'class ') !== false) {
                $skip = false;
            }
            if ($skip) {
                continue;
            }

            // keep spaces in multi line arrays
            if (strpos($line, '*') === false && strncmp(trim($line), "'SQLSTATE[", 10) !== 0) {
                $level += substr_count($line, '[') - substr_count($line, ']');
            }

            if (trim($line) === '') {
                if ($level == 0) {
                    unset($lines[$i]);
                }
            } elseif (ltrim($line)[0] !== '*' && strpos($line, 'function ') !== false) {
                break;
            } elseif (trim($line) === '}') {
                $propertiesOnly = true;
                break;
            }
        }
        $lines = array_values($lines);

        // add back some
        $endofUse = false;
        $endofConst = false;
        $endofPublic = false;
        $endofProtected = false;
        $endofPrivate = false;
        $skip = true;
        $level = 0; // track array properties
        $property = '';
        foreach ($lines as $i => $line) {
            if (strpos($line, 'class ') !== false) {
                $skip = false;
            }
            if ($skip) {
                continue;
            }

            // check for multi line array
            if ($level > 0) {
                ${'endof' . $property} = $i;
            }

            $line = trim($line);
            if (strncmp($line, 'public $', 8) === 0 || strncmp($line, 'public static $', 15) === 0) {
                $endofPublic = $i;
                $property = 'Public';
                $level = 0;
            } elseif (strncmp($line, 'protected $', 11) === 0 || strncmp($line, 'protected static $', 18) === 0) {
                $endofProtected = $i;
                $property = 'Protected';
                $level = 0;
            } elseif (strncmp($line, 'private $', 9) === 0 || strncmp($line, 'private static $', 16) === 0) {
                $endofPrivate = $i;
                $property = 'Private';
                $level = 0;
            } elseif (strpos($line, 'const ') === 0) {
                $endofConst = $i;
                $property = false;
            } elseif (strpos($line, 'use ') === 0) {
                $endofUse = $i;
                $property = false;
            } elseif (strpos($line, '*') === 0) {
                $property = false;
            } elseif (strpos($line, '*') !== 0 && strpos($line, 'function ') !== false || $line === '}') {
                break;
            }

            // check for multi line array
            if ($property !== false && strncmp($line, "'SQLSTATE[", 10) !== 0) {
                $level += substr_count($line, '[') - substr_count($line, ']');
            }
        }

        $endofAll = false;
        foreach (['Private', 'Protected', 'Public', 'Const', 'Use'] as $var) {
            if (${'endof' . $var} !== false) {
                $endofAll = ${'endof' . $var};
                break;
            }
        }

        //        $this->checkPropertyOrder($lineInfo);
        $result = [];
        foreach ($lines as $i => $line) {
            $result[] = $line;
            if (!($propertiesOnly && $i === $endofAll)) {
                if (
                    $i === $endofUse || $i === $endofConst || $i === $endofPublic ||
                    $i === $endofProtected || $i === $endofPrivate
                ) {
                    $result[] = '';
                }
                if ($i === $endofAll) {
                    $result[] = '';
                }
            }
        }

        return $result;
    }

    protected function checkPropertyOrder($lineInfo)
    {
        // TODO
    }

    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);
            return false;
        }

        if ($this->isBaseObject($className, $ref)) {
            $this->stderr("[INFO] Skipping class $className as it is not a subclass of yii\\base\\BaseObject.\n", Console::FG_BLUE, Console::BOLD);
            return false;
        }

        if ($ref->isSubclassOf('yii\db\BaseActiveRecord')) {
            $this->stderr("[INFO] Skipping class $className as it is an ActiveRecord class, property handling is not supported yet.\n", Console::FG_BLUE, Console::BOLD);
            return false;
        }

        $oldDoc = $ref->getDocComment();
        $newDoc = $this->cleanDocComment($this->updateDocComment($oldDoc, $propertyDoc, $className));

        $seenSince = false;
        $seenAuthor = false;

        // TODO move these checks to different action
        $lines = explode("\n", $newDoc);
        $firstLine = trim($lines[1]);
        if ($firstLine === '*' || strncmp($firstLine, '* @', 3) === 0) {
            $this->stderr("[WARN] Class $className has no short description.\n", Console::FG_YELLOW, Console::BOLD);
        }
        foreach ($lines as $line) {
            $line = trim($line);
            if (strncmp($line, '* @since ', 9) === 0) {
                $seenSince = true;
            } elseif (strncmp($line, '* @author ', 10) === 0) {
                $seenAuthor = true;
            }
        }

        if (!$this->skipFrameworkRequirements) {
            if (!$seenSince) {
                $this->stderr("[ERR] No @since found in class doc in file: $file\n", Console::FG_RED);
            }
            if (!$seenAuthor) {
                $this->stderr("[ERR] No @author found in class doc in file: $file\n", Console::FG_RED);
            }
        }

        if (trim($oldDoc) != trim($newDoc)) {
            $fileContent = explode("\n", file_get_contents($file));
            $start = $ref->getStartLine() - 2;
            $docStart = $start - \count(explode("\n", $oldDoc)) + 1;

            $newFileContent = [];
            $n = \count($fileContent);
            for ($i = 0; $i < $n; $i++) {
                if ($i > $start || $i < $docStart) {
                    $newFileContent[] = $fileContent[$i];
                } else {
                    $newFileContent[] = trim($newDoc);
                    $i = $start;
                }
            }

            file_put_contents($file, implode("\n", $newFileContent));

            return true;
        }

        return false;
    }

    /**
     * remove multi empty lines and trim trailing whitespace.
     *
     * @param $doc
     * @return string
     */
    protected function cleanDocComment($doc)
    {
        $lines = explode("\n", $doc);
        $n = \count($lines);
        for ($i = 0; $i < $n; $i++) {
            $lines[$i] = rtrim($lines[$i]);
            if (trim($lines[$i]) == '*' && trim($lines[$i + 1]) == '*') {
                unset($lines[$i]);
            }
        }

        return implode("\n", $lines);
    }

    /**
     * Replace property annotations in doc comment.
     * @param $doc
     * @param $properties
     * @return string
     */
    protected function updateDocComment($doc, $properties, $className)
    {
        $manuallyAddedProperties = self::MANUALLY_ADDED_PROPERTIES[$className] ?? [];
        $lines = explode("\n", $doc);
        $propertyPart = false;
        $propertyPosition = false;
        $lastPropertyName = null;
        $hasManuallyAddedProperties = false;

        foreach ($lines as $i => $line) {
            $line = trim($line);
            if (strncmp($line, '* @property', 11) === 0) {
                $propertyPart = true;
            } elseif ($propertyPart && $line === '*') {
                $propertyPosition = $i;
                $propertyPart = false;
            }
            if (strncmp($line, '* @author ', 10) === 0 && $propertyPosition === false) {
                $propertyPosition = $i - 1;
                $propertyPart = false;
            }
            if ($propertyPart) {
                preg_match(
                    '/@property(?:-read|-write)?\s+([\\\\\w\|\[\]]+)\s+\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)/',
                    $line,
                    $matches
                );

                if (isset($matches[2])) {
                    $lastPropertyName = $matches[2];
                }

                if (in_array($lastPropertyName, $manuallyAddedProperties)) {
                    $hasManuallyAddedProperties = true;
                } else {
                    unset($lines[$i]);
                }
            }
        }

        if ($properties === '') {
            return implode("\n", $lines);
        }

        // if no properties or other tags were present add properties at the end
        if ($propertyPosition === false) {
            $propertyPosition = \count($lines) - 2;
        }

        // if there are properties that were added manually, remove start enclosure
        if ($hasManuallyAddedProperties) {
            $properties = substr($properties, strlen(self::PROPERTIES_ENCLOSURE));
        }

        $finalDoc = '';
        foreach ($lines as $i => $line) {
            if (!$hasManuallyAddedProperties || $i !== $propertyPosition) {
                $finalDoc .= $line . "\n";
            }

            if ($i == $propertyPosition) {
                $finalDoc .= $properties;
            }
        }

        return $finalDoc;
    }

    protected function generateClassPropertyDocs($fileName)
    {
        $phpdoc = '';
        $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);

        if (\count($classes) > 1) {
            $this->stderr("[ERR] There should be only one class in a file: $fileName\n", Console::FG_RED);

            return false;
        }
        if (\count($classes) < 1) {
            $interfaces = $this->match('#\ninterface (?<name>\w+)( extends .+)?\n\{(?<content>.*)\n\}(\n|$)#', $file);
            if (\count($interfaces) == 1) {
                return false;
            }

            if (\count($interfaces) > 1) {
                $this->stderr("[ERR] There should be only one interface in a file: $fileName\n", Console::FG_RED);
            } else {
                $traits = $this->match('#\ntrait (?<name>\w+)\n\{(?<content>.*)\n\}(\n|$)#', $file);
                if (\count($traits) == 1) {
                    return false;
                }

                if (\count($traits) > 1) {
                    $this->stderr("[ERR] There should be only one class/trait/interface in a file: $fileName\n", Console::FG_RED);
                } else {
                    $this->stderr("[ERR] No class in file: $fileName\n", Console::FG_RED);
                }
            }

            return false;
        }

        $className = null;
        foreach ($classes as &$class) {
            $className = $namespace . '\\' . $class['name'];

            $gets = $this->match(
                '#\* @return (?<type>' . self::TYPE_REG_EXP . ')'
                    . '(?: (?<comment>(?:(?!\*/|\* @).)+?)(?:(?!\*/).)+|[\s\n]*)((\*\n)|(\*\s.+))*\*/'
                    . '[\s\n]{2,}(\#\[\\\\*.+\])*[\s\n]{2,}'
                    . 'public function (?<kind>get)(?<name>\w+)\((?:,? ?\$\w+ ?= ?[^,]+)*\)(\:\s*[\w\\|\\\\\\[\\]]+)?#',
                $class['content'],
                true
            );

            $sets = $this->match(
                '#\* @param (?<type>' . self::TYPE_REG_EXP . ') \$\w+'
                    . '(?: (?<comment>(?:(?!\*/|\* @).)+?)(?:(?!\*/).)+|[\s\n]*)((\*\n)|(\*\s.+))*\*/'
                    . '[\s\n]{2,}(\#\[\\\\*.+\])*[\s\n]{2,}'
                    . 'public function (?<kind>set)(?<name>\w+)\(([\w\\|\\\\\\[\\]]+\s*)?\$\w+(?:, ?\$\w+ ?= ?[^,]+)*\)(\:\s*[\w\\|\\\\\\[\\]]+)?#',
                $class['content'],
                true
            );

            $acrs = array_merge($gets, $sets);
            $manuallyAddedProperties = self::MANUALLY_ADDED_PROPERTIES[$className] ?? [];
            $props = [];

            foreach ($acrs as &$acr) {
                $acr['name'] = lcfirst($acr['name']);
                if (in_array($acr['name'], $manuallyAddedProperties)) {
                    continue;
                }

                $acr['comment'] = trim(preg_replace('#(^|\n)\s+\*\s?#', '$1 * ', $acr['comment']));
                $props[$acr['name']][$acr['kind']] = [
                    'type' => $acr['type'],
                    'comment' => $this->fixSentence($acr['comment']),
                ];
            }

            if (\count($props) === 0) {
                continue;
            }

            ksort($props);

            foreach ($props as $propName => &$prop) {
                $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.';
                    }
                } elseif (isset($prop['get'])) {
                    if (!$this->hasSetterInParents($className, $propName)) {
                        $docLine .= '-read';
                    }
                } elseif (isset($prop['set'])) {
                    if (!$this->hasGetterInParents($className, $propName)) {
                        $docLine .= '-write';
                    }
                } else {
                    continue;
                }
                $docLine .= ' ' . $this->getPropParam($prop, 'type') . " $$propName ";
                $comment = explode("\n", $this->getPropParam($prop, 'comment') . $note);
                foreach ($comment as &$cline) {
                    $cline = ltrim(rtrim($cline), '* ');
                }
                $docLine = wordwrap($docLine . implode(' ', $comment), 110, "\n * ") . "\n";

                $phpdoc .= $docLine;
            }
        }

        if ($phpdoc !== '') {
            $phpdoc = self::PROPERTIES_ENCLOSURE . $phpdoc . self::PROPERTIES_ENCLOSURE;
        }

        return [$className, $phpdoc];
    }

    protected function match($pattern, $subject, $split = false)
    {
        $sets = [];
        // split subject by double newlines because regex sometimes has problems with matching
        // in the complete set of methods
        // example: yii\di\ServiceLocator setComponents() is not recognized in the whole but in
        // a part of the class.
        $parts = $split ? explode("\n\n", $subject) : [$subject];
        foreach ($parts as $part) {
            preg_match_all($pattern . 'suU', $part, $matches, PREG_SET_ORDER);
            foreach ($matches as &$set) {
                foreach ($set as $i => $match) {
                    if (is_numeric($i) /*&& $i != 0*/) {
                        unset($set[$i]);
                    }
                }

                $sets[] = $set;
            }
        }

        return $sets;
    }

    protected function fixSentence($str)
    {
        $str = rtrim($str, '*');
        $str = rtrim($str);

        // TODO fix word wrap
        if ($str == '') {
            return '';
        }

        return strtoupper(substr($str, 0, 1)) . substr($str, 1) . ($str[\strlen($str) - 1] !== '.' ? '.' : '');
    }

    protected function getPropParam($prop, $param)
    {
        return isset($prop['property']) ? $prop['property'][$param] : (isset($prop['get']) ? $prop['get'][$param] : $prop['set'][$param]);
    }

    /**
     * Generate a hash value (message digest)
     * @param string $string message to be hashed.
     * @return string calculated message digest.
     */
    private function hash($string)
    {
        if (!function_exists('hash')) {
            return sha1($string);
        }
        return hash('sha256', $string);
    }

    /**
     * @param string $className
     * @param string $propName
     * @return bool
     */
    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;
    }

    /**
     * @param string $className
     * @param string $propName
     * @return bool
     */
    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;
    }

    /**
     * @param string $className
     * @param \ReflectionClass<object> $ref
     * @return bool
     */
    protected function isBaseObject($className, \ReflectionClass $ref)
    {
        $isDeprecatedObject = false;
        if (PHP_VERSION_ID <= 70100) {
            $isDeprecatedObject = $ref->isSubclassOf('yii\base\Object') || $className === 'yii\base\Object';
        }
        return !$isDeprecatedObject && !$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;
    }
}


================================================
FILE: build/controllers/ReleaseController.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use Yii;
use yii\base\Exception;
use yii\console\Application;
use yii\console\Controller;
use yii\helpers\ArrayHelper;
use yii\helpers\Console;
use yii\helpers\FileHelper;

/**
 * ReleaseController is there to help to prepare releases.
 *
 * Get a version overview:
 *
 *     ./build/build release/info
 *
 * run it with `--update` to fetch tags for all repos:
 *
 *     ./build release/info --update
 *
 * Make a framework release (apps are always in line with framework):
 *
 *     ./build/build release framework
 *     ./build/build release app-basic
 *     ./build/build release app-advanced
 *
 * Make an extension release (e.g. for redis):
 *
 *     ./build/build release redis
 *
 * Be sure to check the help info for individual sub-commands:
 *
 * @author Carsten Brandt <mail@cebe.cc>
 * @since 2.0
 *
 * @extends Controller<Application>
 */
class ReleaseController extends Controller
{
    public $defaultAction = 'release';

    /**
     * @var string base path to use for releases.
     */
    public $basePath;
    /**
     * @var bool whether to make actual changes. If true, it will run without changing or pushing anything.
     */
    public $dryRun = false;
    /**
     * @var bool whether to fetch the latest tags.
     */
    public $update = false;
    /**
     * @var string override the default version. e.g. for major or patch releases.
     */
    public $version;


    public function options($actionID)
    {
        $options = ['basePath'];
        if ($actionID === 'release') {
            $options[] = 'dryRun';
            $options[] = 'version';
        } elseif ($actionID === 'sort-changelog') {
            $options[] = 'version';
        } elseif ($actionID === 'info') {
            $options[] = 'update';
        }

        return array_merge(parent::options($actionID), $options);
    }


    public function beforeAction($action)
    {
        if (!$this->interactive) {
            throw new Exception('Sorry, but releases should be run interactively to ensure you actually verify what you are doing ;)');
        }
        if ($this->basePath === null) {
            $this->basePath = \dirname(\dirname(__DIR__));
        }
        $this->basePath = rtrim($this->basePath, '\\/');
        return parent::beforeAction($action);
    }

    /**
     * Shows information about current framework and extension versions.
     */
    public function actionInfo()
    {
        $items = [
            'framework',
            'app-basic',
            'app-advanced',
        ];
        $extensionPath = "{$this->basePath}/extensions";
        foreach (scandir($extensionPath) as $extension) {
            if (ctype_alpha($extension) && is_dir($extensionPath . '/' . $extension)) {
                $items[] = $extension;
            }
        }

        if ($this->update) {
            foreach ($items as $item) {
                $this->stdout("fetching tags for $item...");
                if ($item === 'framework') {
                    $this->gitFetchTags((string)$this->basePath);
                } elseif (strncmp('app-', $item, 4) === 0) {
                    $this->gitFetchTags("{$this->basePath}/apps/" . substr($item, 4));
                } else {
                    $this->gitFetchTags("{$this->basePath}/extensions/$item");
                }
                $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);
            }
        } else {
            $this->stdout("\nInformation may be outdated, re-run with `--update` to fetch latest tags.\n\n");
        }

        $versions = $this->getCurrentVersions($items);
        $nextVersions = $this->getNextVersions($versions, self::PATCH);

        // print version table
        $w = $this->minWidth(array_keys($versions));
        $this->stdout(str_repeat(' ', $w + 2) . "Current Version  Next Version\n", Console::BOLD);
        foreach ($versions as $ext => $version) {
            $this->stdout($ext . str_repeat(' ', $w + 3 - mb_strlen($ext)) . $version . '');
            $this->stdout(str_repeat(' ', 17 - mb_strlen($version)) . $nextVersions[$ext] . "\n");
        }
    }

    private function minWidth($a)
    {
        $w = 1;
        foreach ($a as $s) {
            if (($l = mb_strlen($s)) > $w) {
                $w = $l;
            }
        }

        return $w;
    }

    /**
     * Automation tool for making Yii framework and official extension releases.
     *
     * Usage:
     *
     * To make a release, make sure your git is clean (no uncommitted changes) and run the following command in
     * the yii dev repo root:
     *
     * ```
     * ./build/build release framework
     * ```
     *
     * or
     *
     * ```
     * ./build/build release redis,bootstrap,apidoc
     * ```
     *
     * You may use the `--dryRun` switch to test the command without changing or pushing anything:
     *
     * ```
     * ./build/build release redis --dryRun
     * ```
     *
     * The command will guide you through the complete release process including changing of files,
     * committing and pushing them. Each git command must be confirmed and can be skipped individually.
     * You may adjust changes in a separate shell or your IDE while the command is waiting for confirmation.
     *
     * @param array $what what do you want to release? this can either be:
     *
     * - an extension name such as `redis` or `bootstrap`,
     * - an application indicated by prefix `app-`, e.g. `app-basic`,
     * - or `framework` if you want to release a new version of the framework itself.
     *
     * @return int
     */
    public function actionRelease(array $what)
    {
        if (\count($what) > 1) {
            $this->stdout("Currently only one simultaneous release is supported.\n");
            return 1;
        }

        $this->stdout("This is the Yii release manager\n\n", Console::BOLD);

        if ($this->dryRun) {
            $this->stdout("Running in \"dry-run\" mode, nothing will actually be changed.\n\n", Console::BOLD, Console::FG_GREEN);
        }

        $this->validateWhat($what);
        $versions = $this->getCurrentVersions($what);

        if ($this->version !== null) {
            // if a version is explicitly given
            $newVersions = [];
            foreach ($versions as $k => $v) {
                $newVersions[$k] = $this->version;
            }
        } else {
            // otherwise, get next patch or minor
            $newVersions = $this->getNextVersions($versions, self::PATCH);
        }

        $this->stdout("You are about to prepare a new release for the following things:\n\n");
        $this->printWhat($what, $newVersions, $versions);
        $this->stdout("\n");

        $this->stdout("Before you make a release briefly go over the changes and check if you spot obvious mistakes:\n\n", Console::BOLD);
        $gitDir = reset($what) === 'framework' ? 'framework/' : '';
        $gitVersion = $versions[reset($what)];
        if (strncmp('app-', reset($what), 4) !== 0) {
            $this->stdout("- no accidentally added CHANGELOG lines for other versions than this one?\n\n    git diff $gitVersion.. {$gitDir}CHANGELOG.md\n\n");
            $this->stdout("- are all new `@since` tags for this release version?\n");
        }
        $this->stdout("- other issues with code changes?\n\n    git diff -w $gitVersion.. {$gitDir}\n\n");
        $travisUrl = reset($what) === 'framework' ? '' : '-' . reset($what);
        $this->stdout("- are unit tests passing on travis? https://travis-ci.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");

        if (!$this->confirm('When you continue, this tool will run cleanup jobs and update the changelog as well as other files (locally). Continue?', false)) {
            $this->stdout("Canceled.\n");
            return 1;
        }

        foreach ($what as $ext) {
            if ($ext === 'framework') {
                $this->releaseFramework("{$this->basePath}/framework", $newVersions['framework']);
            } elseif (strncmp('app-', $ext, 4) === 0) {
                $this->releaseApplication(substr($ext, 4), "{$this->basePath}/apps/" . substr($ext, 4), $newVersions[$ext]);
            } else {
                $this->releaseExtension($ext, "{$this->basePath}/extensions/$ext", $newVersions[$ext]);
            }
        }

        return 0;
    }

    /**
     * This will generate application packages for download page.
     *
     * Usage:
     *
     * ```
     * ./build/build release/package app-basic
     * ```
     *
     * @param array $what what do you want to package? this can either be:
     *
     * - an application indicated by prefix `app-`, e.g. `app-basic`,
     *
     * @return int
     */
    public function actionPackage(array $what)
    {
        $this->validateWhat($what, ['app']);
        $versions = $this->getCurrentVersions($what);

        $this->stdout("You are about to generate packages for the following things:\n\n");
        foreach ($what as $ext) {
            if (strncmp('app-', $ext, 4) === 0) {
                $this->stdout(' - ');
                $this->stdout(substr($ext, 4), Console::FG_RED);
                $this->stdout(' application version ');
            } elseif ($ext === 'framework') {
                $this->stdout(' - Yii Framework version ');
            } else {
                $this->stdout(' - ');
                $this->stdout($ext, Console::FG_RED);
                $this->stdout(' extension version ');
            }
            $this->stdout($versions[$ext], Console::BOLD);
            $this->stdout("\n");
        }
        $this->stdout("\n");

        $packagePath = "{$this->basePath}/packages";
        $this->stdout("Packages will be stored in $packagePath\n\n");

        if (!$this->confirm('Continue?', false)) {
            $this->stdout("Canceled.\n");
            return 1;
        }

        foreach ($what as $ext) {
            if ($ext === 'framework') {
                throw new Exception('Can not package framework.');
            } elseif (strncmp('app-', $ext, 4) === 0) {
                $this->packageApplication(substr($ext, 4), $versions[$ext], $packagePath);
            } else {
                throw new Exception('Can not package extension.');
            }
        }

        $this->stdout("\ndone. verify the versions composer installed above and push it to github!\n\n");

        return 0;
    }

    /**
     * Sorts CHANGELOG for framework or extension.
     *
     * @param array $what what do you want to resort changelog for? this can either be:
     *
     * - an extension name such as `redis` or `bootstrap`,
     * - or `framework` if you want to release a new version of the framework itself.
     */
    public function actionSortChangelog(array $what)
    {
        if (\count($what) > 1) {
            $this->stdout("Currently only one simultaneous release is supported.\n");
            return 1;
        }
        $this->validateWhat($what, ['framework', 'ext'], false);

        $version = $this->version ?: array_values($this->getNextVersions($this->getCurrentVersions($what), self::PATCH))[0];
        $this->stdout('sorting CHANGELOG of ');
        $this->stdout(reset($what), Console::BOLD);
        $this->stdout(' for version ');
        $this->stdout($version, Console::BOLD);
        $this->stdout('...');

        $this->resortChangelogs($what, $version);

        $this->stdout("done.\n", Console::BOLD, Console::FG_GREEN);
    }

    protected function printWhat(array $what, $newVersions, $versions)
    {
        foreach ($what as $ext) {
            if (strncmp('app-', $ext, 4) === 0) {
                $this->stdout(' - ');
                $this->stdout(substr($ext, 4), Console::FG_RED);
                $this->stdout(' application version ');
            } elseif ($ext === 'framework') {
                $this->stdout(' - Yii Framework version ');
            } else {
                $this->stdout(' - ');
                $this->stdout($ext, Console::FG_RED);
                $this->stdout(' extension version ');
            }
            $this->stdout($newVersions[$ext], Console::BOLD);
            $this->stdout(", last release was {$versions[$ext]}\n");
        }
    }

    protected function printWhatUrls(array $what, $oldVersions)
    {
        foreach ($what as $ext) {
            if ($ext === 'framework') {
                $this->stdout("framework:    https://github.com/yiisoft/yii2-framework/compare/{$oldVersions[$ext]}...master\n");
                $this->stdout("app-basic:    https://github.com/yiisoft/yii2-app-basic/compare/{$oldVersions[$ext]}...master\n");
                $this->stdout("app-advanced: https://github.com/yiisoft/yii2-app-advanced/compare/{$oldVersions[$ext]}...master\n");
            } else {
                $this->stdout($ext, Console::FG_RED);
                $this->stdout(": https://github.com/yiisoft/yii2-$ext/compare/{$oldVersions[$ext]}...master\n");
            }
        }
    }

    /**
     * @param array $what list of items
     * @param array $limit list of things to allow, or empty to allow any, can be `app`, `framework`, `extension`
     * @param bool $ensureGitClean
     * @throws \yii\base\Exception
     */
    protected function validateWhat(array $what, $limit = [], $ensureGitClean = true)
    {
        foreach ($what as $w) {
            if (strncmp('app-', $w, 4) === 0) {
                if (!empty($limit) && !\in_array('app', $limit)) {
                    throw new Exception('Only the following types are allowed: ' . implode(', ', $limit) . "\n");
                }
                if (!is_dir($appPath = "{$this->basePath}/apps/" . substr($w, 4))) {
                    throw new Exception("Application path does not exist: \"{$appPath}\"\n");
                }
                if ($ensureGitClean) {
                    $this->ensureGitClean($appPath);
                }
            } elseif ($w === 'framework') {
                if (!empty($limit) && !\in_array('framework', $limit)) {
                    throw new Exception('Only the following types are allowed: ' . implode(', ', $limit) . "\n");
                }
                if (!is_dir($fwPath = "{$this->basePath}/framework")) {
                    throw new Exception("Framework path does not exist: \"{$this->basePath}/framework\"\n");
                }
                if ($ensureGitClean) {
                    $this->ensureGitClean($fwPath);
                }
            } else {
                if (!empty($limit) && !\in_array('ext', $limit)) {
                    throw new Exception('Only the following types are allowed: ' . implode(', ', $limit) . "\n");
                }
                if (!is_dir($extPath = "{$this->basePath}/extensions/$w")) {
                    throw new Exception("Extension path for \"$w\" does not exist: \"{$this->basePath}/extensions/$w\"\n");
                }
                if ($ensureGitClean) {
                    $this->ensureGitClean($extPath);
                }
            }
        }
    }


    protected function releaseFramework($frameworkPath, $version)
    {
        $this->stdout("\n");
        $this->stdout($h = "Preparing framework release version $version", Console::BOLD);
        $this->stdout("\n" . str_repeat('-', \strlen($h)) . "\n\n", Console::BOLD);

        if (!$this->confirm('Make sure you are on the right branch for this release and that it tracks the correct remote branch! Continue?')) {
            exit(1);
        }
        $this->runGit('git pull', $frameworkPath);

        // checks

        $this->stdout('check if framework composer.json matches yii2-dev composer.json...');
        $this->checkComposer($frameworkPath);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        // adjustments

        $this->stdout('prepare classmap...', Console::BOLD);
        $this->dryRun || Yii::$app->runAction('classmap', [$frameworkPath]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('updating mimetype magic file and mime aliases...', Console::BOLD);
        $this->dryRun || Yii::$app->runAction('mime-type', ["$frameworkPath/helpers/mimeTypes.php"]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("fixing various PHPDoc style issues...\n", Console::BOLD);
        $this->dryRun || Yii::$app->runAction('php-doc/fix', [$frameworkPath]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("updating PHPDoc @property annotations...\n", Console::BOLD);
        $this->dryRun || Yii::$app->runAction('php-doc/property', [$frameworkPath]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('sorting changelogs...', Console::BOLD);
        $this->dryRun || $this->resortChangelogs(['framework'], $version);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('closing changelogs...', Console::BOLD);
        $this->dryRun || $this->closeChangelogs(['framework'], $version);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('updating Yii version...');
        $this->dryRun || $this->updateYiiVersion($frameworkPath, $version);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("\nIn the following you can check the above changes using git diff.\n\n");
        do {
            $this->runGit('git diff --color', $frameworkPath);
            $this->stdout("\n\n\nCheck whether the above diff is okay, if not you may change things as needed before continuing.\n");
            $this->stdout("You may abort the program with Ctrl + C and reset the changes by running `git checkout -- .` in the repo.\n\n");
        } while (!$this->confirm('Type `yes` to continue, `no` to view git diff again. Continue?'));

        $this->stdout("\n\n");
        $this->stdout("    ****          RELEASE TIME!         ****\n", Console::FG_YELLOW, Console::BOLD);
        $this->stdout("    ****    Commit, Tag and Push it!    ****\n", Console::FG_YELLOW, Console::BOLD);
        $this->stdout("\n\nHint: if you decide 'no' for any of the following, the command will not be executed. You may manually run them later if needed. E.g. try the release locally without pushing it.\n\n");

        $this->stdout("Make sure to have your git set up for GPG signing. The following tag and commit should be signed.\n\n");

        $this->runGit("git commit -S -a -m \"release version $version\"", $frameworkPath);
        $this->runGit("git tag -s $version -m \"version $version\"", $frameworkPath);
        $this->runGit('git push', $frameworkPath);
        $this->runGit('git push --tags', $frameworkPath);

        $this->stdout("\n\n");
        $this->stdout('CONGRATULATIONS! You have just released ', Console::FG_YELLOW, Console::BOLD);
        $this->stdout('framework', Console::FG_RED, Console::BOLD);
        $this->stdout(' version ', Console::FG_YELLOW, Console::BOLD);
        $this->stdout($version, Console::BOLD);
        $this->stdout("!\n\n", Console::FG_YELLOW, Console::BOLD);

        // TODO release applications
        // $this->composerSetStability($what, $version);


        //        $this->resortChangelogs($what, $version);
        //        $this->closeChangelogs($what, $version);
        //        $this->composerSetStability($what, $version);
        //        if (in_array('framework', $what)) {
        //            $this->updateYiiVersion($version);
        //        }


        // if done:
        //     * ./build/build release/done framework 2.0.0-dev 2.0.0-rc
        //     * ./build/build release/done redis 2.0.0-dev 2.0.0-rc
        //            $this->openChangelogs($what, $nextVersion);
        //            $this->composerSetStability($what, 'dev');
        //            if (in_array('framework', $what)) {
        //                $this->updateYiiVersion($devVersion);
        //            }



        // prepare next release

        $this->stdout("Time to prepare the next release...\n\n", Console::FG_YELLOW, Console::BOLD);

        $this->stdout('opening changelogs...', Console::BOLD);
        $nextVersion = $this->getNextVersions(['framework' => $version], self::PATCH); // TODO support other versions
        $this->dryRun || $this->openChangelogs(['framework'], $nextVersion['framework']);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('updating Yii version...');
        $this->dryRun || $this->updateYiiVersion($frameworkPath, $nextVersion['framework'] . '-dev');
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);


        $this->stdout("\n");
        $this->runGit('git diff --color', $frameworkPath);
        $this->stdout("\n\n");
        $this->runGit('git commit -a -m "prepare for next release"', $frameworkPath);
        $this->runGit('git push', $frameworkPath);

        $this->stdout("\n\nDONE!", Console::FG_YELLOW, Console::BOLD);

        $this->stdout("\n\nThe following steps are left for you to do manually:\n\n");
        $nextVersion2 = $this->getNextVersions($nextVersion, self::PATCH); // TODO support other versions
        $this->stdout("- wait for your changes to be propagated to the repo and create a tag $version on  https://github.com/yiisoft/yii2-framework\n\n");
        $this->stdout("    git clone git@github.com:yiisoft/yii2-framework.git\n");
        $this->stdout("    cd yii2-framework/\n");

        $grepVersion = preg_quote($version, '~');
        $this->stdout("    export RELEASECOMMIT=$(git log --oneline |grep \"$grepVersion\" | grep -Po \"^[0-9a-f]+\")\n");
        $this->stdout("    git tag -s $version -m \"version $version\" \$RELEASECOMMIT\n");
        $this->stdout("    git tag --verify $version\n");
        $this->stdout("    git push --tags\n\n");
        $this->stdout("- close the $version milestone on github and open new ones for {$nextVersion['framework']} and {$nextVersion2['framework']}: https://github.com/yiisoft/yii2/milestones\n");
        $this->stdout("- create a release on github.\n");
        $this->stdout("- release news and announcement.\n");
        $this->stdout("- update the website (will be automated soon and is only relevant for the new website).\n");
        $this->stdout("  https://github.com/yiisoft-contrib/yiiframework.com/blob/master/config/versions.php#L69\n");
        $this->stdout("\n");
        $this->stdout("- release applications: ./build/build release app-basic\n");
        $this->stdout("- release applications: ./build/build release app-advanced\n");

        $this->stdout("\n");
    }

    protected function releaseApplication($name, $path, $version)
    {
        $this->stdout("\n");
        $this->stdout($h = "Preparing release for application  $name  version $version", Console::BOLD);
        $this->stdout("\n" . str_repeat('-', \strlen($h)) . "\n\n", Console::BOLD);

        if (!$this->confirm('Make sure you are on the right branch for this release and that it tracks the correct remote branch! Continue?')) {
            exit(1);
        }
        $this->runGit('git pull', $path);

        // adjustments

        $this->stdout("fixing various PHPDoc style issues...\n", Console::BOLD);
        $this->setAppAliases($name, $path);
        $this->dryRun || Yii::$app->runAction('php-doc/fix', [$path, 'skipFrameworkRequirements' => true]);
        $this->resetAppAliases();
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("updating PHPDoc @property annotations...\n", Console::BOLD);
        $this->setAppAliases($name, $path);
        $this->dryRun || Yii::$app->runAction('php-doc/property', [$path, 'skipFrameworkRequirements' => true]);
        $this->resetAppAliases();
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("updating composer stability...\n", Console::BOLD);
        $this->dryRun || $this->composerSetStability(["app-$name"], $version);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("\nIn the following you can check the above changes using git diff.\n\n");
        do {
            $this->runGit('git diff --color', $path);
            $this->stdout("\n\n\nCheck whether the above diff is okay, if not you may change things as needed before continuing.\n");
            $this->stdout("You may abort the program with Ctrl + C and reset the changes by running `git checkout -- .` in the repo.\n\n");
        } while (!$this->confirm('Type `yes` to continue, `no` to view git diff again. Continue?'));

        $this->stdout("\n\n");
        $this->stdout("    ****          RELEASE TIME!         ****\n", Console::FG_YELLOW, Console::BOLD);
        $this->stdout("    ****    Commit, Tag and Push it!    ****\n", Console::FG_YELLOW, Console::BOLD);
        $this->stdout("\n\nHint: if you decide 'no' for any of the following, the command will not be executed. You may manually run them later if needed. E.g. try the release locally without pushing it.\n\n");

        $this->stdout("Make sure to have your git set up for GPG signing. The following tag and commit should be signed.\n\n");

        $this->runGit("git commit -S -a -m \"release version $version\"", $path);
        $this->runGit("git tag -s $version -m \"version $version\"", $path);
        $this->runGit('git push', $path);
        $this->runGit('git push --tags', $path);

        $this->stdout("\n\n");
        $this->stdout('CONGRATULATIONS! You have just released application ', Console::FG_YELLOW, Console::BOLD);
        $this->stdout($name, Console::FG_RED, Console::BOLD);
        $this->stdout(' version ', Console::FG_YELLOW, Console::BOLD);
        $this->stdout($version, Console::BOLD);
        $this->stdout("!\n\n", Console::FG_YELLOW, Console::BOLD);

        // prepare next release

        $this->stdout("Time to prepare the next release...\n\n", Console::FG_YELLOW, Console::BOLD);

        $this->stdout("updating composer stability...\n", Console::BOLD);
        $this->dryRun || $this->composerSetStability(["app-$name"], 'dev');
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $nextVersion = $this->getNextVersions(["app-$name" => $version], self::PATCH); // TODO support other versions

        $this->stdout("\n");
        $this->runGit('git diff --color', $path);
        $this->stdout("\n\n");
        $this->runGit('git commit -a -m "prepare for next release"', $path);
        $this->runGit('git push', $path);

        $this->stdout("\n\nDONE!", Console::FG_YELLOW, Console::BOLD);

        $this->stdout("\n\nThe following steps are left for you to do manually:\n\n");
        $nextVersion2 = $this->getNextVersions($nextVersion, self::PATCH); // TODO support other versions
        $this->stdout("- close the $version milestone on github and open new ones for {$nextVersion["app-$name"]} and {$nextVersion2["app-$name"]}: https://github.com/yiisoft/yii2-app-$name/milestones\n");
        $this->stdout("- Create Application packages and upload them to framework release at github:  ./build/build release/package app-$name\n");

        $this->stdout("\n");
    }

    private $_oldAlias;

    protected function setAppAliases($app, $path)
    {
        $this->_oldAlias = Yii::getAlias('@app');
        switch ($app) {
            case 'basic':
                Yii::setAlias('@app', $path);
                break;
            case 'advanced':
                // setup @frontend, @backend etc...
                require "$path/common/config/bootstrap.php";
                break;
        }
    }

    protected function resetAppAliases()
    {
        Yii::setAlias('@app', $this->_oldAlias);
    }

    protected function packageApplication($name, $version, $packagePath)
    {
        FileHelper::createDirectory($packagePath);

        $this->runCommand("composer create-project yiisoft/yii2-app-$name $name $version", $packagePath);
        // clear cookie validation key in basic app
        if (is_file($configFile = "$packagePath/$name/config/web.php")) {
            $this->sed(
                "/'cookieValidationKey' => '.*?',/",
                "'cookieValidationKey' => '',",
                $configFile
            );
        }
        $this->runCommand("tar zcf yii-$name-app-$version.tgz $name", $packagePath);
    }

    protected function releaseExtension($name, $path, $version)
    {
        $this->stdout("\n");
        $this->stdout($h = "Preparing release for extension  $name  version $version", Console::BOLD);
        $this->stdout("\n" . str_repeat('-', \strlen($h)) . "\n\n", Console::BOLD);

        if (!$this->confirm('Make sure you are on the right branch for this release and that it tracks the correct remote branch! Continue?')) {
            exit(1);
        }
        $this->runGit('git pull', $path);

        // adjustments

        $this->stdout("fixing various PHPDoc style issues...\n", Console::BOLD);
        $this->dryRun || Yii::$app->runAction('php-doc/fix', [$path]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("updating PHPDoc @property annotations...\n", Console::BOLD);
        $this->dryRun || Yii::$app->runAction('php-doc/property', [$path]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('sorting changelogs...', Console::BOLD);
        $this->dryRun || $this->resortChangelogs([$name], $version);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout('closing changelogs...', Console::BOLD);
        $this->dryRun || $this->closeChangelogs([$name], $version);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("\nIn the following you can check the above changes using git diff.\n\n");
        do {
            $this->runGit('git diff --color', $path);
            $this->stdout("\n\n\nCheck whether the above diff is okay, if not you may change things as needed before continuing.\n");
            $this->stdout("You may abort the program with Ctrl + C and reset the changes by running `git checkout -- .` in the repo.\n\n");
        } while (!$this->confirm('Type `yes` to continue, `no` to view git diff again. Continue?'));

        $this->stdout("\n\n");
        $this->stdout("    ****          RELEASE TIME!         ****\n", Console::FG_YELLOW, Console::BOLD);
        $this->stdout("    ****    Commit, Tag and Push it!    ****\n", Console::FG_YELLOW, Console::BOLD);
        $this->stdout("\n\nHint: if you decide 'no' for any of the following, the command will not be executed. You may manually run them later if needed. E.g. try the release locally without pushing it.\n\n");

        $this->stdout("Make sure to have your git set up for GPG signing. The following tag and commit should be signed.\n\n");

        $this->runGit("git commit -S -a -m \"release version $version\"", $path);
        $this->runGit("git tag -s $version -m \"version $version\"", $path);
        $this->runGit('git push', $path);
        $this->runGit('git push --tags', $path);

        $this->stdout("\n\n");
        $this->stdout('CONGRATULATIONS! You have just released extension ', Console::FG_YELLOW, Console::BOLD);
        $this->stdout($name, Console::FG_RED, Console::BOLD);
        $this->stdout(' version ', Console::FG_YELLOW, Console::BOLD);
        $this->stdout($version, Console::BOLD);
        $this->stdout("!\n\n", Console::FG_YELLOW, Console::BOLD);

        // prepare next release

        $this->stdout("Time to prepare the next release...\n\n", Console::FG_YELLOW, Console::BOLD);

        $this->stdout('opening changelogs...', Console::BOLD);
        $nextVersion = $this->getNextVersions([$name => $version], self::PATCH); // TODO support other versions
        $this->dryRun || $this->openChangelogs([$name], $nextVersion[$name]);
        $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD);

        $this->stdout("\n");
        $this->runGit('git diff --color', $path);
        $this->stdout("\n\n");
        $this->runGit('git commit -a -m "prepare for next release"', $path);
        $this->runGit('git push', $path);

        $this->stdout("\n\nDONE!", Console::FG_YELLOW, Console::BOLD);

        $this->stdout("\n\nThe following steps are left for you to do manually:\n\n");
        $nextVersion2 = $this->getNextVersions($nextVersion, self::PATCH); // TODO support other versions
        $this->stdout("- close the $version milestone on github and open new ones for {$nextVersion[$name]} and {$nextVersion2[$name]}: https://github.com/yiisoft/yii2-$name/milestones\n");
        $this->stdout("- release news and announcement.\n");
        $this->stdout("- update the website (will be automated soon and is only relevant for the new website).\n");

        $this->stdout("\n");
    }


    protected function runCommand($cmd, $path)
    {
        $this->stdout("running  $cmd  ...", Console::BOLD);
        if ($this->dryRun) {
            $this->stdout("dry run, command `$cmd` not executed.\n");
            return;
        }
        chdir($path);
        exec($cmd, $output, $ret);
        if ($ret != 0) {
            echo implode("\n", $output);
            throw new Exception("Command \"$cmd\" failed with code " . $ret);
        }
        $this->stdout("\ndone.\n", Console::BOLD, Console::FG_GREEN);
    }

    protected function runGit($cmd, $path)
    {
        if ($this->confirm("Run `$cmd`?", true)) {
            if ($this->dryRun) {
                $this->stdout("dry run, command `$cmd` not executed.\n");
                return;
            }
            chdir($path);
            exec($cmd, $output, $ret);
            echo implode("\n", $output);
            if ($ret != 0) {
                throw new Exception("Command \"$cmd\" failed with code " . $ret);
            }
            echo "\n";
        }
    }

    protected function ensureGitClean($path)
    {
        chdir($path);
        exec('git status --porcelain -uno', $changes, $ret);
        if ($ret != 0) {
            throw new Exception('Command "git status --porcelain -uno" failed with code ' . $ret);
        }
        if (!empty($changes)) {
            throw new Exception("You have uncommitted changes in $path: " . print_r($changes, true));
        }
    }

    protected function gitFetchTags($path)
    {
        try {
            chdir($path);
        } catch (\yii\base\ErrorException $e) {
            throw new Exception('Failed to fetch git tags in ' . $path . ': ' . $e->getMessage());
        }
        exec('git fetch --tags', $output, $ret);
        if ($ret != 0) {
            throw new Exception('Command "git fetch --tags" failed with code ' . $ret);
        }
    }


    protected function checkComposer($fwPath)
    {
        if (!$this->confirm("\nNot yet automated: Please check if composer.json dependencies in framework dir match the one in repo root. Continue?", false)) {
            exit;
        }
    }


    protected function closeChangelogs($what, $version)
    {
        $v = str_replace('\\-', '[\\- ]', preg_quote($version, '/'));
        $headline = $version . ' ' . date('F d, Y');
        $this->sed(
            '/' . $v . ' under development\R(-+?)\R/',
            $headline . "\n" . str_repeat('-', \strlen($headline)) . "\n",
            $this->getChangelogs($what)
        );
    }

    protected function openChangelogs($what, $version)
    {
        $headline = "\n$version under development\n";
        $headline .= str_repeat('-', \strlen($headline) - 2) . "\n\n- no changes in this release.\n";
        foreach ($this->getChangelogs($what) as $file) {
            $lines = explode("\n", file_get_contents($file));
            $hl = [
                array_shift($lines),
                array_shift($lines),
            ];
            array_unshift($lines, $headline);

            file_put_contents($file, implode("\n", array_merge($hl, $lines)));
        }
    }

    protected function resortChangelogs($what, $version)
    {
        foreach ($this->getChangelogs($what) as $file) {
            // split the file into relevant parts
            list($start, $changelog, $end) = $this->splitChangelog($file, $version);
            $changelog = $this->resortChangelog($changelog);
            file_put_contents($file, implode("\n", array_merge($start, $changelog, $end)));
        }
    }

    /**
     * Extract changelog content for a specific version.
     * @param string $file
     * @param string $version
     * @return array
     */
    protected function splitChangelog($file, $version)
    {
        $lines = explode("\n", file_get_contents($file));

        // split the file into relevant parts
        $start = [];
        $changelog = [];
        $end = [];

        $state = 'start';
        foreach ($lines as $l => $line) {
            // starting from the changelogs headline
            if (
                isset($lines[$l - 2]) && strpos($lines[$l - 2], $version) !== false &&
                isset($lines[$l - 1]) && strncmp($lines[$l - 1], '---', 3) === 0
            ) {
                $state = 'changelog';
            }
            if ($state === 'changelog' && isset($lines[$l + 1]) && strncmp($lines[$l + 1], '---', 3) === 0) {
                $state = 'end';
            }
            // add continued lines to the last item to keep them together
            if (!empty(${$state}) && trim($line) !== '' && strncmp($line, '- ', 2) !== 0) {
                end(${$state});

                if (($k = key(${$state})) !== null) {
                    ${$state}[$k] .= "\n" . $line;
                }
            } else {
                ${$state}[] = $line;
            }
        }

        return [$start, $changelog, $end];
    }

    /**
     * Ensure sorting of the changelog lines.
     * @param string[] $changelog
     * @return string[]
     */
    protected function resortChangelog($changelog)
    {
        // cleanup whitespace
        foreach ($changelog as $i => $line) {
            $changelog[$i] = rtrim($line);
        }
        $changelog = array_filter($changelog);

        $i = 0;
        ArrayHelper::multisort($changelog, function ($line) use (&$i) {
            if (preg_match('/^- (Chg|Enh|Bug|New)( #\d+(, #\d+)*)?: .+/', $line, $m)) {
                $o = ['Bug' => 'C', 'Enh' => 'D', 'Chg' => 'E', 'New' => 'F'];
                return $o[$m[1]] . ' ' . (!empty($m[2]) ? $m[2] : 'AAAA' . $i++);
            }

            return 'B' . $i++;
        }, SORT_ASC, SORT_NATURAL);

        // re-add leading and trailing lines
        array_unshift($changelog, '');
        $changelog[] = '';
        $changelog[] = '';

        return $changelog;
    }

    protected function getChangelogs($what)
    {
        $changelogs = [];
        if (\in_array('framework', $what)) {
            $changelogs[] = $this->getFrameworkChangelog();
        }

        return array_merge($changelogs, $this->getExtensionChangelogs($what));
    }

    protected function getFrameworkChangelog()
    {
        return $this->basePath . '/framework/CHANGELOG.md';
    }

    protected function getExtensionChangelogs($what)
    {
        return array_filter(glob($this->basePath . '/extensions/*/CHANGELOG.md'), function ($elem) use ($what) {
            foreach ($what as $ext) {
                if (strpos($elem, "extensions/$ext/CHANGELOG.md") !== false) {
                    return true;
                }
            }

            return false;
        });
    }

    protected function composerSetStability($what, $version)
    {
        $apps = [];
        if (\in_array('app-advanced', $what)) {
            $apps[] = $this->basePath . '/apps/advanced/composer.json';
        }
        if (\in_array('app-basic', $what)) {
            $apps[] = $this->basePath . '/apps/basic/composer.json';
        }
        if (\in_array('app-benchmark', $what)) {
            $apps[] = $this->basePath . '/apps/benchmark/composer.json';
        }
        if (empty($apps)) {
            return;
        }

        $stability = 'stable';
        if (strpos($version, 'alpha') !== false) {
            $stability = 'alpha';
        } elseif (strpos($version, 'beta') !== false) {
            $stability = 'beta';
        } elseif (strpos($version, 'rc') !== false) {
            $stability = 'RC';
        } elseif (strpos($version, 'dev') !== false) {
            $stability = 'dev';
        }

        $this->sed(
            '/"minimum-stability": "(.+?)",/',
            '"minimum-stability": "' . $stability . '",',
            $apps
        );
    }

    protected function updateYiiVersion($frameworkPath, $version)
    {
        $this->sed(
            '/function getVersion\(\)\R {4}\{\R {8}return \'(.+?)\';/',
            "function getVersion()\n    {\n        return '$version';",
            $frameworkPath . '/BaseYii.php'
        );
    }

    protected function sed($pattern, $replace, $files)
    {
        foreach ((array) $files as $file) {
            file_put_contents($file, preg_replace($pattern, $replace, file_get_contents($file)));
        }
    }

    protected function getCurrentVersions(array $what)
    {
        $versions = [];
        foreach ($what as $ext) {
            if ($ext === 'framework') {
                chdir("{$this->basePath}/framework");
            } elseif (strncmp('app-', $ext, 4) === 0) {
                chdir("{$this->basePath}/apps/" . substr($ext, 4));
            } else {
                chdir("{$this->basePath}/extensions/$ext");
            }
            $tags = [];
            exec('git tag', $tags, $ret);
            if ($ret != 0) {
                throw new Exception('Command "git tag" failed with code ' . $ret);
            }
            rsort($tags, SORT_NATURAL); // TODO this can not deal with alpha/beta/rc...

            // exclude 3.0.0-alpha1 tag
            if (($key = array_search('3.0.0-alpha1', $tags, true)) !== false) {
                unset($tags[$key]);
            }

            $versions[$ext] = reset($tags);
        }

        return $versions;
    }

    public const MINOR = 'minor';
    public const PATCH = 'patch';

    protected function getNextVersions(array $versions, $type)
    {
        foreach ($versions as $k => $v) {
            if (empty($v)) {
                $versions[$k] = '2.0.0';
                continue;
            }
            $parts = explode('.', $v);
            switch ($type) {
                case self::MINOR:
                    $parts[1] = (int) $parts[1] + 1;
                    $parts[2] = 0;
                    if (isset($parts[3])) {
                        unset($parts[3]);
                    }
                    break;
                case self::PATCH:
                    $parts[2] = (int) $parts[2] + 1;
                    if (isset($parts[3])) {
                        unset($parts[3]);
                    }
                    break;
                default:
                    throw new Exception('Unknown version type.');
            }
            $versions[$k] = implode('.', $parts);
        }

        return $versions;
    }
}


================================================
FILE: build/controllers/TranslationController.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use DirectoryIterator;
use yii\console\Application;
use yii\console\Controller;
use yii\helpers\Html;

/**
 * TranslationController handles tasks related to framework translations.
 *
 * build translation "../docs/guide" "../docs/guide-ru" "Russian guide translation report" > report_guide_ru.html
 *
 * @author Alexander Makarov <sam@rmcreative.ru>
 *
 * @extends Controller<Application>
 */
class TranslationController extends Controller
{
    public $defaultAction = 'report';

    /**
     * Creates a report about documentation updates since last update of same named translations.
     *
     * @param string $sourcePath the directory where the original documentation files are
     * @param string $translationPath the directory where the translated documentation files are
     * @param string $title custom title to use for report
     */
    public function actionReport($sourcePath, $translationPath, $title = 'Translation report')
    {
        $sourcePath = trim($sourcePath, '/\\');
        $translationPath = trim($translationPath, '/\\');

        $results = [];

        $dir = new DirectoryIterator($sourcePath);
        foreach ($dir as $fileinfo) {
            /** @var DirectoryIterator $fileinfo */
            if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
                $translatedFilePath = $translationPath . '/' . $fileinfo->getFilename();
                $sourceFilePath = $sourcePath . '/' . $fileinfo->getFilename();

                $errors = $this->checkFiles($translatedFilePath);
                $diff = empty($errors) ? $this->getDiff($translatedFilePath, $sourceFilePath) : '';
                if (!empty($diff)) {
                    $errors[] = 'Translation outdated.';
                }

                $result = [
                    'errors' => $errors,
                    'diff' => $diff,
                ];

                $results[$fileinfo->getFilename()] = $result;
            }
        }

        // checking if there are obsolete translation files
        $dir = new DirectoryIterator($translationPath);
        foreach ($dir as $fileinfo) {
            /** @var DirectoryIterator $fileinfo */
            if (!$fileinfo->isDot() && !$fileinfo->isDir()) {
                $translatedFilePath = $translationPath . '/' . $fileinfo->getFilename();

                $errors = $this->checkFiles(null, $translatedFilePath);
                if (!empty($errors)) {
                    $results[$fileinfo->getFilename()]['errors'] = $errors;
                }
            }
        }

        echo $this->renderFile(__DIR__ . '/views/translation/report_html.php', [
            'results' => $results,
            'sourcePath' => $sourcePath,
            'translationPath' => $translationPath,
            'title' => $title,
        ]);
    }

    /**
     * Checks for files existence.
     *
     * @param string $translatedFilePath
     * @param string $sourceFilePath
     * @return array errors
     */
    protected function checkFiles($translatedFilePath = null, $sourceFilePath = null)
    {
        $errors = [];
        if ($translatedFilePath !== null && !file_exists($translatedFilePath)) {
            $errors[] = 'Translation does not exist.';
        }

        if ($sourceFilePath !== null && !file_exists($sourceFilePath)) {
            $errors[] = 'Source does not exist.';
        }

        return $errors;
    }

    /**
     * Getting DIFF from git.
     *
     * @param string $translatedFilePath path pointing to translated file
     * @param string $sourceFilePath path pointing to original file
     * @return string DIFF
     */
    protected function getDiff($translatedFilePath, $sourceFilePath)
    {
        $lastTranslationHash = shell_exec('git log -1 --format=format:"%H" -- ' . $translatedFilePath);
        return shell_exec('git diff ' . $lastTranslationHash . '..HEAD -- ' . $sourceFilePath);
    }

    /**
     * Adds all necessary HTML tags and classes to diff output.
     *
     * @param string $diff DIFF
     * @return string highlighted DIFF
     */
    public function highlightDiff($diff)
    {
        $lines = explode("\n", $diff);
        foreach ($lines as $key => $val) {
            if (strpos($val, '@') === 0) {
                $lines[$key] = '<span class="info">' . Html::encode($val) . '</span>';
            } elseif (strpos($val, '+') === 0) {
                $lines[$key] = '<ins>' . Html::encode($val) . '</ins>';
            } elseif (strpos($val, '-') === 0) {
                $lines[$key] = '<del>' . Html::encode($val) . '</del>';
            } else {
                $lines[$key] = Html::encode($val);
            }
        }

        return implode("\n", $lines);
    }
}


================================================
FILE: build/controllers/Utf8Controller.php
================================================
<?php

/**
 * @link https://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license https://www.yiiframework.com/license/
 */

namespace yii\build\controllers;

use yii\console\Application;
use yii\console\Controller;
use yii\helpers\Console;
use yii\helpers\FileHelper;

/**
 * Check files for broken UTF8 and non-printable characters.
 *
 * @author Carsten Brandt <mail@cebe.cc>
 *
 * @extends Controller<Application>
 */
class Utf8Controller extends Controller
{
    public $defaultAction = 'check-guide';

    /**
     * Check guide for non-printable characters that may break docs generation.
     *
     * @param string $directory the directory to check. If not specified, the default
     * guide directory will be checked.
     */
    public function actionCheckGuide($directory = null)
    {
        if ($directory === null) {
            $directory = \dirname(\dirname(__DIR__)) . '/docs';
        }
        if (is_file($directory)) {
            $files = [$directory];
        } else {
            $files = FileHelper::findFiles($directory, [
                'only' => ['*.md'],
            ]);
        }

        foreach ($files as $file) {
            $content = file_get_contents($file);
            $chars = preg_split('//u', $content, null, PREG_SPLIT_NO_EMPTY);

            $line = 1;
            $pos = 0;
            foreach ($chars as $c) {
                $ord = $this->unicodeOrd($c);

                $pos++;
                if ($ord == 0x000A) {
                    $line++;
                    $pos = 0;
                }

                if ($ord === false) {
                    $this->found('BROKEN UTF8', $c, $line, $pos, $file);
                    continue;
                }

                // https://unicode-table.com/en/blocks/general-punctuation/
                if (
                    0x2000 <= $ord && $ord <= 0x200F
                    || 0x2028 <= $ord && $ord <= 0x202E
                    || 0x205f <= $ord && $ord <= 0x206F
                ) {
                    $this->found('UNSUPPORTED SPACE CHARACTER', $c, $line, $pos, $file);
                    continue;
                }
                if (
                    $ord < 0x0020 && $ord != 0x000A && $ord != 0x0009 ||
                    0x0080 <= $ord && $ord < 0x009F
                ) {
                    $this->found('CONTROL CHARACTER', $c, $line, $pos, $file);
                    continue;
                }
                //                if ($ord > 0x009F) {
                //                    $this->found("NON ASCII CHARACTER", $c, $line, $pos, $file);
                //                    continue;
                //                }
            }
        }
    }

    private $_foundFiles = [];

    private function found($what, $char, $line, $pos, $file)
    {
        if (!isset($this->_foundFiles[$file])) {
            $this->stdout("$file: \n", Console::BOLD);
            $this->_foundFiles[$file] = $file;
        }

        $hexcode = dechex($this->unicodeOrd($char));
        $hexcode = str_repeat('0', max(4 - \strlen($hexcode), 0)) . $hexcode;

        $this->stdout("  at $line:$pos FOUND $what: 0x$hexcode '$char' https://unicode-table.com/en/$hexcode/\n");
    }

    /**
     * Equivalent for ord() just for unicode.
     *
     * https://stackoverflow.com/questions/10333098/utf-8-safe-equivalent-of-ord-or-charcodeat-in-php/10333324#10333324
     *
     * @param $c
     * @return bool|int
     */
    private function unicodeOrd($c)
    {
        $h = \ord($c[0]);
        if ($h <= 0x7F) {
            return $h;
        } elseif ($h < 0xC2) {
            return false;
        } elseif ($h <= 0xDF) {
            return ($h & 0x1F) << 6 | (\ord($c[1]) & 0x3F);
        } elseif ($h <= 0xEF) {
            return ($h & 0x0F) << 12 | (\ord($c[1]) & 0x3F) << 6
                | (\ord($c[2]) & 0x3F);
        } elseif ($h <= 0xF4) {
            return ($h & 0x0F) << 18 | (\ord($c[1]) & 0x3F) << 12
                | (\ord($c[2]) & 0x3F) << 6
                | (\ord($c[3]) & 0x3F);
        }

        return false;
    }
}


================================================
FILE: build/controllers/views/translation/report_html.php
================================================
<?php

use yii\helpers\Html;

/**
 * @var \yii\web\View $this
 * @var string $title
 * @var string $sourcePath
 * @var string $translationPath
 * @var array $results
 */

/** @var \yii\build\controllers\TranslationController $translationController */
$translationController = $this->context;

?><!doctype html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Translation report</title>

        <style>
            .diff ins {
                background: #cfc;
                text-decoration: none;
            }

            .diff del {
                background: #ffe6cc;
                text-decoration: none;
            }

            .ok {
                color: #99cc32;
            }

            .errors {
                color: #cc5129;
            }
        </style>
    </head>
    <body>
        <h1><?= Html::encode($title) ?></h1>

        <ul>
            <li><strong>Source:</strong> <?= Html::encode($sourcePath) ?></li>
            <li><strong>Translation:</strong> <?= Html::encode($translationPath) ?></li>
        </ul>

        <?php foreach ($results as $name => $result): ?>
            <h2 class="<?= empty($result['errors']) ? 'ok' : 'errors' ?>"><?= $name ?></h2>
            <?php foreach ($result['errors'] as $error): ?>
                <p><?= Html::encode($error) ?></p>
            <?php endforeach ?>
            <?php if (!empty($result['diff'])): ?>
                <code class="diff"><pre><?= $translationController->highlightDiff($result['diff']) ?></pre></code>
            <?php endif ?>
        <?php endforeach ?>
    </body>
</html>


================================================
FILE: code-of-conduct.md
================================================
Yii Contributor Code of Conduct
=======================

## Our Pledge

As contributors and maintainers of this project, and in order to keep Yii community open and welcoming, we ask to respect all community members.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
  advances
* Personal attacks
* Trolling or insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing other's private information, such as physical or electronic
  addresses, without explicit permission
* Other conduct which could reasonably be considered inappropriate in
  a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in response
to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments,
commits, code, wiki edits, issues, and other contributions that are not aligned to this
Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors
that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when
an individual is representing the project or its community. Examples of representing
a project or community include posting via an official social media account,
within project GitHub, official forum or acting as an appointed representative at
an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported
by contacting core team members. All complaints will be reviewed and investigated
and will result in a response that is deemed necessary and appropriate to the circumstances.
The project team is obligated to maintain confidentiality with regard to the reporter of
an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith
may face temporary or permanent repercussions as determined by other members of
the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.4.0, available at
[https://contributor-covenant.org/version/1/4/][version]

[homepage]: https://contributor-covenant.org
[version]: https://contributor-covenant.org/version/1/4/


================================================
FILE: composer.json
================================================
{
    "name": "yiisoft/yii2-dev",
    "description": "Yii PHP Framework Version 2 - Development Package",
    "keywords": [
        "yii2",
        "framework"
    ],
    "homepage": "https://www.yiiframework.com/",
    "type": "yii2-extension",
    "license": "BSD-3-Clause",
    "authors": [
        {
            "name": "Qiang Xue",
            "email": "qiang.xue@gmail.com",
            "homepage": "https://www.yiiframework.com/",
            "role": "Founder and project lead"
        },
        {
            "name": "Alexander Makarov",
            "email": "sam@rmcreative.ru",
            "homepage": "https://rmcreative.ru/",
            "role": "Core framework development"
        },
        {
            "name": "Maurizio Domba",
            "homepage": "http://mdomba.info/",
            "role": "Core framework development"
        },
        {
            "name": "Carsten Brandt",
            "email": "mail@cebe.cc",
            "homepage": "https://www.cebe.cc/",
            "role": "Core framework development"
        },
        {
            "name": "Timur Ruziev",
            "email": "resurtm@gmail.com",
            "homepage": "http://resurtm.com/",
            "role": "Core framework development"
        },
        {
            "name": "Paul Klimov",
            "email": "klimov.paul@gmail.com",
            "role": "Core framework development"
        },
        {
            "name": "Dmitry Naumenko",
            "email": "d.naumenko.a@gmail.com",
            "role": "Core framework development"
        },
        {
            "name": "Boudewijn Vahrmeijer",
            "email": "info@dynasource.eu",
            "homepage": "http://dynasource.eu",
            "role": "Core framework development"
        }
    ],
    "support": {
        "issues": "https://github.com/yiisoft/yii2/issues?state=open",
        "forum": "https://forum.yiiframework.com/",
        "wiki": "https://www.yiiframework.com/wiki",
        "irc": "ircs://irc.libera.chat:6697/yii",
        "source": "https://github.com/yiisoft/yii2"
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "replace": {
        "yiisoft/yii2": "self.version"
    },
    "require": {
        "php": ">=7.4.0",
        "ext-mbstring": "*",
        "ext-ctype": "*",
        "lib-pcre": "*",
        "yiisoft/yii2-composer": "~2.0.4",
        "ezyang/htmlpurifier": "^4.17",
        "cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0",
        "bower-asset/jquery": "3.7.*@stable | 3.6.*@stable | 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": "^5.0.8 ",
        "bower-asset/punycode": "^2.2",
        "bower-asset/yii2-pjax": "~2.0.1"
    },
    "require-dev": {
        "cebe/indent": "~1.0.2",
        "dealerdirect/phpcodesniffer-composer-installer": "*",
        "dms/phpunit-arraysubset-asserts": "^0.5",
        "phpunit/phpunit": "^9.6",
        "yiisoft/yii2-coding-standards": "^3.0",
        "phpstan/phpstan": "^2.1",
        "phpstan/phpstan-phpunit": "^2.0"
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ],
    "suggest": {
        "yiisoft/yii2-coding-standards": "you can use this package to check for code style issues when contributing to yii"
    },
    "autoload": {
        "psr-4": {
            "yii\\": "framework/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "yii\\build\\": "build/",
            "yiiunit\\": "tests/"
        }
    },
    "config": {
        "allow-plugins": {
            "cweagans/composer-patches": true,
            "yiisoft/yii2-composer": true,
            "dealerdirect/phpcodesniffer-composer-installer": true
        }
    },
    "bin": [
        "framework/yii"
    ],
    "extra": {
        "branch-alias": {
            "dev-master": "2.0.x-dev"
        }
    },
    "scripts": {
        "cs": "./vendor/bin/phpcs",
        "cs-fix": "./vendor/bin/phpcbf"
    }
}


================================================
FILE: contrib/completion/bash/yii
================================================
# This file implements bash completion for the ./yii command file.
# It completes the commands available by the ./yii command.
# See also:
# - https://debian-administration.org/article/317/An_introduction_to_bash_completion_part_2 on how this works.
# - https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html
# - https://www.yiiframework.com/doc-2.0/guide-tutorial-console.html#bash-completion
#
# Usage:
# Temporarily you can source this file in you bash by typing: source yii
# For permanent availability, copy or link this file to /etc/bash_completion.d/
#

_yii()
{
    local cur opts yii command
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    yii="${COMP_WORDS[0]}"

    # exit if ./yii does not exist
    test -f $yii || return 0

    # lookup for command
    for word in ${COMP_WORDS[@]:1}; do
        if [[ $word != -* ]]; then
            command=$word
            break
        fi
    done

    [[ $cur == $command ]] && state="command"
    [[ $cur != $command ]] && state="option"
    [[ $cur = *=* ]] && state="value"
    [[ $prev == "help" ]] && state="help"

    case $state in
        command|help)
            # complete command/route if not given
            # fetch available commands from ./yii help/list command
            opts=$($yii help/list 2> /dev/null)
        ;;
        option)
            # fetch available options from ./yii help/list-action-options command
            opts=$($yii help/list-action-options $command 2> /dev/null | grep -o '^--[a-zA-Z0-9\-]*')
        ;;
        value)
            # TODO allow normal file completion after an option, e.g. --migrationPath=...
        ;;
    esac

    # generate completion suggestions
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
    return 0

}

# register completion for the ./yii command
# you may adjust this line if your command file is named differently
complete -o default -F _yii ./yii yii


================================================
FILE: contrib/completion/zsh/_yii
================================================
#compdef yii

_yii() {
    local state command lastArgument commands options executive
    lastArgument=${words[${#words[@]}]}
    prevArgument=${words[${#words[@]}-1]}
    executive=$words[1]

    # lookup for command
    for word in ${words[@]:1}; do
        if [[ $word != -* ]]; then
            command=$word
            break
        fi
    done


    [[ $lastArgument == $command ]] && state="command"
    [[ $lastArgument != $command ]] && state="option"
    [[ $prevArgument == "help" ]] && state="help"

    case $state in
        command|help)
            commands=("${(@f)$(${executive} help/list 2>/dev/null)}")
            _describe 'command' commands
        ;;
        option)
            options=("${(@f)$(${executive} help/usage ${command} 2>/dev/null)}")
            _message -r "$options"

            suboptions=("${(@f)$(${executive} help/list-action-options ${command} 2>/dev/null)}")
            _describe -V -o -t suboption 'action options' suboptions
        ;;
        *)
    esac

}

compdef _yii yii



================================================
FILE: docs/documentation_style_guide.md
================================================
# Yii Documentation Style Guide

Guidelines to go by when writing or editing any Yii documentation.

*This needs to be expanded.*

## General Style

* Try to use an active voice.
* Use short, declarative sentences.
* Demonstrate ideas using code as much as possible.
* Never use "we". It's the Yii development team or the Yii core team. Better yet to put things in terms of the framework or the guide.
* Use the Oxford comma (e.g., "this, that, and the other" not "this, that and the other").

## Formatting

* Use *italics* for emphasis, never capitalization, bold, or underlines.

## Lists

* Numeric lists should be complete sentences that end with periods.
* Bullet lists should be fragments that end with semicolon except the last item, which should end with a period.

## Blocks

Blocks use the Markdown `> Type: `. There are four block types:

* `Warning`, for bad security things and other problems
* `Note`, to emphasize key concepts, things to avoid
* `Info`, general information (an aside); not as strong as a "Note"
* `Tip`, pro tips, extras, can be useful but may not be needed by everyone all the time

The sentence after the colon should begin with a capital letter.

When translating documentation, these Block indicators should not be translated.
Keeps them intact as they are and only translate the block content.
For translating the `Type` word, each guide translation should have a `blocktypes.json` file
containing the translations. The following shows an example for German:

```json
{
    "Warning:": "Achtung:",
    "Note:": "Hinweis:",
    "Info:": "Info:",
    "Tip:": "Tipp:"
}
```

## References

* Yii 2.0 or Yii 2 (not Yii2 or Yii2.0)
* Each "page" of the guide is referred to as a "section".
* References to Code objects:
  - Refer to classes using the full namespace: `yii\base\Model`
  - Refer to class properties using the static syntax even if they are not static: `yii\base\Model::$validators`
  - Refer to class methods using the static syntax even if they are not static and include parenthesis to make it clear, that it is a method: `yii\base\Model::validate()`
  - references to code objects should be writting in `[[]]` to generate links to the API documentation. E.g. `[[yii\base\Model]]`, `[[yii\base\Model::$validators]]`, or `[[yii\base\Model::validate()]]`.

## Capitalizations

* Web, not web
* the guide or this guide, not the Guide

## Validating the docs

The following are some scripts that help find broken links and other issues in the guide:

Find broken links (some false-positives may occur):

    grep -rniP "\[\[[^\],']+?\][^\]]"  docs/guide*
    grep -rniP "[^\[]\[[^\]\[,']+?\]\]"  docs/guide*
    
## Attribution of Translators

The names of the translators will be listed among the guide authors in the
rendered versions of the guide.
Therefor in each guide directory for a different language than english a `translators.json` file
should be created that contains an array of names of the people who have participated in the translation.

```json
[
  "Jane Doe",
  "John Doe"
]
```

If you have contributed a significant part to the translation, feel free to send a pull request adding your name.


================================================
FILE: docs/guide/README.md
================================================
The Definitive Guide to Yii 2.0
===============================

This tutorial is released under the [Terms of Yii Documentation](https://www.yiiframework.com/doc/terms/).

All Rights Reserved.

2014 (c) Yii Software LLC.


Introduction
------------

* [About Yii](intro-yii.md)
* [Upgrading from Version 1.1](intro-upgrade-from-v1.md)


Getting Started
---------------

* [What do you need to know](start-prerequisites.md)
* [Installing Yii](start-installation.md)
* [Running Applications](start-workflow.md)
* [Saying Hello](start-hello.md)
* [Working with Forms](start-forms.md)
* [Working with Databases](start-databases.md)
* [Generating Code with Gii](start-gii.md)
* [Looking Ahead](start-looking-ahead.md)


Application Structure
---------------------

* [Application Structure Overview](structure-overview.md)
* [Entry Scripts](structure-entry-scripts.md)
* [Applications](structure-applications.md)
* [Application Components](structure-application-components.md)
* [Controllers](structure-controllers.md)
* [Models](structure-models.md)
* [Views](structure-views.md)
* [Modules](structure-modules.md)
* [Filters](structure-filters.md)
* [Widgets](structure-widgets.md)
* [Assets](structure-assets.md)
* [Extensions](structure-extensions.md)


Handling Requests
-----------------

* [Request Handling Overview](runtime-overview.md)
* [Bootstrapping](runtime-bootstrapping.md)
* [Routing and URL Creation](runtime-routing.md)
* [Requests](runtime-requests.md)
* [Responses](runtime-responses.md)
* [Sessions and Cookies](runtime-sessions-cookies.md)
* [Handling Errors](runtime-handling-errors.md)
* [Logging](runtime-logging.md)


Key Concepts
------------

* [Components](concept-components.md)
* [Properties](concept-properties.md)
* [Events](concept-events.md)
* [Behaviors](concept-behaviors.md)
* [Configurations](concept-configurations.md)
* [Aliases](concept-aliases.md)
* [Class Autoloading](concept-autoloading.md)
* [Service Locator](concept-service-locator.md)
* [Dependency Injection Container](concept-di-container.md)


Working with Databases
----------------------

* [Database Access Objects](db-dao.md): Connecting to a database, basic queries, transactions, and schema manipulation
* [Query Builder](db-query-builder.md): Querying the database using a simple abstraction layer
* [Active Record](db-active-record.md): The Active Record ORM, retrieving and manipulating records, and defining relations
* [Migrations](db-migrations.md): Apply version control to your databases in a team development environment
* [Sphinx](https://www.yiiframework.com/extension/yiisoft/yii2-sphinx/doc/guide)
* [Redis](https://www.yiiframework.com/extension/yiisoft/yii2-redis/doc/guide)
* [MongoDB](https://www.yiiframework.com/extension/yiisoft/yii2-mongodb/doc/guide)
* [ElasticSearch](https://www.yiiframework.com/extension/yiisoft/yii2-elasticsearch/doc/guide)


Getting Data from Users
-----------------------

* [Creating Forms](input-forms.md)
* [Validating Input](input-validation.md)
* [Uploading Files](input-file-upload.md)
* [Collecting Tabular Input](input-tabular-input.md)
* [Getting Data for Multiple Models](input-multiple-models.md)
* [Extending ActiveForm on the Client Side](input-form-javascript.md)


Displaying Data
---------------

* [Data Formatting](output-formatting.md)
* [Pagination](output-pagination.md)
* [Sorting](output-sorting.md)
* [Data Providers](output-data-providers.md)
* [Data Widgets](output-data-widgets.md)
* [Working with Client Scripts](output-client-scripts.md)
* [Theming](output-theming.md)


Security
--------

* [Security Overview](security-overview.md)
* [Authentication](security-authentication.md)
* [Authorization](security-authorization.md)
* [Working with Passwords](security-passwords.md)
* [Cryptography](security-cryptography.md)
* [Auth Clients](https://www.yiiframework.com/extension/yiisoft/yii2-authclient/doc/guide)
* [Best Practices](security-best-practices.md)


Caching
-------

* [Caching Overview](caching-overview.md)
* [Data Caching](caching-data.md)
* [Fragment Caching](caching-fragment.md)
* [Page Caching](caching-page.md)
* [HTTP Caching](caching-http.md)


RESTful Web Services
--------------------

* [Quick Start](rest-quick-start.md)
* [Resources](rest-resources.md)
* [Controllers](rest-controllers.md)
* [Filtering Collections](rest-filtering-collections.md)
* [Routing](rest-routing.md)
* [Response Formatting](rest-response-formatting.md)
* [Authentication](rest-authentication.md)
* [Rate Limiting](rest-rate-limiting.md)
* [Versioning](rest-versioning.md)
* [Error Handling](rest-error-handling.md)


Development Tools
-----------------

* [Debug Toolbar and Debugger](https://www.yiiframework.com/extension/yiisoft/yii2-debug/doc/guide)
* [Generating Code using Gii](https://www.yiiframework.com/extension/yiisoft/yii2-gii/doc/guide)
* [Generating API Documentation](https://www.yiiframework.com/extension/yiisoft/yii2-apidoc)


Testing
-------

* [Testing Overview](test-overview.md)
* [Testing environment setup](test-environment-setup.md)
* [Unit Tests](test-unit.md)
* [Functional Tests](test-functional.md)
* [Acceptance Tests](test-acceptance.md)
* [Fixtures](test-fixtures.md)


Special Topics
--------------

* [Advanced Project Template](https://www.yiiframework.com/extension/yiisoft/yii2-app-advanced/doc/guide)
* [Building Application from Scratch](tutorial-start-from-scratch.md)
* [Console Commands](tutorial-console.md)
* [Core Validators](tutorial-core-validators.md)
* [Docker](tutorial-docker.md)
* [Internationalization](tutorial-i18n.md)
* [Mailing](tutorial-mailing.md)
* [Performance Tuning](tutorial-performance-tuning.md)
* [Shared Hosting Environment](tutorial-shared-hosting.md)
* [Template Engines](tutorial-template-engines.md)
* [Working with Third-Party Code](tutorial-yii-integration.md)
* [Using Yii as a micro framework](tutorial-yii-as-micro-framework.md)


Widgets
-------

* [GridView](https://www.yiiframework.com/doc-2.0/yii-grid-gridview.html)
* [ListView](https://www.yiiframework.com/doc-2.0/yii-widgets-listview.html)
* [DetailView](https://www.yiiframework.com/doc-2.0/yii-widgets-detailview.html)
* [ActiveForm](https://www.yiiframework.com/doc-2.0/guide-input-forms.html#activerecord-based-forms-activeform)
* [Pjax](https://www.yiiframework.com/doc-2.0/yii-widgets-pjax.html)
* [Menu](https://www.yiiframework.com/doc-2.0/yii-widgets-menu.html)
* [LinkPager](https://www.yiiframework.com/doc-2.0/yii-widgets-linkpager.html)
* [LinkSorter](https://www.yiiframework.com/doc-2.0/yii-widgets-linksorter.html)
* [Bootstrap Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-bootstrap/doc/guide)
* [jQuery UI Widgets](https://www.yiiframework.com/extension/yiisoft/yii2-jui/doc/guide)


Helpers
-------

* [Helpers Overview](helper-overview.md)
* [ArrayHelper](helper-array.md)
* [Html](helper-html.md)
* [Json](helper-json.md)
* [Url](helper-url.md)



================================================
FILE: docs/guide/caching-data.md
================================================
Data Caching
============

Data caching is about storing some PHP variables in cache and retrieving it later from cache.
It is also the foundation for more advanced caching features, such as [query caching](#query-caching)
and [page caching](caching-page.md).

The following code is a typical usage pattern of data caching, where `$cache` refers to
a [cache component](#cache-components):

```php
// try retrieving $data from cache
$data = $cache->get($key);

if ($data === false) {
    // $data is not found in cache, calculate it from scratch
    $data = $this->calculateSomething();

    // store $data in cache so that it can be retrieved next time
    $cache->set($key, $data);
}

// $data is available here
```

Since version 2.0.11, [cache component](#cache-components) provides [[yii\caching\Cache::getOrSet()|getOrSet()]] method
that simplifies code for data getting, calculating and storing. The following code does exactly the same as the 
previous example:

```php
$data = $cache->getOrSet($key, function () {
    return $this->calculateSomething();
});
```

When cache has data associated with the `$key`, the cached value will be returned. 
Otherwise, the passed anonymous function will be executed to calculate the value that will be cached and returned.

If the anonymous function requires some data from the outer scope, you can pass it with the `use` statement.
For example:

```php
$user_id = 42;
$data = $cache->getOrSet($key, function () use ($user_id) {
    return $this->calculateSomething($user_id);
});
```

> Note: [[yii\caching\Cache::getOrSet()|getOrSet()]] method supports duration and dependencies as well. 
  See [Cache Expiration](#cache-expiration) and [Cache Dependencies](#cache-dependencies) to know more.
  

## Cache Components <span id="cache-components"></span>

Data caching relies on the so-called *cache components* which represent various cache storage,
such as memory, files, databases.

Cache components are usually registered as [application components](structure-application-components.md) so
that they can be globally configurable
and accessible. The following code shows how to configure the `cache` application component to use
[memcached](https://memcached.org/) with two cache servers:

```php
'components' => [
    'cache' => [
        'class' => 'yii\caching\MemCache',
        'servers' => [
            [
                'host' => 'server1',
                'port' => 11211,
                'weight' => 100,
            ],
            [
                'host' => 'server2',
                'port' => 11211,
                'weight' => 50,
            ],
        ],
    ],
],
```

You can then access the above cache component using the expression `Yii::$app->cache`.

If no cache component is specified, then Yii will use [yii\caching\FileCache](https://www.yiiframework.com/doc/api/2.0/yii-caching-filecache) as default.

Because all cache components support the same set of APIs, you can swap the underlying cache component
with a different one by reconfiguring it in the application configuration without modifying the code that uses the cache.
For example, you can modify the above configuration to use [[yii\caching\ApcCache|APC cache]]:


```php
'components' => [
    'cache' => [
        'class' => 'yii\caching\ApcCache',
    ],
],
```

> Tip: You can register multiple cache application components. The component named `cache` is used
  by default by many cache-dependent classes (e.g. [[yii\web\UrlManager]]).


### Supported Cache Storage <span id="supported-cache-storage"></span>

Yii supports a wide range of cache storage. The following is a summary:

* [[yii\caching\ApcCache]]: uses PHP [APC](https://www.php.net/manual/en/book.apcu.php) extension. This option can be
  considered as the fastest one when dealing with cache for a centralized thick application (e.g. one
  server, no dedicated load balancers, etc.).
* [[yii\caching\DbCache]]: uses a database table to store cached data. To use this cache, you must
  create a table as specified in [[yii\caching\DbCache::cacheTable]].
* [[yii\caching\ArrayCache]]: provides caching for the current request only by storing the values in an array.
  For enhanced performance of ArrayCache, you can disable serialization of the stored data by setting
  [[yii\caching\ArrayCache::$serializer]] to `false`.
* [[yii\caching\DummyCache]]: serves as a cache placeholder which does no real caching.
  The purpose of this component is to simplify the code that needs to check the availability of cache.
  For example, during development or if the server doesn't have actual cache support, you may configure
  a cache component to use this cache. When an actual cache support is enabled, you can switch to use
  the corresponding cache component. In both cases, you may use the same code
  `Yii::$app->cache->get($key)` to attempt retrieving data from the cache without worrying that
  `Yii::$app->cache` might be `null`.
* [[yii\caching\FileCache]]: uses standard files to store cached data. This is particularly suitable
  to cache large chunk of data, such as page content.
* [[yii\caching\MemCache]]: uses PHP [memcache](https://www.php.net/manual/en/book.memcache.php)
  and [memcached](https://www.php.net/manual/en/book.memcached.php) extensions. This option can be considered as
  the fastest one when dealing with cache in a distributed applications (e.g. with several servers, load
  balancers, etc.)
* [[yii\redis\Cache]]: implements a cache component based on [Redis](https://redis.io/) key-value store
  (redis version 2.6.12 or higher is required).
* [[yii\caching\WinCache]]: uses PHP [WinCache](https://iis.net/downloads/microsoft/wincache-extension)
  ([see also](https://www.php.net/manual/en/book.wincache.php)) extension.

> Tip: You may use different cache storage in the same application. A common strategy is to use memory-based
  cache storage to store data that is small but constantly used (e.g. statistical data), and use file-based
  or database-based cache storage to store data that is big and less frequently used (e.g. page content).


## Cache APIs <span id="cache-apis"></span>

All cache components have the same base class [[yii\caching\Cache]] and thus support the following APIs:

* [[yii\caching\Cache::get()|get()]]: retrieves a data item from cache with a specified key. A `false`
  value will be returned if the data item is not found in the cache or is expired/invalidated.
* [[yii\caching\Cache::set()|set()]]: stores a data item identified by a key in cache.
* [[yii\caching\Cache::add()|add()]]: stores a data item identified by a key in cache if the key is not found in the cache.
* [[yii\caching\Cache::getOrSet()|getOrSet()]]: retrieves a data item from cache with a specified key or executes passed
  callback, stores return of the callback in a cache by a key and returns that data.  
* [[yii\caching\Cache::multiGet()|multiGet()]]: retrieves multiple data items from cache with the specified keys.
* [[yii\caching\Cache::multiSet()|multiSet()]]: stores multiple data items in cache. Each item is identified by a key.
* [[yii\caching\Cache::multiAdd()|multiAdd()]]: stores multiple data items in cache. Each item is identified by a key.
  If a key already exists in the cache, the data item will be skipped.
* [[yii\caching\Cache::exists()|exists()]]: returns a value indicating whe
Download .txt
gitextract_0uomsu8b/

├── .appveyor.yml
├── .codecov.yml
├── .dockerignore
├── .editorconfig
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SECURITY.md
│   ├── actions/
│   │   ├── php-setup/
│   │   │   └── action.yml
│   │   └── phpunit/
│   │       └── action.yml
│   └── workflows/
│       ├── build.yml
│       ├── ci-mariadb.yml
│       ├── ci-mssql.yml
│       ├── ci-mysql.yml
│       ├── ci-node.yml
│       ├── ci-oracle.yml
│       ├── ci-pgsql.yml
│       ├── ci-sqlite.yml
│       ├── linter.yaml
│       └── static.yml
├── .gitignore
├── .gitlab-ci.yml
├── .well-known/
│   └── funding-manifest-urls
├── Dockerfile
├── LICENSE.md
├── README.md
├── ROADMAP.md
├── build/
│   ├── .htaccess
│   ├── build
│   ├── build.bat
│   ├── build.xml
│   └── controllers/
│       ├── ClassmapController.php
│       ├── DevController.php
│       ├── MimeTypeController.php
│       ├── PhpDocController.php
│       ├── ReleaseController.php
│       ├── TranslationController.php
│       ├── Utf8Controller.php
│       └── views/
│           └── translation/
│               └── report_html.php
├── code-of-conduct.md
├── composer.json
├── contrib/
│   └── completion/
│       ├── bash/
│       │   └── yii
│       └── zsh/
│           └── _yii
├── docs/
│   ├── documentation_style_guide.md
│   ├── guide/
│   │   ├── README.md
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-json.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-filtering-collections.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-ar/
│   │   ├── README.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   └── start-workflow.md
│   ├── guide-de/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   └── translators.json
│   ├── guide-es/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-multiple-models.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-pagination.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-fr/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── translators.json
│   │   └── tutorial-i18n.md
│   ├── guide-id/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-overview.md
│   │   └── translators.json
│   ├── guide-it/
│   │   ├── README.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   └── start-installation.md
│   ├── guide-ja/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-json.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-filtering-collections.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-pl/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── db-active-record.md
│   │   ├── db-migrations.md
│   │   ├── glossary.md
│   │   ├── helper-overview.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-pagination.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-overview.md
│   │   ├── security-overview.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-overview.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   └── tutorial-yii-as-micro-framework.md
│   ├── guide-pt-BR/
│   │   ├── README.md
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-data-providers.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-overview.md
│   │   ├── translators.json
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-shared-hosting.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-ru/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-json.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-filtering-collections.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-tr/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── intro-yii.md
│   │   ├── start-prerequisites.md
│   │   └── translators.json
│   ├── guide-uk/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-fragment.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── images/
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-models.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── tutorial-console.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   └── tutorial-yii-integration.md
│   ├── guide-uz/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-page.md
│   │   ├── images/
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-workflow.md
│   │   └── structure-controllers.md
│   ├── guide-vi/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   └── structure-views.md
│   ├── guide-zh-CN/
│   │   ├── README.md
│   │   ├── blocktypes.json
│   │   ├── caching-data.md
│   │   ├── caching-fragment.md
│   │   ├── caching-http.md
│   │   ├── caching-overview.md
│   │   ├── caching-page.md
│   │   ├── concept-aliases.md
│   │   ├── concept-autoloading.md
│   │   ├── concept-behaviors.md
│   │   ├── concept-components.md
│   │   ├── concept-configurations.md
│   │   ├── concept-di-container.md
│   │   ├── concept-events.md
│   │   ├── concept-properties.md
│   │   ├── concept-service-locator.md
│   │   ├── db-active-record.md
│   │   ├── db-dao.md
│   │   ├── db-migrations.md
│   │   ├── db-query-builder.md
│   │   ├── documentation_style_guide.md
│   │   ├── glossary.md
│   │   ├── helper-array.md
│   │   ├── helper-html.md
│   │   ├── helper-overview.md
│   │   ├── helper-url.md
│   │   ├── images/
│   │   │   ├── advanced-app-configs.graphml
│   │   │   ├── application-lifecycle.graphml
│   │   │   ├── application-structure.graphml
│   │   │   ├── rbac-access-check-1.graphml
│   │   │   ├── rbac-access-check-2.graphml
│   │   │   ├── rbac-access-check-3.graphml
│   │   │   ├── rbac-hierarchy-1.graphml
│   │   │   ├── rbac-hierarchy-2.graphml
│   │   │   └── request-lifecycle.graphml
│   │   ├── input-file-upload.md
│   │   ├── input-form-javascript.md
│   │   ├── input-forms.md
│   │   ├── input-multiple-models.md
│   │   ├── input-tabular-input.md
│   │   ├── input-validation.md
│   │   ├── intro-upgrade-from-v1.md
│   │   ├── intro-yii.md
│   │   ├── output-client-scripts.md
│   │   ├── output-data-providers.md
│   │   ├── output-data-widgets.md
│   │   ├── output-formatting.md
│   │   ├── output-pagination.md
│   │   ├── output-sorting.md
│   │   ├── output-theming.md
│   │   ├── rest-authentication.md
│   │   ├── rest-controllers.md
│   │   ├── rest-error-handling.md
│   │   ├── rest-quick-start.md
│   │   ├── rest-rate-limiting.md
│   │   ├── rest-resources.md
│   │   ├── rest-response-formatting.md
│   │   ├── rest-routing.md
│   │   ├── rest-versioning.md
│   │   ├── runtime-bootstrapping.md
│   │   ├── runtime-handling-errors.md
│   │   ├── runtime-logging.md
│   │   ├── runtime-overview.md
│   │   ├── runtime-requests.md
│   │   ├── runtime-responses.md
│   │   ├── runtime-routing.md
│   │   ├── runtime-sessions-cookies.md
│   │   ├── security-authentication.md
│   │   ├── security-authorization.md
│   │   ├── security-best-practices.md
│   │   ├── security-cryptography.md
│   │   ├── security-overview.md
│   │   ├── security-passwords.md
│   │   ├── start-databases.md
│   │   ├── start-forms.md
│   │   ├── start-gii.md
│   │   ├── start-hello.md
│   │   ├── start-installation.md
│   │   ├── start-looking-ahead.md
│   │   ├── start-prerequisites.md
│   │   ├── start-workflow.md
│   │   ├── structure-application-components.md
│   │   ├── structure-applications.md
│   │   ├── structure-assets.md
│   │   ├── structure-controllers.md
│   │   ├── structure-entry-scripts.md
│   │   ├── structure-extensions.md
│   │   ├── structure-filters.md
│   │   ├── structure-models.md
│   │   ├── structure-modules.md
│   │   ├── structure-overview.md
│   │   ├── structure-views.md
│   │   ├── structure-widgets.md
│   │   ├── test-acceptance.md
│   │   ├── test-environment-setup.md
│   │   ├── test-fixtures.md
│   │   ├── test-functional.md
│   │   ├── test-overview.md
│   │   ├── test-unit.md
│   │   ├── translators.json
│   │   ├── tutorial-console.md
│   │   ├── tutorial-core-validators.md
│   │   ├── tutorial-docker.md
│   │   ├── tutorial-i18n.md
│   │   ├── tutorial-mailing.md
│   │   ├── tutorial-performance-tuning.md
│   │   ├── tutorial-shared-hosting.md
│   │   ├── tutorial-start-from-scratch.md
│   │   ├── tutorial-template-engines.md
│   │   ├── tutorial-yii-as-micro-framework.md
│   │   └── tutorial-yii-integration.md
│   ├── internals/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── exception_hierarchy.vsd
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── schema-builder-patterns.xlsx
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-es/
│   │   └── translation-workflow.md
│   ├── internals-fa/
│   │   └── core-code-style.md
│   ├── internals-ja/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── exception_hierarchy.vsd
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── schema-builder-patterns.xlsx
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-pl/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── exception_hierarchy.vsd
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── schema-builder-patterns.xlsx
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-pt-BR/
│   │   └── translation-workflow.md
│   ├── internals-ru/
│   │   ├── README.md
│   │   ├── automation.md
│   │   ├── bc.md
│   │   ├── blocktypes.json
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── project-organization.md
│   │   ├── pull-request-qa.md
│   │   ├── release.md
│   │   ├── report-an-issue.md
│   │   ├── translation-status.md
│   │   ├── translation-teams.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   ├── internals-sr-Latn/
│   │   ├── automation.md
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── report-an-issue.md
│   │   └── translation-workflow.md
│   ├── internals-uk/
│   │   ├── automation.md
│   │   ├── core-code-style.md
│   │   ├── design-decisions.md
│   │   ├── getting-started.md
│   │   ├── git-workflow.md
│   │   ├── report-an-issue.md
│   │   ├── translation-workflow.md
│   │   ├── versions.md
│   │   └── view-code-style.md
│   └── internals-uz/
│       └── translation-workflow.md
├── eslint.config.js
├── framework/
│   ├── .github/
│   │   ├── CONTRIBUTING.md
│   │   ├── FUNDING.yml
│   │   ├── PULL_REQUEST_TEMPLATE.md
│   │   └── SECURITY.md
│   ├── .gitignore
│   ├── .htaccess
│   ├── .meta-storm/
│   │   ├── active-record.meta-storm.xml
│   │   ├── array.meta-storm.xml
│   │   ├── controller.meta-storm.xml
│   │   ├── db.meta-storm.xml
│   │   ├── html.meta-storm.xml
│   │   ├── model.meta-storm.xml
│   │   ├── view.meta-storm.xml
│   │   └── widgets.meta-storm.xml
│   ├── .phpstorm.meta.php
│   ├── BaseYii.php
│   ├── CHANGELOG.md
│   ├── LICENSE.md
│   ├── README.md
│   ├── UPGRADE.md
│   ├── Yii.php
│   ├── assets/
│   │   ├── yii.activeForm.js
│   │   ├── yii.captcha.js
│   │   ├── yii.gridView.js
│   │   ├── yii.js
│   │   └── yii.validation.js
│   ├── base/
│   │   ├── Action.php
│   │   ├── ActionEvent.php
│   │   ├── ActionFilter.php
│   │   ├── Application.php
│   │   ├── ArrayAccessTrait.php
│   │   ├── Arrayable.php
│   │   ├── ArrayableTrait.php
│   │   ├── BaseObject.php
│   │   ├── Behavior.php
│   │   ├── BootstrapInterface.php
│   │   ├── Component.php
│   │   ├── Configurable.php
│   │   ├── Controller.php
│   │   ├── DynamicContentAwareInterface.php
│   │   ├── DynamicContentAwareTrait.php
│   │   ├── DynamicModel.php
│   │   ├── ErrorException.php
│   │   ├── ErrorHandler.php
│   │   ├── Event.php
│   │   ├── Exception.php
│   │   ├── ExitException.php
│   │   ├── InlineAction.php
│   │   ├── InvalidArgumentException.php
│   │   ├── InvalidCallException.php
│   │   ├── InvalidConfigException.php
│   │   ├── InvalidParamException.php
│   │   ├── InvalidRouteException.php
│   │   ├── InvalidValueException.php
│   │   ├── Model.php
│   │   ├── ModelEvent.php
│   │   ├── Module.php
│   │   ├── NotSupportedException.php
│   │   ├── Request.php
│   │   ├── Response.php
│   │   ├── Security.php
│   │   ├── StaticInstanceInterface.php
│   │   ├── StaticInstanceTrait.php
│   │   ├── Theme.php
│   │   ├── UnknownClassException.php
│   │   ├── UnknownMethodException.php
│   │   ├── UnknownPropertyException.php
│   │   ├── UserException.php
│   │   ├── View.php
│   │   ├── ViewContextInterface.php
│   │   ├── ViewEvent.php
│   │   ├── ViewNotFoundException.php
│   │   ├── ViewRenderer.php
│   │   ├── Widget.php
│   │   ├── WidgetEvent.php
│   │   └── package.json
│   ├── behaviors/
│   │   ├── AttributeBehavior.php
│   │   ├── AttributeTypecastBehavior.php
│   │   ├── AttributesBehavior.php
│   │   ├── BlameableBehavior.php
│   │   ├── CacheableWidgetBehavior.php
│   │   ├── OptimisticLockBehavior.php
│   │   ├── SluggableBehavior.php
│   │   └── TimestampBehavior.php
│   ├── caching/
│   │   ├── ApcCache.php
│   │   ├── ArrayCache.php
│   │   ├── Cache.php
│   │   ├── CacheInterface.php
│   │   ├── CallbackDependency.php
│   │   ├── ChainedDependency.php
│   │   ├── DbCache.php
│   │   ├── DbDependency.php
│   │   ├── DbQueryDependency.php
│   │   ├── Dependency.php
│   │   ├── DummyCache.php
│   │   ├── ExpressionDependency.php
│   │   ├── FileCache.php
│   │   ├── FileDependency.php
│   │   ├── MemCache.php
│   │   ├── MemCacheServer.php
│   │   ├── TagDependency.php
│   │   ├── WinCache.php
│   │   └── migrations/
│   │       ├── m150909_153426_cache_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── captcha/
│   │   ├── Captcha.php
│   │   ├── CaptchaAction.php
│   │   ├── CaptchaAsset.php
│   │   ├── CaptchaValidator.php
│   │   └── SpicyRice.md
│   ├── classes.php
│   ├── composer.json
│   ├── console/
│   │   ├── Application.php
│   │   ├── Controller.php
│   │   ├── ErrorHandler.php
│   │   ├── Exception.php
│   │   ├── ExitCode.php
│   │   ├── Markdown.php
│   │   ├── Request.php
│   │   ├── Response.php
│   │   ├── UnknownCommandException.php
│   │   ├── controllers/
│   │   │   ├── AssetController.php
│   │   │   ├── BaseMigrateController.php
│   │   │   ├── CacheController.php
│   │   │   ├── FixtureController.php
│   │   │   ├── HelpController.php
│   │   │   ├── MessageController.php
│   │   │   ├── MigrateController.php
│   │   │   └── ServeController.php
│   │   ├── runtime/
│   │   │   └── .gitignore
│   │   └── widgets/
│   │       └── Table.php
│   ├── data/
│   │   ├── ActiveDataFilter.php
│   │   ├── ActiveDataProvider.php
│   │   ├── ArrayDataProvider.php
│   │   ├── BaseDataProvider.php
│   │   ├── DataFilter.php
│   │   ├── DataProviderInterface.php
│   │   ├── Pagination.php
│   │   ├── Sort.php
│   │   └── SqlDataProvider.php
│   ├── db/
│   │   ├── ActiveQuery.php
│   │   ├── ActiveQueryInterface.php
│   │   ├── ActiveQueryTrait.php
│   │   ├── ActiveRecord.php
│   │   ├── ActiveRecordInterface.php
│   │   ├── ActiveRelationTrait.php
│   │   ├── AfterSaveEvent.php
│   │   ├── ArrayExpression.php
│   │   ├── BaseActiveRecord.php
│   │   ├── BatchQueryResult.php
│   │   ├── CheckConstraint.php
│   │   ├── ColumnSchema.php
│   │   ├── ColumnSchemaBuilder.php
│   │   ├── Command.php
│   │   ├── Connection.php
│   │   ├── Constraint.php
│   │   ├── ConstraintFinderInterface.php
│   │   ├── ConstraintFinderTrait.php
│   │   ├── DataReader.php
│   │   ├── DefaultValueConstraint.php
│   │   ├── Exception.php
│   │   ├── Expression.php
│   │   ├── ExpressionBuilder.php
│   │   ├── ExpressionBuilderInterface.php
│   │   ├── ExpressionBuilderTrait.php
│   │   ├── ExpressionInterface.php
│   │   ├── ForeignKeyConstraint.php
│   │   ├── IndexConstraint.php
│   │   ├── IntegrityException.php
│   │   ├── JsonExpression.php
│   │   ├── Migration.php
│   │   ├── MigrationInterface.php
│   │   ├── PdoValue.php
│   │   ├── PdoValueBuilder.php
│   │   ├── Query.php
│   │   ├── QueryBuilder.php
│   │   ├── QueryExpressionBuilder.php
│   │   ├── QueryInterface.php
│   │   ├── QueryTrait.php
│   │   ├── Schema.php
│   │   ├── SchemaBuilderTrait.php
│   │   ├── SqlToken.php
│   │   ├── SqlTokenizer.php
│   │   ├── StaleObjectException.php
│   │   ├── TableSchema.php
│   │   ├── Transaction.php
│   │   ├── ViewFinderTrait.php
│   │   ├── conditions/
│   │   │   ├── AndCondition.php
│   │   │   ├── BetweenColumnsCondition.php
│   │   │   ├── BetweenColumnsConditionBuilder.php
│   │   │   ├── BetweenCondition.php
│   │   │   ├── BetweenConditionBuilder.php
│   │   │   ├── ConditionInterface.php
│   │   │   ├── ConjunctionCondition.php
│   │   │   ├── ConjunctionConditionBuilder.php
│   │   │   ├── ExistsCondition.php
│   │   │   ├── ExistsConditionBuilder.php
│   │   │   ├── HashCondition.php
│   │   │   ├── HashConditionBuilder.php
│   │   │   ├── InCondition.php
│   │   │   ├── InConditionBuilder.php
│   │   │   ├── LikeCondition.php
│   │   │   ├── LikeConditionBuilder.php
│   │   │   ├── NotCondition.php
│   │   │   ├── NotConditionBuilder.php
│   │   │   ├── OrCondition.php
│   │   │   ├── SimpleCondition.php
│   │   │   └── SimpleConditionBuilder.php
│   │   ├── cubrid/
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── QueryBuilder.php
│   │   │   ├── Schema.php
│   │   │   └── conditions/
│   │   │       └── LikeConditionBuilder.php
│   │   ├── mssql/
│   │   │   ├── ColumnSchema.php
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── DBLibPDO.php
│   │   │   ├── PDO.php
│   │   │   ├── QueryBuilder.php
│   │   │   ├── Schema.php
│   │   │   ├── SqlsrvPDO.php
│   │   │   ├── TableSchema.php
│   │   │   └── conditions/
│   │   │       ├── InConditionBuilder.php
│   │   │       └── LikeConditionBuilder.php
│   │   ├── mysql/
│   │   │   ├── ColumnSchema.php
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── JsonExpressionBuilder.php
│   │   │   ├── QueryBuilder.php
│   │   │   └── Schema.php
│   │   ├── oci/
│   │   │   ├── ColumnSchemaBuilder.php
│   │   │   ├── Command.php
│   │   │   ├── QueryBuilder.php
│   │   │   ├── Schema.php
│   │   │   └── conditions/
│   │   │       ├── InConditionBuilder.php
│   │   │       └── LikeConditionBuilder.php
│   │   ├── pgsql/
│   │   │   ├── ArrayExpressionBuilder.php
│   │   │   ├── ArrayParser.php
│   │   │   ├── ColumnSchema.php
│   │   │   ├── JsonExpressionBuilder.php
│   │   │   ├── QueryBuilder.php
│   │   │   └── Schema.php
│   │   └── sqlite/
│   │       ├── ColumnSchemaBuilder.php
│   │       ├── Command.php
│   │       ├── QueryBuilder.php
│   │       ├── Schema.php
│   │       ├── SqlTokenizer.php
│   │       └── conditions/
│   │           ├── InConditionBuilder.php
│   │           └── LikeConditionBuilder.php
│   ├── di/
│   │   ├── Container.php
│   │   ├── Instance.php
│   │   ├── NotInstantiableException.php
│   │   └── ServiceLocator.php
│   ├── filters/
│   │   ├── AccessControl.php
│   │   ├── AccessRule.php
│   │   ├── AjaxFilter.php
│   │   ├── ContentNegotiator.php
│   │   ├── Cors.php
│   │   ├── HostControl.php
│   │   ├── HttpCache.php
│   │   ├── PageCache.php
│   │   ├── RateLimitInterface.php
│   │   ├── RateLimiter.php
│   │   ├── VerbFilter.php
│   │   └── auth/
│   │       ├── AuthInterface.php
│   │       ├── AuthMethod.php
│   │       ├── CompositeAuth.php
│   │       ├── HttpBasicAuth.php
│   │       ├── HttpBearerAuth.php
│   │       ├── HttpHeaderAuth.php
│   │       └── QueryParamAuth.php
│   ├── grid/
│   │   ├── ActionColumn.php
│   │   ├── CheckboxColumn.php
│   │   ├── Column.php
│   │   ├── DataColumn.php
│   │   ├── GridView.php
│   │   ├── GridViewAsset.php
│   │   ├── RadioButtonColumn.php
│   │   └── SerialColumn.php
│   ├── helpers/
│   │   ├── ArrayHelper.php
│   │   ├── BaseArrayHelper.php
│   │   ├── BaseConsole.php
│   │   ├── BaseFileHelper.php
│   │   ├── BaseFormatConverter.php
│   │   ├── BaseHtml.php
│   │   ├── BaseHtmlPurifier.php
│   │   ├── BaseInflector.php
│   │   ├── BaseIpHelper.php
│   │   ├── BaseJson.php
│   │   ├── BaseMarkdown.php
│   │   ├── BaseStringHelper.php
│   │   ├── BaseUrl.php
│   │   ├── BaseVarDumper.php
│   │   ├── Console.php
│   │   ├── FileHelper.php
│   │   ├── FormatConverter.php
│   │   ├── Html.php
│   │   ├── HtmlPurifier.php
│   │   ├── Inflector.php
│   │   ├── IpHelper.php
│   │   ├── Json.php
│   │   ├── Markdown.php
│   │   ├── ReplaceArrayValue.php
│   │   ├── StringHelper.php
│   │   ├── UnsetArrayValue.php
│   │   ├── Url.php
│   │   ├── VarDumper.php
│   │   ├── mimeAliases.php
│   │   ├── mimeExtensions.php
│   │   └── mimeTypes.php
│   ├── i18n/
│   │   ├── DbMessageSource.php
│   │   ├── Formatter.php
│   │   ├── GettextFile.php
│   │   ├── GettextMessageSource.php
│   │   ├── GettextMoFile.php
│   │   ├── GettextPoFile.php
│   │   ├── I18N.php
│   │   ├── Locale.php
│   │   ├── MessageFormatter.php
│   │   ├── MessageSource.php
│   │   ├── MissingTranslationEvent.php
│   │   ├── PhpMessageSource.php
│   │   └── migrations/
│   │       ├── m150207_210500_i18n_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── log/
│   │   ├── DbTarget.php
│   │   ├── Dispatcher.php
│   │   ├── EmailTarget.php
│   │   ├── FileTarget.php
│   │   ├── LogRuntimeException.php
│   │   ├── Logger.php
│   │   ├── SyslogTarget.php
│   │   ├── Target.php
│   │   └── migrations/
│   │       ├── m141106_185632_log_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── mail/
│   │   ├── BaseMailer.php
│   │   ├── BaseMessage.php
│   │   ├── MailEvent.php
│   │   ├── MailerInterface.php
│   │   └── MessageInterface.php
│   ├── messages/
│   │   ├── af/
│   │   │   └── yii.php
│   │   ├── ar/
│   │   │   └── yii.php
│   │   ├── az/
│   │   │   └── yii.php
│   │   ├── be/
│   │   │   └── yii.php
│   │   ├── bg/
│   │   │   └── yii.php
│   │   ├── bs/
│   │   │   └── yii.php
│   │   ├── ca/
│   │   │   └── yii.php
│   │   ├── config.php
│   │   ├── cs/
│   │   │   └── yii.php
│   │   ├── da/
│   │   │   └── yii.php
│   │   ├── de/
│   │   │   └── yii.php
│   │   ├── el/
│   │   │   └── yii.php
│   │   ├── es/
│   │   │   └── yii.php
│   │   ├── et/
│   │   │   └── yii.php
│   │   ├── fa/
│   │   │   └── yii.php
│   │   ├── fi/
│   │   │   └── yii.php
│   │   ├── fr/
│   │   │   └── yii.php
│   │   ├── ga/
│   │   │   └── yii.php
│   │   ├── he/
│   │   │   └── yii.php
│   │   ├── hi/
│   │   │   └── yii.php
│   │   ├── hr/
│   │   │   └── yii.php
│   │   ├── hu/
│   │   │   └── yii.php
│   │   ├── hy/
│   │   │   └── yii.php
│   │   ├── id/
│   │   │   └── yii.php
│   │   ├── it/
│   │   │   └── yii.php
│   │   ├── ja/
│   │   │   └── yii.php
│   │   ├── ka/
│   │   │   └── yii.php
│   │   ├── kk/
│   │   │   └── yii.php
│   │   ├── ko/
│   │   │   └── yii.php
│   │   ├── kz/
│   │   │   └── yii.php
│   │   ├── lt/
│   │   │   └── yii.php
│   │   ├── lv/
│   │   │   └── yii.php
│   │   ├── ms/
│   │   │   └── yii.php
│   │   ├── mt/
│   │   │   └── yii.php
│   │   ├── nb-NO/
│   │   │   └── yii.php
│   │   ├── nl/
│   │   │   └── yii.php
│   │   ├── pl/
│   │   │   └── yii.php
│   │   ├── pt/
│   │   │   └── yii.php
│   │   ├── pt-BR/
│   │   │   └── yii.php
│   │   ├── ro/
│   │   │   └── yii.php
│   │   ├── ru/
│   │   │   └── yii.php
│   │   ├── sk/
│   │   │   └── yii.php
│   │   ├── sl/
│   │   │   └── yii.php
│   │   ├── sr/
│   │   │   └── yii.php
│   │   ├── sr-Latn/
│   │   │   └── yii.php
│   │   ├── sv/
│   │   │   └── yii.php
│   │   ├── tg/
│   │   │   └── yii.php
│   │   ├── th/
│   │   │   └── yii.php
│   │   ├── tr/
│   │   │   └── yii.php
│   │   ├── uk/
│   │   │   └── yii.php
│   │   ├── uz/
│   │   │   └── yii.php
│   │   ├── uz-Cy/
│   │   │   └── yii.php
│   │   ├── vi/
│   │   │   └── yii.php
│   │   ├── zh/
│   │   │   └── yii.php
│   │   └── zh-TW/
│   │       └── yii.php
│   ├── mutex/
│   │   ├── DbMutex.php
│   │   ├── FileMutex.php
│   │   ├── Mutex.php
│   │   ├── MysqlMutex.php
│   │   ├── OracleMutex.php
│   │   ├── PgsqlMutex.php
│   │   └── RetryAcquireTrait.php
│   ├── rbac/
│   │   ├── Assignment.php
│   │   ├── BaseManager.php
│   │   ├── CheckAccessInterface.php
│   │   ├── DbManager.php
│   │   ├── Item.php
│   │   ├── ManagerInterface.php
│   │   ├── Permission.php
│   │   ├── PhpManager.php
│   │   ├── Role.php
│   │   ├── Rule.php
│   │   └── migrations/
│   │       ├── m140506_102106_rbac_init.php
│   │       ├── m170907_052038_rbac_add_index_on_auth_assignment_user_id.php
│   │       ├── m180523_151638_rbac_updates_indexes_without_prefix.php
│   │       ├── m200409_110543_rbac_update_mssql_trigger.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── requirements/
│   │   ├── YiiRequirementChecker.php
│   │   ├── requirements.php
│   │   └── views/
│   │       ├── console/
│   │       │   └── index.php
│   │       └── web/
│   │           ├── css.php
│   │           └── index.php
│   ├── rest/
│   │   ├── Action.php
│   │   ├── ActiveController.php
│   │   ├── Controller.php
│   │   ├── CreateAction.php
│   │   ├── DeleteAction.php
│   │   ├── IndexAction.php
│   │   ├── OptionsAction.php
│   │   ├── Serializer.php
│   │   ├── UpdateAction.php
│   │   ├── UrlRule.php
│   │   └── ViewAction.php
│   ├── test/
│   │   ├── ActiveFixture.php
│   │   ├── ArrayFixture.php
│   │   ├── BaseActiveFixture.php
│   │   ├── DbFixture.php
│   │   ├── FileFixtureTrait.php
│   │   ├── Fixture.php
│   │   ├── FixtureTrait.php
│   │   └── InitDbFixture.php
│   ├── validators/
│   │   ├── BooleanValidator.php
│   │   ├── CompareValidator.php
│   │   ├── DateValidator.php
│   │   ├── DefaultValueValidator.php
│   │   ├── EachValidator.php
│   │   ├── EmailValidator.php
│   │   ├── ExistValidator.php
│   │   ├── FileValidator.php
│   │   ├── FilterValidator.php
│   │   ├── ImageValidator.php
│   │   ├── InlineValidator.php
│   │   ├── IpValidator.php
│   │   ├── NumberValidator.php
│   │   ├── PunycodeAsset.php
│   │   ├── RangeValidator.php
│   │   ├── RegularExpressionValidator.php
│   │   ├── RequiredValidator.php
│   │   ├── SafeValidator.php
│   │   ├── StringValidator.php
│   │   ├── TrimValidator.php
│   │   ├── UniqueValidator.php
│   │   ├── UrlValidator.php
│   │   ├── ValidationAsset.php
│   │   └── Validator.php
│   ├── views/
│   │   ├── _addColumns.php
│   │   ├── _addComments.php
│   │   ├── _addForeignKeys.php
│   │   ├── _createTable.php
│   │   ├── _dropColumns.php
│   │   ├── _dropForeignKeys.php
│   │   ├── _dropTable.php
│   │   ├── _foreignTables.php
│   │   ├── addColumnMigration.php
│   │   ├── createJunctionMigration.php
│   │   ├── createTableMigration.php
│   │   ├── dropColumnMigration.php
│   │   ├── dropTableMigration.php
│   │   ├── errorHandler/
│   │   │   ├── callStackItem.php
│   │   │   ├── error.php
│   │   │   ├── exception.php
│   │   │   └── previousException.php
│   │   ├── messageConfig.php
│   │   └── migration.php
│   ├── web/
│   │   ├── Application.php
│   │   ├── AssetBundle.php
│   │   ├── AssetConverter.php
│   │   ├── AssetConverterInterface.php
│   │   ├── AssetManager.php
│   │   ├── BadRequestHttpException.php
│   │   ├── CacheSession.php
│   │   ├── CompositeUrlRule.php
│   │   ├── ConflictHttpException.php
│   │   ├── Controller.php
│   │   ├── Cookie.php
│   │   ├── CookieCollection.php
│   │   ├── DbSession.php
│   │   ├── ErrorAction.php
│   │   ├── ErrorHandler.php
│   │   ├── ForbiddenHttpException.php
│   │   ├── GoneHttpException.php
│   │   ├── GroupUrlRule.php
│   │   ├── HeaderCollection.php
│   │   ├── HeadersAlreadySentException.php
│   │   ├── HtmlResponseFormatter.php
│   │   ├── HttpException.php
│   │   ├── IdentityInterface.php
│   │   ├── JqueryAsset.php
│   │   ├── JsExpression.php
│   │   ├── JsonParser.php
│   │   ├── JsonResponseFormatter.php
│   │   ├── Link.php
│   │   ├── Linkable.php
│   │   ├── MethodNotAllowedHttpException.php
│   │   ├── MultiFieldSession.php
│   │   ├── MultipartFormDataParser.php
│   │   ├── NotAcceptableHttpException.php
│   │   ├── NotFoundHttpException.php
│   │   ├── RangeNotSatisfiableHttpException.php
│   │   ├── Request.php
│   │   ├── RequestParserInterface.php
│   │   ├── Response.php
│   │   ├── ResponseFormatterInterface.php
│   │   ├── ServerErrorHttpException.php
│   │   ├── Session.php
│   │   ├── SessionHandler.php
│   │   ├── SessionIterator.php
│   │   ├── TooManyRequestsHttpException.php
│   │   ├── UnauthorizedHttpException.php
│   │   ├── UnprocessableEntityHttpException.php
│   │   ├── UnsupportedMediaTypeHttpException.php
│   │   ├── UploadedFile.php
│   │   ├── UrlManager.php
│   │   ├── UrlNormalizer.php
│   │   ├── UrlNormalizerRedirectException.php
│   │   ├── UrlRule.php
│   │   ├── UrlRuleInterface.php
│   │   ├── User.php
│   │   ├── UserEvent.php
│   │   ├── View.php
│   │   ├── ViewAction.php
│   │   ├── XmlResponseFormatter.php
│   │   ├── YiiAsset.php
│   │   └── migrations/
│   │       ├── m160313_153426_session_init.php
│   │       ├── schema-mssql.sql
│   │       ├── schema-mysql.sql
│   │       ├── schema-oci.sql
│   │       ├── schema-pgsql.sql
│   │       └── schema-sqlite.sql
│   ├── widgets/
│   │   ├── ActiveField.php
│   │   ├── ActiveForm.php
│   │   ├── ActiveFormAsset.php
│   │   ├── BaseListView.php
│   │   ├── Block.php
│   │   ├── Breadcrumbs.php
│   │   ├── ContentDecorator.php
│   │   ├── DetailView.php
│   │   ├── FragmentCache.php
│   │   ├── InputWidget.php
│   │   ├── LinkPager.php
│   │   ├── LinkSorter.php
│   │   ├── ListView.php
│   │   ├── MaskedInput.php
│   │   ├── MaskedInputAsset.php
│   │   ├── Menu.php
│   │   ├── Pjax.php
│   │   ├── PjaxAsset.php
│   │   └── Spaceless.php
│   ├── yii
│   └── yii.bat
├── package.json
├── phpcs.xml.dist
├── phpstan-7x.dist.neon
├── phpstan-baseline-7x.neon
├── phpstan-baseline.neon
├── phpstan.dist.neon
├── phpunit.xml.dist
└── tests/
    ├── .env-dist
    ├── .gitignore
    ├── .hhconfig
    ├── Dockerfile.caching
    ├── Dockerfile.mssql
    ├── IsOneOfAssert.php
    ├── README.md
    ├── ResultPrinter.php
    ├── TestCase.php
    ├── assets/
    │   └── .gitignore
    ├── bootstrap.php
    ├── data/
    │   ├── ar/
    │   │   ├── ActiveRecord.php
    │   │   ├── Alpha.php
    │   │   ├── Animal.php
    │   │   ├── Beta.php
    │   │   ├── BitValues.php
    │   │   ├── Cat.php
    │   │   ├── Category.php
    │   │   ├── CroppedType.php
    │   │   ├── Customer.php
    │   │   ├── CustomerQuery.php
    │   │   ├── CustomerWithAlias.php
    │   │   ├── CustomerWithConstructor.php
    │   │   ├── DefaultMultiplePk.php
    │   │   ├── DefaultPk.php
    │   │   ├── Department.php
    │   │   ├── Document.php
    │   │   ├── Dog.php
    │   │   ├── Dossier.php
    │   │   ├── Employee.php
    │   │   ├── EnumTypeInCustomSchema.php
    │   │   ├── Item.php
    │   │   ├── NoAutoLabels.php
    │   │   ├── NullValues.php
    │   │   ├── Order.php
    │   │   ├── OrderItem.php
    │   │   ├── OrderItemWithConstructor.php
    │   │   ├── OrderItemWithNullFK.php
    │   │   ├── OrderWithConstructor.php
    │   │   ├── OrderWithNullFK.php
    │   │   ├── Profile.php
    │   │   ├── ProfileWithConstructor.php
    │   │   ├── Storage.php
    │   │   ├── TestTrigger.php
    │   │   ├── TestTriggerAlert.php
    │   │   └── Type.php
    │   ├── base/
    │   │   ├── ArrayAccessObject.php
    │   │   ├── CallableClass.php
    │   │   ├── InvalidRulesModel.php
    │   │   ├── RulesModel.php
    │   │   ├── Singer.php
    │   │   ├── Speaker.php
    │   │   └── TraversableObject.php
    │   ├── cache/
    │   │   └── MockDependency.php
    │   ├── codeclimate/
    │   │   └── phpmd_ruleset.xml
    │   ├── config-docker.php
    │   ├── config.php
    │   ├── console/
    │   │   ├── controllers/
    │   │   │   ├── FakeController.php
    │   │   │   ├── FakeEmptyController.php
    │   │   │   ├── FakeNoDefaultController.php
    │   │   │   └── fixtures/
    │   │   │       ├── DependentActiveFixture.php
    │   │   │       ├── FirstFixture.php
    │   │   │       ├── FirstIndependentActiveFixture.php
    │   │   │       ├── FixtureStorage.php
    │   │   │       ├── GlobalFixture.php
    │   │   │       ├── SecondFixture.php
    │   │   │       ├── SecondIndependentActiveFixture.php
    │   │   │       └── subdir/
    │   │   │           ├── FirstFixture.php
    │   │   │           └── SecondFixture.php
    │   │   └── migrate_create/
    │   │       ├── add_columns_fk.php
    │   │       ├── add_columns_prefix.php
    │   │       ├── add_columns_test.php
    │   │       ├── add_two_columns_test.php
    │   │       ├── create_field_with_colon_default_values.php
    │   │       ├── create_fields.php
    │   │       ├── create_fields_with_col_method_after_default_value.php
    │   │       ├── create_foreign_key.php
    │   │       ├── create_id_field_not_as_pk.php
    │   │       ├── create_id_pk.php
    │   │       ├── create_prefix.php
    │   │       ├── create_products_from_store_table.php
    │   │       ├── create_test.php
    │   │       ├── create_title_pk.php
    │   │       ├── create_title_with_comma_default_values.php
    │   │       ├── create_unsigned_big_pk.php
    │   │       ├── create_unsigned_pk.php
    │   │       ├── default.php
    │   │       ├── drop_columns_test.php
    │   │       ├── drop_fields.php
    │   │       ├── drop_products_from_store_table.php
    │   │       ├── drop_test.php
    │   │       └── junction_test.php
    │   ├── controllers/
    │   │   └── TestController.php
    │   ├── cubrid.sql
    │   ├── helpers/
    │   │   └── CustomDebugInfo.php
    │   ├── i18n/
    │   │   ├── messages/
    │   │   │   ├── de/
    │   │   │   │   └── test.php
    │   │   │   ├── de-DE/
    │   │   │   │   └── test.php
    │   │   │   ├── en-150/
    │   │   │   │   └── test.php
    │   │   │   ├── en-US/
    │   │   │   │   └── test.php
    │   │   │   └── ru/
    │   │   │       └── test.php
    │   │   ├── test.mo
    │   │   └── test.po
    │   ├── modules/
    │   │   └── magic/
    │   │       ├── Module.php
    │   │       └── controllers/
    │   │           ├── ETagController.php
    │   │           └── subFolder/
    │   │               └── SubController.php
    │   ├── mssql.sql
    │   ├── mysql.sql
    │   ├── oci/
    │   │   └── optimize_for_tests.sql
    │   ├── oci.sql
    │   ├── postgres.sql
    │   ├── postgres10.sql
    │   ├── postgres12.sql
    │   ├── rbac/
    │   │   └── UserID.php
    │   ├── sqlite.sql
    │   ├── validators/
    │   │   ├── TestValidator.php
    │   │   └── models/
    │   │       ├── FakedValidationModel.php
    │   │       ├── FakedValidationTypedModel.php
    │   │       ├── ValidatorTestEachAndInlineMethodModel.php
    │   │       ├── ValidatorTestFunctionModel.php
    │   │       ├── ValidatorTestMainModel.php
    │   │       ├── ValidatorTestRefModel.php
    │   │       └── ValidatorTestTypedPropModel.php
    │   ├── views/
    │   │   ├── error.php
    │   │   ├── errorHandler.php
    │   │   ├── errorHandlerForAssetFiles.php
    │   │   ├── layout.php
    │   │   ├── pageCacheLayout.php
    │   │   ├── rawlayout.php
    │   │   ├── simple.php
    │   │   └── widgets/
    │   │       ├── GridView/
    │   │       │   └── gridview.php
    │   │       └── ListView/
    │   │           └── item.php
    │   └── web/
    │       ├── assetSources/
    │       │   ├── css/
    │       │   │   └── stub.css
    │       │   └── js/
    │       │       └── jquery.js
    │       ├── assets/
    │       │   └── .gitignore
    │       └── data.txt
    ├── docker-compose.caching.yml
    ├── docker-compose.mssql.yml
    ├── docker-compose.mysql.yml
    ├── docker-compose.oracle.yml
    ├── docker-compose.pgsql.yml
    ├── docker-compose.yml
    ├── framework/
    │   ├── BaseYiiTest.php
    │   ├── ChangeLogTest.php
    │   ├── ar/
    │   │   └── ActiveRecordTestTrait.php
    │   ├── base/
    │   │   ├── ActionFilterTest.php
    │   │   ├── ApplicationTest.php
    │   │   ├── ArrayableTraitTest.php
    │   │   ├── BaseObjectTest.php
    │   │   ├── BehaviorTest.php
    │   │   ├── ComponentTest.php
    │   │   ├── ControllerTest.php
    │   │   ├── DynamicModelTest.php
    │   │   ├── ErrorExceptionTest.php
    │   │   ├── EventTest.php
    │   │   ├── ExposedSecurity.php
    │   │   ├── ModelTest.php
    │   │   ├── ModuleTest.php
    │   │   ├── SecurityTest.php
    │   │   ├── StaticInstanceTraitTest.php
    │   │   ├── ThemeTest.php
    │   │   ├── ViewTest.php
    │   │   ├── WidgetTest.php
    │   │   ├── fixtures/
    │   │   │   └── themes/
    │   │   │       ├── basic/
    │   │   │       │   └── views/
    │   │   │       │       └── site/
    │   │   │       │           └── index.php
    │   │   │       └── christmas/
    │   │   │           └── views/
    │   │   │               └── site/
    │   │   │                   ├── index.php
    │   │   │                   └── main.php
    │   │   └── stub/
    │   │       ├── AnonymousComponentClass.php
    │   │       └── AnonymousModelClass.php
    │   ├── behaviors/
    │   │   ├── AttributeBehaviorTest.php
    │   │   ├── AttributeTypecastBehaviorTest.php
    │   │   ├── AttributesBehaviorTest.php
    │   │   ├── BlameableBehaviorConsoleTest.php
    │   │   ├── BlameableBehaviorTest.php
    │   │   ├── CacheableWidgetBehaviorTest.php
    │   │   ├── OptimisticLockBehaviorTest.php
    │   │   ├── SluggableBehaviorTest.php
    │   │   └── TimestampBehaviorTest.php
    │   ├── caching/
    │   │   ├── ApcCacheTest.php
    │   │   ├── ArrayCacheTest.php
    │   │   ├── CacheTestCase.php
    │   │   ├── CallbackDependencyTest.php
    │   │   ├── DbCacheTest.php
    │   │   ├── DbDependencyTest.php
    │   │   ├── DbQueryDependencyTest.php
    │   │   ├── DependencyTest.php
    │   │   ├── FileCacheTest.php
    │   │   ├── MemCacheTest.php
    │   │   ├── MemCachedTest.php
    │   │   ├── MssqlCacheTest.php
    │   │   ├── PgSQLCacheTest.php
    │   │   ├── TagDependencyTest.php
    │   │   └── WinCacheTest.php
    │   ├── console/
    │   │   ├── ControllerTest.php
    │   │   ├── FakeController.php
    │   │   ├── FakeHelpController.php
    │   │   ├── FakeHelpControllerWithoutOutput.php
    │   │   ├── FakePhp71Controller.php
    │   │   ├── RequestTest.php
    │   │   ├── UnknownCommandExceptionTest.php
    │   │   ├── controllers/
    │   │   │   ├── AssetControllerTest.php
    │   │   │   ├── BaseMessageControllerTest.php
    │   │   │   ├── CacheControllerTest.php
    │   │   │   ├── DbMessageControllerTest.php
    │   │   │   ├── EchoMigrateController.php
    │   │   │   ├── FixtureControllerTest.php
    │   │   │   ├── HelpControllerTest.php
    │   │   │   ├── MigrateControllerTest.php
    │   │   │   ├── MigrateControllerTestTrait.php
    │   │   │   ├── PHPMessageControllerTest.php
    │   │   │   ├── POMessageControllerTest.php
    │   │   │   ├── ServeControllerTest.php
    │   │   │   ├── SilencedCacheController.php
    │   │   │   ├── StdOutBufferControllerTrait.php
    │   │   │   └── stub/
    │   │   │       └── index.php
    │   │   ├── stubs/
    │   │   │   └── DummyService.php
    │   │   └── widgets/
    │   │       └── TableTest.php
    │   ├── data/
    │   │   ├── ActiveDataFilterTest.php
    │   │   ├── ActiveDataProviderCloningTest.php
    │   │   ├── ActiveDataProviderTest.php
    │   │   ├── ArrayDataProviderTest.php
    │   │   ├── BaseDataProviderTest.php
    │   │   ├── DataFilterTest.php
    │   │   ├── PaginationTest.php
    │   │   ├── SortTest.php
    │   │   └── SqlDataProviderTest.php
    │   ├── db/
    │   │   ├── ActiveQueryModelConnectionTest.php
    │   │   ├── ActiveQueryTest.php
    │   │   ├── ActiveRecordTest.php
    │   │   ├── AnyCaseValue.php
    │   │   ├── AnyValue.php
    │   │   ├── BaseActiveRecordTest.php
    │   │   ├── BatchQueryResultTest.php
    │   │   ├── ColumnSchemaBackedEnumTest.php
    │   │   ├── ColumnSchemaBuilderTest.php
    │   │   ├── ColumnSchemaTest.php
    │   │   ├── CommandTest.php
    │   │   ├── CompareValue.php
    │   │   ├── ConnectionTest.php
    │   │   ├── DatabaseTestCase.php
    │   │   ├── GetTablesAliasTestTrait.php
    │   │   ├── QueryBuilderTest.php
    │   │   ├── QueryTest.php
    │   │   ├── SchemaBuilderTraitTest.php
    │   │   ├── SchemaTest.php
    │   │   ├── SqlTokenTest.php
    │   │   ├── UnqueryableQueryMock.php
    │   │   ├── cubrid/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   └── UniqueValidatorTest.php
    │   │   ├── enums/
    │   │   │   ├── Status.php
    │   │   │   ├── StatusTypeInt.php
    │   │   │   └── StatusTypeString.php
    │   │   ├── mssql/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── DbMessageSourceTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryCacheTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   └── type/
    │   │   │       ├── BooleanTest.php
    │   │   │       └── VarbinaryTest.php
    │   │   ├── mysql/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BaseActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   ├── connection/
    │   │   │   │   └── DeadLockTest.php
    │   │   │   └── type/
    │   │   │       └── JsonTest.php
    │   │   ├── oci/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   └── UniqueValidatorTest.php
    │   │   ├── pgsql/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── ArrayParserTest.php
    │   │   │   ├── BaseActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   └── type/
    │   │   │       └── BooleanTest.php
    │   │   ├── sqlite/
    │   │   │   ├── ActiveDataProviderTest.php
    │   │   │   ├── ActiveFixtureTest.php
    │   │   │   ├── ActiveQueryTest.php
    │   │   │   ├── ActiveRecordTest.php
    │   │   │   ├── BatchQueryResultTest.php
    │   │   │   ├── ColumnSchemaBuilderTest.php
    │   │   │   ├── CommandTest.php
    │   │   │   ├── ConnectionTest.php
    │   │   │   ├── ExistValidatorTest.php
    │   │   │   ├── QueryBuilderTest.php
    │   │   │   ├── QueryTest.php
    │   │   │   ├── SchemaTest.php
    │   │   │   ├── SqlTokenizerTest.php
    │   │   │   ├── UniqueValidatorTest.php
    │   │   │   ├── conditions/
    │   │   │   │   └── InconditionBuilderTest.php
    │   │   │   └── type/
    │   │   │       └── BooleanTest.php
    │   │   ├── stubs/
    │   │   │   └── BackedEnumStubs.php
    │   │   └── testBatchInsertWithYield.php
    │   ├── di/
    │   │   ├── ContainerTest.php
    │   │   ├── InstanceTest.php
    │   │   ├── ServiceLocatorTest.php
    │   │   ├── stubs/
    │   │   │   ├── AbstractColor.php
    │   │   │   ├── Alpha.php
    │   │   │   ├── Bar.php
    │   │   │   ├── BarSetter.php
    │   │   │   ├── Beta.php
    │   │   │   ├── Car.php
    │   │   │   ├── Color.php
    │   │   │   ├── Corge.php
    │   │   │   ├── Foo.php
    │   │   │   ├── FooBaz.php
    │   │   │   ├── FooProperty.php
    │   │   │   ├── Kappa.php
    │   │   │   ├── Qux.php
    │   │   │   ├── QuxAnother.php
    │   │   │   ├── QuxFactory.php
    │   │   │   ├── QuxInterface.php
    │   │   │   ├── StaticMethodsWithIntersectionTypes.php
    │   │   │   ├── StaticMethodsWithUnionTypes.php
    │   │   │   ├── UnionTypeNotNull.php
    │   │   │   ├── UnionTypeNull.php
    │   │   │   ├── UnionTypeWithClass.php
    │   │   │   ├── Variadic.php
    │   │   │   └── Zeta.php
    │   │   └── testContainerWithVariadicCallable.php
    │   ├── filters/
    │   │   ├── AccessRuleTest.php
    │   │   ├── AjaxFilterTest.php
    │   │   ├── ContentNegotiatorTest.php
    │   │   ├── CorsTest.php
    │   │   ├── HostControlTest.php
    │   │   ├── HttpCacheTest.php
    │   │   ├── PageCacheTest.php
    │   │   ├── RateLimiterTest.php
    │   │   ├── auth/
    │   │   │   ├── AuthMethodTest.php
    │   │   │   ├── AuthTest.php
    │   │   │   ├── BasicAuthTest.php
    │   │   │   └── CompositeAuthTest.php
    │   │   └── stubs/
    │   │       ├── ExposedLogger.php
    │   │       ├── MockAuthManager.php
    │   │       ├── RateLimit.php
    │   │       └── UserIdentity.php
    │   ├── grid/
    │   │   ├── ActionColumnTest.php
    │   │   ├── CheckboxColumnTest.php
    │   │   ├── DataColumnTest.php
    │   │   ├── GridViewTest.php
    │   │   ├── RadiobuttonColumnTest.php
    │   │   └── SerialColumnTest.php
    │   ├── helpers/
    │   │   ├── ArrayHelperTest.php
    │   │   ├── BaseConsoleTest.php
    │   │   ├── BaseUrlTest.php
    │   │   ├── ConsoleStub.php
    │   │   ├── ConsoleTest.php
    │   │   ├── FallbackInflector.php
    │   │   ├── FileHelperTest.php
    │   │   ├── FormatConverterTest.php
    │   │   ├── HtmlTest.php
    │   │   ├── InflectorTest.php
    │   │   ├── IpHelperTest.php
    │   │   ├── JsonTest.php
    │   │   ├── MarkdownTest.php
    │   │   ├── ReplaceArrayValueTest.php
    │   │   ├── StringHelperTest.php
    │   │   ├── UnsetArrayValueTest.php
    │   │   ├── UrlTest.php
    │   │   └── VarDumperTest.php
    │   ├── i18n/
    │   │   ├── DbMessageSourceTest.php
    │   │   ├── FallbackMessageFormatterTest.php
    │   │   ├── FormatterDateTest.php
    │   │   ├── FormatterNumberTest.php
    │   │   ├── FormatterTest.php
    │   │   ├── GettextMessageSourceTest.php
    │   │   ├── GettextMoFileTest.php
    │   │   ├── GettextPoFileTest.php
    │   │   ├── I18NTest.php
    │   │   ├── IntlTestHelper.php
    │   │   ├── LocaleTest.php
    │   │   └── MessageFormatterTest.php
    │   ├── log/
    │   │   ├── ArrayTarget.php
    │   │   ├── DbTargetTest.php
    │   │   ├── DispatcherTest.php
    │   │   ├── EmailTargetTest.php
    │   │   ├── FileTargetTest.php
    │   │   ├── LoggerTest.php
    │   │   ├── MySQLTargetTest.php
    │   │   ├── PgSQLTargetTest.php
    │   │   ├── SqliteTargetTest.php
    │   │   ├── SyslogTargetTest.php
    │   │   ├── TargetTest.php
    │   │   └── mocks/
    │   │       ├── CustomLogger.php
    │   │       ├── TargetMock.php
    │   │       └── typed_error.php
    │   ├── mail/
    │   │   ├── BaseMailerTest.php
    │   │   └── BaseMessageTest.php
    │   ├── models/
    │   │   └── JsonModel.php
    │   ├── mutex/
    │   │   ├── FileMutexTest.php
    │   │   ├── MutexTestTrait.php
    │   │   ├── MysqlMutexTest.php
    │   │   ├── PgsqlMutexTest.php
    │   │   ├── RetryAcquireTraitTest.php
    │   │   └── mocks/
    │   │       └── DumbMutex.php
    │   ├── rbac/
    │   │   ├── ActionRule.php
    │   │   ├── AuthorRule.php
    │   │   ├── DbManagerTestCase.php
    │   │   ├── ExposedPhpManager.php
    │   │   ├── ManagerTestCase.php
    │   │   ├── MySQLManagerCacheTest.php
    │   │   ├── MySQLManagerTest.php
    │   │   ├── PgSQLManagerCacheTest.php
    │   │   ├── PgSQLManagerTest.php
    │   │   ├── PhpManagerTest.php
    │   │   └── SqliteManagerTest.php
    │   ├── requirements/
    │   │   └── YiiRequirementCheckerTest.php
    │   ├── rest/
    │   │   ├── IndexActionTest.php
    │   │   ├── SerializerTest.php
    │   │   └── UrlRuleTest.php
    │   ├── test/
    │   │   ├── ActiveFixtureTest.php
    │   │   ├── ArrayFixtureTest.php
    │   │   ├── FixtureTest.php
    │   │   ├── custom/
    │   │   │   └── customer.php
    │   │   └── data/
    │   │       ├── array_fixture.php
    │   │       ├── customer.php
    │   │       └── profile.php
    │   ├── validators/
    │   │   ├── BooleanValidatorTest.php
    │   │   ├── CompareValidatorTest.php
    │   │   ├── DateValidatorTest.php
    │   │   ├── DefaultValueValidatorTest.php
    │   │   ├── EachValidatorTest.php
    │   │   ├── EmailValidatorTest.php
    │   │   ├── ExistValidatorTest.php
    │   │   ├── FileValidatorTest.php
    │   │   ├── FilterValidatorTest.php
    │   │   ├── IpValidatorTest.php
    │   │   ├── NumberValidatorTest.php
    │   │   ├── RangeValidatorTest.php
    │   │   ├── RegularExpressionValidatorTest.php
    │   │   ├── RequiredValidatorTest.php
    │   │   ├── SafeValidatorTest.php
    │   │   ├── StringValidatorTest.php
    │   │   ├── TrimValidatorTest.php
    │   │   ├── UniqueValidatorTest.php
    │   │   ├── UrlValidatorTest.php
    │   │   ├── ValidatorTest.php
    │   │   └── data/
    │   │       └── mimeType/
    │   │           ├── test.odt
    │   │           ├── test.tar.xz
    │   │           ├── test.txt
    │   │           └── test.xml
    │   ├── web/
    │   │   ├── AssetBundleTest.php
    │   │   ├── AssetConverterTest.php
    │   │   ├── ControllerTest.php
    │   │   ├── CookieCollectionTest.php
    │   │   ├── ErrorActionTest.php
    │   │   ├── ErrorHandlerTest.php
    │   │   ├── FakeController.php
    │   │   ├── FakePhp71Controller.php
    │   │   ├── FakePhp7Controller.php
    │   │   ├── FakePhp80Controller.php
    │   │   ├── FormatterTest.php
    │   │   ├── GroupUrlRuleTest.php
    │   │   ├── HeaderCollectionTest.php
    │   │   ├── JsonResponseFormatterTest.php
    │   │   ├── LinkTest.php
    │   │   ├── MultipartFormDataParserTest.php
    │   │   ├── Post.php
    │   │   ├── RequestTest.php
    │   │   ├── ResponseTest.php
    │   │   ├── UploadedFileTest.php
    │   │   ├── UrlManagerCreateUrlTest.php
    │   │   ├── UrlManagerParseUrlTest.php
    │   │   ├── UrlManagerTest.php
    │   │   ├── UrlNormalizerTest.php
    │   │   ├── UrlRuleTest.php
    │   │   ├── UserIdentity.php
    │   │   ├── UserTest.php
    │   │   ├── ViewTest.php
    │   │   ├── XmlResponseFormatterTest.php
    │   │   ├── mocks/
    │   │   │   └── TestRequestComponent.php
    │   │   ├── session/
    │   │   │   ├── AbstractDbSessionTest.php
    │   │   │   ├── CacheSessionTest.php
    │   │   │   ├── SessionTest.php
    │   │   │   ├── SessionTestTrait.php
    │   │   │   ├── mssql/
    │   │   │   │   └── DbSessionTest.php
    │   │   │   ├── mysql/
    │   │   │   │   └── DbSessionTest.php
    │   │   │   ├── pgsql/
    │   │   │   │   └── DbSessionTest.php
    │   │   │   └── sqlite/
    │   │   │       └── DbSessionTest.php
    │   │   └── stubs/
    │   │       ├── CachedUrlRule.php
    │   │       ├── ModelBindingStub.php
    │   │       ├── ModelStub.php
    │   │       └── VendorImage.php
    │   └── widgets/
    │       ├── ActiveFieldTest.php
    │       ├── ActiveFormTest.php
    │       ├── BlockTest.php
    │       ├── BreadcrumbsTest.php
    │       ├── ContentDecoratorTest.php
    │       ├── DetailViewTest.php
    │       ├── FragmentCacheTest.php
    │       ├── LinkPagerTest.php
    │       ├── LinkSorterTest.php
    │       ├── ListViewTest.php
    │       ├── MenuTest.php
    │       ├── PjaxTest.php
    │       └── SpacelessTest.php
    ├── js/
    │   ├── data/
    │   │   ├── yii.activeForm.html
    │   │   ├── yii.gridView.html
    │   │   └── yii.html
    │   └── tests/
    │       ├── yii.activeForm.test.js
    │       ├── yii.captcha.test.js
    │       ├── yii.gridView.test.js
    │       ├── yii.test.js
    │       └── yii.validation.test.js
    ├── runtime/
    │   └── .gitignore
    └── test-local.sh
Download .txt
Showing preview only (327K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3757 symbols across 442 files)

FILE: build/controllers/ClassmapController.php
  class ClassmapController (line 24) | class ClassmapController extends Controller
    method actionCreate (line 33) | public function actionCreate($root = null, $mapFile = null)

FILE: build/controllers/DevController.php
  class DevController (line 30) | class DevController extends Controller
    method actionAll (line 84) | public function actionAll()
    method actionRun (line 116) | public function actionRun($command)
    method actionApp (line 154) | public function actionApp($app, $repo = null)
    method actionExt (line 213) | public function actionExt($extension, $repo = null)
    method options (line 263) | public function options($actionID)
    method cleanupVendorDir (line 279) | protected function cleanupVendorDir($dir)
    method linkFrameworkAndExtensions (line 301) | protected function linkFrameworkAndExtensions($dir, $base)
    method listSubDirs (line 334) | protected function listSubDirs($dir)
    method findDirs (line 363) | protected function findDirs($dir)

FILE: build/controllers/MimeTypeController.php
  class MimeTypeController (line 31) | class MimeTypeController extends Controller
    method actionIndex (line 68) | public function actionIndex($outFile = null, $aliasesOutFile = null, $...
    method generateMimeTypesFile (line 97) | private function generateMimeTypesFile($outFile, $content)
    method generateMimeAliasesFile (line 149) | private function generateMimeAliasesFile($outFile)
    method generateMimeExtensionsFile (line 174) | private function generateMimeExtensionsFile($outFile, $content)

FILE: build/controllers/PhpDocController.php
  class PhpDocController (line 34) | class PhpDocController extends ConsoleController
    method actionProperty (line 102) | public function actionProperty($root = null)
    method actionFix (line 133) | public function actionFix($root = null)
    method options (line 167) | public function options($actionID)
    method findFiles (line 177) | protected function findFiles($root, $needsInclude = true)
    method setUpExtensionAliases (line 298) | private function setUpExtensionAliases($extensionPath)
    method fixFileDoc (line 322) | protected function fixFileDoc(&$lines)
    method fixDocBlockIndentation (line 364) | protected function fixDocBlockIndentation(&$lines)
    method fixParamTypes (line 422) | protected function fixParamTypes($line)
    method fixLineSpacing (line 446) | protected function fixLineSpacing($lines)
    method checkPropertyOrder (line 559) | protected function checkPropertyOrder($lineInfo)
    method updateClassPropertyDocs (line 564) | protected function updateClassPropertyDocs($file, $className, $propert...
    method cleanDocComment (line 655) | protected function cleanDocComment($doc)
    method updateDocComment (line 675) | protected function updateDocComment($doc, $properties, $className)
    method generateClassPropertyDocs (line 743) | protected function generateClassPropertyDocs($fileName)
    method match (line 868) | protected function match($pattern, $subject, $split = false)
    method fixSentence (line 892) | protected function fixSentence($str)
    method getPropParam (line 905) | protected function getPropParam($prop, $param)
    method hash (line 915) | private function hash($string)
    method hasGetterInParents (line 928) | protected function hasGetterInParents($className, $propName)
    method hasSetterInParents (line 951) | protected function hasSetterInParents($className, $propName)
    method isBaseObject (line 974) | protected function isBaseObject($className, \ReflectionClass $ref)
    method shouldSkipClass (line 983) | private function shouldSkipClass($className)

FILE: build/controllers/ReleaseController.php
  class ReleaseController (line 47) | class ReleaseController extends Controller
    method options (line 69) | public function options($actionID)
    method beforeAction (line 85) | public function beforeAction($action)
    method actionInfo (line 100) | public function actionInfo()
    method minWidth (line 142) | private function minWidth($a)
    method actionRelease (line 190) | public function actionRelease(array $what)
    method actionPackage (line 268) | public function actionPackage(array $what)
    method actionSortChangelog (line 322) | public function actionSortChangelog(array $what)
    method printWhat (line 342) | protected function printWhat(array $what, $newVersions, $versions)
    method printWhatUrls (line 361) | protected function printWhatUrls(array $what, $oldVersions)
    method validateWhat (line 381) | protected function validateWhat(array $what, $limit = [], $ensureGitCl...
    method releaseFramework (line 419) | protected function releaseFramework($frameworkPath, $version)
    method releaseApplication (line 560) | protected function releaseApplication($name, $path, $version)
    method setAppAliases (line 643) | protected function setAppAliases($app, $path)
    method resetAppAliases (line 657) | protected function resetAppAliases()
    method packageApplication (line 662) | protected function packageApplication($name, $version, $packagePath)
    method releaseExtension (line 678) | protected function releaseExtension($name, $path, $version)
    method runCommand (line 760) | protected function runCommand($cmd, $path)
    method runGit (line 776) | protected function runGit($cmd, $path)
    method ensureGitClean (line 793) | protected function ensureGitClean($path)
    method gitFetchTags (line 805) | protected function gitFetchTags($path)
    method checkComposer (line 819) | protected function checkComposer($fwPath)
    method closeChangelogs (line 827) | protected function closeChangelogs($what, $version)
    method openChangelogs (line 838) | protected function openChangelogs($what, $version)
    method resortChangelogs (line 854) | protected function resortChangelogs($what, $version)
    method splitChangelog (line 870) | protected function splitChangelog($file, $version)
    method resortChangelog (line 911) | protected function resortChangelog($changelog)
    method getChangelogs (line 937) | protected function getChangelogs($what)
    method getFrameworkChangelog (line 947) | protected function getFrameworkChangelog()
    method getExtensionChangelogs (line 952) | protected function getExtensionChangelogs($what)
    method composerSetStability (line 965) | protected function composerSetStability($what, $version)
    method updateYiiVersion (line 999) | protected function updateYiiVersion($frameworkPath, $version)
    method sed (line 1008) | protected function sed($pattern, $replace, $files)
    method getCurrentVersions (line 1015) | protected function getCurrentVersions(array $what)
    method getNextVersions (line 1047) | protected function getNextVersions(array $versions, $type)

FILE: build/controllers/TranslationController.php
  class TranslationController (line 25) | class TranslationController extends Controller
    method actionReport (line 36) | public function actionReport($sourcePath, $translationPath, $title = '...
    method checkFiles (line 94) | protected function checkFiles($translatedFilePath = null, $sourceFileP...
    method getDiff (line 115) | protected function getDiff($translatedFilePath, $sourceFilePath)
    method highlightDiff (line 127) | public function highlightDiff($diff)

FILE: build/controllers/Utf8Controller.php
  class Utf8Controller (line 23) | class Utf8Controller extends Controller
    method actionCheckGuide (line 33) | public function actionCheckGuide($directory = null)
    method found (line 92) | private function found($what, $char, $line, $pos, $file)
    method unicodeOrd (line 113) | private function unicodeOrd($c)

FILE: framework/BaseYii.php
  class BaseYii (line 64) | class BaseYii
    method getVersion (line 98) | public static function getVersion()
    method getAlias (line 135) | public static function getAlias($alias, $throwException = true)
    method getRootAlias (line 171) | public static function getRootAlias($alias)
    method setAlias (line 221) | public static function setAlias($alias, $path)
    method autoload (line 281) | public static function autoload($className)
    method createObject (line 348) | public static function createObject($type, array $params = [])
    method getLogger (line 382) | public static function getLogger()
    method setLogger (line 395) | public static function setLogger($logger)
    method debug (line 410) | public static function debug($message, $category = 'application')
    method trace (line 424) | public static function trace($message, $category = 'application')
    method error (line 437) | public static function error($message, $category = 'application')
    method warning (line 450) | public static function warning($message, $category = 'application')
    method info (line 463) | public static function info($message, $category = 'application')
    method beginProfile (line 486) | public static function beginProfile($token, $category = 'application')
    method endProfile (line 498) | public static function endProfile($token, $category = 'application')
    method powered (line 508) | public static function powered()
    method t (line 540) | public static function t($category, $message, $params = [], $language ...
    method configure (line 560) | public static function configure($object, $properties)
    method getObjectVars (line 577) | public static function getObjectVars($object)

FILE: framework/Yii.php
  class Yii (line 25) | class Yii extends \yii\BaseYii

FILE: framework/assets/yii.gridView.js
  function initEventHandler (line 248) | function initEventHandler($gridView, type, event, selector, callback)

FILE: framework/assets/yii.js
  function initCsrfHandler (line 356) | function initCsrfHandler()
  function initRedirectHandler (line 367) | function initRedirectHandler()
  function initAssetFilters (line 378) | function initAssetFilters()
  function initDataMethods (line 478) | function initDataMethods()
  function isReloadableAsset (line 506) | function isReloadableAsset(url)
  function escapeRegExp (line 520) | function escapeRegExp(str)
  function getAbsoluteUrl (line 530) | function getAbsoluteUrl(url)

FILE: framework/assets/yii.validation.js
  function getUploadedFiles (line 382) | function getUploadedFiles(attribute, messages, options)
  function validateFile (line 419) | function validateFile(file, messages, options)
  function validateMimeType (line 453) | function validateMimeType(mimeTypes, fileType)
  function validateImageSize (line 464) | function validateImageSize(file, image, messages, options)
  function trimString (line 486) | function trimString(value, options = {skipOnEmpty: true, chars: null})

FILE: framework/base/Action.php
  class Action (line 41) | class Action extends Component
    method __construct (line 60) | public function __construct($id, $controller, $config = [])
    method getUniqueId (line 72) | public function getUniqueId()
    method runWithParams (line 85) | public function runWithParams($params)
    method beforeRun (line 112) | protected function beforeRun()
    method afterRun (line 121) | protected function afterRun()

FILE: framework/base/ActionEvent.php
  class ActionEvent (line 21) | class ActionEvent extends Event
    method __construct (line 44) | public function __construct($action, $config = [])

FILE: framework/base/ActionFilter.php
  class ActionFilter (line 29) | class ActionFilter extends Behavior
    method attach (line 54) | public function attach($owner)
    method detach (line 63) | public function detach()
    method beforeFilter (line 75) | public function beforeFilter($event)
    method afterFilter (line 94) | public function afterFilter($event)
    method beforeAction (line 106) | public function beforeAction($action)
    method afterAction (line 118) | public function afterAction($action, $result)
    method getActionId (line 129) | protected function getActionId($action)
    method isActive (line 149) | protected function isActive($action)

FILE: framework/base/Application.php
  class Application (line 48) | abstract class Application extends Module
    method __construct (line 193) | public function __construct($config = [])
    method preInit (line 215) | public function preInit(&$config)
    method init (line 268) | public function init()
    method bootstrap (line 279) | protected function bootstrap()
    method registerErrorHandler (line 336) | protected function registerErrorHandler(&$config)
    method getUniqueId (line 354) | public function getUniqueId()
    method setBasePath (line 365) | public function setBasePath($path)
    method run (line 376) | public function run()
    method handleRequest (line 409) | abstract public function handleRequest($request);
    method getRuntimePath (line 418) | public function getRuntimePath()
    method setRuntimePath (line 431) | public function setRuntimePath($path)
    method getVendorPath (line 444) | public function getVendorPath()
    method setVendorPath (line 457) | public function setVendorPath($path)
    method getTimeZone (line 473) | public function getTimeZone()
    method setTimeZone (line 485) | public function setTimeZone($value)
    method getDb (line 494) | public function getDb()
    method getLog (line 503) | public function getLog()
    method getErrorHandler (line 512) | public function getErrorHandler()
    method getCache (line 521) | public function getCache()
    method getFormatter (line 530) | public function getFormatter()
    method getRequest (line 539) | public function getRequest()
    method getResponse (line 548) | public function getResponse()
    method getView (line 557) | public function getView()
    method getUrlManager (line 566) | public function getUrlManager()
    method getI18n (line 575) | public function getI18n()
    method getMailer (line 585) | public function getMailer()
    method getAuthManager (line 594) | public function getAuthManager()
    method getAssetManager (line 603) | public function getAssetManager()
    method getSecurity (line 612) | public function getSecurity()
    method coreComponents (line 622) | public function coreComponents()
    method end (line 648) | public function end($status = 0, $response = null)
    method setContainer (line 674) | public function setContainer($config)

FILE: framework/base/ArrayAccessTrait.php
  type ArrayAccessTrait (line 22) | trait ArrayAccessTrait
    method getIterator (line 30) | #[\ReturnTypeWillChange]
    method count (line 41) | #[\ReturnTypeWillChange]
    method offsetExists (line 52) | #[\ReturnTypeWillChange]
    method offsetGet (line 63) | #[\ReturnTypeWillChange]
    method offsetSet (line 74) | #[\ReturnTypeWillChange]
    method offsetUnset (line 84) | #[\ReturnTypeWillChange]

FILE: framework/base/Arrayable.php
  type Arrayable (line 24) | interface Arrayable
    method fields (line 65) | public function fields();
    method extraFields (line 79) | public function extraFields();
    method toArray (line 92) | public function toArray(array $fields = [], array $expand = [], $recur...

FILE: framework/base/ArrayableTrait.php
  type ArrayableTrait (line 25) | trait ArrayableTrait
    method fields (line 72) | public function fields()
    method extraFields (line 96) | public function extraFields()
    method toArray (line 123) | public function toArray(array $fields = [], array $expand = [], $recur...
    method extractRootFields (line 169) | protected function extractRootFields(array $fields)
    method extractFieldsFor (line 194) | protected function extractFieldsFor(array $fields, $rootField)
    method resolveFields (line 217) | protected function resolveFields(array $fields, array $expand)

FILE: framework/base/BaseObject.php
  class BaseObject (line 78) | class BaseObject implements Configurable
    method className (line 85) | public static function className()
    method __construct (line 105) | public function __construct($config = [])
    method init (line 118) | public function init()
    method __get (line 133) | public function __get($name)
    method __set (line 156) | public function __set($name, $value)
    method __isset (line 179) | public function __isset($name)
    method __unset (line 201) | public function __unset($name)
    method __call (line 221) | public function __call($name, $params)
    method hasProperty (line 241) | public function hasProperty($name, $checkVars = true)
    method canGetProperty (line 260) | public function canGetProperty($name, $checkVars = true)
    method canSetProperty (line 279) | public function canSetProperty($name, $checkVars = true)
    method hasMethod (line 292) | public function hasMethod($name)

FILE: framework/base/Behavior.php
  class Behavior (line 26) | class Behavior extends BaseObject
    method events (line 67) | public function events()
    method attach (line 79) | public function attach($owner)
    method detach (line 94) | public function detach()

FILE: framework/base/BootstrapInterface.php
  type BootstrapInterface (line 56) | interface BootstrapInterface
    method bootstrap (line 62) | public function bootstrap($app);

FILE: framework/base/Component.php
  class Component (line 105) | class Component extends BaseObject
    method __get (line 138) | public function __get($name)
    method __set (line 179) | public function __set($name, $value)
    method __isset (line 243) | public function __isset($name)
    method __unset (line 275) | public function __unset($name)
    method __call (line 308) | public function __call($name, $params)
    method __clone (line 323) | public function __clone()
    method hasProperty (line 347) | public function hasProperty($name, $checkVars = true, $checkBehaviors ...
    method canGetProperty (line 368) | public function canGetProperty($name, $checkVars = true, $checkBehavio...
    method canSetProperty (line 400) | public function canSetProperty($name, $checkVars = true, $checkBehavio...
    method hasMethod (line 428) | public function hasMethod($name, $checkBehaviors = true)
    method behaviors (line 469) | public function behaviors()
    method hasEventHandlers (line 479) | public function hasEventHandlers($name)
    method on (line 534) | public function on($name, $handler, $data = null, $append = true)
    method off (line 568) | public function off($name, $handler = null)
    method trigger (line 623) | public function trigger($name, ?Event $event = null)
    method getBehavior (line 669) | public function getBehavior($name)
    method getBehaviors (line 682) | public function getBehaviors()
    method attachBehavior (line 709) | public function attachBehavior($name, $behavior)
    method attachBehaviors (line 722) | public function attachBehaviors($behaviors)
    method detachBehavior (line 739) | public function detachBehavior($name)
    method detachBehaviors (line 755) | public function detachBehaviors()
    method ensureBehaviors (line 766) | public function ensureBehaviors()
    method attachBehaviorInternal (line 784) | private function attachBehaviorInternal($name, $behavior)

FILE: framework/base/Configurable.php
  type Configurable (line 32) | interface Configurable

FILE: framework/base/Controller.php
  class Controller (line 31) | class Controller extends Component implements ViewContextInterface
    method __construct (line 96) | public function __construct($id, $module, $config = [])
    method init (line 107) | public function init()
    method actions (line 136) | public function actions()
    method runAction (line 150) | public function runAction($id, $params = [])
    method run (line 211) | public function run($route, $params = [])
    method bindActionParams (line 233) | public function bindActionParams($action, $params)
    method createAction (line 251) | public function createAction($id)
    method beforeAction (line 308) | public function beforeAction($action)
    method afterAction (line 339) | public function afterAction($action, $result)
    method getModules (line 353) | public function getModules()
    method getUniqueId (line 369) | public function getUniqueId()
    method getRoute (line 378) | public function getRoute()
    method render (line 422) | public function render($view, $params = [])
    method renderContent (line 435) | public function renderContent($content)
    method renderPartial (line 453) | public function renderPartial($view, $params = [])
    method renderFile (line 465) | public function renderFile($file, $params = [])
    method getView (line 477) | public function getView()
    method setView (line 490) | public function setView($view)
    method getViewPath (line 501) | public function getViewPath()
    method setViewPath (line 516) | public function setViewPath($path)
    method findLayoutFile (line 528) | public function findLayoutFile($view)
    method bindInjectedParams (line 578) | final protected function bindInjectedParams(\ReflectionNamedType $type...

FILE: framework/base/DynamicContentAwareInterface.php
  type DynamicContentAwareInterface (line 18) | interface DynamicContentAwareInterface
    method getDynamicPlaceholders (line 25) | public function getDynamicPlaceholders();
    method setDynamicPlaceholders (line 32) | public function setDynamicPlaceholders($placeholders);
    method addDynamicPlaceholder (line 40) | public function addDynamicPlaceholder($name, $statements);

FILE: framework/base/DynamicContentAwareTrait.php
  type DynamicContentAwareTrait (line 18) | trait DynamicContentAwareTrait
    method getView (line 29) | abstract protected function getView();
    method getDynamicPlaceholders (line 34) | public function getDynamicPlaceholders()
    method setDynamicPlaceholders (line 42) | public function setDynamicPlaceholders($placeholders)
    method addDynamicPlaceholder (line 50) | public function addDynamicPlaceholder($name, $statements)
    method updateDynamicContent (line 62) | protected function updateDynamicContent($content, $placeholders, $isRe...

FILE: framework/base/DynamicModel.php
  class DynamicModel (line 55) | class DynamicModel extends Model
    method __construct (line 74) | public function __construct(array $attributes = [], $config = [])
    method __get (line 89) | public function __get($name)
    method __set (line 101) | public function __set($name, $value)
    method __isset (line 113) | public function __isset($name)
    method __unset (line 125) | public function __unset($name)
    method canGetProperty (line 137) | public function canGetProperty($name, $checkVars = true, $checkBehavio...
    method canSetProperty (line 145) | public function canSetProperty($name, $checkVars = true, $checkBehavio...
    method hasAttribute (line 156) | public function hasAttribute($name)
    method defineAttribute (line 166) | public function defineAttribute($name, $value = null)
    method undefineAttribute (line 175) | public function undefineAttribute($name)
    method addRule (line 194) | public function addRule($attributes, $validator, $options = [])
    method validateData (line 219) | public static function validateData(array $data, $rules = [])
    method defineAttributesByValidator (line 248) | private function defineAttributesByValidator($validator)
    method attributes (line 260) | public function attributes()
    method setAttributeLabels (line 271) | public function setAttributeLabels(array $labels = [])
    method setAttributeLabel (line 285) | public function setAttributeLabel($attribute, $label)
    method attributeLabels (line 295) | public function attributeLabels()

FILE: framework/base/ErrorException.php
  class ErrorException (line 19) | class ErrorException extends \ErrorException
    method __construct (line 40) | public function __construct($message = '', $code = 0, $severity = 1, $...
    method isXdebugStackAvailable (line 85) | private function isXdebugStackAvailable()
    method isFatalError (line 112) | public static function isFatalError($error)
    method getName (line 120) | public function getName()

FILE: framework/base/ErrorHandler.php
  class ErrorHandler (line 28) | abstract class ErrorHandler extends Component
    method init (line 75) | public function init()
    method register (line 86) | public function register()
    method unregister (line 112) | public function unregister()
    method handleException (line 130) | public function handleException($exception)
    method handleFallbackExceptionMessage (line 177) | protected function handleFallbackExceptionMessage($exception, $previou...
    method handleHhvmError (line 217) | public function handleHhvmError($code, $message, $file, $line, $contex...
    method handleError (line 252) | public function handleError($code, $message, $file, $line)
    method handleFatalError (line 286) | public function handleFatalError()
    method renderException (line 349) | abstract protected function renderException($exception);
    method logException (line 356) | public function logException($exception)
    method clearOutput (line 370) | public function clearOutput()
    method convertExceptionToError (line 393) | public static function convertExceptionToError($exception)
    method convertExceptionToString (line 403) | public static function convertExceptionToString($exception)
    method convertExceptionToVerboseString (line 423) | public static function convertExceptionToVerboseString($exception)

FILE: framework/base/Event.php
  class Event (line 30) | class Event extends BaseObject
    method on (line 104) | public static function on($class, $name, $handler, $data = null, $appe...
    method off (line 139) | public static function off($class, $name, $handler = null)
    method offAll (line 196) | public static function offAll()
    method hasHandlers (line 210) | public static function hasHandlers($class, $name)
    method trigger (line 263) | public static function trigger($class, $name, $event = null)

FILE: framework/base/Exception.php
  class Exception (line 19) | class Exception extends \Exception
    method getName (line 24) | public function getName()

FILE: framework/base/ExitException.php
  class ExitException (line 19) | class ExitException extends \Exception
    method __construct (line 34) | public function __construct($status = 0, $message = null, $code = 0, $...

FILE: framework/base/InlineAction.php
  class InlineAction (line 27) | class InlineAction extends Action
    method __construct (line 41) | public function __construct($id, $controller, $actionMethod, $config =...
    method runWithParams (line 53) | public function runWithParams($params)

FILE: framework/base/InvalidArgumentException.php
  class InvalidArgumentException (line 17) | class InvalidArgumentException extends InvalidParamException
    method getName (line 22) | public function getName()

FILE: framework/base/InvalidCallException.php
  class InvalidCallException (line 17) | class InvalidCallException extends \BadMethodCallException
    method getName (line 22) | public function getName()

FILE: framework/base/InvalidConfigException.php
  class InvalidConfigException (line 17) | class InvalidConfigException extends Exception
    method getName (line 22) | public function getName()

FILE: framework/base/InvalidParamException.php
  class InvalidParamException (line 18) | class InvalidParamException extends \BadMethodCallException
    method getName (line 23) | public function getName()

FILE: framework/base/InvalidRouteException.php
  class InvalidRouteException (line 17) | class InvalidRouteException extends UserException
    method getName (line 22) | public function getName()

FILE: framework/base/InvalidValueException.php
  class InvalidValueException (line 17) | class InvalidValueException extends \UnexpectedValueException
    method getName (line 22) | public function getName()

FILE: framework/base/Model.php
  class Model (line 74) | class Model extends Component implements StaticInstanceInterface, Iterat...
    method rules (line 172) | public function rules()
    method scenarios (line 202) | public function scenarios()
    method formName (line 268) | public function formName()
    method attributes (line 285) | public function attributes()
    method attributeLabels (line 314) | public function attributeLabels()
    method attributeHints (line 334) | public function attributeHints()
    method validate (line 362) | public function validate($attributeNames = null, $clearErrors = true)
    method beforeValidate (line 400) | public function beforeValidate()
    method afterValidate (line 414) | public function afterValidate()
    method getValidators (line 435) | public function getValidators()
    method getActiveValidators (line 450) | public function getActiveValidators($attribute = null)
    method createValidators (line 479) | public function createValidators()
    method isAttributeRequired (line 510) | public function isAttributeRequired($attribute)
    method isAttributeSafe (line 527) | public function isAttributeSafe($attribute)
    method isAttributeActive (line 538) | public function isAttributeActive($attribute)
    method getAttributeLabel (line 550) | public function getAttributeLabel($attribute)
    method getAttributeHint (line 563) | public function getAttributeHint($attribute)
    method hasErrors (line 574) | public function hasErrors($attribute = null)
    method getErrors (line 600) | public function getErrors($attribute = null)
    method getFirstErrors (line 616) | public function getFirstErrors()
    method getFirstError (line 639) | public function getFirstError($attribute)
    method getErrorSummary (line 653) | public function getErrorSummary($showAllErrors)
    method addError (line 668) | public function addError($attribute, $error = '')
    method addErrors (line 681) | public function addErrors(array $items)
    method clearErrors (line 698) | public function clearErrors($attribute = null)
    method generateAttributeLabel (line 715) | public function generateAttributeLabel($name)
    method getAttributes (line 728) | public function getAttributes($names = null, $except = [])
    method setAttributes (line 752) | public function setAttributes($values, $safeOnly = true)
    method onUnsafeAttribute (line 773) | public function onUnsafeAttribute($name, $value)
    method getScenario (line 788) | public function getScenario()
    method setScenario (line 799) | public function setScenario($value)
    method safeAttributes (line 809) | public function safeAttributes()
    method activeAttributes (line 834) | public function activeAttributes()
    method load (line 884) | public function load($data, $formName = null)
    method loadMultiple (line 915) | public static function loadMultiple($models, $data, $formName = null)
    method validateMultiple (line 952) | public static function validateMultiple($models, $attributeNames = null)
    method fields (line 1008) | public function fields()
    method getIterator (line 1020) | #[\ReturnTypeWillChange]
    method offsetExists (line 1034) | #[\ReturnTypeWillChange]
    method offsetGet (line 1047) | #[\ReturnTypeWillChange]
    method offsetSet (line 1060) | #[\ReturnTypeWillChange]
    method offsetUnset (line 1072) | #[\ReturnTypeWillChange]
    method __clone (line 1081) | public function __clone()

FILE: framework/base/ModelEvent.php
  class ModelEvent (line 17) | class ModelEvent extends Event

FILE: framework/base/Module.php
  class Module (line 42) | class Module extends ServiceLocator
    method __construct (line 157) | public function __construct($id, $parent = null, $config = [])
    method getInstance (line 170) | public static function getInstance()
    method setInstance (line 181) | public static function setInstance($instance)
    method init (line 199) | public function init()
    method getUniqueId (line 214) | public function getUniqueId()
    method getBasePath (line 224) | public function getBasePath()
    method setBasePath (line 240) | public function setBasePath($path)
    method getControllerPath (line 258) | public function getControllerPath()
    method setControllerPath (line 273) | public function setControllerPath($path)
    method getViewPath (line 282) | public function getViewPath()
    method setViewPath (line 296) | public function setViewPath($path)
    method getLayoutPath (line 305) | public function getLayoutPath()
    method setLayoutPath (line 319) | public function setLayoutPath($path)
    method getVersion (line 330) | public function getVersion()
    method setVersion (line 357) | public function setVersion($version)
    method defaultVersion (line 368) | protected function defaultVersion()
    method setAliases (line 392) | public function setAliases($aliases)
    method hasModule (line 406) | public function hasModule($id)
    method getModule (line 427) | public function getModule($id, $load = true)
    method setModule (line 462) | public function setModule($id, $module)
    method getModules (line 481) | public function getModules($loadedOnly = false)
    method setModules (line 521) | public function setModules($modules)
    method runAction (line 541) | public function runAction($route, $params = [])
    method createController (line 585) | public function createController($route)
    method createControllerByID (line 644) | public function createControllerByID($id)
    method isIncorrectClassNameOrPrefix (line 684) | private function isIncorrectClassNameOrPrefix($className, $prefix)
    method beforeAction (line 726) | public function beforeAction($action)
    method afterAction (line 757) | public function afterAction($action, $result)
    method get (line 771) | public function get($id, $throwException = true)
    method has (line 790) | public function has($id, $checkInstance = false)

FILE: framework/base/NotSupportedException.php
  class NotSupportedException (line 17) | class NotSupportedException extends Exception
    method getName (line 22) | public function getName()

FILE: framework/base/Request.php
  class Request (line 24) | abstract class Request extends Component
    method resolve (line 34) | abstract public function resolve();
    method getIsConsoleRequest (line 40) | public function getIsConsoleRequest()
    method setIsConsoleRequest (line 49) | public function setIsConsoleRequest($value)
    method getScriptFile (line 59) | public function getScriptFile()
    method setScriptFile (line 80) | public function setScriptFile($value)

FILE: framework/base/Response.php
  class Response (line 19) | class Response extends Component
    method send (line 31) | public function send()
    method clearOutputBuffers (line 38) | public function clearOutputBuffers()

FILE: framework/base/Security.php
  class Security (line 33) | class Security extends Component
    method shouldUseLibreSSL (line 107) | protected function shouldUseLibreSSL()
    method encryptByPassword (line 136) | public function encryptByPassword($data, $password)
    method encryptByKey (line 155) | public function encryptByKey($data, $inputKey, $info = null)
    method decryptByPassword (line 167) | public function decryptByPassword($data, $password)
    method decryptByKey (line 180) | public function decryptByKey($data, $inputKey, $info = null)
    method encrypt (line 199) | protected function encrypt($data, $passwordBased, $secret, $info)
    method decrypt (line 249) | protected function decrypt($data, $passwordBased, $secret, $info)
    method hkdf (line 299) | public function hkdf($algo, $inputKey, $salt = null, $info = null, $le...
    method pbkdf2 (line 323) | public function pbkdf2($algo, $password, $salt, $iterations, $length = 0)
    method hashData (line 349) | public function hashData($data, $key, $rawHash = false)
    method validateData (line 374) | public function validateData($data, $key, $rawHash = false)
    method generateRandomKey (line 405) | public function generateRandomKey($length = 32)
    method generateRandomString (line 426) | public function generateRandomString($length = 32)
    method generatePasswordHash (line 472) | public function generatePasswordHash($password, $cost = null)
    method validatePassword (line 489) | public function validatePassword($password, $hash)
    method generateSalt (line 520) | protected function generateSalt($cost = 13)
    method compareString (line 544) | public function compareString($expected, $actual)
    method maskToken (line 565) | public function maskToken($token)
    method unmaskToken (line 578) | public function unmaskToken($maskedToken)

FILE: framework/base/StaticInstanceInterface.php
  type StaticInstanceInterface (line 23) | interface StaticInstanceInterface
    method instance (line 30) | public static function instance($refresh = false);

FILE: framework/base/StaticInstanceTrait.php
  type StaticInstanceTrait (line 21) | trait StaticInstanceTrait
    method instance (line 34) | public static function instance($refresh = false)

FILE: framework/base/Theme.php
  class Theme (line 75) | class Theme extends Component
    method getBaseUrl (line 92) | public function getBaseUrl()
    method setBaseUrl (line 101) | public function setBaseUrl($url)
    method getBasePath (line 112) | public function getBasePath()
    method setBasePath (line 122) | public function setBasePath($path)
    method applyTo (line 134) | public function applyTo($path)
    method getUrl (line 167) | public function getUrl($url)
    method getPath (line 182) | public function getPath($path)

FILE: framework/base/UnknownClassException.php
  class UnknownClassException (line 17) | class UnknownClassException extends Exception
    method getName (line 22) | public function getName()

FILE: framework/base/UnknownMethodException.php
  class UnknownMethodException (line 17) | class UnknownMethodException extends \BadMethodCallException
    method getName (line 22) | public function getName()

FILE: framework/base/UnknownPropertyException.php
  class UnknownPropertyException (line 17) | class UnknownPropertyException extends Exception
    method getName (line 22) | public function getName()

FILE: framework/base/UserException.php
  class UserException (line 18) | class UserException extends Exception

FILE: framework/base/View.php
  class View (line 31) | class View extends Component implements DynamicContentAwareInterface
    method init (line 116) | public function init()
    method render (line 154) | public function render($view, $params = [], $context = null)
    method findViewFile (line 171) | protected function findViewFile($view, $context = null)
    method renderFile (line 224) | public function renderFile($viewFile, $params = [], $context = null)
    method getViewFile (line 272) | public function getViewFile()
    method getRequestedViewFile (line 281) | protected function getRequestedViewFile()
    method beforeRender (line 294) | public function beforeRender($viewFile, $params)
    method afterRender (line 314) | public function afterRender($viewFile, $params, &$output)
    method renderPhpFile (line 341) | public function renderPhpFile($_file_, $_params_ = [])
    method renderDynamic (line 381) | public function renderDynamic($statements)
    method getDynamicPlaceholders (line 397) | public function getDynamicPlaceholders()
    method setDynamicPlaceholders (line 405) | public function setDynamicPlaceholders($placeholders)
    method addDynamicPlaceholder (line 413) | public function addDynamicPlaceholder($placeholder, $statements)
    method evaluateDynamicContent (line 432) | public function evaluateDynamicContent($statements)
    method getDynamicContents (line 442) | public function getDynamicContents()
    method pushDynamicContent (line 453) | public function pushDynamicContent(DynamicContentAwareInterface $insta...
    method popDynamicContent (line 463) | public function popDynamicContent()
    method beginBlock (line 477) | public function beginBlock($id, $renderInPlace = false)
    method endBlock (line 489) | public function endBlock()
    method beginContent (line 512) | public function beginContent($viewFile, $params = [])
    method endContent (line 524) | public function endContent()
    method beginCache (line 549) | public function beginCache($id, $properties = [])
    method endCache (line 567) | public function endCache()
    method beginPage (line 575) | public function beginPage()
    method endPage (line 586) | public function endPage()

FILE: framework/base/ViewContextInterface.php
  type ViewContextInterface (line 19) | interface ViewContextInterface
    method getViewPath (line 24) | public function getViewPath();

FILE: framework/base/ViewEvent.php
  class ViewEvent (line 17) | class ViewEvent extends Event

FILE: framework/base/ViewNotFoundException.php
  class ViewNotFoundException (line 17) | class ViewNotFoundException extends InvalidArgumentException
    method getName (line 22) | public function getName()

FILE: framework/base/ViewRenderer.php
  class ViewRenderer (line 17) | abstract class ViewRenderer extends Component
    method render (line 30) | abstract public function render($view, $file, $params);

FILE: framework/base/Widget.php
  class Widget (line 28) | class Widget extends Component implements ViewContextInterface
    method init (line 74) | public function init()
    method begin (line 90) | public static function begin($config = [])
    method end (line 108) | public static function end()
    method widget (line 139) | public static function widget($config = [])
    method getId (line 176) | public function getId($autoGenerate = true)
    method setId (line 189) | public function setId($value)
    method getView (line 203) | public function getView()
    method setView (line 216) | public function setView($view)
    method run (line 226) | public function run()
    method render (line 250) | public function render($view, $params = [])
    method renderFile (line 262) | public function renderFile($file, $params = [])
    method getViewPath (line 272) | public function getViewPath()
    method beforeRun (line 303) | public function beforeRun()
    method afterRun (line 331) | public function afterRun($result)

FILE: framework/base/WidgetEvent.php
  class WidgetEvent (line 19) | class WidgetEvent extends Event

FILE: framework/behaviors/AttributeBehavior.php
  class AttributeBehavior (line 56) | class AttributeBehavior extends Behavior
    method events (line 103) | public function events()
    method evaluateAttributes (line 115) | public function evaluateAttributes($event)
    method getValue (line 147) | protected function getValue($event)

FILE: framework/behaviors/AttributeTypecastBehavior.php
  class AttributeTypecastBehavior (line 116) | class AttributeTypecastBehavior extends Behavior
    method clearAutoDetectedAttributeTypes (line 197) | public static function clearAutoDetectedAttributeTypes()
    method attach (line 205) | public function attach($owner)
    method typecastAttributes (line 224) | public function typecastAttributes($attributeNames = null)
    method typecastValue (line 254) | protected function typecastValue($value, $type)
    method detectAttributeTypes (line 292) | protected function detectAttributeTypes()
    method events (line 316) | public function events()
    method afterValidate (line 342) | public function afterValidate($event)
    method beforeSave (line 353) | public function beforeSave($event)
    method afterSave (line 363) | public function afterSave($event)
    method afterFind (line 372) | public function afterFind($event)
    method resetOldAttributes (line 382) | protected function resetOldAttributes()

FILE: framework/behaviors/AttributesBehavior.php
  class AttributesBehavior (line 69) | class AttributesBehavior extends Behavior
    method events (line 132) | public function events()
    method evaluateAttributes (line 146) | public function evaluateAttributes($event)
    method getValue (line 180) | protected function getValue($attribute, $event)

FILE: framework/behaviors/BlameableBehavior.php
  class BlameableBehavior (line 61) | class BlameableBehavior extends AttributeBehavior
    method init (line 89) | public function init()
    method getValue (line 106) | protected function getValue($event)
    method getDefaultValue (line 128) | protected function getDefaultValue($event)

FILE: framework/behaviors/CacheableWidgetBehavior.php
  class CacheableWidgetBehavior (line 51) | class CacheableWidgetBehavior extends Behavior
    method attach (line 111) | public function attach($owner)
    method beforeRun (line 124) | public function beforeRun($event)
    method afterRun (line 139) | public function afterRun($event)
    method initializeEventHandlers (line 150) | private function initializeEventHandlers()
    method getCacheInstance (line 162) | private function getCacheInstance()
    method getCacheKey (line 173) | private function getCacheKey()
    method getFragmentCacheConfiguration (line 189) | private function getFragmentCacheConfiguration()

FILE: framework/behaviors/OptimisticLockBehavior.php
  class OptimisticLockBehavior (line 69) | class OptimisticLockBehavior extends AttributeBehavior
    method attach (line 91) | public function attach($owner)
    method events (line 104) | public function events()
    method getLockAttribute (line 119) | protected function getLockAttribute()
    method getValue (line 140) | protected function getValue($event)
    method upgrade (line 164) | public function upgrade()

FILE: framework/behaviors/SluggableBehavior.php
  class SluggableBehavior (line 68) | class SluggableBehavior extends AttributeBehavior
    method init (line 136) | public function init()
    method getValue (line 152) | protected function getValue($event)
    method isNewSlugNeeded (line 182) | protected function isNewSlugNeeded()
    method generateSlug (line 213) | protected function generateSlug($slugParts)
    method makeUnique (line 227) | protected function makeUnique($slug)
    method validateSlug (line 244) | protected function validateSlug($slug)
    method generateUniqueSlug (line 270) | protected function generateUniqueSlug($baseSlug, $iteration)
    method isEmpty (line 286) | protected function isEmpty($slugPart)

FILE: framework/behaviors/TimestampBehavior.php
  class TimestampBehavior (line 76) | class TimestampBehavior extends AttributeBehavior
    method init (line 100) | public function init()
    method getValue (line 118) | protected function getValue($event)
    method touch (line 136) | public function touch($attribute)

FILE: framework/caching/ApcCache.php
  class ApcCache (line 27) | class ApcCache extends Cache
    method init (line 43) | public function init()
    method exists (line 62) | public function exists($key)
    method getValue (line 75) | protected function getValue($key)
    method getValues (line 85) | protected function getValues($keys)
    method setValue (line 101) | protected function setValue($key, $value, $duration)
    method setValues (line 112) | protected function setValues($data, $duration)
    method addValue (line 127) | protected function addValue($key, $value, $duration)
    method addValues (line 138) | protected function addValues($data, $duration)
    method deleteValue (line 150) | protected function deleteValue($key)
    method flushValues (line 160) | protected function flushValues()

FILE: framework/caching/ArrayCache.php
  class ArrayCache (line 26) | class ArrayCache extends Cache
    method exists (line 34) | public function exists($key)
    method getValue (line 43) | protected function getValue($key)
    method setValue (line 55) | protected function setValue($key, $value, $duration)
    method addValue (line 64) | protected function addValue($key, $value, $duration)
    method deleteValue (line 76) | protected function deleteValue($key)
    method flushValues (line 85) | protected function flushValues()

FILE: framework/caching/Cache.php
  class Cache (line 55) | abstract class Cache extends Component implements CacheInterface
    method init (line 92) | public function init()
    method buildKey (line 108) | public function buildKey($key)
    method get (line 132) | public function get($key)
    method exists (line 162) | public function exists($key)
    method mget (line 182) | public function mget($keys)
    method multiGet (line 198) | public function multiGet($keys)
    method set (line 240) | public function set($key, $value, $duration = null, $dependency = null)
    method mset (line 273) | public function mset($items, $duration = null, $dependency = null)
    method multiSet (line 292) | public function multiSet($items, $duration = null, $dependency = null)
    method madd (line 315) | public function madd($items, $duration = 0, $dependency = null)
    method multiAdd (line 332) | public function multiAdd($items, $duration = 0, $dependency = null)
    method prepareCacheData (line 347) | private function prepareCacheData($items, $dependency)
    method add (line 380) | public function add($key, $value, $duration = 0, $dependency = null)
    method delete (line 401) | public function delete($key)
    method flush (line 413) | public function flush()
    method getValue (line 426) | abstract protected function getValue($key);
    method setValue (line 438) | abstract protected function setValue($key, $value, $duration);
    method addValue (line 450) | abstract protected function addValue($key, $value, $duration);
    method deleteValue (line 458) | abstract protected function deleteValue($key);
    method flushValues (line 465) | abstract protected function flushValues();
    method getValues (line 475) | protected function getValues($keys)
    method setValues (line 493) | protected function setValues($data, $duration)
    method addValues (line 513) | protected function addValues($data, $duration)
    method offsetExists (line 531) | #[\ReturnTypeWillChange]
    method offsetGet (line 543) | #[\ReturnTypeWillChange]
    method offsetSet (line 557) | #[\ReturnTypeWillChange]
    method offsetUnset (line 568) | #[\ReturnTypeWillChange]
    method getOrSet (line 603) | public function getOrSet($key, $callable, $duration = null, $dependenc...

FILE: framework/caching/CacheInterface.php
  type CacheInterface (line 46) | interface CacheInterface extends \ArrayAccess
    method buildKey (line 58) | public function buildKey($key);
    method get (line 67) | public function get($key);
    method exists (line 81) | public function exists($key);
    method multiGet (line 93) | public function multiGet($keys);
    method set (line 110) | public function set($key, $value, $duration = null, $dependency = null);
    method multiSet (line 125) | public function multiSet($items, $duration = null, $dependency = null);
    method add (line 139) | public function add($key, $value, $duration = 0, $dependency = null);
    method multiAdd (line 152) | public function multiAdd($items, $duration = 0, $dependency = null);
    method delete (line 160) | public function delete($key);
    method flush (line 167) | public function flush();
    method getOrSet (line 196) | public function getOrSet($key, $callable, $duration = null, $dependenc...

FILE: framework/caching/CallbackDependency.php
  class CallbackDependency (line 21) | class CallbackDependency extends Dependency
    method generateDependencyData (line 35) | protected function generateDependencyData($cache)

FILE: framework/caching/ChainedDependency.php
  class ChainedDependency (line 23) | class ChainedDependency extends Dependency
    method evaluateDependency (line 43) | public function evaluateDependency($cache)
    method generateDependencyData (line 56) | protected function generateDependencyData($cache)
    method isChanged (line 64) | public function isChanged($cache)

FILE: framework/caching/DbCache.php
  class DbCache (line 41) | class DbCache extends Cache
    method init (line 96) | public function init()
    method exists (line 112) | public function exists($key)
    method getValue (line 138) | protected function getValue($key)
    method getValues (line 161) | protected function getValues($keys)
    method setValue (line 204) | protected function setValue($key, $value, $duration)
    method addValue (line 234) | protected function addValue($key, $value, $duration)
    method deleteValue (line 262) | protected function deleteValue($key)
    method gc (line 278) | public function gc($force = false)
    method flushValues (line 293) | protected function flushValues()
    method isVarbinaryDataField (line 306) | protected function isVarbinaryDataField()
    method getDataFieldName (line 319) | protected function getDataFieldName()
    method getDataFieldValue (line 328) | protected function getDataFieldValue($value)

FILE: framework/caching/DbDependency.php
  class DbDependency (line 26) | class DbDependency extends Dependency
    method generateDependencyData (line 50) | protected function generateDependencyData($cache)

FILE: framework/caching/DbQueryDependency.php
  class DbQueryDependency (line 31) | class DbQueryDependency extends Dependency
    method generateDependencyData (line 71) | protected function generateDependencyData($cache)
    method executeQuery (line 101) | private function executeQuery($query, $db)

FILE: framework/caching/Dependency.php
  class Dependency (line 22) | abstract class Dependency extends \yii\base\BaseObject
    method evaluateDependency (line 48) | public function evaluateDependency($cache)
    method getHasChanged (line 67) | public function getHasChanged($cache)
    method isChanged (line 78) | public function isChanged($cache)
    method resetReusableData (line 96) | public static function resetReusableData()
    method generateReusableHash (line 107) | protected function generateReusableHash()
    method generateDependencyData (line 133) | abstract protected function generateDependencyData($cache);

FILE: framework/caching/DummyCache.php
  class DummyCache (line 24) | class DummyCache extends Cache
    method getValue (line 32) | protected function getValue($key)
    method setValue (line 46) | protected function setValue($key, $value, $duration)
    method addValue (line 59) | protected function addValue($key, $value, $duration)
    method deleteValue (line 70) | protected function deleteValue($key)
    method flushValues (line 80) | protected function flushValues()

FILE: framework/caching/ExpressionDependency.php
  class ExpressionDependency (line 26) | class ExpressionDependency extends Dependency
    method generateDependencyData (line 47) | protected function generateDependencyData($cache)

FILE: framework/caching/FileCache.php
  class FileCache (line 28) | class FileCache extends Cache
    method init (line 78) | public function init()
    method exists (line 97) | public function exists($key)
    method getValue (line 110) | protected function getValue($key)
    method setValue (line 138) | protected function setValue($key, $value, $duration)
    method addValue (line 188) | protected function addValue($key, $value, $duration)
    method deleteValue (line 204) | protected function deleteValue($key)
    method getCacheFile (line 216) | protected function getCacheFile($normalizedKey)
    method flushValues (line 244) | protected function flushValues()
    method gc (line 258) | public function gc($force = false, $expiredOnly = true)
    method gcRecursive (line 272) | protected function gcRecursive($path, $expiredOnly)

FILE: framework/caching/FileDependency.php
  class FileDependency (line 25) | class FileDependency extends Dependency
    method generateDependencyData (line 41) | protected function generateDependencyData($cache)

FILE: framework/caching/MemCache.php
  class MemCache (line 67) | class MemCache extends Cache
    method init (line 114) | public function init()
    method addServers (line 127) | protected function addServers($cache, $servers)
    method addMemcachedServers (line 155) | protected function addMemcachedServers($cache, $servers)
    method addMemcacheServers (line 177) | protected function addMemcacheServers($cache, $servers)
    method getMemcache (line 216) | public function getMemcache()
    method getServers (line 245) | public function getServers()
    method setServers (line 256) | public function setServers($config)
    method getValue (line 269) | protected function getValue($key)
    method getValues (line 279) | protected function getValues($keys)
    method setValue (line 294) | protected function setValue($key, $value, $duration)
    method setValues (line 306) | protected function setValues($data, $duration)
    method addValue (line 329) | protected function addValue($key, $value, $duration)
    method deleteValue (line 341) | protected function deleteValue($key)
    method flushValues (line 351) | protected function flushValues()
    method normalizeDuration (line 367) | protected function normalizeDuration($duration)

FILE: framework/caching/MemCacheServer.php
  class MemCacheServer (line 22) | class MemCacheServer extends \yii\base\BaseObject

FILE: framework/caching/TagDependency.php
  class TagDependency (line 30) | class TagDependency extends Dependency
    method generateDependencyData (line 44) | protected function generateDependencyData($cache)
    method isChanged (line 64) | public function isChanged($cache)
    method invalidate (line 75) | public static function invalidate($cache, $tags)
    method touchKeys (line 90) | protected static function touchKeys($cache, $keys)
    method getTimestamps (line 107) | protected function getTimestamps($cache, $tags)

FILE: framework/caching/WinCache.php
  class WinCache (line 24) | class WinCache extends Cache
    method exists (line 36) | public function exists($key)
    method getValue (line 49) | protected function getValue($key)
    method getValues (line 59) | protected function getValues($keys)
    method setValue (line 74) | protected function setValue($key, $value, $duration)
    method setValues (line 85) | protected function setValues($data, $duration)
    method addValue (line 100) | protected function addValue($key, $value, $duration)
    method addValues (line 113) | protected function addValues($data, $duration)
    method deleteValue (line 124) | protected function deleteValue($key)
    method flushValues (line 134) | protected function flushValues()

FILE: framework/caching/migrations/m150909_153426_cache_init.php
  class m150909_153426_cache_init (line 19) | class m150909_153426_cache_init extends Migration
    method getCache (line 25) | protected function getCache()
    method up (line 38) | public function up()
    method down (line 60) | public function down()

FILE: framework/caching/migrations/schema-mysql.sql
  type `cache` (line 14) | create table `cache`

FILE: framework/caching/migrations/schema-oci.sql
  type "cache" (line 14) | create table "cache"

FILE: framework/caching/migrations/schema-pgsql.sql
  type "cache" (line 14) | create table "cache"

FILE: framework/caching/migrations/schema-sqlite.sql
  type "cache" (line 14) | create table "cache"

FILE: framework/captcha/Captcha.php
  class Captcha (line 61) | class Captcha extends InputWidget
    method init (line 90) | public function init()
    method run (line 104) | public function run()
    method registerClientScript (line 124) | public function registerClientScript()
    method getClientOptions (line 138) | protected function getClientOptions()
    method checkRequirements (line 161) | public static function checkRequirements()

FILE: framework/captcha/CaptchaAction.php
  class CaptchaAction (line 44) | class CaptchaAction extends Action
    method init (line 117) | public function init()
    method run (line 128) | public function run()
    method generateValidationHash (line 154) | public function generateValidationHash($code)
    method getVerifyCode (line 168) | public function getVerifyCode($regenerate = false)
    method validate (line 191) | public function validate($input, $caseSensitive)
    method generateVerifyCode (line 210) | protected function generateVerifyCode()
    method getSessionKey (line 242) | protected function getSessionKey()
    method renderImage (line 253) | protected function renderImage($code)
    method renderImageByGD (line 274) | protected function renderImageByGD($code)
    method renderImageByImagick (line 331) | protected function renderImageByImagick($code)
    method setHttpHeaders (line 367) | protected function setHttpHeaders()

FILE: framework/captcha/CaptchaAsset.php
  class CaptchaAsset (line 19) | class CaptchaAsset extends AssetBundle

FILE: framework/captcha/CaptchaValidator.php
  class CaptchaValidator (line 30) | class CaptchaValidator extends Validator
    method init (line 49) | public function init()
    method validateValue (line 60) | protected function validateValue($value)
    method createCaptchaAction (line 73) | public function createCaptchaAction()
    method clientValidateAttribute (line 91) | public function clientValidateAttribute($model, $attribute, $view)
    method getClientOptions (line 102) | public function getClientOptions($model, $attribute)

FILE: framework/console/Application.php
  class Application (line 62) | class Application extends \yii\base\Application
    method __construct (line 87) | public function __construct($config = [])
    method loadConfig (line 101) | protected function loadConfig($config)
    method init (line 123) | public function init()
    method handleRequest (line 144) | public function handleRequest($request)
    method runAction (line 178) | public function runAction($route, $params = [])
    method coreCommands (line 192) | public function coreCommands()
    method getErrorHandler (line 209) | public function getErrorHandler()
    method getRequest (line 218) | public function getRequest()
    method getResponse (line 227) | public function getResponse()
    method coreComponents (line 235) | public function coreComponents()

FILE: framework/console/Controller.php
  class Controller (line 48) | class Controller extends BaseController
    method beforeAction (line 89) | public function beforeAction($action)
    method isColorEnabled (line 106) | public function isColorEnabled($stream = \STDOUT)
    method runAction (line 121) | public function runAction($id, $params = [])
    method bindActionParams (line 204) | public function bindActionParams($action, $params)
    method ansiFormat (line 292) | public function ansiFormat($string)
    method stdout (line 319) | public function stdout($string)
    method stderr (line 346) | public function stderr($string)
    method prompt (line 384) | public function prompt($text, $options = [])
    method confirm (line 411) | public function confirm($message, $default = false)
    method select (line 432) | public function select($prompt, $options = [], $default = null)
    method options (line 453) | public function options($actionID)
    method optionAliases (line 469) | public function optionAliases()
    method getOptionValues (line 483) | public function getOptionValues($actionID)
    method getPassedOptions (line 499) | public function getPassedOptions()
    method getPassedOptionValues (line 509) | public function getPassedOptionValues()
    method getHelpSummary (line 527) | public function getHelpSummary()
    method getHelp (line 539) | public function getHelp()
    method getActionHelpSummary (line 552) | public function getActionHelpSummary($action)
    method getActionHelp (line 569) | public function getActionHelp($action)
    method getActionArgsHelp (line 594) | public function getActionArgsHelp($action)
    method getActionOptionsHelp (line 670) | public function getActionOptionsHelp($action)
    method getActionMethodReflection (line 728) | protected function getActionMethodReflection($action)
    method parseDocCommentTags (line 746) | protected function parseDocCommentTags($reflection)
    method parseDocCommentSummary (line 777) | protected function parseDocCommentSummary($reflection)
    method parseDocCommentDetail (line 796) | protected function parseDocCommentDetail($reflection)

FILE: framework/console/ErrorHandler.php
  class ErrorHandler (line 25) | class ErrorHandler extends \yii\base\ErrorHandler
    method renderException (line 31) | protected function renderException($exception)
    method formatMessage (line 90) | protected function formatMessage($message, $format = [Console::FG_RED,...

FILE: framework/console/Exception.php
  class Exception (line 19) | class Exception extends UserException
    method getName (line 24) | public function getName()

FILE: framework/console/ExitCode.php
  class ExitCode (line 37) | class ExitCode
    method getReason (line 156) | public static function getReason($exitCode)

FILE: framework/console/Markdown.php
  class Markdown (line 25) | class Markdown extends \cebe\markdown\Parser
    method renderCode (line 52) | protected function renderCode($block)
    method renderParagraph (line 63) | protected function renderParagraph($block)
    method renderInlineCode (line 73) | protected function renderInlineCode($element)
    method renderEmph (line 83) | protected function renderEmph($element)
    method renderStrong (line 93) | protected function renderStrong($element)
    method renderStrike (line 103) | protected function renderStrike($element)

FILE: framework/console/Request.php
  class Request (line 22) | class Request extends \yii\base\Request
    method getParams (line 31) | public function getParams()
    method setParams (line 49) | public function setParams($params)
    method resolve (line 59) | public function resolve()

FILE: framework/console/Response.php
  class Response (line 17) | class Response extends \yii\base\Response

FILE: framework/console/UnknownCommandException.php
  class UnknownCommandException (line 19) | class UnknownCommandException extends Exception
    method __construct (line 40) | public function __construct($route, $application, $code = 0, $previous...
    method getName (line 50) | public function getName()
    method getSuggestedAlternatives (line 68) | public function getSuggestedAlternatives()
    method filterBySimilarity (line 113) | private function filterBySimilarity($actions, $command)

FILE: framework/console/controllers/AssetController.php
  class AssetController (line 53) | class AssetController extends Controller
    method getAssetManager (line 149) | public function getAssetManager()
    method setAssetManager (line 178) | public function setAssetManager($assetManager)
    method actionCompress (line 193) | public function actionCompress($configFile, $bundleFile)
    method loadConfiguration (line 222) | protected function loadConfiguration($configFile)
    method loadBundles (line 242) | protected function loadBundles($bundles)
    method loadDependency (line 264) | protected function loadDependency($bundle, &$result)
    method loadTargets (line 286) | protected function loadTargets($targets, $bundles)
    method buildTarget (line 350) | protected function buildTarget($target, $type, $bundles)
    method adjustDependency (line 394) | protected function adjustDependency($targets, $bundles)
    method registerBundle (line 443) | protected function registerBundle($bundles, $name, &$registered)
    method saveTargets (line 464) | protected function saveTargets($targets, $bundleFile)
    method compressJsFiles (line 514) | protected function compressJsFiles($inputFiles, $outputFile)
    method compressCssFiles (line 543) | protected function compressCssFiles($inputFiles, $outputFile)
    method combineJsFiles (line 572) | public function combineJsFiles($inputFiles, $outputFile)
    method combineCssFiles (line 597) | public function combineCssFiles($inputFiles, $outputFile)
    method adjustCssUrl (line 618) | protected function adjustCssUrl($cssContent, $inputFilePath, $outputFi...
    method actionTemplate (line 696) | public function actionTemplate($configFile)
    method findRealPath (line 760) | private function findRealPath($path)
    method isBundleExternal (line 781) | private function isBundleExternal($bundle)
    method composeBundleConfig (line 790) | private function composeBundleConfig($bundle)
    method composeCircularDependencyTrace (line 803) | private function composeCircularDependencyTrace($circularDependencyNam...
    method deletePublishedAssets (line 824) | private function deletePublishedAssets($bundles)

FILE: framework/console/controllers/BaseMigrateController.php
  class BaseMigrateController (line 34) | abstract class BaseMigrateController extends Controller
    method options (line 118) | public function options($actionID)
    method beforeAction (line 137) | public function beforeAction($action)
    method actionUp (line 189) | public function actionUp($limit = 0)
    method actionDown (line 257) | public function actionDown($limit = 1)
    method actionRedo (line 321) | public function actionRedo($limit = 1)
    method actionTo (line 395) | public function actionTo($version)
    method actionMark (line 429) | public function actionMark($version)
    method actionFresh (line 485) | public function actionFresh()
    method extractNamespaceMigrationVersion (line 510) | private function extractNamespaceMigrationVersion($rawVersion)
    method extractMigrationVersion (line 525) | private function extractMigrationVersion($rawVersion)
    method actionHistory (line 550) | public function actionHistory($limit = 10)
    method actionNew (line 596) | public function actionNew($limit = 10)
    method actionCreate (line 657) | public function actionCreate($name)
    method generateClassName (line 700) | private function generateClassName($name)
    method findMigrationPath (line 728) | private function findMigrationPath($namespace)
    method getNamespacePath (line 747) | private function getNamespacePath($namespace)
    method migrateUp (line 757) | protected function migrateUp($class)
    method migrateDown (line 785) | protected function migrateDown($class)
    method createMigration (line 813) | protected function createMigration($class)
    method includeMigrationFile (line 835) | protected function includeMigrationFile($class)
    method migrateToTime (line 858) | protected function migrateToTime($time)
    method migrateToVersion (line 880) | protected function migrateToVersion($version)
    method getNewMigrations (line 913) | protected function getNewMigrations()
    method generateMigrationSourceCode (line 973) | protected function generateMigrationSourceCode($params)
    method truncateDatabase (line 984) | protected function truncateDatabase()
    method getMigrationNameLimit (line 996) | protected function getMigrationNameLimit()
    method getMigrationHistory (line 1006) | abstract protected function getMigrationHistory($limit);
    method addMigrationHistory (line 1012) | abstract protected function addMigrationHistory($version);
    method removeMigrationHistory (line 1018) | abstract protected function removeMigrationHistory($version);

FILE: framework/console/controllers/CacheController.php
  class CacheController (line 52) | class CacheController extends Controller
    method actionIndex (line 57) | public function actionIndex()
    method actionFlush (line 78) | public function actionFlush()
    method actionFlushAll (line 119) | public function actionFlushAll()
    method actionFlushSchema (line 155) | public function actionFlushSchema($db = 'db')
    method notifyCachesCanBeFlushed (line 185) | private function notifyCachesCanBeFlushed($caches)
    method notifyNoCachesFound (line 203) | private function notifyNoCachesFound()
    method notifyNotFoundCaches (line 212) | private function notifyNotFoundCaches($cachesNames)
    method notifyFlushed (line 226) | private function notifyFlushed($caches)
    method confirmFlush (line 248) | private function confirmFlush($cachesNames)
    method findCaches (line 264) | private function findCaches(array $cachesNames = [])
    method isCacheClass (line 298) | private function isCacheClass($className)
    method canBeFlushed (line 308) | private function canBeFlushed($className)

FILE: framework/console/controllers/FixtureController.php
  class FixtureController (line 51) | class FixtureController extends Controller
    method options (line 75) | public function options($actionID)
    method optionAliases (line 86) | public function optionAliases()
    method actionLoad (line 115) | public function actionLoad(array $fixturesInput = [])
    method actionUnload (line 191) | public function actionUnload(array $fixturesInput = [])
    method printHelpMessage (line 247) | private function printHelpMessage()
    method notifyLoaded (line 259) | private function notifyLoaded($fixtures)
    method notifyNothingToLoad (line 278) | public function notifyNothingToLoad($foundFixtures, $except)
    method notifyNothingToUnload (line 300) | public function notifyNothingToUnload($foundFixtures, $except)
    method notifyUnloaded (line 321) | private function notifyUnloaded($fixtures)
    method notifyNotFound (line 332) | private function notifyNotFound($fixtures)
    method confirmLoad (line 347) | private function confirmLoad($fixtures, $except)
    method confirmUnload (line 379) | private function confirmUnload($fixtures, $except)
    method outputList (line 406) | private function outputList($data)
    method needToApplyAll (line 418) | public function needToApplyAll($fixture)
    method findFixtures (line 429) | private function findFixtures(array $fixtures = [])
    method getFixtureRelativeName (line 461) | private function getFixtureRelativeName($fullFixturePath)
    method getFixturesConfig (line 477) | private function getFixturesConfig($fixtures)
    method filterFixtures (line 520) | private function filterFixtures($fixtures)
    method getFixturePath (line 543) | private function getFixturePath()

FILE: framework/console/controllers/HelpController.php
  class HelpController (line 45) | class HelpController extends Controller
    method actionIndex (line 56) | public function actionIndex($command = null)
    method actionList (line 85) | public function actionList()
    method actionListActionOptions (line 109) | public function actionListActionOptions($action)
    method actionUsage (line 142) | public function actionUsage($action)
    method getCommands (line 179) | public function getCommands()
    method getCommandDescriptions (line 199) | protected function getCommandDescriptions()
    method getActions (line 217) | public function getActions($controller)
    method getModuleCommands (line 237) | protected function getModuleCommands($module)
    method validateControllerClass (line 287) | protected function validateControllerClass($controllerClass)
    method getDefaultHelp (line 300) | protected function getDefaultHelp()
    method getCommandHelp (line 361) | protected function getCommandHelp($controller)
    method getSubCommandHelp (line 407) | protected function getSubCommandHelp($controller, $actionID)
    method formatOptionHelp (line 486) | protected function formatOptionHelp($name, $required, $type, $defaultV...
    method formatOptionAliases (line 529) | protected function formatOptionAliases($controller, $option)
    method getScriptName (line 543) | protected function getScriptName()
    method getDefaultHelpHeader (line 553) | protected function getDefaultHelpHeader()
    method camel2id (line 565) | private function camel2id($name)

FILE: framework/console/controllers/MessageController.php
  class MessageController (line 47) | class MessageController extends Controller
    method options (line 163) | public function options($actionID)
    method optionAliases (line 191) | public function optionAliases()
    method actionConfig (line 222) | public function actionConfig($filePath)
    method actionConfigTemplate (line 270) | public function actionConfigTemplate($filePath)
    method actionExtract (line 300) | public function actionExtract($configFile = null)
    method saveMessagesToDb (line 355) | protected function saveMessagesToDb($messages, $db, $sourceMessageTabl...
    method extractMessages (line 506) | protected function extractMessages($fileName, $translator, $ignoreCate...
    method extractMessagesFromTokens (line 533) | protected function extractMessagesFromTokens(array $tokens, array $tra...
    method isCategoryIgnored (line 648) | protected function isCategoryIgnored($category, array $ignoreCategories)
    method tokensEqual (line 672) | protected function tokensEqual($a, $b)
    method getLine (line 691) | protected function getLine($tokens)
    method saveMessagesToPHP (line 712) | protected function saveMessagesToPHP($messages, $dirName, $overwrite, ...
    method saveMessagesCategoryToPHP (line 741) | protected function saveMessagesCategoryToPHP($messages, $fileName, $ov...
    method saveMessagesToPO (line 822) | protected function saveMessagesToPO($messages, $dirName, $overwrite, $...
    method saveMessagesToPOT (line 915) | protected function saveMessagesToPOT($messages, $dirName, $catalog)
    method deleteUnusedPhpMessageFiles (line 945) | private function deleteUnusedPhpMessageFiles($existingCategories, $dir...
    method initConfig (line 965) | protected function initConfig($configFile)

FILE: framework/console/controllers/MigrateController.php
  class MigrateController (line 81) | class MigrateController extends BaseMigrateController
    method options (line 151) | public function options($actionID)
    method optionAliases (line 166) | public function optionAliases()
    method beforeAction (line 188) | public function beforeAction($action)
    method createMigration (line 203) | protected function createMigration($class)
    method getMigrationHistory (line 217) | protected function getMigrationHistory($limit)
    method createMigrationHistoryTable (line 274) | protected function createMigrationHistoryTable()
    method addMigrationHistory (line 292) | protected function addMigrationHistory($version)
    method truncateDatabase (line 305) | protected function truncateDatabase()
    method isViewRelated (line 339) | private function isViewRelated($errorMessage)
    method removeMigrationHistory (line 359) | protected function removeMigrationHistory($version)
    method getMigrationNameLimit (line 373) | protected function getMigrationNameLimit()
    method normalizeTableName (line 393) | private function normalizeTableName($name)
    method generateMigrationSourceCode (line 410) | protected function generateMigrationSourceCode($params)
    method generateTableName (line 519) | protected function generateTableName($tableName)
    method parseFields (line 537) | protected function parseFields()
    method splitFieldIntoChunks (line 584) | protected function splitFieldIntoChunks($field)
    method addDefaultPrimaryKey (line 611) | protected function addDefaultPrimaryKey(&$fields)

FILE: framework/console/controllers/ServeController.php
  class ServeController (line 29) | class ServeController extends Controller
    method actionIndex (line 57) | public function actionIndex($address = 'localhost')
    method options (line 102) | public function options($actionID)
    method optionAliases (line 115) | public function optionAliases()
    method isAddressTaken (line 128) | protected function isAddressTaken($address)
    method runCommand (line 139) | protected function runCommand($command)

FILE: framework/console/widgets/Table.php
  class Table (line 53) | class Table extends Widget
    method setHeaders (line 126) | public function setHeaders(array $headers)
    method setRows (line 138) | public function setRows(array $rows)
    method setChars (line 158) | public function setChars(array $chars)
    method setScreenWidth (line 170) | public function setScreenWidth($width)
    method setListPrefix (line 182) | public function setListPrefix($listPrefix)
    method run (line 191) | public function run()
    method renderRow (line 250) | protected function renderRow(array $row, $spanLeft, $spanMiddle, $span...
    method renderSeparator (line 323) | protected function renderSeparator($spanLeft, $spanMid, $spanMidMid, $...
    method calculateRowsSize (line 341) | protected function calculateRowsSize()
    method calculateRowHeight (line 403) | protected function calculateRowHeight($row)
    method getScreenWidth (line 432) | protected function getScreenWidth()

FILE: framework/data/ActiveDataFilter.php
  class ActiveDataFilter (line 19) | class ActiveDataFilter extends DataFilter
    method buildInternal (line 72) | protected function buildInternal()
    method buildCondition (line 86) | protected function buildCondition($condition)
    method buildConjunctionCondition (line 121) | protected function buildConjunctionCondition($operator, $condition)
    method buildBlockCondition (line 142) | protected function buildBlockCondition($operator, $condition)
    method buildAttributeCondition (line 159) | protected function buildAttributeCondition($attribute, $condition)
    method buildOperatorCondition (line 197) | protected function buildOperatorCondition($operator, $condition, $attr...

FILE: framework/data/ActiveDataProvider.php
  class ActiveDataProvider (line 57) | class ActiveDataProvider extends BaseDataProvider
    method init (line 88) | public function init()
    method prepareModels (line 99) | protected function prepareModels()
    method prepareKeys (line 122) | protected function prepareKeys($models)
    method prepareTotalCount (line 163) | protected function prepareTotalCount()
    method setSort (line 175) | public function setSort($value)
    method __clone (line 196) | public function __clone()

FILE: framework/data/ArrayDataProvider.php
  class ArrayDataProvider (line 54) | class ArrayDataProvider extends BaseDataProvider
    method prepareModels (line 81) | protected function prepareModels()
    method prepareKeys (line 105) | protected function prepareKeys($models)
    method prepareTotalCount (line 117) | protected function prepareTotalCount()
    method sortModels (line 128) | protected function sortModels($models, $sort)

FILE: framework/data/BaseDataProvider.php
  class BaseDataProvider (line 35) | abstract class BaseDataProvider extends Component implements DataProvide...
    method init (line 60) | public function init()
    method prepareModels (line 75) | abstract protected function prepareModels();
    method prepareKeys (line 82) | abstract protected function prepareKeys($models);
    method prepareTotalCount (line 88) | abstract protected function prepareTotalCount();
    method prepare (line 100) | public function prepare($forcePrepare = false)
    method getModels (line 114) | public function getModels()
    method setModels (line 125) | public function setModels($models)
    method getKeys (line 135) | public function getKeys()
    method setKeys (line 146) | public function setKeys($keys)
    method getCount (line 155) | public function getCount()
    method getTotalCount (line 166) | public function getTotalCount()
    method setTotalCount (line 180) | public function setTotalCount($value)
    method getPagination (line 191) | public function getPagination()
    method setPagination (line 212) | public function setPagination($value)
    method getSort (line 232) | public function getSort()
    method setSort (line 253) | public function setSort($value)
    method refresh (line 273) | public function refresh()

FILE: framework/data/DataFilter.php
  class DataFilter (line 127) | class DataFilter extends Model
    method getFilter (line 269) | public function getFilter()
    method setFilter (line 277) | public function setFilter($filter)
    method getSearchModel (line 286) | public function getSearchModel()
    method setSearchModel (line 302) | public function setSearchModel($model)
    method getSearchAttributeTypes (line 313) | public function getSearchAttributeTypes()
    method setSearchAttributeTypes (line 324) | public function setSearchAttributeTypes($searchAttributeTypes)
    method detectSearchAttributeTypes (line 333) | protected function detectSearchAttributeTypes()
    method detectSearchAttributeType (line 362) | protected function detectSearchAttributeType(Validator $validator)
    method getErrorMessages (line 397) | public function getErrorMessages()
    method setErrorMessages (line 418) | public function setErrorMessages($errorMessages)
    method defaultErrorMessages (line 430) | protected function defaultErrorMessages()
    method parseErrorMessage (line 448) | protected function parseErrorMessage($messageKey, $params = [])
    method attributes (line 472) | public function attributes()
    method formName (line 482) | public function formName()
    method rules (line 490) | public function rules()
    method attributeLabels (line 500) | public function attributeLabels()
    method validateFilter (line 512) | public function validateFilter()
    method validateCondition (line 524) | protected function validateCondition($condition)
    method validateConjunctionCondition (line 553) | protected function validateConjunctionCondition($operator, $condition)
    method validateBlockCondition (line 571) | protected function validateBlockCondition($operator, $condition)
    method validateAttributeCondition (line 581) | protected function validateAttributeCondition($attribute, $condition)
    method validateOperatorCondition (line 620) | protected function validateOperatorCondition($operator, $condition, $a...
    method validateAttributeValue (line 661) | protected function validateAttributeValue($attribute, $value)
    method filterAttributeValue (line 682) | protected function filterAttributeValue($attribute, $value)
    method build (line 707) | public function build($runValidation = true)
    method buildInternal (line 721) | protected function buildInternal()
    method normalize (line 733) | public function normalize($runValidation = true)
    method normalizeComplexFilter (line 752) | private function normalizeComplexFilter(array $filter)
    method canGetProperty (line 777) | public function canGetProperty($name, $checkVars = true, $checkBehavio...
    method canSetProperty (line 788) | public function canSetProperty($name, $checkVars = true, $checkBehavio...
    method __get (line 799) | public function __get($name)
    method __set (line 811) | public function __set($name, $value)
    method __isset (line 823) | public function __isset($name)
    method __unset (line 835) | public function __unset($name)

FILE: framework/data/DataProviderInterface.php
  type DataProviderInterface (line 22) | interface DataProviderInterface
    method prepare (line 34) | public function prepare($forcePrepare = false);
    method getCount (line 42) | public function getCount();
    method getTotalCount (line 49) | public function getTotalCount();
    method getModels (line 55) | public function getModels();
    method getKeys (line 62) | public function getKeys();
    method getSort (line 67) | public function getSort();
    method getPagination (line 72) | public function getPagination();

FILE: framework/data/Pagination.php
  class Pagination (line 77) | class Pagination extends BaseObject implements Linkable
    method getPageCount (line 151) | public function getPageCount()
    method getPage (line 170) | public function getPage($recalculate = false)
    method setPage (line 186) | public function setPage($value, $validatePage = false)
    method getPageSize (line 213) | public function getPageSize()
    method setPageSize (line 232) | public function setPageSize($value, $validatePageSize = false)
    method createUrl (line 259) | public function createUrl($page, $pageSize = null, $absolute = false)
    method getOffset (line 293) | public function getOffset()
    method getLimit (line 305) | public function getLimit()
    method getLinks (line 318) | public function getLinks($absolute = false)
    method getQueryParam (line 345) | protected function getQueryParam($name, $defaultValue = null)

FILE: framework/data/Sort.php
  class Sort (line 81) | class Sort extends BaseObject
    method init (line 206) | public function init()
    method getOrders (line 233) | public function getOrders($recalculate = false)
    method getAttributeOrders (line 264) | public function getAttributeOrders($recalculate = false)
    method parseSortParam (line 320) | protected function parseSortParam($param)
    method setAttributeOrders (line 334) | public function setAttributeOrders($attributeOrders, $validate = true)
    method getAttributeOrder (line 358) | public function getAttributeOrder($attribute)
    method link (line 379) | public function link($attribute, $options = [])
    method createUrl (line 424) | public function createUrl($attribute, $absolute = false)
    method createSortParam (line 448) | public function createSortParam($attribute)
    method hasAttribute (line 492) | public function hasAttribute($name)

FILE: framework/data/SqlDataProvider.php
  class SqlDataProvider (line 67) | class SqlDataProvider extends BaseDataProvider
    method init (line 96) | public function init()
    method prepareModels (line 108) | protected function prepareModels()
    method prepareKeys (line 143) | protected function prepareKeys($models)
    method prepareTotalCount (line 164) | protected function prepareTotalCount()

FILE: framework/db/ActiveQuery.php
  class ActiveQuery (line 84) | class ActiveQuery extends Query implements ActiveQueryInterface
    method __construct (line 117) | public function __construct($modelClass, $config = [])
    method init (line 129) | public function init()
    method all (line 141) | public function all($db = null)
    method prepare (line 149) | public function prepare($builder)
    method populate (line 223) | public function populate($rows)
    method removeDuplicatedModels (line 257) | private function removeDuplicatedModels($models)
    method one (line 312) | public function one($db = null)
    method createCommand (line 329) | public function createCommand($db = null)
    method queryScalar (line 353) | protected function queryScalar($selectExpression, $db)
    method joinWith (line 430) | public function joinWith($with, $eagerLoading = true, $joinType = 'LEF...
    method buildJoinWith (line 462) | private function buildJoinWith()
    method innerJoinWith (line 528) | public function innerJoinWith($with, $eagerLoading = true)
    method joinWithRelations (line 539) | private function joinWithRelations($model, $with, $joinType)
    method getJoinType (line 590) | private function getJoinType($joinType, $name)
    method getTableNameAndAlias (line 604) | protected function getTableNameAndAlias()
    method joinWithRelation (line 635) | private function joinWithRelation($parent, $child, $joinType)
    method onCondition (line 725) | public function onCondition($condition, $params = [])
    method andOnCondition (line 742) | public function andOnCondition($condition, $params = [])
    method orOnCondition (line 763) | public function orOnCondition($condition, $params = [])
    method viaTable (line 797) | public function viaTable($tableName, $link, ?callable $callable = null)
    method alias (line 824) | public function alias($alias)
    method getTablesUsedInFrom (line 847) | public function getTablesUsedInFrom()
    method getPrimaryTableName (line 860) | protected function getPrimaryTableName()

FILE: framework/db/ActiveQueryInterface.php
  type ActiveQueryInterface (line 24) | interface ActiveQueryInterface extends QueryInterface
    method asArray (line 31) | public function asArray($value = true);
    method one (line 41) | public function one($db = null);
    method indexBy (line 60) | public function indexBy($column);
    method with (line 91) | public function with();
    method via (line 100) | public function via($relationName, ?callable $callable = null);
    method findFor (line 109) | public function findFor($name, $model);

FILE: framework/db/ActiveQueryTrait.php
  type ActiveQueryTrait (line 18) | trait ActiveQueryTrait
    method asArray (line 40) | public function asArray($value = true)
    method with (line 83) | public function with()
    method createModels (line 113) | protected function createModels($rows)
    method findWith (line 137) | public function findWith($with, &$models)
    method normalizeRelations (line 165) | private function normalizeRelations($model, $with)

FILE: framework/db/ActiveRecord.php
  class ActiveRecord (line 78) | class ActiveRecord extends BaseActiveRecord
    method loadDefaultValues (line 112) | public function loadDefaultValues($skipIfSet = true)
    method getDb (line 133) | public static function getDb()
    method findBySql (line 156) | public static function findBySql($sql, $params = [])
    method findByCondition (line 172) | protected static function findByCondition($condition)
    method filterValidAliases (line 206) | protected static function filterValidAliases(Query $query)
    method filterCondition (line 230) | protected static function filterCondition(array $condition, array $ali...
    method filterValidColumnNames (line 256) | protected static function filterValidColumnNames($db, array $aliases)
    method refresh (line 280) | public function refresh()
    method updateAll (line 327) | public static function updateAll($attributes, $condition = '', $params...
    method updateAllCounters (line 354) | public static function updateAllCounters($counters, $condition = '', $...
    method deleteAll (line 396) | public static function deleteAll($condition = null, $params = [])
    method find (line 408) | public static function find()
    method tableName (line 421) | public static function tableName()
    method getTableSchema (line 431) | public static function getTableSchema()
    method primaryKey (line 457) | public static function primaryKey()
    method attributes (line 467) | public function attributes()
    method transactions (line 499) | public function transactions()
    method populateRecord (line 507) | public static function populateRecord($record, $row)
    method insert (line 558) | public function insert($runValidation = true, $attributes = null)
    method hasMany (line 596) | public function hasMany($class, $link)
    method hasOne (line 611) | public function hasOne($class, $link)
    method insertInternal (line 622) | protected function insertInternal($attributes = null)
    method update (line 696) | public function update($runValidation = true, $attributeNames = null)
    method delete (line 745) | public function delete()
    method deleteInternal (line 776) | protected function deleteInternal()
    method equals (line 806) | public function equals($record)
    method isTransactional (line 820) | public function isTransactional($operation)

FILE: framework/db/ActiveRecordInterface.php
  type ActiveRecordInterface (line 20) | interface ActiveRecordInterface extends StaticInstanceInterface
    method primaryKey (line 31) | public static function primaryKey();
    method attributes (line 37) | public function attributes();
    method getAttribute (line 47) | public function getAttribute($name);
    method setAttribute (line 55) | public function setAttribute($name, $value);
    method hasAttribute (line 62) | public function hasAttribute($name);
    method getPrimaryKey (line 73) | public function getPrimaryKey($asArray = false);
    method getOldPrimaryKey (line 87) | public function getOldPrimaryKey($asArray = false);
    method isPrimaryKey (line 94) | public static function isPrimaryKey($keys);
    method find (line 152) | public static function find();
    method findOne (line 217) | public static function findOne($condition);
    method findAll (line 285) | public static function findAll($condition);
    method updateAll (line 303) | public static function updateAll($attributes, $condition = null);
    method deleteAll (line 320) | public static function deleteAll($condition = null);
    method save (line 344) | public function save($runValidation = true, $attributeNames = null);
    method insert (line 365) | public function insert($runValidation = true, $attributes = null);
    method update (line 389) | public function update($runValidation = true, $attributeNames = null);
    method delete (line 397) | public function delete();
    method getIsNewRecord (line 403) | public function getIsNewRecord();
    method equals (line 411) | public function equals($record);
    method getRelation (line 422) | public function getRelation($name, $throwException = true);
    method populateRelation (line 431) | public function populateRelation($name, $records);
    method link (line 451) | public function link($name, $model, $extraColumns = []);
    method unlink (line 465) | public function unlink($name, $model, $delete = false);
    method getDb (line 471) | public static function getDb();

FILE: framework/db/ActiveRelationTrait.php
  type ActiveRelationTrait (line 26) | trait ActiveRelationTrait
    method __clone (line 72) | public function __clone()
    method via (line 107) | public function via($relationName, ?callable $callable = null)
    method inverseOf (line 164) | public function inverseOf($relationName)
    method findFor (line 178) | public function findFor($name, $model)
    method addInverseRelations (line 196) | private function addInverseRelations(&$result)
    method populateRelation (line 226) | public function populateRelation($name, &$primaryModels)
    method populateInverseRelation (line 337) | private function populateInverseRelation(&$primaryModels, $models, $pr...
    method buildBuckets (line 401) | private function buildBuckets($models, $link, $viaModels = null, $viaQ...
    method mapVia (line 458) | private function mapVia($map, $viaMap)
    method indexBuckets (line 478) | private function indexBuckets($buckets, $indexBy)
    method prefixKeyColumns (line 496) | private function prefixKeyColumns($attributes)
    method filterByModels (line 524) | private function filterByModels($models)
    method getModelKey (line 589) | private function getModelKey($model, $attributes)
    method normalizeModelKey (line 608) | private function normalizeModelKey($value)
    method findJunctionRows (line 623) | private function findJunctionRows($primaryModels)

FILE: framework/db/AfterSaveEvent.php
  class AfterSaveEvent (line 19) | class AfterSaveEvent extends Event

FILE: framework/db/ArrayExpression.php
  class ArrayExpression (line 33) | class ArrayExpression implements ExpressionInterface, \ArrayAccess, \Cou...
    method __construct (line 64) | public function __construct($value, $type = null, $dimension = 1)
    method getType (line 78) | public function getType()
    method getValue (line 86) | public function getValue()
    method getDimension (line 94) | public function getDimension()
    method offsetExists (line 112) | #[\ReturnTypeWillChange]
    method offsetGet (line 128) | #[\ReturnTypeWillChange]
    method offsetSet (line 147) | #[\ReturnTypeWillChange]
    method offsetUnset (line 163) | #[\ReturnTypeWillChange]
    method count (line 179) | #[\ReturnTypeWillChange]
    method getIterator (line 194) | #[\ReturnTypeWillChange]

FILE: framework/db/BaseActiveRecord.php
  class BaseActiveRecord (line 43) | abstract class BaseActiveRecord extends Model implements ActiveRecordInt...
    method findOne (line 108) | public static function findOne($condition)
    method findAll (line 117) | public static function findAll($condition)
    method findByCondition (line 130) | protected static function findByCondition($condition)
    method updateAll (line 163) | public static function updateAll($attributes, $condition = '')
    method updateAllCounters (line 184) | public static function updateAllCounters($counters, $condition = '')
    method deleteAll (line 204) | public static function deleteAll($condition = null)
    method optimisticLock (line 235) | public function optimisticLock()
    method canGetProperty (line 243) | public function canGetProperty($name, $checkVars = true, $checkBehavio...
    method canSetProperty (line 260) | public function canSetProperty($name, $checkVars = true, $checkBehavio...
    method __get (line 283) | public function __get($name)
    method __set (line 311) | public function __set($name, $value)
    method __isset (line 332) | public function __isset($name)
    method __unset (line 349) | public function __unset($name)
    method hasOne (line 393) | public function hasOne($class, $link)
    method hasMany (line 428) | public function hasMany($class, $link)
    method createRelationQuery (line 443) | protected function createRelationQuery($class, $link, $multiple)
    method populateRelation (line 464) | public function populateRelation($name, $records)
    method isRelationPopulated (line 479) | public function isRelationPopulated($name)
    method getRelatedRecords (line 489) | public function getRelatedRecords()
    method hasAttribute (line 499) | public function hasAttribute($name)
    method getAttribute (line 517) | public function getAttribute($name)
    method setAttribute (line 529) | public function setAttribute($name, $value)
    method getOldAttributes (line 548) | public function getOldAttributes()
    method setOldAttributes (line 559) | public function setOldAttributes($values)
    method getOldAttribute (line 573) | public function getOldAttribute($name)
    method setOldAttribute (line 585) | public function setOldAttribute($name, $value)
    method canSetOldAttribute (line 600) | public function canSetOldAttribute($name)
    method markAttributeDirty (line 611) | public function markAttributeDirty($name)
    method isAttributeChanged (line 624) | public function isAttributeChanged($name, $identical = true)
    method getDirtyAttributes (line 646) | public function getDirtyAttributes($names = null)
    method save (line 693) | public function save($runValidation = true, $attributeNames = null)
    method update (line 754) | public function update($runValidation = true, $attributeNames = null)
    method updateAttributes (line 778) | public function updateAttributes($attributes)
    method updateInternal (line 810) | protected function updateInternal($attributes = null)
    method updateCounters (line 866) | public function updateCounters($counters)
    method delete (line 903) | public function delete()
    method getIsNewRecord (line 929) | public function getIsNewRecord()
    method setIsNewRecord (line 939) | public function setIsNewRecord($value)
    method init (line 949) | public function init()
    method afterFind (line 961) | public function afterFind()
    method beforeSave (line 990) | public function beforeSave($insert)
    method afterSave (line 1016) | public function afterSave($insert, $changedAttributes)
    method beforeDelete (line 1043) | public function beforeDelete()
    method afterDelete (line 1057) | public function afterDelete()
    method refresh (line 1071) | public function refresh()
    method refreshInternal (line 1085) | protected function refreshInternal($record)
    method afterRefresh (line 1108) | public function afterRefresh()
    method equals (line 1120) | public function equals($record)
    method getPrimaryKey (line 1138) | public function getPrimaryKey($asArray = false)
    method getOldPrimaryKey (line 1166) | public function getOldPrimaryKey($asArray = false)
    method populateRecord (line 1198) | public static function populateRecord($record, $row)
    method instantiate (line 1226) | public static function instantiate($row)
    method offsetExists (line 1237) | #[\ReturnTypeWillChange]
    method getRelation (line 1253) | public function getRelation($name, $throwException = true)
    method link (line 1310) | public function link($name, $model, $extraColumns = [])
    method unlink (line 1406) | public function unlink($name, $model, $delete = false)
    method unlinkAll (line 1509) | public function unlinkAll($name, $delete = false)
    method bindModels (line 1590) | private function bindModels($link, $foreignModel, $primaryModel)
    method isPrimaryKey (line 1611) | public static function isPrimaryKey($keys)
    method getAttributeLabel (line 1635) | public function getAttributeLabel($attribute)
    method getAttributeHint (line 1677) | public function getAttributeHint($attribute)
    method fields (line 1716) | public function fields()
    method extraFields (line 1728) | public function extraFields()
    method offsetUnset (line 1741) | public function offsetUnset($offset)
    method resetDependentRelations (line 1754) | private function resetDependentRelations($attribute)
    method setRelationDependencies (line 1768) | private function setRelationDependencies($name, $relation, $viaRelatio...
    method isValueDifferent (line 1791) | private function isValueDifferent($newValue, $oldValue)
    method loadRelationsFor (line 1827) | public static function loadRelationsFor(&$models, $relationNames, $asA...
    method loadRelations (line 1854) | public function loadRelations($relationNames, $asArray = false)

FILE: framework/db/BatchQueryResult.php
  class BatchQueryResult (line 34) | class BatchQueryResult extends Component implements \Iterator
    method __destruct (line 93) | public function __destruct()
    method reset (line 103) | public function reset()
    method rewind (line 119) | #[\ReturnTypeWillChange]
    method next (line 130) | #[\ReturnTypeWillChange]
    method fetchData (line 158) | protected function fetchData()
    method getRows (line 174) | protected function getRows()
    method key (line 204) | #[\ReturnTypeWillChange]
    method current (line 215) | #[\ReturnTypeWillChange]
    method valid (line 226) | #[\ReturnTypeWillChange]
    method getDbDriverName (line 237) | private function getDbDriverName()
    method __wakeup (line 259) | public function __wakeup()

FILE: framework/db/CheckConstraint.php
  class CheckConstraint (line 17) | class CheckConstraint extends Constraint

FILE: framework/db/ColumnSchema.php
  class ColumnSchema (line 20) | class ColumnSchema extends BaseObject
    method phpTypecast (line 90) | public function phpTypecast($value)
    method dbTypecast (line 102) | public function dbTypecast($value)
    method typecast (line 116) | protected function typecast($value)
    method getPdoParamTypes (line 194) | private function getPdoParamTypes()

FILE: framework/db/ColumnSchemaBuilder.php
  class ColumnSchemaBuilder (line 24) | class ColumnSchemaBuilder extends BaseObject
    method __construct (line 130) | public function __construct($type, $length = null, $db = null, $config...
    method notNull (line 142) | public function notNull()
    method null (line 153) | public function null()
    method unique (line 163) | public function unique()
    method check (line 174) | public function check($check)
    method defaultValue (line 185) | public function defaultValue($default)
    method comment (line 201) | public function comment($comment)
    method unsigned (line 212) | public function unsigned()
    method after (line 233) | public function after($after)
    method first (line 245) | public function first()
    method defaultExpression (line 257) | public function defaultExpression($default)
    method append (line 270) | public function append($sql)
    method __toString (line 280) | public function __toString()
    method getCategoryMap (line 297) | public function getCategoryMap()
    method setCategoryMap (line 306) | public function setCategoryMap($categoryMap)
    method buildLengthString (line 315) | protected function buildLengthString()
    method buildNotNullString (line 332) | protected function buildNotNullString()
    method buildUniqueString (line 347) | protected function buildUniqueString()
    method buildDefaultValue (line 356) | protected function buildDefaultValue()
    method buildDefaultString (line 385) | protected function buildDefaultString()
    method buildCheckString (line 399) | protected function buildCheckString()
    method buildUnsignedString (line 409) | protected function buildUnsignedString()
    method buildAfterString (line 419) | protected function buildAfterString()
    method buildFirstString (line 429) | protected function buildFirstString()
    method buildAppendString (line 439) | protected function buildAppendString()
    method getTypeCategory (line 449) | protected function getTypeCategory()
    method buildCommentString (line 459) | protected function buildCommentString()
    method buildCompleteString (line 470) | protected function buildCompleteString($format)

FILE: framework/db/Command.php
  class Command (line 58) | class Command extends Component
    method cache (line 126) | public function cache($duration = null, $dependency = null)
    method noCache (line 137) | public function noCache()
    method getSql (line 147) | public function getSql()
    method setSql (line 162) | public function setSql($sql)
    method setRawSql (line 184) | public function setRawSql($sql)
    method getRawSql (line 201) | public function getRawSql()
    method prepare (line 245) | public function prepare($forRead = null)
    method cancel (line 284) | public function cancel()
    method bindParam (line 302) | public function bindParam($name, &$value, $dataType = null, $length = ...
    method bindPendingParams (line 325) | protected function bindPendingParams()
    method bindValue (line 344) | public function bindValue($name, $value, $dataType = null)
    method bindValues (line 366) | public function bindValues($values)
    method query (line 403) | public function query()
    method queryAll (line 416) | public function queryAll($fetchMode = null)
    method queryOne (line 430) | public function queryOne($fetchMode = null)
    method queryScalar (line 442) | public function queryScalar()
    method queryColumn (line 459) | public function queryColumn()
    method insert (line 486) | public function insert($table, $columns)
    method batchInsert (line 518) | public function batchInsert($table, $columns, $rows)
    method upsert (line 563) | public function upsert($table, $insertColumns, $updateColumns = true, ...
    method update (line 597) | public function update($table, $columns, $condition = '', $params = [])
    method delete (line 630) | public function delete($table, $condition = '', $params = [])
    method createTable (line 666) | public function createTable($table, $columns, $options = null)
    method renameTable (line 679) | public function renameTable($table, $newName)
    method dropTable (line 691) | public function dropTable($table)
    method truncateTable (line 703) | public function truncateTable($table)
    method addColumn (line 719) | public function addColumn($table, $column, $type)
    method dropColumn (line 732) | public function dropColumn($table, $column)
    method renameColumn (line 746) | public function renameColumn($table, $oldName, $newName)
    method alterColumn (line 762) | public function alterColumn($table, $column, $type)
    method addPrimaryKey (line 777) | public function addPrimaryKey($name, $table, $columns)
    method dropPrimaryKey (line 790) | public function dropPrimaryKey($name, $table)
    method addForeignKey (line 809) | public function addForeignKey($name, $table, $columns, $refTable, $ref...
    method dropForeignKey (line 822) | public function dropForeignKey($name, $table)
    method createIndex (line 838) | public function createIndex($name, $table, $columns, $unique = false)
    method dropIndex (line 851) | public function dropIndex($name, $table)
    method addUnique (line 870) | public function addUnique($name, $table, $columns)
    method dropUnique (line 886) | public function dropUnique($name, $table)
    method addCheck (line 903) | public function addCheck($name, $table, $expression)
    method dropCheck (line 919) | public function dropCheck($name, $table)
    method addDefaultValue (line 938) | public function addDefaultValue($name, $table, $column, $value)
    method dropDefaultValue (line 954) | public function dropDefaultValue($name, $table)
    method resetSequence (line 971) | public function resetSequence($table, $value = null)
    method executeResetSequence (line 989) | public function executeResetSequence($table, $value = null)
    method checkIntegrity (line 1003) | public function checkIntegrity($check = true, $schema = '', $table = '')
    method addCommentOnColumn (line 1019) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 1034) | public function addCommentOnTable($table, $comment)
    method dropCommentFromColumn (line 1049) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 1063) | public function dropCommentFromTable($table)
    method createView (line 1079) | public function createView($viewName, $subquery)
    method dropView (line 1093) | public function dropView($viewName)
    method execute (line 1107) | public function execute()
    method logQuery (line 1142) | protected function logQuery($category)
    method queryInternal (line 1164) | protected function queryInternal($method, $fetchMode = null)
    method getCacheKey (line 1222) | protected function getCacheKey($method, $fetchMode, $rawSql)
    method requireTableSchemaRefresh (line 1243) | protected function requireTableSchemaRefresh($name)
    method refreshTableSchema (line 1253) | protected function refreshTableSchema()
    method requireTransaction (line 1267) | protected function requireTransaction($isolationLevel = null)
    method setRetryHandler (line 1291) | protected function setRetryHandler(callable $handler)
    method internalExecute (line 1307) | protected function internalExecute($rawSql)
    method reset (line 1339) | protected function reset()

FILE: framework/db/Connection.php
  class Connection (line 137) | class Connection extends Component
    method getIsActive (line 472) | public function getIsActive()
    method cache (line 507) | public function cache(callable $callable, $duration = null, $dependenc...
    method noCache (line 548) | public function noCache(callable $callable)
    method getQueryCacheInfo (line 572) | public function getQueryCacheInfo($duration, $dependency)
    method open (line 607) | public function open()
    method close (line 657) | public function close()
    method createPdoInstance (line 693) | protected function createPdoInstance()
    method initConnection (line 733) | protected function initConnection()
    method createCommand (line 761) | public function createCommand($sql = null, $params = [])
    method getTransaction (line 781) | public function getTransaction()
    method beginTransaction (line 792) | public function beginTransaction($isolationLevel = null)
    method transaction (line 813) | public function transaction(callable $callback, $isolationLevel = null)
    method rollbackTransactionOnLevel (line 841) | private function rollbackTransactionOnLevel($transaction, $level)
    method getSchema (line 859) | public function getSchema()
    method getQueryBuilder (line 883) | public function getQueryBuilder()
    method setQueryBuilder (line 894) | public function setQueryBuilder($value)
    method restoreQueryBuilderConfiguration (line 903) | private function restoreQueryBuilderConfiguration()
    method getTableSchema (line 922) | public function getTableSchema($name, $refresh = false)
    method getLastInsertID (line 933) | public function getLastInsertID($sequenceName = '')
    method quoteValue (line 945) | public function quoteValue($value)
    method quoteTableName (line 958) | public function quoteTableName($name)
    method quoteColumnName (line 974) | public function quoteColumnName($name)
    method quoteSql (line 991) | public function quoteSql($sql)
    method getDriverName (line 1011) | public function getDriverName()
    method setDriverName (line 1028) | public function setDriverName($driverName)
    method getServerVersion (line 1038) | public function getServerVersion()
    method getSlavePdo (line 1051) | public function getSlavePdo($fallbackToMaster = true)
    method getMasterPdo (line 1066) | public function getMasterPdo()
    method getSlave (line 1079) | public function getSlave($fallbackToMaster = true)
    method getMaster (line 1098) | public function getMaster()
    method useMaster (line 1126) | public function useMaster(callable $callback)
    method openFromPool (line 1161) | protected function openFromPool(array $pool, array $sharedConfig)
    method openFromPoolSequentially (line 1190) | protected function openFromPoolSequentially(array $pool, array $shared...
    method __sleep (line 1259) | public function __sleep()
    method __clone (line 1275) | public function __clone()

FILE: framework/db/Constraint.php
  class Constraint (line 19) | class Constraint extends BaseObject

FILE: framework/db/ConstraintFinderInterface.php
  type ConstraintFinderInterface (line 17) | interface ConstraintFinderInterface
    method getTablePrimaryKey (line 25) | public function getTablePrimaryKey($name, $refresh = false);
    method getSchemaPrimaryKeys (line 35) | public function getSchemaPrimaryKeys($schema = '', $refresh = false);
    method getTableForeignKeys (line 43) | public function getTableForeignKeys($name, $refresh = false);
    method getSchemaForeignKeys (line 53) | public function getSchemaForeignKeys($schema = '', $refresh = false);
    method getTableIndexes (line 61) | public function getTableIndexes($name, $refresh = false);
    method getSchemaIndexes (line 71) | public function getSchemaIndexes($schema = '', $refresh = false);
    method getTableUniques (line 79) | public function getTableUniques($name, $refresh = false);
    method getSchemaUniques (line 89) | public function getSchemaUniques($schema = '', $refresh = false);
    method getTableChecks (line 97) | public function getTableChecks($name, $refresh = false);
    method getSchemaChecks (line 107) | public function getSchemaChecks($schema = '', $refresh = false);
    method getTableDefaultValues (line 115) | public function getTableDefaultValues($name, $refresh = false);
    method getSchemaDefaultValues (line 125) | public function getSchemaDefaultValues($schema = '', $refresh = false);

FILE: framework/db/ConstraintFinderTrait.php
  type ConstraintFinderTrait (line 30) | trait ConstraintFinderTrait
    method getTableMetadata (line 39) | abstract protected function getTableMetadata($name, $type, $refresh);
    method getSchemaMetadata (line 49) | abstract protected function getSchemaMetadata($schema, $type, $refresh);
    method loadTablePrimaryKey (line 56) | abstract protected function loadTablePrimaryKey($tableName);
    method loadTableForeignKeys (line 63) | abstract protected function loadTableForeignKeys($tableName);
    method loadTableIndexes (line 70) | abstract protected function loadTableIndexes($tableName);
    method loadTableUniques (line 77) | abstract protected function loadTableUniques($tableName);
    method loadTableChecks (line 84) | abstract protected function loadTableChecks($tableName);
    method loadTableDefaultValues (line 92) | abstract protected function loadTableDefaultValues($tableName);
    method getTablePrimaryKey (line 100) | public function getTablePrimaryKey($name, $refresh = false)
    method getSchemaPrimaryKeys (line 113) | public function getSchemaPrimaryKeys($schema = '', $refresh = false)
    method getTableForeignKeys (line 124) | public function getTableForeignKeys($name, $refresh = false)
    method getSchemaForeignKeys (line 137) | public function getSchemaForeignKeys($schema = '', $refresh = false)
    method getTableIndexes (line 148) | public function getTableIndexes($name, $refresh = false)
    method getSchemaIndexes (line 161) | public function getSchemaIndexes($schema = '', $refresh = false)
    method getTableUniques (line 172) | public function getTableUniques($name, $refresh = false)
    method getSchemaUniques (line 185) | public function getSchemaUniques($schema = '', $refresh = false)
    method getTableChecks (line 196) | public function getTableChecks($name, $refresh = false)
    method getSchemaChecks (line 209) | public function getSchemaChecks($schema = '', $refresh = false)
    method getTableDefaultValues (line 220) | public function getTableDefaultValues($name, $refresh = false)
    method getSchemaDefaultValues (line 233) | public function getSchemaDefaultValues($schema = '', $refresh = false)

FILE: framework/db/DataReader.php
  class DataReader (line 54) | class DataReader extends \yii\base\BaseObject implements \Iterator, \Cou...
    method __construct (line 70) | public function __construct(Command $command, $config = [])
    method bindColumn (line 88) | public function bindColumn($column, &$value, $dataType = null)
    method setFetchMode (line 103) | public function setFetchMode($mode)
    method read (line 113) | public function read()
    method readColumn (line 123) | public function readColumn($columnIndex)
    method readObject (line 134) | public function readObject($className, $fields)
    method readAll (line 144) | public function readAll()
    method nextResult (line 155) | public function nextResult()
    method close (line 169) | public function close()
    method getIsClosed (line 179) | public function getIsClosed()
    method getRowCount (line 190) | public function getRowCount()
    method count (line 202) | #[\ReturnTypeWillChange]
    method getColumnCount (line 213) | public function getColumnCount()
    method rewind (line 223) | #[\ReturnTypeWillChange]
    method key (line 239) | #[\ReturnTypeWillChange]
    method current (line 250) | #[\ReturnTypeWillChange]
    method next (line 260) | #[\ReturnTypeWillChange]
    method valid (line 272) | #[\ReturnTypeWillChange]

FILE: framework/db/DefaultValueConstraint.php
  class DefaultValueConstraint (line 17) | class DefaultValueConstraint extends Constraint

FILE: framework/db/Exception.php
  class Exception (line 17) | class Exception extends \yii\base\Exception
    method __construct (line 33) | public function __construct($message, $errorInfo = [], $code = '', $pr...
    method getName (line 43) | public function getName()
    method __toString (line 51) | public function __toString()

FILE: framework/db/Expression.php
  class Expression (line 32) | class Expression extends \yii\base\BaseObject implements ExpressionInter...
    method __construct (line 52) | public function __construct($expression, $params = [], $config = [])
    method __toString (line 63) | public function __toString()

FILE: framework/db/ExpressionBuilder.php
  class ExpressionBuilder (line 17) | class ExpressionBuilder implements ExpressionBuilderInterface
    method build (line 26) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/ExpressionBuilderInterface.php
  type ExpressionBuilderInterface (line 18) | interface ExpressionBuilderInterface
    method build (line 28) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/ExpressionBuilderTrait.php
  type ExpressionBuilderTrait (line 18) | trait ExpressionBuilderTrait
    method __construct (line 30) | public function __construct(QueryBuilder $queryBuilder)

FILE: framework/db/ExpressionInterface.php
  type ExpressionInterface (line 23) | interface ExpressionInterface

FILE: framework/db/ForeignKeyConstraint.php
  class ForeignKeyConstraint (line 17) | class ForeignKeyConstraint extends Constraint

FILE: framework/db/IndexConstraint.php
  class IndexConstraint (line 17) | class IndexConstraint extends Constraint

FILE: framework/db/IntegrityException.php
  class IntegrityException (line 17) | class IntegrityException extends Exception
    method getName (line 22) | public function getName()

FILE: framework/db/JsonExpression.php
  class JsonExpression (line 25) | class JsonExpression implements ExpressionInterface, \JsonSerializable
    method __construct (line 52) | public function __construct($value, $type = null)
    method getValue (line 66) | public function getValue()
    method getType (line 75) | public function getType()
    method jsonSerialize (line 89) | #[\ReturnTypeWillChange]

FILE: framework/db/Migration.php
  class Migration (line 47) | class Migration extends Component implements MigrationInterface
    method init (line 88) | public function init()
    method getDb (line 100) | protected function getDb()
    method up (line 111) | public function up()
    method down (line 140) | public function down()
    method printException (line 165) | private function printException($e)
    method safeUp (line 184) | public function safeUp()
    method safeDown (line 201) | public function safeDown()
    method execute (line 212) | public function execute($sql, $params = [])
    method insert (line 230) | public function insert($table, $columns)
    method batchInsert (line 244) | public function batchInsert($table, $columns, $rows)
    method upsert (line 267) | public function upsert($table, $insertColumns, $updateColumns = true, ...
    method update (line 283) | public function update($table, $columns, $condition = '', $params = [])
    method delete (line 297) | public function delete($table, $condition = '', $params = [])
    method createTable (line 332) | public function createTable($table, $columns, $options = null)
    method renameTable (line 349) | public function renameTable($table, $newName)
    method dropTable (line 360) | public function dropTable($table)
    method truncateTable (line 371) | public function truncateTable($table)
    method addColumn (line 386) | public function addColumn($table, $column, $type)
    method dropColumn (line 401) | public function dropColumn($table, $column)
    method renameColumn (line 414) | public function renameColumn($table, $name, $newName)
    method alterColumn (line 429) | public function alterColumn($table, $column, $type)
    method addPrimaryKey (line 446) | public function addPrimaryKey($name, $table, $columns)
    method dropPrimaryKey (line 458) | public function dropPrimaryKey($name, $table)
    method addForeignKey (line 476) | public function addForeignKey($name, $table, $columns, $refTable, $ref...
    method dropForeignKey (line 488) | public function dropForeignKey($name, $table)
    method createIndex (line 504) | public function createIndex($name, $table, $columns, $unique = false)
    method dropIndex (line 516) | public function dropIndex($name, $table)
    method addCheck (line 531) | public function addCheck($name, $table, $expression)
    method dropCheck (line 545) | public function dropCheck($name, $table)
    method addCommentOnColumn (line 560) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 574) | public function addCommentOnTable($table, $comment)
    method dropCommentFromColumn (line 588) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 601) | public function dropCommentFromTable($table)
    method beginCommand (line 615) | protected function beginCommand($description)
    method endCommand (line 629) | protected function endCommand($time)

FILE: framework/db/MigrationInterface.php
  type MigrationInterface (line 20) | interface MigrationInterface
    method up (line 27) | public function up();
    method down (line 35) | public function down();

FILE: framework/db/PdoValue.php
  class PdoValue (line 27) | final class PdoValue implements ExpressionInterface
    method __construct (line 46) | public function __construct($value, $type)
    method getValue (line 55) | public function getValue()
    method getType (line 63) | public function getType()

FILE: framework/db/PdoValueBuilder.php
  class PdoValueBuilder (line 17) | class PdoValueBuilder implements ExpressionBuilderInterface
    method build (line 23) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/Query.php
  class Query (line 52) | class Query extends Component implements QueryInterface, ExpressionInter...
    method createCommand (line 153) | public function createCommand($db = null)
    method prepare (line 173) | public function prepare($builder)
    method batch (line 199) | public function batch($batchSize = 100, $db = null)
    method each (line 227) | public function each($batchSize = 100, $db = null)
    method all (line 244) | public function all($db = null)
    method populate (line 262) | public function populate($rows)
    method one (line 282) | public function one($db = null)
    method scalar (line 299) | public function scalar($db = null)
    method column (line 314) | public function column($db = null)
    method count (line 363) | public function count($q = '*', $db = null)
    method sum (line 380) | public function sum($q, $db = null)
    method average (line 397) | public function average($q, $db = null)
    method min (line 414) | public function min($q, $db = null)
    method max (line 427) | public function max($q, $db = null)
    method exists (line 438) | public function exists($db = null)
    method queryScalar (line 458) | protected function queryScalar($selectExpression, $db)
    method getTablesUsedInFrom (line 517) | public function getTablesUsedInFrom()
    method cleanUpTableNames (line 543) | protected function cleanUpTableNames($tableNames)
    method ensureNameQuoted (line 609) | private function ensureNameQuoted($name)
    method select (line 641) | public function select($columns, $option = null)
    method addSelect (line 663) | public function addSelect($columns)
    method normalizeSelect (line 683) | protected function normalizeSelect($columns)
    method getUniqueColumns (line 728) | protected function getUniqueColumns($columns)
    method getUnaliasedColumnsFromSelect (line 759) | protected function getUnaliasedColumnsFromSelect()
    method distinct (line 777) | public function distinct($value = true)
    method from (line 817) | public function from($tables)
    method where (line 846) | public function where($condition, $params = [])
    method andWhere (line 863) | public function andWhere($condition, $params = [])
    method orWhere (line 886) | public function orWhere($condition, $params = [])
    method andFilterCompare (line 923) | public function andFilterCompare($name, $value, $defaultOperator = '=')
    method join (line 967) | public function join($type, $table, $on = '', $params = [])
    method innerJoin (line 993) | public function innerJoin($table, $on = '', $params = [])
    method leftJoin (line 1019) | public function leftJoin($table, $on = '', $params = [])
    method rightJoin (line 1045) | public function rightJoin($table, $on = '', $params = [])
    method groupBy (line 1067) | public function groupBy($columns)
    method addGroupBy (line 1094) | public function addGroupBy($columns)
    method having (line 1119) | public function having($condition, $params = [])
    method andHaving (line 1136) | public function andHaving($condition, $params = [])
    method orHaving (line 1157) | public function orHaving($condition, $params = [])
    method filterHaving (line 1196) | public function filterHaving(array $condition)
    method andFilterHaving (line 1221) | public function andFilterHaving(array $condition)
    method orFilterHaving (line 1246) | public function orFilterHaving(array $condition)
    method union (line 1262) | public function union($sql, $all = false)
    method withQuery (line 1276) | public function withQuery($query, $alias, $recursive = false)
    method params (line 1289) | public function params($params)
    method addParams (line 1302) | public function addParams($params)
    method cache (line 1332) | public function cache($duration = true, $dependency = null)
    method noCache (line 1344) | public function noCache()
    method setCommandCache (line 1357) | protected function setCommandCache($command)
    method create (line 1373) | public static function create($from)
    method __toString (line 1398) | public function __toString()

FILE: framework/db/QueryBuilder.php
  class QueryBuilder (line 37) | class QueryBuilder extends \yii\base\BaseObject
    method __construct (line 116) | public function __construct($connection, $config = [])
    method init (line 125) | public function init()
    method defaultConditionClasses (line 141) | protected function defaultConditionClasses()
    method defaultExpressionBuilders (line 168) | protected function defaultExpressionBuilders()
    method setExpressionBuilders (line 196) | public function setExpressionBuilders($builders)
    method setConditionClasses (line 213) | public function setConditionClasses($classes)
    method build (line 228) | public function build($query, $params = [])
    method buildExpression (line 287) | public function buildExpression(ExpressionInterface $expression, &$par...
    method getExpressionBuilder (line 304) | public function getExpressionBuilder(ExpressionInterface $expression)
    method insert (line 353) | public function insert($table, $columns, &$params)
    method prepareInsertValues (line 372) | protected function prepareInsertValues($table, $columns, $params = [])
    method prepareInsertSelectSubQuery (line 411) | protected function prepareInsertSelectSubQuery($columns, $schema, $par...
    method batchInsert (line 456) | public function batchInsert($table, $columns, $rows, &$params = [])
    method upsert (line 535) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method prepareUpsertColumns (line 549) | protected function prepareUpsertColumns($table, $insertColumns, $updat...
    method getTableUniqueColumnNames (line 576) | private function getTableUniqueColumnNames($name, $columns, &$constrai...
    method update (line 633) | public function update($table, $columns, $condition, &$params)
    method prepareUpdateSets (line 650) | protected function prepareUpdateSets($table, $columns, $params = [])
    method delete (line 686) | public function delete($table, $condition, &$params)
    method createTable (line 721) | public function createTable($table, $columns, $options = null)
    method renameTable (line 742) | public function renameTable($oldName, $newName)
    method dropTable (line 752) | public function dropTable($table)
    method addPrimaryKey (line 764) | public function addPrimaryKey($name, $table, $columns)
    method dropPrimaryKey (line 785) | public function dropPrimaryKey($name, $table)
    method truncateTable (line 796) | public function truncateTable($table)
    method addColumn (line 810) | public function addColumn($table, $column, $type)
    method dropColumn (line 823) | public function dropColumn($table, $column)
    method renameColumn (line 836) | public function renameColumn($table, $oldName, $newName)
    method alterColumn (line 853) | public function alterColumn($table, $column, $type)
    method addForeignKey (line 875) | public function addForeignKey($name, $table, $columns, $refTable, $ref...
    method dropForeignKey (line 898) | public function dropForeignKey($name, $table)
    method createIndex (line 914) | public function createIndex($name, $table, $columns, $unique = false)
    method dropIndex (line 928) | public function dropIndex($name, $table)
    method addUnique (line 945) | public function addUnique($name, $table, $columns)
    method dropUnique (line 968) | public function dropUnique($name, $table)
    method addCheck (line 984) | public function addCheck($name, $table, $expression)
    method dropCheck (line 999) | public function dropCheck($name, $table)
    method addDefaultValue (line 1018) | public function addDefaultValue($name, $table, $column, $value)
    method dropDefaultValue (line 1033) | public function dropDefaultValue($name, $table)
    method resetSequence (line 1048) | public function resetSequence($tableName, $value = null)
    method executeResetSequence (line 1064) | public function executeResetSequence($table, $value = null)
    method checkIntegrity (line 1077) | public function checkIntegrity($check = true, $schema = '', $table = '')
    method addCommentOnColumn (line 1091) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 1104) | public function addCommentOnTable($table, $comment)
    method dropCommentFromColumn (line 1117) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 1129) | public function dropCommentFromTable($table)
    method createView (line 1143) | public function createView($viewName, $subQuery)
    method dropView (line 1166) | public function dropView($viewName)
    method getColumnType (line 1211) | public function getColumnType($type)
    method buildSelect (line 1239) | public function buildSelect($columns, &$params, $distinct = false, $se...
    method buildFrom (line 1282) | public function buildFrom($tables, &$params)
    method buildJoin (line 1299) | public function buildJoin($joins, &$params)
    method quoteTableNames (line 1332) | private function quoteTableNames($tables, &$params)
    method buildWhere (line 1360) | public function buildWhere($condition, &$params)
    method buildGroupBy (line 1371) | public function buildGroupBy($columns)
    method buildHaving (line 1392) | public function buildHaving($condition, &$params)
    method buildOrderByAndLimit (line 1407) | public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset)
    method buildOrderBy (line 1425) | public function buildOrderBy($columns)
    method buildLimit (line 1447) | public function buildLimit($limit, $offset)
    method hasLimit (line 1465) | protected function hasLimit($limit)
    method hasOffset (line 1475) | protected function hasOffset($offset)
    method buildUnion (line 1485) | public function buildUnion($unions, &$params)
    method buildWithQueries (line 1512) | public function buildWithQueries($withs, &$params)
    method buildColumns (line 1543) | public function buildColumns($columns)
    method buildCondition (line 1574) | public function buildCondition($condition, &$params)
    method createConditionFromArray (line 1601) | public function createConditionFromArray($condition)
    method buildHashCondition (line 1625) | public function buildHashCondition($condition, &$params)
    method buildAndCondition (line 1638) | public function buildAndCondition($operator, $operands, &$params)
    method buildNotCondition (line 1653) | public function buildNotCondition($operator, $operands, &$params)
    method buildBetweenCondition (line 1669) | public function buildBetweenCondition($operator, $operands, &$params)
    method buildInCondition (line 1688) | public function buildInCondition($operator, $operands, &$params)
    method buildLikeCondition (line 1715) | public function buildLikeCondition($operator, $operands, &$params)
    method buildExistsCondition (line 1730) | public function buildExistsCondition($operator, $operands, &$params)
    method buildSimpleCondition (line 1745) | public function buildSimpleCondition($operator, $operands, &$params)
    method selectExists (line 1757) | public function selectExists($rawSql)
    method bindParam (line 1771) | public function bindParam($value, &$params)
    method extractAlias (line 1785) | protected function extractAlias($table)

FILE: framework/db/QueryExpressionBuilder.php
  class QueryExpressionBuilder (line 18) | class QueryExpressionBuilder implements ExpressionBuilderInterface
    method build (line 31) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/QueryInterface.php
  type QueryInterface (line 24) | interface QueryInterface
    method all (line 32) | public function all($db = null);
    method one (line 41) | public function one($db = null);
    method count (line 50) | public function count($q = '*', $db = null);
    method exists (line 58) | public function exists($db = null);
    method indexBy (line 75) | public function indexBy($column);
    method where (line 164) | public function where($condition);
    method andWhere (line 175) | public function andWhere($condition);
    method orWhere (line 186) | public function orWhere($condition);
    method filterWhere (line 197) | public function filterWhere(array $condition);
    method andFilterWhere (line 208) | public function andFilterWhere(array $condition);
    method orFilterWhere (line 219) | public function orFilterWhere(array $condition);
    method orderBy (line 231) | public function orderBy($columns);
    method addOrderBy (line 243) | public function addOrderBy($columns);
    method limit (line 250) | public function limit($limit);
    method offset (line 257) | public function offset($offset);
    method emulateExecution (line 269) | public function emulateExecution($value = true);

FILE: framework/db/QueryTrait.php
  type QueryTrait (line 22) | trait QueryTrait
    method indexBy (line 78) | public function indexBy($column)
    method where (line 94) | public function where($condition)
    method andWhere (line 109) | public function andWhere($condition)
    method orWhere (line 129) | public function orWhere($condition)
    method filterWhere (line 167) | public function filterWhere(array $condition)
    method andFilterWhere (line 191) | public function andFilterWhere(array $condition)
    method orFilterWhere (line 215) | public function orFilterWhere(array $condition)
    method filterCondition (line 232) | protected function filterCondition($condition)
    method isEmpty (line 302) | protected function isEmpty($value)
    method orderBy (line 324) | public function orderBy($columns)
    method addOrderBy (line 347) | public function addOrderBy($columns)
    method normalizeOrderBy (line 365) | protected function normalizeOrderBy($columns)
    method limit (line 393) | public function limit($limit)
    method offset (line 404) | public function offset($offset)
    method emulateExecution (line 420) | public function emulateExecution($value = true)

FILE: framework/db/Schema.php
  class Schema (line 44) | abstract class Schema extends BaseObject
    method resolveTableName (line 137) | protected function resolveTableName($name)
    method findSchemaNames (line 150) | protected function findSchemaNames()
    method findTableNames (line 163) | protected function findTableNames($schema = '')
    method loadTableSchema (line 173) | abstract protected function loadTableSchema($name);
    method createColumnSchema (line 181) | protected function createColumnSchema()
    method getTableSchema (line 192) | public function getTableSchema($name, $refresh = false)
    method getTableSchemas (line 205) | public function getTableSchemas($schema = '', $refresh = false)
    method getSchemaNames (line 217) | public function getSchemaNames($refresh = false)
    method getTableNames (line 234) | public function getTableNames($schema = '', $refresh = false)
    method getQueryBuilder (line 246) | public function getQueryBuilder()
    method getPdoType (line 261) | public function getPdoType($data)
    method refresh (line 281) | public function refresh()
    method refreshTableSchema (line 299) | public function refreshTableSchema($name)
    method createQueryBuilder (line 316) | public function createQueryBuilder()
    method createColumnSchemaBuilder (line 331) | public function createColumnSchemaBuilder($type, $length = null)
    method findUniqueIndexes (line 354) | public function findUniqueIndexes($table)
    method getLastInsertID (line 366) | public function getLastInsertID($sequenceName = '')
    method supportsSavepoint (line 378) | public function supportsSavepoint()
    method createSavepoint (line 387) | public function createSavepoint($name)
    method releaseSavepoint (line 396) | public function releaseSavepoint($name)
    method rollBackSavepoint (line 405) | public function rollBackSavepoint($name)
    method setTransactionIsolationLevel (line 418) | public function setTransactionIsolationLevel($level)
    method insert (line 430) | public function insert($table, $columns)
    method quoteValue (line 457) | public function quoteValue($str)
    method quoteTableName (line 480) | public function quoteTableName($name)
    method getTableNameParts (line 505) | protected function getTableNameParts($name)
    method quoteColumnName (line 519) | public function quoteColumnName($name)
    method quoteSimpleTableName (line 544) | public function quoteSimpleTableName($name)
    method quoteSimpleColumnName (line 561) | public function quoteSimpleColumnName($name)
    method unquoteSimpleTableName (line 579) | public function unquoteSimpleTableName($name)
    method unquoteSimpleColumnName (line 597) | public function unquoteSimpleColumnName($name)
    method getRawTableName (line 614) | public function getRawTableName($name)
    method getColumnPhpType (line 630) | protected function getColumnPhpType($column)
    method convertException (line 664) | public function convertException(\Exception $e, $rawSql)
    method isReadQuery (line 686) | public function isReadQuery($sql)
    method getServerVersion (line 697) | public function getServerVersion()
    method getCacheKey (line 710) | protected function getCacheKey($name)
    method getCacheTag (line 725) | protected function getCacheTag()
    method getTableMetadata (line 744) | protected function getTableMetadata($name, $type, $refresh)
    method getSchemaMetadata (line 776) | protected function getSchemaMetadata($schema, $type, $refresh)
    method setTableMetadata (line 800) | protected function setTableMetadata($name, $type, $data)
    method normalizePdoRowKeyCase (line 812) | protected function normalizePdoRowKeyCase(array $row, $multiple)
    method loadTableMetadataFromCache (line 832) | private function loadTableMetadataFromCache($cache, $name)
    method saveTableMetadataToCache (line 854) | private function saveTableMetadataToCache($cache, $name)

FILE: framework/db/SchemaBuilderTrait.php
  type SchemaBuilderTrait (line 36) | trait SchemaBuilderTrait
    method getDb (line 41) | abstract protected function getDb();
    method primaryKey (line 50) | public function primaryKey($length = null)
    method bigPrimaryKey (line 62) | public function bigPrimaryKey($length = null)
    method char (line 74) | public function char($length = null)
    method string (line 86) | public function string($length = null)
    method text (line 96) | public function text()
    method tinyInteger (line 108) | public function tinyInteger($length = null)
    method smallInteger (line 120) | public function smallInteger($length = null)
    method integer (line 132) | public function integer($length = null)
    method bigInteger (line 144) | public function bigInteger($length = null)
    method float (line 156) | public function float($precision = null)
    method double (line 168) | public function double($precision = null)
    method decimal (line 184) | public function decimal($precision = null, $scale = null)
    method dateTime (line 204) | public function dateTime($precision = null)
    method timestamp (line 216) | public function timestamp($precision = null)
    method time (line 228) | public function time($precision = null)
    method date (line 238) | public function date()
    method binary (line 250) | public function binary($length = null)
    method boolean (line 260) | public function boolean()
    method money (line 276) | public function money($precision = null, $scale = null)
    method json (line 294) | public function json()

FILE: framework/db/SqlToken.php
  class SqlToken (line 26) | class SqlToken extends BaseObject implements \ArrayAccess
    method __toString (line 76) | public function __toString()
    method offsetExists (line 88) | #[\ReturnTypeWillChange]
    method offsetGet (line 101) | #[\ReturnTypeWillChange]
    method offsetSet (line 115) | #[\ReturnTypeWillChange]
    method offsetUnset (line 133) | #[\ReturnTypeWillChange]
    method getChildren (line 147) | public function getChildren()
    method setChildren (line 156) | public function setChildren($children)
    method getIsCollection (line 170) | public function getIsCollection()
    method getHasChildren (line 183) | public function getHasChildren()
    method getSql (line 192) | public function getSql()
    method matches (line 221) | public function matches(SqlToken $patternToken, $offset = 0, &$firstMa...
    method tokensMatch (line 240) | private function tokensMatch(SqlToken $patternToken, SqlToken $token, ...
    method calculateOffset (line 293) | private function calculateOffset($offset)
    method updateCollectionOffsets (line 305) | private function updateCollectionOffsets()

FILE: framework/db/SqlTokenizer.php
  class SqlTokenizer (line 32) | abstract class SqlTokenizer extends Component
    method __construct (line 75) | public function __construct($sql, $config = [])
    method tokenize (line 85) | public function tokenize()
    method isWhitespace (line 129) | abstract protected function isWhitespace(&$length);
    method isComment (line 137) | abstract protected function isComment(&$length);
    method isOperator (line 147) | abstract protected function isOperator(&$length, &$content);
    method isIdentifier (line 157) | abstract protected function isIdentifier(&$length, &$content);
    method isStringLiteral (line 167) | abstract protected function isStringLiteral(&$length, &$content);
    method isKeyword (line 176) | abstract protected function isKeyword($string, &$content);
    method startsWithAnyLongest (line 187) | protected function startsWithAnyLongest(array &$with, $caseSensitive, ...
    method substring (line 222) | protected function substring($length, $caseSensitive = true, $offset =...
    method indexAfter (line 248) | protected function indexAfter($string, $offset = null)
    method tokenizeDelimitedString (line 272) | private function tokenizeDelimitedString(&$length)
    method tokenizeOperator (line 295) | private function tokenizeOperator(&$length)
    method addTokenFromBuffer (line 357) | private function addTokenFromBuffer()
    method advance (line 378) | private function advance($length)
    method isEof (line 392) | private function isEof()

FILE: framework/db/StaleObjectException.php
  class StaleObjectException (line 15) | class StaleObjectException extends Exception
    method getName (line 20) | public function getName()

FILE: framework/db/TableSchema.php
  class TableSchema (line 22) | class TableSchema extends BaseObject
    method getColumn (line 70) | public function getColumn($name)
    method getColumnNames (line 79) | public function getColumnNames()
    method fixPrimaryKey (line 89) | public function fixPrimaryKey($keys)

FILE: framework/db/Transaction.php
  class Transaction (line 53) | class Transaction extends \yii\base\BaseObject
    method getIsActive (line 91) | public function getIsActive()
    method begin (line 119) | public function begin($isolationLevel = null)
    method commit (line 157) | public function commit()
    method rollBack (line 189) | public function rollBack()
    method setIsolationLevel (line 232) | public function setIsolationLevel($level)
    method getLevel (line 245) | public function getLevel()

FILE: framework/db/ViewFinderTrait.php
  type ViewFinderTrait (line 18) | trait ViewFinderTrait
    method findViewNames (line 30) | abstract protected function findViewNames($schema = '');
    method getViewNames (line 40) | public function getViewNames($schema = '', $refresh = false)

FILE: framework/db/conditions/AndCondition.php
  class AndCondition (line 17) | class AndCondition extends ConjunctionCondition
    method getOperator (line 24) | public function getOperator()

FILE: framework/db/conditions/BetweenColumnsCondition.php
  class BetweenColumnsCondition (line 43) | class BetweenColumnsCondition implements ConditionInterface
    method __construct (line 71) | public function __construct($value, $operator, $intervalStartColumn, $...
    method getOperator (line 82) | public function getOperator()
    method getValue (line 90) | public function getValue()
    method getIntervalStartColumn (line 98) | public function getIntervalStartColumn()
    method getIntervalEndColumn (line 106) | public function getIntervalEndColumn()
    method fromArrayDefinition (line 115) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/BetweenColumnsConditionBuilder.php
  class BetweenColumnsConditionBuilder (line 22) | class BetweenColumnsConditionBuilder implements ExpressionBuilderInterface
    method build (line 35) | public function build(ExpressionInterface $expression, array &$params ...
    method escapeColumnName (line 53) | protected function escapeColumnName($columnName, &$params = [])
    method createPlaceholder (line 74) | protected function createPlaceholder($value, &$params)

FILE: framework/db/conditions/BetweenCondition.php
  class BetweenCondition (line 20) | class BetweenCondition implements ConditionInterface
    method __construct (line 48) | public function __construct($column, $operator, $intervalStart, $inter...
    method getOperator (line 59) | public function getOperator()
    method getColumn (line 67) | public function getColumn()
    method getIntervalStart (line 75) | public function getIntervalStart()
    method getIntervalEnd (line 83) | public function getIntervalEnd()
    method fromArrayDefinition (line 92) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/BetweenConditionBuilder.php
  class BetweenConditionBuilder (line 21) | class BetweenConditionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $expression, array &$params ...
    method createPlaceholder (line 56) | protected function createPlaceholder($value, &$params)

FILE: framework/db/conditions/ConditionInterface.php
  type ConditionInterface (line 21) | interface ConditionInterface extends ExpressionInterface
    method fromArrayDefinition (line 33) | public static function fromArrayDefinition($operator, $operands);

FILE: framework/db/conditions/ConjunctionCondition.php
  class ConjunctionCondition (line 17) | abstract class ConjunctionCondition implements ConditionInterface
    method __construct (line 28) | public function __construct($expressions) // TODO: use variadic params...
    method getExpressions (line 36) | public function getExpressions()
    method getOperator (line 45) | abstract public function getOperator();
    method fromArrayDefinition (line 50) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/ConjunctionConditionBuilder.php
  class ConjunctionConditionBuilder (line 21) | class ConjunctionConditionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $condition, array &$params =...
    method buildExpressionsFrom (line 56) | private function buildExpressionsFrom(ExpressionInterface $condition, ...

FILE: framework/db/conditions/ExistsCondition.php
  class ExistsCondition (line 21) | class ExistsCondition implements ConditionInterface
    method __construct (line 39) | public function __construct($operator, $query)
    method fromArrayDefinition (line 48) | public static function fromArrayDefinition($operator, $operands)
    method getOperator (line 60) | public function getOperator()
    method getQuery (line 68) | public function getQuery()

FILE: framework/db/conditions/ExistsConditionBuilder.php
  class ExistsConditionBuilder (line 21) | class ExistsConditionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/conditions/HashCondition.php
  class HashCondition (line 18) | class HashCondition implements ConditionInterface
    method __construct (line 31) | public function __construct($hash)
    method getHash (line 39) | public function getHash()
    method fromArrayDefinition (line 47) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/HashConditionBuilder.php
  class HashConditionBuilder (line 23) | class HashConditionBuilder implements ExpressionBuilderInterface
    method build (line 36) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/conditions/InCondition.php
  class InCondition (line 21) | class InCondition implements ConditionInterface
    method __construct (line 49) | public function __construct($column, $operator, $values)
    method getOperator (line 59) | public function getOperator()
    method getColumn (line 67) | public function getColumn()
    method getValues (line 75) | public function getValues()
    method fromArrayDefinition (line 83) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/InConditionBuilder.php
  class InConditionBuilder (line 23) | class InConditionBuilder implements ExpressionBuilderInterface
    method build (line 36) | public function build(ExpressionInterface $expression, array &$params ...
    method buildValues (line 119) | protected function buildValues(ConditionInterface $condition, $values,...
    method buildSubqueryInCondition (line 162) | protected function buildSubqueryInCondition($operator, $columns, $valu...
    method buildCompositeInCondition (line 198) | protected function buildCompositeInCondition($operator, $columns, $val...
    method getNullCondition (line 239) | protected function getNullCondition($operator, $column)
    method getRawValuesFromTraversableObject (line 253) | protected function getRawValuesFromTraversableObject(\Traversable $tra...

FILE: framework/db/conditions/LikeCondition.php
  class LikeCondition (line 19) | class LikeCondition extends SimpleCondition
    method __construct (line 36) | public function __construct($column, $operator, $value)
    method setEscapingReplacements (line 50) | public function setEscapingReplacements($escapingReplacements)
    method getEscapingReplacements (line 58) | public function getEscapingReplacements()
    method fromArrayDefinition (line 67) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/LikeConditionBuilder.php
  class LikeConditionBuilder (line 22) | class LikeConditionBuilder implements ExpressionBuilderInterface
    method build (line 50) | public function build(ExpressionInterface $expression, array &$params ...
    method getEscapeSql (line 93) | private function getEscapeSql()
    method parseOperator (line 106) | protected function parseOperator($operator)

FILE: framework/db/conditions/NotCondition.php
  class NotCondition (line 20) | class NotCondition implements ConditionInterface
    method __construct (line 33) | public function __construct($condition)
    method getCondition (line 41) | public function getCondition()
    method fromArrayDefinition (line 50) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/NotConditionBuilder.php
  class NotConditionBuilder (line 21) | class NotConditionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $expression, array &$params ...
    method getNegationOperator (line 48) | protected function getNegationOperator()

FILE: framework/db/conditions/OrCondition.php
  class OrCondition (line 17) | class OrCondition extends ConjunctionCondition
    method getOperator (line 24) | public function getOperator()

FILE: framework/db/conditions/SimpleCondition.php
  class SimpleCondition (line 20) | class SimpleCondition implements ConditionInterface
    method __construct (line 43) | public function __construct($column, $operator, $value)
    method getOperator (line 53) | public function getOperator()
    method getColumn (line 61) | public function getColumn()
    method getValue (line 69) | public function getValue()
    method fromArrayDefinition (line 78) | public static function fromArrayDefinition($operator, $operands)

FILE: framework/db/conditions/SimpleConditionBuilder.php
  class SimpleConditionBuilder (line 21) | class SimpleConditionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/cubrid/ColumnSchemaBuilder.php
  class ColumnSchemaBuilder (line 19) | class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
    method buildUnsignedString (line 24) | protected function buildUnsignedString()
    method buildAfterString (line 32) | protected function buildAfterString()
    method buildFirstString (line 42) | protected function buildFirstString()
    method buildCommentString (line 50) | protected function buildCommentString()
    method __toString (line 58) | public function __toString()

FILE: framework/db/cubrid/QueryBuilder.php
  class QueryBuilder (line 22) | class QueryBuilder extends \yii\db\QueryBuilder
    method defaultExpressionBuilders (line 55) | protected function defaultExpressionBuilders()
    method upsert (line 66) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method resetSequence (line 131) | public function resetSequence($tableName, $value = null)
    method buildLimit (line 154) | public function buildLimit($limit, $offset)
    method selectExists (line 176) | public function selectExists($rawSql)
    method dropIndex (line 185) | public function dropIndex($name, $table)
    method addCheck (line 202) | public function addCheck($name, $table, $expression)
    method dropCheck (line 211) | public function dropCheck($name, $table)
    method addCommentOnColumn (line 220) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 236) | public function addCommentOnTable($table, $comment)
    method dropCommentFromColumn (line 245) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 254) | public function dropCommentFromTable($table)
    method getColumnDefinition (line 269) | private function getColumnDefinition($table, $column)

FILE: framework/db/cubrid/Schema.php
  class Schema (line 34) | class Schema extends BaseSchema implements ConstraintFinderInterface
    method findTableNames (line 99) | protected function findTableNames($schema = '')
    method loadTableSchema (line 117) | protected function loadTableSchema($name)
    method loadTablePrimaryKey (line 166) | protected function loadTablePrimaryKey($tableName)
    method loadTableForeignKeys (line 183) | protected function loadTableForeignKeys($tableName)
    method loadTableIndexes (line 213) | protected function loadTableIndexes($tableName)
    method loadTableUniques (line 221) | protected function loadTableUniques($tableName)
    method loadTableChecks (line 230) | protected function loadTableChecks($tableName)
    method loadTableDefaultValues (line 239) | protected function loadTableDefaultValues($tableName)
    method releaseSavepoint (line 247) | public function releaseSavepoint($name)
    method createQueryBuilder (line 256) | public function createQueryBuilder()
    method loadColumnSchema (line 266) | protected function loadColumnSchema($info)
    method getPdoType (line 339) | public function getPdoType($data)
    method setTransactionIsolationLevel (line 358) | public function setTransactionIsolationLevel($level)
    method createColumnSchemaBuilder (line 381) | public function createColumnSchemaBuilder($type, $length = null)
    method loadTableConstraints (line 394) | private function loadTableConstraints($tableName, $returnType)

FILE: framework/db/cubrid/conditions/LikeConditionBuilder.php
  class LikeConditionBuilder (line 14) | class LikeConditionBuilder extends \yii\db\conditions\LikeConditionBuilder

FILE: framework/db/mssql/ColumnSchema.php
  class ColumnSchema (line 16) | class ColumnSchema extends \yii\db\ColumnSchema
    method defaultPhpTypecast (line 31) | public function defaultPhpTypecast($value)

FILE: framework/db/mssql/ColumnSchemaBuilder.php
  class ColumnSchemaBuilder (line 23) | class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
    method __toString (line 32) | public function __toString()
    method setAlterColumnFormat (line 46) | public function setAlterColumnFormat()
    method getDefaultValue (line 55) | public function getDefaultValue()
    method getCheckValue (line 68) | public function getCheckValue()
    method isUnique (line 76) | public function isUnique()

FILE: framework/db/mssql/DBLibPDO.php
  class DBLibPDO (line 18) | class DBLibPDO extends \PDO
    method lastInsertId (line 25) | #[\ReturnTypeWillChange]
    method getAttribute (line 40) | #[\ReturnTypeWillChange]

FILE: framework/db/mssql/PDO.php
  class PDO (line 18) | class PDO extends \PDO
    method lastInsertId (line 25) | #[\ReturnTypeWillChange]
    method beginTransaction (line 36) | #[\ReturnTypeWillChange]
    method commit (line 49) | #[\ReturnTypeWillChange]
    method rollBack (line 62) | #[\ReturnTypeWillChange]
    method getAttribute (line 79) | #[\ReturnTypeWillChange]

FILE: framework/db/mssql/QueryBuilder.php
  class QueryBuilder (line 23) | class QueryBuilder extends \yii\db\QueryBuilder
    method defaultExpressionBuilders (line 56) | protected function defaultExpressionBuilders()
    method buildOrderByAndLimit (line 67) | public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset)
    method newBuildOrderByAndLimit (line 89) | protected function newBuildOrderByAndLimit($sql, $orderBy, $limit, $of...
    method oldBuildOrderByAndLimit (line 116) | protected function oldBuildOrderByAndLimit($sql, $orderBy, $limit, $of...
    method renameTable (line 147) | public function renameTable($oldName, $newName)
    method renameColumn (line 159) | public function renameColumn($table, $oldName, $newName)
    method alterColumn (line 177) | public function alterColumn($table, $column, $type)
    method addDefaultValue (line 220) | public function addDefaultValue($name, $table, $column, $value)
    method dropDefaultValue (line 230) | public function dropDefaultValue($name, $table)
    method resetSequence (line 246) | public function resetSequence($tableName, $value = null)
    method checkIntegrity (line 282) | public function checkIntegrity($check = true, $schema = '', $table = '')
    method buildAddCommentSql (line 314) | protected function buildAddCommentSql($comment, $table, $column = null)
    method addCommentOnColumn (line 354) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 363) | public function addCommentOnTable($table, $comment)
    method buildRemoveCommentSql (line 380) | protected function buildRemoveCommentSql($table, $column = null)
    method dropCommentFromColumn (line 413) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 422) | public function dropCommentFromTable($table)
    method getAllColumnNames (line 433) | protected function getAllColumnNames($modelClass = null)
    method isOldMssql (line 449) | protected function isOldMssql()
    method selectExists (line 458) | public function selectExists($rawSql)
    method normalizeTableRowData (line 469) | private function normalizeTableRowData($table, $columns, &$params)
    method insert (line 491) | public function insert($table, $columns, &$params)
    method upsert (line 545) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method update (line 617) | public function update($table, $columns, $condition, &$params)
    method getColumnType (line 625) | public function getColumnType($type)
    method extractAlias (line 638) | protected function extractAlias($table)
    method dropConstraintsForColumn (line 656) | private function dropConstraintsForColumn($table, $column, $type = '')
    method dropColumn (line 686) | public function dropColumn($table, $column)

FILE: framework/db/mssql/Schema.php
  class Schema (line 32) | class Schema extends BaseSchema implements ConstraintFinderInterface
    method resolveTableName (line 107) | protected function resolveTableName($name)
    method getTableNameParts (line 144) | protected function getTableNameParts($name)
    method findSchemaNames (line 161) | protected function findSchemaNames()
    method findTableNames (line 177) | protected function findTableNames($schema = '')
    method loadTableSchema (line 195) | protected function loadTableSchema($name)
    method getSchemaMetadata (line 211) | protected function getSchemaMetadata($schema, $type, $refresh)
    method loadTablePrimaryKey (line 234) | protected function loadTablePrimaryKey($tableName)
    method loadTableForeignKeys (line 242) | protected function loadTableForeignKeys($tableName)
    method loadTableIndexes (line 250) | protected function loadTableIndexes($tableName)
    method loadTableUniques (line 289) | protected function loadTableUniques($tableName)
    method loadTableChecks (line 297) | protected function loadTableChecks($tableName)
    method loadTableDefaultValues (line 305) | protected function loadTableDefaultValues($tableName)
    method createSavepoint (line 313) | public function createSavepoint($name)
    method releaseSavepoint (line 321) | public function releaseSavepoint($name)
    method rollBackSavepoint (line 329) | public function rollBackSavepoint($name)
    method createQueryBuilder (line 338) | public function createQueryBuilder()
    method resolveTableNames (line 348) | protected function resolveTableNames($table, $name)
    method loadColumnSchema (line 381) | protected function loadColumnSchema($info)
    method findColumns (line 446) | protected function findColumns($table)
    method findTableConstraints (line 521) | protected function findTableConstraints($table, $type)
    method findPrimaryKeys (line 560) | protected function findPrimaryKeys($table)
    method findForeignKeys (line 573) | protected function findForeignKeys($table)
    method findViewNames (line 621) | protected function findViewNames($schema = '')
    method findUniqueIndexes (line 653) | public function findUniqueIndexes($table)
    method loadTableConstraints (line 674) | private function loadTableConstraints($tableName, $returnType)
    method quoteColumnName (line 782) | public function quoteColumnName($name)
    method insert (line 795) | public function insert($table, $columns)
    method createColumnSchemaBuilder (line 827) | public function createColumnSchemaBuilder($type, $length = null)

FILE: framework/db/mssql/SqlsrvPDO.php
  class SqlsrvPDO (line 18) | class SqlsrvPDO extends \PDO
    method lastInsertId (line 30) | #[\ReturnTypeWillChange]

FILE: framework/db/mssql/TableSchema.php
  class TableSchema (line 17) | class TableSchema extends \yii\db\TableSchema

FILE: framework/db/mssql/conditions/InConditionBuilder.php
  class InConditionBuilder (line 20) | class InConditionBuilder extends \yii\db\conditions\InConditionBuilder
    method buildSubqueryInCondition (line 26) | protected function buildSubqueryInCondition($operator, $columns, $valu...
    method buildCompositeInCondition (line 38) | protected function buildCompositeInCondition($operator, $columns, $val...

FILE: framework/db/mssql/conditions/LikeConditionBuilder.php
  class LikeConditionBuilder (line 14) | class LikeConditionBuilder extends \yii\db\conditions\LikeConditionBuilder

FILE: framework/db/mysql/ColumnSchema.php
  class ColumnSchema (line 20) | class ColumnSchema extends \yii\db\ColumnSchema
    method dbTypecast (line 36) | public function dbTypecast($value)
    method phpTypecast (line 56) | public function phpTypecast($value)

FILE: framework/db/mysql/ColumnSchemaBuilder.php
  class ColumnSchemaBuilder (line 19) | class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
    method buildUnsignedString (line 24) | protected function buildUnsignedString()
    method buildAfterString (line 32) | protected function buildAfterString()
    method buildFirstString (line 42) | protected function buildFirstString()
    method buildCommentString (line 50) | protected function buildCommentString()
    method __toString (line 58) | public function __toString()

FILE: framework/db/mysql/JsonExpressionBuilder.php
  class JsonExpressionBuilder (line 24) | class JsonExpressionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/mysql/QueryBuilder.php
  class QueryBuilder (line 24) | class QueryBuilder extends \yii\db\QueryBuilder
    method init (line 55) | public function init()
    method defaultExpressionBuilders (line 65) | protected function defaultExpressionBuilders()
    method renameColumn (line 80) | public function renameColumn($table, $oldName, $newName)
    method createIndex (line 113) | public function createIndex($name, $table, $columns, $unique = false)
    method dropForeignKey (line 128) | public function dropForeignKey($name, $table)
    method dropPrimaryKey (line 140) | public function dropPrimaryKey($name, $table)
    method dropUnique (line 148) | public function dropUnique($name, $table)
    method resetSequence (line 163) | public function resetSequence($tableName, $value = null)
    method checkIntegrity (line 190) | public function checkIntegrity($check = true, $schema = '', $table = '')
    method buildLimit (line 198) | public function buildLimit($limit, $offset)
    method hasLimit (line 219) | protected function hasLimit($limit)
    method hasOffset (line 228) | protected function hasOffset($offset)
    method prepareInsertValues (line 238) | protected function prepareInsertValues($table, $columns, $params = [])
    method upsert (line 265) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method addCommentOnColumn (line 294) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 319) | public function addCommentOnTable($table, $comment)
    method dropCommentFromColumn (line 328) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 337) | public function dropCommentFromTable($table)
    method selectExists (line 346) | public function selectExists($rawSql)
    method getColumnDefinition (line 359) | private function getColumnDefinition($table, $column)
    method supportsFractionalSeconds (line 389) | private function supportsFractionalSeconds()
    method defaultTimeTypeMap (line 418) | private function defaultTimeTypeMap()

FILE: framework/db/mysql/Schema.php
  class Schema (line 35) | class Schema extends BaseSchema implements ConstraintFinderInterface
    method resolveTableName (line 103) | protected function resolveTableName($name)
    method findTableNames (line 121) | protected function findTableNames($schema = '')
    method loadTableSchema (line 134) | protected function loadTableSchema($name)
    method loadTablePrimaryKey (line 150) | protected function loadTablePrimaryKey($tableName)
    method loadTableForeignKeys (line 158) | protected function loadTableForeignKeys($tableName)
    method loadTableIndexes (line 166) | protected function loadTableIndexes($tableName)
    method loadTableUniques (line 202) | protected function loadTableUniques($tableName)
    method loadTableChecks (line 210) | protected function loadTableChecks($tableName)
    method loadTableDefaultValues (line 255) | protected function loadTableDefaultValues($tableName)
    method createQueryBuilder (line 264) | public function createQueryBuilder()
    method resolveTableNames (line 274) | protected function resolveTableNames($table, $name)
    method loadColumnSchema (line 291) | protected function loadColumnSchema($info)
    method findColumns (line 367) | protected function findColumns($table)
    method getCreateTableSql (line 412) | protected function getCreateTableSql($table)
    method findConstraints (line 430) | protected function findConstraints($table)
    method findUniqueIndexes (line 505) | public function findUniqueIndexes($table)
    method createColumnSchemaBuilder (line 525) | public function createColumnSchemaBuilder($type, $length = null)
    method isOldMysql (line 536) | protected function isOldMysql()
    method loadTableConstraints (line 555) | private function loadTableConstraints($tableName, $returnType)
    method getJsonColumns (line 652) | private function getJsonColumns(TableSchema $table): array

FILE: framework/db/oci/ColumnSchemaBuilder.php
  class ColumnSchemaBuilder (line 20) | class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
    method buildUnsignedString (line 25) | protected function buildUnsignedString()
    method __toString (line 33) | public function __toString()

FILE: framework/db/oci/Command.php
  class Command (line 18) | class Command extends \yii\db\Command
    method bindPendingParams (line 23) | protected function bindPendingParams()

FILE: framework/db/oci/QueryBuilder.php
  class QueryBuilder (line 25) | class QueryBuilder extends \yii\db\QueryBuilder
    method defaultExpressionBuilders (line 58) | protected function defaultExpressionBuilders()
    method buildOrderByAndLimit (line 69) | public function buildOrderByAndLimit($sql, $orderBy, $limit, $offset)
    method renameTable (line 104) | public function renameTable($table, $newName)
    method alterColumn (line 119) | public function alterColumn($table, $column, $type)
    method dropIndex (line 133) | public function dropIndex($name, $table)
    method executeResetSequence (line 141) | public function executeResetSequence($table, $value = null)
    method addForeignKey (line 174) | public function addForeignKey($name, $table, $columns, $refTable, $ref...
    method prepareInsertValues (line 194) | protected function prepareInsertValues($table, $columns, $params = [])
    method upsert (line 214) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method batchInsert (line 299) | public function batchInsert($table, $columns, $rows, &$params = [])
    method selectExists (line 353) | public function selectExists($rawSql)
    method dropCommentFromColumn (line 362) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 371) | public function dropCommentFromTable($table)

FILE: framework/db/oci/Schema.php
  class Schema (line 39) | class Schema extends BaseSchema implements ConstraintFinderInterface
    method init (line 60) | public function init()
    method resolveTableName (line 75) | protected function resolveTableName($name)
    method findSchemaNames (line 94) | protected function findSchemaNames()
    method findTableNames (line 109) | protected function findTableNames($schema = '')
    method loadTableSchema (line 155) | protected function loadTableSchema($name)
    method loadTablePrimaryKey (line 170) | protected function loadTablePrimaryKey($tableName)
    method loadTableForeignKeys (line 178) | protected function loadTableForeignKeys($tableName)
    method loadTableIndexes (line 186) | protected function loadTableIndexes($tableName)
    method loadTableUniques (line 228) | protected function loadTableUniques($tableName)
    method loadTableChecks (line 236) | protected function loadTableChecks($tableName)
    method loadTableDefaultValues (line 245) | protected function loadTableDefaultValues($tableName)
    method releaseSavepoint (line 253) | public function releaseSavepoint($name)
    method quoteSimpleTableName (line 261) | public function quoteSimpleTableName($name)
    method createQueryBuilder (line 269) | public function createQueryBuilder()
    method createColumnSchemaBuilder (line 277) | public function createColumnSchemaBuilder($type, $length = null)
    method resolveTableNames (line 288) | protected function resolveTableNames($table, $name)
    method findColumns (line 307) | protected function findColumns($table)
    method getTableSequenceName (line 364) | protected function getTableSequenceName($tableName)
    method getLastInsertID (line 389) | public function getLastInsertID($sequenceName = '')
    method createColumn (line 408) | protected function createColumn($column)
    method findConstraints (line 451) | protected function findConstraints($table)
    method findUniqueIndexes (line 529) | public function findUniqueIndexes($table)
    method extractColumnType (line 566) | protected function extractColumnType($column, $dbType, $precision, $sc...
    method extractColumnSize (line 602) | protected function extractColumnSize($column, $dbType, $precision, $sc...
    method insert (line 612) | public function insert($table, $columns)
    method loadTableConstraints (line 668) | private function loadTableConstraints($tableName, $returnType)

FILE: framework/db/oci/conditions/InConditionBuilder.php
  class InConditionBuilder (line 17) | class InConditionBuilder extends \yii\db\conditions\InConditionBuilder
    method build (line 27) | public function build(ExpressionInterface $expression, array &$params ...
    method splitCondition (line 45) | protected function splitCondition(InCondition $condition, &$params)

FILE: framework/db/oci/conditions/LikeConditionBuilder.php
  class LikeConditionBuilder (line 16) | class LikeConditionBuilder extends \yii\db\conditions\LikeConditionBuilder
    method build (line 37) | public function build(ExpressionInterface $expression, array &$params ...

FILE: framework/db/pgsql/ArrayExpressionBuilder.php
  class ArrayExpressionBuilder (line 24) | class ArrayExpressionBuilder implements ExpressionBuilderInterface
    method build (line 33) | public function build(ExpressionInterface $expression, array &$params ...
    method buildPlaceholders (line 56) | protected function buildPlaceholders(ExpressionInterface $expression, ...
    method unnestArrayExpression (line 96) | private function unnestArrayExpression(ArrayExpression $expression, $v...
    method getTypehint (line 107) | protected function getTypehint(ArrayExpression $expression)
    method buildSubqueryArray (line 126) | protected function buildSubqueryArray($sql, ArrayExpression $expression)
    method typecastValue (line 138) | protected function typecastValue(ArrayExpression $expression, $value)

FILE: framework/db/pgsql/ArrayParser.php
  class ArrayParser (line 19) | class ArrayParser
    method parse (line 33) | public function parse($value)
    method parseArray (line 53) | private function parseArray($value, &$i = 0)
    method parseString (line 87) | private function parseString($value, &$i)

FILE: framework/db/pgsql/ColumnSchema.php
  class ColumnSchema (line 20) | class ColumnSchema extends \yii\db\ColumnSchema
    method dbTypecast (line 63) | public function dbTypecast($value)
    method phpTypecast (line 88) | public function phpTypecast($value)
    method phpTypecastValue (line 119) | protected function phpTypecastValue($value)
    method getArrayParser (line 148) | protected function getArrayParser()

FILE: framework/db/pgsql/JsonExpressionBuilder.php
  class JsonExpressionBuilder (line 25) | class JsonExpressionBuilder implements ExpressionBuilderInterface
    method build (line 34) | public function build(ExpressionInterface $expression, array &$params ...
    method getTypecast (line 55) | protected function getTypecast(JsonExpression $expression)

FILE: framework/db/pgsql/QueryBuilder.php
  class QueryBuilder (line 24) | class QueryBuilder extends \yii\db\QueryBuilder
    method defaultConditionClasses (line 83) | protected function defaultConditionClasses()
    method defaultExpressionBuilders (line 96) | protected function defaultExpressionBuilders()
    method createIndex (line 117) | public function createIndex($name, $table, $columns, $unique = false)
    method dropIndex (line 140) | public function dropIndex($name, $table)
    method renameTable (line 165) | public function renameTable($oldName, $newName)
    method resetSequence (line 180) | public function resetSequence($tableName, $value = null)
    method checkIntegrity (line 209) | public function checkIntegrity($check = true, $schema = '', $table = '')
    method truncateTable (line 237) | public function truncateTable($table)
    method alterColumn (line 252) | public function alterColumn($table, $column, $type)
    method insert (line 305) | public function insert($table, $columns, &$params)
    method upsert (line 315) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method newUpsert (line 336) | private function newUpsert($table, $insertColumns, $updateColumns, &$p...
    method oldUpsert (line 370) | private function oldUpsert($table, $insertColumns, $updateColumns, &$p...
    method update (line 455) | public function update($table, $columns, $condition, &$params)
    method normalizeTableRowData (line 470) | private function normalizeTableRowData($table, $columns)
    method batchInsert (line 491) | public function batchInsert($table, $columns, $rows, &$params = [])

FILE: framework/db/pgsql/Schema.php
  class Schema (line 35) | class Schema extends BaseSchema implements ConstraintFinderInterface
    method resolveTableName (line 142) | protected function resolveTableName($name)
    method findSchemaNames (line 160) | protected function findSchemaNames()
    method findTableNames (line 175) | protected function findTableNames($schema = '')
    method loadTableSchema (line 193) | protected function loadTableSchema($name)
    method loadTablePrimaryKey (line 208) | protected function loadTablePrimaryKey($tableName)
    method loadTableForeignKeys (line 216) | protected function loadTableForeignKeys($tableName)
    method loadTableIndexes (line 224) | protected function loadTableIndexes($tableName)
    method loadTableUniques (line 268) | protected function loadTableUniques($tableName)
    method loadTableChecks (line 276) | protected function loadTableChecks($tableName)
    method loadTableDefaultValues (line 285) | protected function loadTableDefaultValues($tableName)
    method createQueryBuilder (line 294) | public function createQueryBuilder()
    method resolveTableNames (line 304) | protected function resolveTableNames($table, $name)
    method findViewNames (line 322) | protected function findViewNames($schema = '')
    method findConstraints (line 341) | protected function findConstraints($table)
    method getUniqueIndexInformation (line 403) | protected function getUniqueIndexInformation($table)
    method findUniqueIndexes (line 442) | public function findUniqueIndexes($table)
    method findColumns (line 467) | protected function findColumns($table)
    method loadColumnSchema (line 597) | protected function loadColumnSchema($info)
    method insert (line 638) | public function insert($table, $columns)
    method loadTableConstraints (line 668) | private function loadTableConstraints($tableName, $returnType)

FILE: framework/db/sqlite/ColumnSchemaBuilder.php
  class ColumnSchemaBuilder (line 19) | class ColumnSchemaBuilder extends AbstractColumnSchemaBuilder
    method buildUnsignedString (line 24) | protected function buildUnsignedString()
    method __toString (line 32) | public function __toString()

FILE: framework/db/sqlite/Command.php
  class Command (line 22) | class Command extends \yii\db\Command
    method execute (line 27) | public function execute()
    method queryInternal (line 49) | protected function queryInternal($method, $fetchMode = null)
    method splitStatements (line 77) | private function splitStatements($sql, $params)
    method extractUsedParams (line 103) | private function extractUsedParams(SqlToken $statement, $params)

FILE: framework/db/sqlite/QueryBuilder.php
  class QueryBuilder (line 25) | class QueryBuilder extends \yii\db\QueryBuilder
    method defaultExpressionBuilders (line 58) | protected function defaultExpressionBuilders()
    method upsert (line 70) | public function upsert($table, $insertColumns, $updateColumns, &$params)
    method batchInsert (line 135) | public function batchInsert($table, $columns, $rows, &$params = [])
    method resetSequence (line 200) | public function resetSequence($tableName, $value = null)
    method checkIntegrity (line 231) | public function checkIntegrity($check = true, $schema = '', $table = '')
    method truncateTable (line 241) | public function truncateTable($table)
    method dropIndex (line 252) | public function dropIndex($name, $table)
    method dropColumn (line 264) | public function dropColumn($table, $column)
    method renameColumn (line 277) | public function renameColumn($table, $oldName, $newName)
    method addForeignKey (line 297) | public function addForeignKey($name, $table, $columns, $refTable, $ref...
    method dropForeignKey (line 309) | public function dropForeignKey($name, $table)
    method renameTable (line 321) | public function renameTable($table, $newName)
    method alterColumn (line 337) | public function alterColumn($table, $column, $type)
    method addPrimaryKey (line 350) | public function addPrimaryKey($name, $table, $columns)
    method dropPrimaryKey (line 362) | public function dropPrimaryKey($name, $table)
    method addUnique (line 371) | public function addUnique($name, $table, $columns)
    method dropUnique (line 380) | public function dropUnique($name, $table)
    method addCheck (line 389) | public function addCheck($name, $table, $expression)
    method dropCheck (line 398) | public function dropCheck($name, $table)
    method addDefaultValue (line 407) | public function addDefaultValue($name, $table, $column, $value)
    method dropDefaultValue (line 416) | public function dropDefaultValue($name, $table)
    method addCommentOnColumn (line 426) | public function addCommentOnColumn($table, $column, $comment)
    method addCommentOnTable (line 436) | public function addCommentOnTable($table, $comment)
    method dropCommentFromColumn (line 446) | public function dropCommentFromColumn($table, $column)
    method dropCommentFromTable (line 456) | public function dropCommentFromTable($table)
    method buildLimit (line 464) | public function buildLimit($limit, $offset)
    method build (line 484) | public function build($query, $params = [])
    method buildUnion (line 533) | public function buildUnion($unions, &$params)
    method createIndex (line 556) | public function createIndex($name, $table, $columns, $unique = false)

FILE: framework/db/sqlite/Schema.php
  class Schema (line 39) | class Schema extends BaseSchema implements ConstraintFinderInterface
    method findTableNames (line 90) | protected function findTableNames($schema = '')
    method loadTableSchema (line 99) | protected function loadTableSchema($name)
    method loadTablePrimaryKey (line 116) | protected function loadTablePrimaryKey($tableName)
    method loadTableForeignKeys (line 124) | protected function loadTableForeignKeys($tableName)
    method loadTableIndexes (line 147) | protected function loadTableIndexes($tableName)
    method loadTableUniques (line 155) | protected function loadTableUniques($tableName)
    method loadTableChecks (line 163) | protected function loadTableChecks($tableName)
    method loadTableDefaultValues (line 203) | protected function loadTableDefaultValues($tableName)
    method createQueryBuilder (line 213) | public function createQueryBuilder()
    method createColumnSchemaBuilder (line 222) | public function createColumnSchemaBuilder($type, $length = null)
    method findColumns (line 232) | protected function findColumns($table)
    method findConstraints (line 259) | protected function findConstraints($table)
    method findUniqueIndexes (line 289) | public function findUniqueIndexes($table)
    method loadColumnSchema (line 315) | protected function loadColumnSchema($info)
    method setTransactionIsolationLevel (line 373) | public function setTransactionIsolationLevel($level)
    method loadTableColumnsInfo (line 392) | private function loadTableColumnsInfo($tableName)
    method loadTableConstraints (line 409) | private function loadTableConstraints($tableName, $returnType)
    method isSystemIdentifier (line 488) | private function isSystemIdentifier($identifier)
    method quoteValue (line 503) | public function quoteValue($value)

FILE: framework/db/sqlite/SqlTokenizer.php
  class SqlTokenizer (line 20) | class SqlTokenizer extends \yii\db\SqlTokenizer
    method isWhitespace (line 25) | protected function isWhitespace(&$length)
    method isComment (line 42) | protected function isComment(&$length)
    method isOperator (line 66) | protected function isOperator(&$length, &$content)
    method isIdentifier (line 101) | protected function isIdentifier(&$length, &$content)
    method isStringLiteral (line 133) | protected function isStringLiteral(&$length, &$content)
    method isKeyword (line 154) | protected function isKeyword($string, &$content)

FILE: framework/db/sqlite/conditions/InConditionBuilder.php
  class InConditionBuilder (line 20) | class InConditionBuilder extends \yii\db\conditions\InConditionBuilder
    method buildSubqueryInCondition (line 26) | protected function buildSubqueryInCondition($operator, $columns, $valu...
    method buildCompositeInCondition (line 38) | protected function buildCompositeInCondition($operator, $columns, $val...

FILE: framework/db/sqlite/conditions/LikeConditionBuilder.php
  class LikeConditionBuilder (line 14) | class LikeConditionBuilder extends \yii\db\conditions\LikeConditionBuilder

FILE: framework/di/Container.php
  class Container (line 107) | class Container extends Component
    method get (line 166) | public function get($class, $params = [], $config = [])
    method set (line 271) | public function set($class, $definition = [], array $params = [])
    method setSingleton (line 292) | public function setSingleton($class, $definition = [], array $params =...
    method has (line 306) | public function has($class)
    method hasSingleton (line 318) | public function hasSingleton($class, $checkInstance = false)
    method clear (line 327) | public function clear($class)
    method normalizeDefinition (line 339) | protected function normalizeDefinition($class, $definition)
    method getDefinitions (line 372) | public function getDefinitions()
    method build (line 390) | protected function build($class, $params, $config)
    method mergeDependencies (line 443) | private function mergeDependencies($a, $b)
    method validateDependencies (line 455) | private function validateDependencies($parameters)
    method mergeParams (line 485) | protected function mergeParams($class, $params)
    method getDependencies (line 510) | protected function getDependencies($class)
    method isNulledParam (line 585) | private function isNulledParam($param)
    method resolveDependencies (line 597) | protected function resolveDependencies($dependencies, $reflection = null)
    method invoke (line 642) | public function invoke(callable $callback, $params = [])
    method resolveCallableDependencies (line 660) | public function resolveCallableDependencies(callable $callback, $param...
    method setDefinitions (line 790) | public function setDefinitions(array $definitions)
    method setSingletons (line 812) | public function setSingletons(array $singletons)
    method setResolveArrays (line 828) | public function setResolveArrays($value)

FILE: framework/di/Instance.php
  class Instance (line 57) | class Instance
    method __construct (line 74) | protected function __construct($id, $optional = false)
    method of (line 86) | public static function of($id, $optional = false)
    method ensure (line 121) | public static function ensure($reference, $type = null, $container = n...
    method get (line 175) | public function get($container = null)
    method __set_state (line 208) | public static function __set_state($state)

FILE: framework/di/NotInstantiableException.php
  class NotInstantiableException (line 20) | class NotInstantiableException extends InvalidConfigException
    method __construct (line 25) | public function __construct($class, $message = null, $code = 0, $previ...
    method getName (line 36) | public function getName()

FILE: framework/di/ServiceLocator.php
  class ServiceLocator (line 54) | class ServiceLocator extends Component
    method __get (line 72) | public function __get($name)
    method __isset (line 87) | public function __isset($name)
    method has (line 110) | public function has($id, $checkInstance = false)
    method get (line 126) | public function get($id, $throwException = true)
    method set (line 189) | public function set($id, $definition)
    method clear (line 221) | public function clear($id)
    method getComponents (line 231) | public function getComponents($returnDefinitions = true)
    method setComponents (line 263) | public function setComponents($components)

FILE: framework/filters/AccessControl.php
  class AccessControl (line 61) | class AccessControl extends ActionFilter
    method init (line 102) | public function init()
    method beforeAction (line 118) | public function beforeAction($action)
    method denyAccess (line 154) | protected function denyAccess($user)

FILE: framework/filters/AccessRule.php
  class AccessRule (line 28) | class AccessRule extends Component
    method allows (line 172) | public function allows($action, $user, $request)
    method matchAction (line 192) | protected function matchAction($action)
    method matchController (line 201) | protected function matchController($controller)
    method matchRole (line 222) | protected function matchRole($user)
    method matchIP (line 264) | protected function matchIP($ip)
    method matchVerb (line 294) | protected function matchVerb($verb)
    method matchCustom (line 303) | protected function matchCustom($action)

FILE: framework/filters/AjaxFilter.php
  class AjaxFilter (line 38) | class AjaxFilter extends ActionFilter
    method init (line 53) | public function init()
    method beforeAction (line 63) | public function beforeAction($action)

FILE: framework/filters/ContentNegotiator.php
  class ContentNegotiator (line 91) | class ContentNegotiator extends ActionFilter implements BootstrapInterface
    method bootstrap (line 140) | public function bootstrap($app)
    method beforeAction (line 148) | public function beforeAction($action)
    method negotiate (line 157) | public function negotiate()
    method negotiateContentType (line 182) | protected function negotiateContentType($request, $response)
    method negotiateLanguage (line 232) | protected function negotiateLanguage($request)
    method isLanguageSupported (line 271) | protected function isLanguageSupported($requested, $supported)

FILE: framework/filters/Cors.php
  class Cors (line 78) | class Cors extends ActionFilter
    method beforeAction (line 108) | public function beforeAction($action)
    method overrideDefaultSettings (line 132) | public function overrideDefaultSettings($action)
    method extractHeaders (line 151) | public function extractHeaders()
    method prepareHeaders (line 170) | public function prepareHeaders($requestHeaders)
    method prepareAllowHeaders (line 224) | protected function prepareAllowHeaders($type, $requestHeaders, &$respo...
    method addCorsHeaders (line 247) | public function addCorsHeaders($response, $headers)
    method headerize (line 266) | protected function headerize($string)
    method headerizeToPhp (line 284) | protected function headerizeToPhp($string)

FILE: framework/filters/HostControl.php
  class HostControl (line 74) | class HostControl extends ActionFilter
    method beforeAction (line 129) | public function beforeAction($a
Copy disabled (too large) Download .json
Condensed preview — 2161 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,485K chars).
[
  {
    "path": ".appveyor.yml",
    "chars": 1417,
    "preview": "build: false\nversion: dev-{build}\nclone_folder: C:\\projects\\yii2\n\nenvironment:\n    matrix:\n      - php_ver: 7.4.0\n\ncache"
  },
  {
    "path": ".codecov.yml",
    "chars": 76,
    "preview": "ignore:\n  - \"framework/classes.php\"\n  - \"framework/views/messageConfig.php\"\n"
  },
  {
    "path": ".dockerignore",
    "chars": 16,
    "preview": ".git\nvendor\ndocs"
  },
  {
    "path": ".editorconfig",
    "chars": 233,
    "preview": "# editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\ni"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 1126,
    "preview": "# Reformat code to be PSR-2 compatible\nb5f8a4dc22d5f8188405a2099d85fc154226c9b2\n# Added php-cs-fixer coding standards va"
  },
  {
    "path": ".gitattributes",
    "chars": 1001,
    "preview": "# Autodetect text files\n* text=auto eol=lf\n\n# ...Unless the name matches the following overriding patterns\n\n# Definitive"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 402,
    "preview": "Contributing to Yii 2\n=====================\n\n- [Report an issue](../docs/internals/report-an-issue.md)\n- [Translate docu"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 125,
    "preview": "# These are supported funding model platforms\n\nopen_collective: yiisoft\ngithub: [yiisoft]\ntidelift: \"packagist/yiisoft/y"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 442,
    "preview": "<!--\nPlease use this issue tracker for bugs and feature requests only. In case you need support please use one of\nYii co"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 196,
    "preview": "| Q             | A\n| ------------- | ---\n| Is bugfix?    | ✔️/❌\n| New feature?  | ✔️/❌\n| Breaks BC?    | ✔️/❌\n| Fixed i"
  },
  {
    "path": ".github/SECURITY.md",
    "chars": 354,
    "preview": "# Security Policy\n\nPlease use the [security issue form](https://www.yiiframework.com/security) to report to us any secur"
  },
  {
    "path": ".github/actions/php-setup/action.yml",
    "chars": 2150,
    "preview": "---\nname: PHP setup with composer.\ndescription: Setup PHP environment with composer and install dependencies.\n\ninputs:\n "
  },
  {
    "path": ".github/actions/phpunit/action.yml",
    "chars": 3714,
    "preview": "---\nname: PHPUnit Test Runner.\ndescription: Run PHPUnit tests with coverage and configurable options.\n\ninputs:\n  additio"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 2884,
    "preview": "---\nname: build\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignor"
  },
  {
    "path": ".github/workflows/ci-mariadb.yml",
    "chars": 2107,
    "preview": "name: ci-mariadb\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-igno"
  },
  {
    "path": ".github/workflows/ci-mssql.yml",
    "chars": 2822,
    "preview": "name: ci-mssql\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignore"
  },
  {
    "path": ".github/workflows/ci-mysql.yml",
    "chars": 2078,
    "preview": "name: ci-mysql\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignore"
  },
  {
    "path": ".github/workflows/ci-node.yml",
    "chars": 1651,
    "preview": "name: build-node\n\non:\n  pull_request: &ignore-paths\n    paths-ignore:\n      - \".appveyor.yml\"\n      - \".dockerignore\"\n  "
  },
  {
    "path": ".github/workflows/ci-oracle.yml",
    "chars": 1629,
    "preview": "name: ci-oracle\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignor"
  },
  {
    "path": ".github/workflows/ci-pgsql.yml",
    "chars": 2170,
    "preview": "name: ci-pgsql\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignore"
  },
  {
    "path": ".github/workflows/ci-sqlite.yml",
    "chars": 1670,
    "preview": "name: ci-sqlite\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignor"
  },
  {
    "path": ".github/workflows/linter.yaml",
    "chars": 952,
    "preview": "name: linter\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths-ignore:\n"
  },
  {
    "path": ".github/workflows/static.yml",
    "chars": 1419,
    "preview": "name: static analysis\n\npermissions:\n  contents: read\n  pull-requests: write\n\non:\n  pull_request: &ignore-paths\n    paths"
  },
  {
    "path": ".gitignore",
    "chars": 850,
    "preview": "# phpstorm project files\n.idea\n*.iml\n\n# netbeans project files\nnbproject\n\n# zend studio for eclipse project files\n.build"
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 3186,
    "preview": "image: docker:latest\n\nservices:\n  - docker:dind\n\nvariables:\n  DOCKER_YII2_PHP_IMAGE: yiisoftware/yii2-php:7.4-apache\n  D"
  },
  {
    "path": ".well-known/funding-manifest-urls",
    "chars": 42,
    "preview": "https://www.yiiframework.com/funding.json\n"
  },
  {
    "path": "Dockerfile",
    "chars": 243,
    "preview": "ARG DOCKER_YII2_PHP_IMAGE\nFROM ${DOCKER_YII2_PHP_IMAGE}\n\n# Project source-code\nWORKDIR /project\nADD composer.* /project/"
  },
  {
    "path": "LICENSE.md",
    "chars": 1522,
    "preview": "Copyright © 2008 by Yii Software (https://www.yiiframework.com/)\nAll rights reserved.\n\nRedistribution and use in source "
  },
  {
    "path": "README.md",
    "chars": 5700,
    "preview": "<p align=\"center\">\n    <a href=\"https://www.yiiframework.com/\" target=\"_blank\">\n        <picture>\n            <source me"
  },
  {
    "path": "ROADMAP.md",
    "chars": 941,
    "preview": "> Roadmap for Yii 3.0 and further was moved to [yiisoft/docs](https://github.com/yiisoft/docs/blob/master/003-roadmap.md"
  },
  {
    "path": "build/.htaccess",
    "chars": 14,
    "preview": "deny from all\n"
  },
  {
    "path": "build/build",
    "chars": 1013,
    "preview": "#!/usr/bin/env php\n<?php\n/**\n * build script file.\n *\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c)"
  },
  {
    "path": "build/build.bat",
    "chars": 573,
    "preview": "@echo off\n\nrem -------------------------------------------------------------\nrem  build script for Windows.\nrem\nrem  Thi"
  },
  {
    "path": "build/build.xml",
    "chars": 9638,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n/**\n * Phing build file for Yii 2.\n *\n * @author Qiang Xue <qiang.xue@gmail."
  },
  {
    "path": "build/controllers/ClassmapController.php",
    "chars": 2726,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/DevController.php",
    "chars": 13420,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/MimeTypeController.php",
    "chars": 7637,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/PhpDocController.php",
    "chars": 33969,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/ReleaseController.php",
    "chars": 43510,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/TranslationController.php",
    "chars": 4876,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/Utf8Controller.php",
    "chars": 4096,
    "preview": "<?php\n\n/**\n * @link https://www.yiiframework.com/\n * @copyright Copyright (c) 2008 Yii Software LLC\n * @license https://"
  },
  {
    "path": "build/controllers/views/translation/report_html.php",
    "chars": 1596,
    "preview": "<?php\n\nuse yii\\helpers\\Html;\n\n/**\n * @var \\yii\\web\\View $this\n * @var string $title\n * @var string $sourcePath\n * @var s"
  },
  {
    "path": "code-of-conduct.md",
    "chars": 2905,
    "preview": "Yii Contributor Code of Conduct\n=======================\n\n## Our Pledge\n\nAs contributors and maintainers of this project,"
  },
  {
    "path": "composer.json",
    "chars": 4064,
    "preview": "{\n    \"name\": \"yiisoft/yii2-dev\",\n    \"description\": \"Yii PHP Framework Version 2 - Development Package\",\n    \"keywords\""
  },
  {
    "path": "contrib/completion/bash/yii",
    "chars": 1960,
    "preview": "# This file implements bash completion for the ./yii command file.\n# It completes the commands available by the ./yii co"
  },
  {
    "path": "contrib/completion/zsh/_yii",
    "chars": 1030,
    "preview": "#compdef yii\n\n_yii() {\n    local state command lastArgument commands options executive\n    lastArgument=${words[${#words"
  },
  {
    "path": "docs/documentation_style_guide.md",
    "chars": 3159,
    "preview": "# Yii Documentation Style Guide\n\nGuidelines to go by when writing or editing any Yii documentation.\n\n*This needs to be e"
  },
  {
    "path": "docs/guide/README.md",
    "chars": 6899,
    "preview": "The Definitive Guide to Yii 2.0\n===============================\n\nThis tutorial is released under the [Terms of Yii Docum"
  },
  {
    "path": "docs/guide/caching-data.md",
    "chars": 19595,
    "preview": "Data Caching\n============\n\nData caching is about storing some PHP variables in cache and retrieving it later from cache."
  },
  {
    "path": "docs/guide/caching-fragment.md",
    "chars": 7489,
    "preview": "Fragment Caching\n================\n\nFragment caching refers to caching a fragment of a Web page. For example, if a page d"
  },
  {
    "path": "docs/guide/caching-http.md",
    "chars": 6555,
    "preview": "HTTP Caching\n============\n\nBesides server-side caching that we have described in the previous sections, Web applications"
  },
  {
    "path": "docs/guide/caching-overview.md",
    "chars": 954,
    "preview": "Caching\n=======\n\nCaching is a cheap and effective way to improve the performance of a Web application. By storing relati"
  },
  {
    "path": "docs/guide/caching-page.md",
    "chars": 1595,
    "preview": "Page Caching\n============\n\nPage caching refers to caching the content of a whole page on the server-side. Later when the"
  },
  {
    "path": "docs/guide/concept-aliases.md",
    "chars": 6246,
    "preview": "Aliases\n=======\n\nAliases are used to represent file paths or URLs so that you don't have to hard-code absolute paths or "
  },
  {
    "path": "docs/guide/concept-autoloading.md",
    "chars": 5508,
    "preview": "Class Autoloading\n=================\n\nYii relies on the [class autoloading mechanism](https://www.php.net/manual/en/langu"
  },
  {
    "path": "docs/guide/concept-behaviors.md",
    "chars": 12845,
    "preview": "Behaviors\n=========\n\nBehaviors are instances of [[yii\\base\\Behavior]], or of a child class. Behaviors, also known\nas [mi"
  },
  {
    "path": "docs/guide/concept-components.md",
    "chars": 3666,
    "preview": "Components\n==========\n\nComponents are the main building blocks of Yii applications. Components are instances of [[yii\\ba"
  },
  {
    "path": "docs/guide/concept-configurations.md",
    "chars": 11155,
    "preview": "Configurations\n==============\n\nConfigurations are widely used in Yii when creating new objects or initializing existing "
  },
  {
    "path": "docs/guide/concept-di-container.md",
    "chars": 20525,
    "preview": "Dependency Injection Container\n==============================\n\nA dependency injection (DI) container is an object that k"
  },
  {
    "path": "docs/guide/concept-events.md",
    "chars": 14928,
    "preview": "Events\n======\n\nEvents allow you to inject custom code into existing code at certain execution points. You can attach cus"
  },
  {
    "path": "docs/guide/concept-properties.md",
    "chars": 4593,
    "preview": "Properties\n==========\n\nIn PHP, class member variables are also called *properties*. These variables are part of the clas"
  },
  {
    "path": "docs/guide/concept-service-locator.md",
    "chars": 5569,
    "preview": "Service Locator\n===============\n\nA service locator is an object that knows how to provide all sorts of services (or comp"
  },
  {
    "path": "docs/guide/db-active-record.md",
    "chars": 72649,
    "preview": "Active Record\n=============\n\n[Active Record](https://en.wikipedia.org/wiki/Active_record_pattern) provides an object-ori"
  },
  {
    "path": "docs/guide/db-dao.md",
    "chars": 27268,
    "preview": "Database Access Objects\n=======================\n\nBuilt on top of [PDO](https://www.php.net/manual/en/book.pdo.php), Yii "
  },
  {
    "path": "docs/guide/db-migrations.md",
    "chars": 39599,
    "preview": "Database Migration\n==================\n\nDuring the course of developing and maintaining a database-driven application, th"
  },
  {
    "path": "docs/guide/db-query-builder.md",
    "chars": 41911,
    "preview": "Query Builder\n=============\n\nBuilt on top of [Database Access Objects](db-dao.md), query builder allows you to construct"
  },
  {
    "path": "docs/guide/glossary.md",
    "chars": 2071,
    "preview": "# A\n\n## alias\n\nAlias is a string that's used by Yii to refer to the class or directory such as `@app/vendor`.\n\n## applic"
  },
  {
    "path": "docs/guide/helper-array.md",
    "chars": 16453,
    "preview": "ArrayHelper\n===========\n\nAdditionally to the [rich set of PHP array functions](https://www.php.net/manual/en/book.array."
  },
  {
    "path": "docs/guide/helper-html.md",
    "chars": 15601,
    "preview": "Html helper\n===========\n\nEvery web application generates lots of HTML markup. If the markup is static, it can be done ef"
  },
  {
    "path": "docs/guide/helper-json.md",
    "chars": 1280,
    "preview": "Json Helper\n==========\n\nJson helper provides a set of static methods for encoding and decoding JSON.\nIt handles encoding"
  },
  {
    "path": "docs/guide/helper-overview.md",
    "chars": 2804,
    "preview": "Helpers\n=======\n\n> Note: This section is under development.\n\nYii provides many classes that help simplify common coding "
  },
  {
    "path": "docs/guide/helper-url.md",
    "chars": 6337,
    "preview": "Url Helper\n==========\n\nUrl helper provides a set of static methods for managing URLs.\n\n\n## Getting Common URLs <span id="
  },
  {
    "path": "docs/guide/images/application-lifecycle.graphml",
    "chars": 34707,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/application-structure.graphml",
    "chars": 29889,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/rbac-access-check-1.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/rbac-access-check-2.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/rbac-access-check-3.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/rbac-hierarchy-1.graphml",
    "chars": 19864,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/rbac-hierarchy-2.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/images/request-lifecycle.graphml",
    "chars": 59793,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide/input-file-upload.md",
    "chars": 6597,
    "preview": "Uploading Files\n===============\n\nUploading files in Yii is usually done with the help of [[yii\\web\\UploadedFile]] which "
  },
  {
    "path": "docs/guide/input-form-javascript.md",
    "chars": 5954,
    "preview": "Extending ActiveForm on the Client Side\n=======================================\n\nThe [[yii\\widgets\\ActiveForm]] widget c"
  },
  {
    "path": "docs/guide/input-forms.md",
    "chars": 10326,
    "preview": "Creating Forms\n==============\n\nActiveRecord based forms: ActiveForm\n-----------------------\nThe primary way of using for"
  },
  {
    "path": "docs/guide/input-multiple-models.md",
    "chars": 3037,
    "preview": "Getting Data for Multiple Models\n================================\n\nWhen dealing with some complex data, it is possible t"
  },
  {
    "path": "docs/guide/input-tabular-input.md",
    "chars": 4433,
    "preview": "Collecting Tabular Input\n========================\n\nSometimes you need to handle multiple models of the same kind in a si"
  },
  {
    "path": "docs/guide/input-validation.md",
    "chars": 33896,
    "preview": "Validating Input\n================\n\nAs a rule of thumb, you should never trust the data received from end users and shoul"
  },
  {
    "path": "docs/guide/intro-upgrade-from-v1.md",
    "chars": 21454,
    "preview": "Upgrading from Version 1.1\n==========================\n\nThere are many differences between versions 1.1 and 2.0 of Yii as"
  },
  {
    "path": "docs/guide/intro-yii.md",
    "chars": 3402,
    "preview": "What is Yii\n===========\n\nYii is a high performance, component-based PHP framework for rapidly developing modern Web appl"
  },
  {
    "path": "docs/guide/output-client-scripts.md",
    "chars": 10215,
    "preview": "Working with Client Scripts\n===========================\n\nModern web applications, additionally to static HTML pages that"
  },
  {
    "path": "docs/guide/output-data-providers.md",
    "chars": 13397,
    "preview": "Data Providers\n==============\n\nIn the [Pagination](output-pagination.md) and [Sorting](output-sorting.md) sections, we h"
  },
  {
    "path": "docs/guide/output-data-widgets.md",
    "chars": 27123,
    "preview": "Data widgets\n============\n\nYii provides a set of [widgets](structure-widgets.md) that can be used to display data.\nWhile"
  },
  {
    "path": "docs/guide/output-formatting.md",
    "chars": 13463,
    "preview": "Data Formatting\n===============\n\nTo display data in a more readable format for users, you may format them using the `for"
  },
  {
    "path": "docs/guide/output-pagination.md",
    "chars": 3223,
    "preview": "Pagination\n==========\n\nWhen there are too much data to be displayed on a single page, a common strategy is to display th"
  },
  {
    "path": "docs/guide/output-sorting.md",
    "chars": 4280,
    "preview": "Sorting\n=======\n\nWhen displaying multiple rows of data, it is often needed that the data be sorted according to some col"
  },
  {
    "path": "docs/guide/output-theming.md",
    "chars": 4380,
    "preview": "Theming\n=======\n\nTheming is a way to replace a set of [views](structure-views.md) with another without the need of touch"
  },
  {
    "path": "docs/guide/rest-authentication.md",
    "chars": 5803,
    "preview": "Authentication\n==============\n\nUnlike Web applications, RESTful APIs are usually stateless, which means sessions or cook"
  },
  {
    "path": "docs/guide/rest-controllers.md",
    "chars": 8448,
    "preview": "Controllers\n===========\n\nAfter creating the resource classes and specifying how resource data should be formatted, the n"
  },
  {
    "path": "docs/guide/rest-error-handling.md",
    "chars": 4008,
    "preview": "Error Handling\n==============\n\nWhen handling a RESTful API request, if there is an error in the user request or if somet"
  },
  {
    "path": "docs/guide/rest-filtering-collections.md",
    "chars": 6645,
    "preview": "Filtering Collections\n=====================\n\nResource collection can be filtered using [[yii\\data\\DataFilter]] component"
  },
  {
    "path": "docs/guide/rest-quick-start.md",
    "chars": 8886,
    "preview": "Quick Start\n===========\n\nYii provides a whole set of tools to simplify the task of implementing RESTful Web Service APIs"
  },
  {
    "path": "docs/guide/rest-rate-limiting.md",
    "chars": 3032,
    "preview": "Rate Limiting\n=============\n\nTo prevent abuse, you should consider adding *rate limiting* to your APIs. For example, you"
  },
  {
    "path": "docs/guide/rest-resources.md",
    "chars": 9505,
    "preview": "Resources\n=========\n\nRESTful APIs are all about accessing and manipulating *resources*. You may view resources as\n[model"
  },
  {
    "path": "docs/guide/rest-response-formatting.md",
    "chars": 6924,
    "preview": "Response Formatting\n===================\n\nWhen handling a RESTful API request, an application usually takes the following"
  },
  {
    "path": "docs/guide/rest-routing.md",
    "chars": 4074,
    "preview": "Routing\n=======\n\nWith resource and controller classes ready, you can access the resources using the URL like\n`http://loc"
  },
  {
    "path": "docs/guide/rest-versioning.md",
    "chars": 4882,
    "preview": "Versioning\n==========\n\nA good API is *versioned*: changes and new features are implemented in new versions of the API in"
  },
  {
    "path": "docs/guide/runtime-bootstrapping.md",
    "chars": 2832,
    "preview": "Bootstrapping\n=============\n\nBootstrapping refers to the process of preparing the environment before an application star"
  },
  {
    "path": "docs/guide/runtime-handling-errors.md",
    "chars": 7991,
    "preview": "Handling Errors\n===============\n\nYii includes a built-in [[yii\\web\\ErrorHandler|error handler]] which makes error handli"
  },
  {
    "path": "docs/guide/runtime-logging.md",
    "chars": 18186,
    "preview": "Logging\n=======\n\nYii provides a powerful logging framework that is highly customizable and extensible. Using this framew"
  },
  {
    "path": "docs/guide/runtime-overview.md",
    "chars": 1395,
    "preview": "Overview\n========\n\nEach time when a Yii application handles a request, it undergoes a similar workflow.\n\n1. A user makes"
  },
  {
    "path": "docs/guide/runtime-requests.md",
    "chars": 10081,
    "preview": "Requests\n========\n\nRequests made to an application are represented in terms of [[yii\\web\\Request]] objects which provide"
  },
  {
    "path": "docs/guide/runtime-responses.md",
    "chars": 12645,
    "preview": "Responses\n=========\n\nWhen an application finishes handling a [request](runtime-requests.md), it generates a [[yii\\web\\Re"
  },
  {
    "path": "docs/guide/runtime-routing.md",
    "chars": 33278,
    "preview": "Routing and URL Creation\n========================\n\nWhen a Yii application starts processing a requested URL, the first s"
  },
  {
    "path": "docs/guide/runtime-sessions-cookies.md",
    "chars": 15891,
    "preview": "Sessions and Cookies\n====================\n\nSessions and cookies allow data to be persisted across multiple user requests"
  },
  {
    "path": "docs/guide/security-authentication.md",
    "chars": 8804,
    "preview": "Authentication\n==============\n\nAuthentication is the process of verifying the identity of a user. It usually uses an ide"
  },
  {
    "path": "docs/guide/security-authorization.md",
    "chars": 26995,
    "preview": "Authorization\n=============\n\nAuthorization is the process of verifying that a user has enough permission to do something"
  },
  {
    "path": "docs/guide/security-best-practices.md",
    "chars": 15868,
    "preview": "Security best practices\n=======================\n\nBelow we'll review common security principles and describe how to avoid"
  },
  {
    "path": "docs/guide/security-cryptography.md",
    "chars": 2532,
    "preview": "Cryptography\n============\n\nIn this section we'll review the following security aspects:\n\n- Generating random data\n- Encr"
  },
  {
    "path": "docs/guide/security-overview.md",
    "chars": 821,
    "preview": "Security\n========\n\nGood security is vital to the health and success of any application. Unfortunately, many developers c"
  },
  {
    "path": "docs/guide/security-passwords.md",
    "chars": 1458,
    "preview": "Working with Passwords\n======================\n\nMost developers know that passwords cannot be stored in plain text, but m"
  },
  {
    "path": "docs/guide/start-databases.md",
    "chars": 11524,
    "preview": "Working with Databases\n======================\n\nThis section will describe how to create a new page that displays country"
  },
  {
    "path": "docs/guide/start-forms.md",
    "chars": 9624,
    "preview": "Working with Forms\n==================\n\nThis section describes how to create a new page with a form for getting data from"
  },
  {
    "path": "docs/guide/start-gii.md",
    "chars": 5961,
    "preview": "Generating Code with Gii\n========================\n\nThis section will describe how to use [Gii](https://www.yiiframework."
  },
  {
    "path": "docs/guide/start-hello.md",
    "chars": 7769,
    "preview": "Saying Hello\n============\n\nThis section describes how to create a new \"Hello\" page in your application.\nTo achieve this "
  },
  {
    "path": "docs/guide/start-installation.md",
    "chars": 16814,
    "preview": "Installing Yii\n==============\n\nYou can install Yii in two ways, using the [Composer](https://getcomposer.org/) package m"
  },
  {
    "path": "docs/guide/start-looking-ahead.md",
    "chars": 2854,
    "preview": "Looking Ahead\n=============\n\nIf you've read through the entire \"Getting Started\" chapter, you have now created a complet"
  },
  {
    "path": "docs/guide/start-prerequisites.md",
    "chars": 1371,
    "preview": "# What do you need to know\n\nThe Yii learning curve is not as steep as other PHP frameworks but still there are some thin"
  },
  {
    "path": "docs/guide/start-workflow.md",
    "chars": 5956,
    "preview": "Running Applications\n====================\n\nAfter installing Yii, you have a working Yii application that can be accessed"
  },
  {
    "path": "docs/guide/structure-application-components.md",
    "chars": 6676,
    "preview": "Application Components\n======================\n\nApplications are [service locators](concept-service-locator.md). They hos"
  },
  {
    "path": "docs/guide/structure-applications.md",
    "chars": 26804,
    "preview": "Applications\n============\n\nApplications are objects that govern the overall structure and lifecycle of Yii application s"
  },
  {
    "path": "docs/guide/structure-assets.md",
    "chars": 42181,
    "preview": "Assets\n======\n\nAn asset in Yii is a file that may be referenced in a Web page. It can be a CSS file, a JavaScript file, "
  },
  {
    "path": "docs/guide/structure-controllers.md",
    "chars": 19351,
    "preview": "Controllers\n===========\n\nControllers are part of the [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93cont"
  },
  {
    "path": "docs/guide/structure-entry-scripts.md",
    "chars": 4063,
    "preview": "Entry Scripts\n=============\n\nEntry scripts are the first step in the application bootstrapping process. An application ("
  },
  {
    "path": "docs/guide/structure-extensions.md",
    "chars": 23908,
    "preview": "Extensions\n==========\n\nExtensions are redistributable software packages specifically designed to be used in Yii applicat"
  },
  {
    "path": "docs/guide/structure-filters.md",
    "chars": 15185,
    "preview": "Filters\n=======\n\nFilters are objects that run before and/or after [controller actions](structure-controllers.md#actions)"
  },
  {
    "path": "docs/guide/structure-models.md",
    "chars": 22342,
    "preview": "Models\n======\n\nModels are part of the [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) archite"
  },
  {
    "path": "docs/guide/structure-modules.md",
    "chars": 13584,
    "preview": "Modules\n=======\n\nModules are self-contained software units that consist of [models](structure-models.md), [views](struct"
  },
  {
    "path": "docs/guide/structure-overview.md",
    "chars": 1663,
    "preview": "Overview\n========\n\nYii applications are organized according to the [model-view-controller (MVC)](https://wikipedia.org/w"
  },
  {
    "path": "docs/guide/structure-views.md",
    "chars": 31588,
    "preview": "Views\n=====\n\nViews are part of the [MVC](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller) architectu"
  },
  {
    "path": "docs/guide/structure-widgets.md",
    "chars": 7918,
    "preview": "Widgets\n=======\n\nWidgets are reusable building blocks used in [views](structure-views.md) to create complex and configur"
  },
  {
    "path": "docs/guide/test-acceptance.md",
    "chars": 940,
    "preview": "Acceptance Tests\n================\n\nAcceptance test verifies scenarios from a user's perspective. The application tested "
  },
  {
    "path": "docs/guide/test-environment-setup.md",
    "chars": 1076,
    "preview": "Testing environment setup\n======================\n\nYii 2 has officially maintained integration with [`Codeception`](https"
  },
  {
    "path": "docs/guide/test-fixtures.md",
    "chars": 14066,
    "preview": "Fixtures\n========\n\nFixtures are an important part of testing. Their main purpose is to set up the environment in a fixed"
  },
  {
    "path": "docs/guide/test-functional.md",
    "chars": 1215,
    "preview": "Functional Tests\n================\n\nFunctional test verifies scenarios from a user's perspective. It is similar to [accep"
  },
  {
    "path": "docs/guide/test-overview.md",
    "chars": 3517,
    "preview": "Testing\n=======\n\nTesting is an important part of software development. Whether we are aware of it or not, we conduct tes"
  },
  {
    "path": "docs/guide/test-unit.md",
    "chars": 1260,
    "preview": "Unit Tests\n==========\n\nA unit test verifies that a single unit of code is working as expected. That is, given different "
  },
  {
    "path": "docs/guide/tutorial-console.md",
    "chars": 12938,
    "preview": "Console applications\n====================\n\nBesides, the rich features for building web applications, Yii also has full-f"
  },
  {
    "path": "docs/guide/tutorial-core-validators.md",
    "chars": 38323,
    "preview": "Core Validators\n===============\n\nYii provides a set of commonly used core validators, found primarily under the `yii\\val"
  },
  {
    "path": "docs/guide/tutorial-docker.md",
    "chars": 2942,
    "preview": "Yii and Docker\n==============\n\nFor development and deployments Yii applications can be run as Docker containers. A conta"
  },
  {
    "path": "docs/guide/tutorial-i18n.md",
    "chars": 30310,
    "preview": "Internationalization\n====================\n\nInternationalization (I18N) refers to the process of designing a software app"
  },
  {
    "path": "docs/guide/tutorial-mailing.md",
    "chars": 7599,
    "preview": "Mailing\n=======\n\n> Note: This section is under development.\n\nYii supports composition and sending of the email messages."
  },
  {
    "path": "docs/guide/tutorial-performance-tuning.md",
    "chars": 10853,
    "preview": "Performance Tuning\n==================\n\nThere are many factors affecting the performance of your Web application. Some ar"
  },
  {
    "path": "docs/guide/tutorial-shared-hosting.md",
    "chars": 2678,
    "preview": "Shared Hosting Environment\n==========================\n\nShared hosting environments are often quite limited about configu"
  },
  {
    "path": "docs/guide/tutorial-start-from-scratch.md",
    "chars": 2797,
    "preview": "Creating your own Application structure\n=======================================\n\n> Note: This section is under developme"
  },
  {
    "path": "docs/guide/tutorial-template-engines.md",
    "chars": 1936,
    "preview": "Using template engines\n======================\n\nBy default, Yii uses PHP as its template language, but you can configure "
  },
  {
    "path": "docs/guide/tutorial-yii-as-micro-framework.md",
    "chars": 7286,
    "preview": "# Using Yii as a Micro-framework\n\nYii can be easily used without the features included in basic and advanced templates. "
  },
  {
    "path": "docs/guide/tutorial-yii-integration.md",
    "chars": 8202,
    "preview": "Working with Third-Party Code\n=============================\n\nFrom time to time, you may need to use some third-party cod"
  },
  {
    "path": "docs/guide-ar/README.md",
    "chars": 7846,
    "preview": " Yii 2.0 الدليل التقني الخاص ببيئة العمل\n===============================\n\nتم تحرير هذا الملف اعتمادا على [الشروط الخاصة "
  },
  {
    "path": "docs/guide-ar/intro-yii.md",
    "chars": 3176,
    "preview": "# <div dir=\"rtl\">ما هي بيئة العمل Yii</div>\n\n<p dir=\"rtl\">Yii هو إطار PHP عالي الأداء يعتمد على المكونات لتطوير تطبيقات "
  },
  {
    "path": "docs/guide-ar/start-databases.md",
    "chars": 14522,
    "preview": "# <div dir=\"rtl\">التعامل مع قواعد البيانات</div>\n\n<p dir=\"rtl\">\n    في هذا الجزء التعليمي ستتعلم آلية إنشاء صفحة جديدة ت"
  },
  {
    "path": "docs/guide-ar/start-forms.md",
    "chars": 12037,
    "preview": "# <div dir=\"rtl\">العمل مع ال Forms</div>\n\n<p dir=\"rtl\">\nفي هذا الموضوع سنتعلم كيفية إنشاء صفحة تحتوي على form للحصول على"
  },
  {
    "path": "docs/guide-ar/start-gii.md",
    "chars": 7791,
    "preview": "# <div dir=\"rtl\">إنشاء الشيفرة البرمجية من خلال ال gii</div>\n\n<p dir=\"rtl\">\n    في هذا الجزء التعليمي سنتعرف على آلية ال"
  },
  {
    "path": "docs/guide-ar/start-hello.md",
    "chars": 9871,
    "preview": "# <div dir=\"rtl\">قل مرحبا - Saying Hello</div>\n\n<p dir=\"rtl\">\n    في هذا الموضوع سنتعرف على كيفية إنشاء صفحة \"Hello\" جدي"
  },
  {
    "path": "docs/guide-ar/start-installation.md",
    "chars": 16035,
    "preview": "# <div dir=\"rtl\">تثبيت ال Yii</div>\n\n<p dir=\"rtl\">يمكنك تثبيت ال Yii بطريقتين ، الأولى باستخدام مدير الحزم <a href=\"http"
  },
  {
    "path": "docs/guide-ar/start-looking-ahead.md",
    "chars": 3680,
    "preview": "# <div dir=\"rtl\">ماذا الآن - الخطوة القادمة</div>\n\n<p dir=\"rtl\">\nإذا قمت بقرائة الفصل الخاص ب \"البداية من هنا\"، فأنت الآ"
  },
  {
    "path": "docs/guide-ar/start-prerequisites.md",
    "chars": 1859,
    "preview": "# <div dir=\"rtl\">ماذا يجب أن تعرف قبل البدء بال Yii</div>\n\n<p dir=\"rtl\">\n    منحنى التعلم الخاص بال Yii ليس حادًا مثل أط"
  },
  {
    "path": "docs/guide-ar/start-workflow.md",
    "chars": 7856,
    "preview": "# <div dir=\"rtl\">تشغيل التطبيقات</div>\n\n<p dir=\"rtl\">\nبعد تثبيت ال Yii، سيكون لديك تطبيق Yii جاهز للعمل عليه ويمكن الوصو"
  },
  {
    "path": "docs/guide-de/README.md",
    "chars": 5938,
    "preview": "Das umfassende Handbuch für Yii 2.0\n===================================\n\nDieses Tutorial wurde unter den [Bedingungen de"
  },
  {
    "path": "docs/guide-de/blocktypes.json",
    "chars": 98,
    "preview": "{\n    \"Warning:\": \"Achtung:\",\n    \"Note:\": \"Hinweis:\",\n    \"Info:\": \"Info:\",\n    \"Tip:\": \"Tipp:\"\n}"
  },
  {
    "path": "docs/guide-de/translators.json",
    "chars": 22,
    "preview": "[\n  \"Carsten Brandt\"\n]"
  },
  {
    "path": "docs/guide-es/README.md",
    "chars": 6661,
    "preview": "Guía Definitiva de Yii 2.0\n==========================\n\nEste tutorial se publica bajo los [Términos de Documentación Yii]"
  },
  {
    "path": "docs/guide-es/blocktypes.json",
    "chars": 104,
    "preview": "{\n    \"Warning:\": \"Aviso:\",\n    \"Note:\": \"Nota:\",\n    \"Info:\": \"Información:\",\n    \"Tip:\": \"Consejo:\"\n}\n"
  },
  {
    "path": "docs/guide-es/caching-data.md",
    "chars": 18487,
    "preview": "Almacenamiento de Datos en Caché\n================================\n\nEl almacenamiento de datos en caché trata del almacen"
  },
  {
    "path": "docs/guide-es/caching-fragment.md",
    "chars": 8400,
    "preview": "Caché de Fragmentos\n===================\n\nLa Caché de Fragmentos se refiere al almacenamiento en caché de un fragmento, o"
  },
  {
    "path": "docs/guide-es/caching-http.md",
    "chars": 7327,
    "preview": "Caché HTTP\n==========\n\nAdemás del almacenamiento de caché en el servidor que hemos descrito en secciones anteriores, las"
  },
  {
    "path": "docs/guide-es/caching-overview.md",
    "chars": 1284,
    "preview": "El Almacenamiento en Caché\n==========================\n\nEl almacenamiento en caché es una forma económica y eficaz para m"
  },
  {
    "path": "docs/guide-es/caching-page.md",
    "chars": 1840,
    "preview": "Caché de Páginas\n================\n\nLa caché de páginas se refiere a guardar el contenido de toda una página en el almace"
  },
  {
    "path": "docs/guide-es/concept-aliases.md",
    "chars": 6345,
    "preview": "Alias\n=====\n\nLoa alias son utilizados para representar rutas o URLs de manera que no tengas que escribir explícitamente "
  },
  {
    "path": "docs/guide-es/concept-autoloading.md",
    "chars": 5781,
    "preview": "Autocarga de clases\n===================\n\nYii depende del [mecanismo de autocarga de clases](https://www.php.net/manual/e"
  },
  {
    "path": "docs/guide-es/concept-behaviors.md",
    "chars": 12705,
    "preview": "Comportamientos\n===============\n\nComportamientos son instancias de [[yii\\base\\Behavior]] o sus clases \"hija\". Comportami"
  },
  {
    "path": "docs/guide-es/concept-components.md",
    "chars": 4017,
    "preview": "Componentes\n===========\n\nLos componentes son los principales bloques de construcción de las aplicaciones Yii. Los compon"
  },
  {
    "path": "docs/guide-es/concept-configurations.md",
    "chars": 10991,
    "preview": "Configuración\n==============\n\nLas configuraciones se utilizan ampliamente en Yii al crear nuevos objetos o inicializar l"
  },
  {
    "path": "docs/guide-es/concept-di-container.md",
    "chars": 12568,
    "preview": "Contenedor de Inyección de Dependencias\n=======================================\n\nUn contenedor de Inyección de Dependenc"
  },
  {
    "path": "docs/guide-es/concept-events.md",
    "chars": 11714,
    "preview": "Eventos\n=======\n\nLos eventos permiten inyectar código dentro de otro código existente en ciertos puntos de ejecución. Se"
  },
  {
    "path": "docs/guide-es/concept-properties.md",
    "chars": 4784,
    "preview": "Propiedades\n===========\n\nEn PHP, las variables miembro de clases también llamadas *propiedades*, son parte de la definic"
  },
  {
    "path": "docs/guide-es/concept-service-locator.md",
    "chars": 3752,
    "preview": "Localizador de Servicios\n========================\n\nUn localizador de servicios es un objeto que sabe cómo proporcionar t"
  },
  {
    "path": "docs/guide-es/db-dao.md",
    "chars": 25932,
    "preview": "Objetos de Acceso a Bases de Datos\n==================================\n\nConstruido sobre [PDO](https://www.php.net/manual"
  },
  {
    "path": "docs/guide-es/db-migrations.md",
    "chars": 35184,
    "preview": "Migración de Base de Datos\n==========================\n\nDurante el curso de desarrollo y mantenimiento de una aplicación "
  },
  {
    "path": "docs/guide-es/db-query-builder.md",
    "chars": 18219,
    "preview": "Constructor de Consultas\n========================\n\n> Note: Esta sección está en desarrollo.\n\nYii proporciona una capa de"
  },
  {
    "path": "docs/guide-es/glossary.md",
    "chars": 2307,
    "preview": "# A\n\n## alias\n\nAlias es un string utilizado por Yii para referirse a una clase o directorio tal como `@app/vendor`.\n\n## "
  },
  {
    "path": "docs/guide-es/helper-array.md",
    "chars": 12874,
    "preview": "ArrayHelper\n===========\n\nAdicionalmente al [rico conjunto de funciones para arrays de PHP](https://www.php.net/manual/es"
  },
  {
    "path": "docs/guide-es/helper-html.md",
    "chars": 15013,
    "preview": "Clase auxiliar Html (Html helper)\n=================================\n\nTodas las aplicaciones web generan grandes cantidad"
  },
  {
    "path": "docs/guide-es/helper-overview.md",
    "chars": 2804,
    "preview": "Helpers\n=======\n\n> Note: Esta sección está en desarrollo.\n\nYii ofrece muchas clases que ayudan a simplificar las tareas "
  },
  {
    "path": "docs/guide-es/helper-url.md",
    "chars": 6610,
    "preview": "Clase Auxiliar URL (URL Helper)\n===============================\n\nLa clase auxiliar URL proporciona un conjunto de método"
  },
  {
    "path": "docs/guide-es/images/application-lifecycle.graphml",
    "chars": 34707,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide-es/images/application-structure.graphml",
    "chars": 29797,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide-es/images/rbac-access-check-1.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide-es/images/rbac-access-check-2.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide-es/images/rbac-access-check-3.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide-es/images/rbac-hierarchy-1.graphml",
    "chars": 19864,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  },
  {
    "path": "docs/guide-es/images/rbac-hierarchy-2.graphml",
    "chars": 22701,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi="
  }
]

// ... and 1961 more files (download for full content)

About this extraction

This page contains the full source code of the yiisoft/yii2 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2161 files (18.8 MB), approximately 4.0M tokens, and a symbol index with 3757 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!