Compare commits

...

304 Commits
master ... 3.0

Author SHA1 Message Date
Alexander Makarov fb45bf2386
Fixed typo 6 years ago
Alexander Makarov 86fbdcbe45
Added deprecation note 6 years ago
Brandon Kelly 1d5ae6de43 Fixed bug where component behaviors could be double-attached (#16663) 6 years ago
Sergey Aksenov 7f36d26f1c Fix namespace issue (#16602) 6 years ago
Andrii Vasyliev 08590596e5 Removed empty captcha directory and file (#16507) 6 years ago
Erik Verheij 6f19d3d4a9 Fixes #12895: Use custom error action when provided, regardless of the response format 6 years ago
Paul Klimov e28bf15754 Fixes #11389: `yii\base\Event` refactored to match commonly used notations 6 years ago
Andrii Vasyliev d24d795785 Fixes #16495: Added method call support in DI and `Yii::configure()` 6 years ago
Andrii Vasyliev 22c3126c1c Fixes #16487: Added circular reference detection in DI container 6 years ago
Brandon Kelly e1a49cfb6d Fixes #16247: Cloning components will now clone their behaviors as well 6 years ago
Mahesh S Warrier f903fb2c0a Fixes #16285: Modified yii\web\XmlResponseFormatter to accept attributes for XML elements 6 years ago
Alexander Makarov 705f3e4a80
Merge branch 'CjtMailer' of https://github.com/cjtterabytesoft/yii2 into cjtterabytesoft-CjtMailer 6 years ago
Alexander Makarov c184ef864e
Adjusted versioning 6 years ago
cjtterabyte 8cd14e7d54
Merge branch 'CjtMailer' of https://github.com/cjtterabytesoft/yii2 into CjtMailer 6 years ago
cjtterabyte 1c2320fd32
Fix getComposer() yii\BaseYii::createObject(null) BaseMailer.php #16327 6 years ago
Alexander Makarov 95e3237054
Update CHANGELOG.md 6 years ago
cjtterabyte 921447a25a
Fix getComposer() yii\BaseYii::createObject(null) BaseMailer.php #16327 6 years ago
cjtterabyte 9014f92bc5
Fix getComposer() yii\BaseYii::createObject(null) BaseMailer.php #16327 6 years ago
Alexander Makarov 32efb09902
Fixes #11397: `yii\i18n\MessageFormatter` polyfills and `yii\i18n\MessageFormatter::parse()` method were removed resulting in performance boost. See UPGRADE for compatibility notes 6 years ago
Carsten Brandt 501ddbeac3
Update PageCache.php 6 years ago
SilverFire - Dmitry Naumenko be8633702d
Fixing tests after meging with master 6 years ago
SilverFire - Dmitry Naumenko 1cc5f15635
Use null coalesce operator where possible 6 years ago
SilverFire - Dmitry Naumenko fa71f808c1
Merge branch 'master' into 2.1 6 years ago
Kuts Dmitriy 6b99e4f2e4 Change document root to public (#16254) 6 years ago
SilverFire - Dmitry Naumenko 2468282154
Fixing tests 6 years ago
SilverFire - Dmitry Naumenko b9ffea141c
Fixing tests 6 years ago
SilverFire - Dmitry Naumenko 4f33296491
Fixing tests 6 years ago
SilverFire - Dmitry Naumenko 3e4936982e
Fixing tests 6 years ago
SilverFire - Dmitry Naumenko e164c07145
Merge branch 'master' into 2.1 6 years ago
Carsten Brandt 290621ce4e
improved docs for DSN array syntax 7 years ago
Leandro Gehlen 892f1a8711 Added more docs about `yii\db\Connection::dsn` property (#16148) [skip ci] 7 years ago
Leandro Gehlen b576336beb Fixes #16126: Allows to configure `Connection::dsn` by config array 7 years ago
Pavel Ivanov c12e665dc8 Fixes #16067: added yii\build namespace to composer.json (#16078) 7 years ago
sashsvamir 115fa3f746 fix timezone (#16070) 7 years ago
Carsten Brandt 418fc416df
update yii version to 2.1 7 years ago
Carsten Brandt 7eadd66639
added 2.1 extensions to devcontroller 7 years ago
Roman Zhuravlev 9546bd8187 Fixes #16054: Callback execution with mutex synchronization 7 years ago
Dmitry Naumenko 8ecc361f2b
Merge pull request #15963 from rugabarbo/2.1-drop-deprecated-column-schema-properties 7 years ago
Robert Korulczyk 8a46b33ef7 Simplify yield test for `Command::batchInsert()`. (#16007) 7 years ago
Pavel Ivanov 3e25001a67 Issue #15957: dropped unnecessary PHP version checks (#15975) 7 years ago
Pavel Ivanov b0b06b1ad3 Issue #15957: dropped deprecated User::getAuthManager() method (#15981) 7 years ago
Pavel Ivanov 2c6bc8ff1c Issue #15957: dropped deprecated QueryBuilder condition builders (#15980) 7 years ago
Pavel Ivanov 741a569695 Issue #15957: dropped deprecated UniqueValidator::$comboNotUnique (#15976) 7 years ago
Pavel Ivanov b88bb2b9f7 Issue #15957: dropped deprecated createJunctionMigration template (#15977) 7 years ago
Pavel Ivanov a0b3e2bc15 Issue #15957: dropped deprecated Request::CSRF_MASK_LENGTH (#15970) 7 years ago
Pavel Ivanov e4285c59f1 Issue #15957: dropped deprecated Connection::$commandClass (#15966) 7 years ago
Pavel Ivanov a7f0fea200 Issue #15957: small fix of travis builds (#15967) 7 years ago
Pavel Ivanov 20fdf81711 Issue #15957: drop HHVM remains (#15965) 7 years ago
Pavel Ivanov 93a3260a3a Issue #15957: dropped deprecated Dependency method (#15962) 7 years ago
Pavel Ivanov 0babc4b299 Issue #15957: dropped deprecated View properties (#15961) 7 years ago
Pavel Ivanov 893f2a7bbd Issue #15957: dropped deprecated ColumnSchema properties 7 years ago
Pavel Ivanov f5315185dc Issue #15957: finally drop deprecated exit code constants (#15958) 7 years ago
Pavel Ivanov 4e15d33756 yii\base\Object finally dropped (#15956) 7 years ago
Pavel Ivanov 8005748714 #11560: removed ZendDataCache remains (#15955) 7 years ago
xicond faac174af8 Fixes #15811: Fixed issue with additional parameters on `yii\base\View::renderDynamic()` while parameters contains single quote introduced in #12938 7 years ago
Klimov Paul fdd761d6cb Added `yii\web\AssetConverter::$isOutdatedCallback` allowing custom check for outdated asset conversion result 7 years ago
Tobias Munk 25ffc7cefd added autoloading path for yii (CLI) when installed from yii2-dev (#15812) 7 years ago
Klimov Paul 43c8f457ba improve check for empty body at `Request::getParsedBody()` 7 years ago
Klimov Paul 854ae7127c fix `web\Request::getParsedBody()` throws exception for empty body without content-type 7 years ago
Klimov Paul 8ce498cf65 `OracleMutex` moved to "yiisoft/yii2-oracle" 7 years ago
Klimov Paul e74fbb1b0f CUBRID database support removed 7 years ago
Andrii Vasyliev d7cf629b10 Added support for `__construct()` in class configuration (#15815) 7 years ago
Klimov Paul d1ff652b2f class DI definitions changed to '__class' keyword 7 years ago
Klimov Paul b04e0e06dc added support for '__class' keyword at DI definitions 7 years ago
Klimov Paul 732d0a841f improve unit tests 7 years ago
Paul Klimov 603c084fbc
Fix #15383 drop PJAX (#15809) 7 years ago
Paul Klimov 13c37091d5 added changelog about extracted extensions 7 years ago
Paul Klimov 39e9ba74bc docs for REST moved to "yiisoft/yii2-rest" 7 years ago
Paul Klimov 7cf9116fe6 update docs 7 years ago
Paul Klimov 8779f7a187 unit tests clean up 7 years ago
Paul Klimov 0a5304419b 'mssql' and 'oracle' packages removed 7 years ago
Paul Klimov 5e2c16da66 `Captcha` references removed from unit tests 7 years ago
Paul Klimov fafa4044c0 fix 'filters' unit tests 7 years ago
Paul Klimov 0cb91006d5 'captcha' package removed 7 years ago
Paul Klimov 445c838fec update `composer.lock` 7 years ago
Paul Klimov c68e553879 'jquery' package removed 7 years ago
Paul Klimov bc77937bfd redundant 'compatibility' for PHPUnit removed 7 years ago
Paul Klimov 86abef49ff 'rest' package removed 7 years ago
Paul Klimov 624d39c43e upgrade note about extracted packages added 7 years ago
Paul Klimov f8893fe6c8 Merge branch 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
Paul Klimov 3b11ce91cb default condition builder class reference updated to use `::class` construction 7 years ago
Paul Klimov 0f6dbdd135 Merge branch 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
SilverFire - Dmitry Naumenko 41aa5d07ba
ReplaceArrayValue, UnsetArrayValue can be restored after `var_export()` 7 years ago
Paul Klimov ba73528038 Merge branch 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
Paul Klimov 56545c420a fix code to match '2.1' requirements 7 years ago
Paul Klimov a8d2127ad4 Merge branch 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
Klimov Paul 481970957b log level DB column type fix 7 years ago
Klimov Paul fdad1c98c5 DI container reset added to unit test 7 years ago
Klimov Paul e19d7a7917 reset logger after unit test moved to `tearDown()` 7 years ago
Klimov Paul 8e39886f62 reset logger after unit test added 7 years ago
Klimov Paul e31dda7f22 `log\DbTarget` fix 7 years ago
Klimov Paul d5117984b3 restored 'since' tag at `InvalidArgumentException` 7 years ago
Paul Klimov 9ef1c44749 fix unit tests 7 years ago
Paul Klimov 0a7327f87e fix CHANGELOG.md 7 years ago
Paul Klimov d86b716b08 unit test fix 7 years ago
Paul Klimov bccd260e9c fix `PageCache` to use actual `Response` properties 7 years ago
Paul Klimov 4c21603cb2 fix `CacheableWidgetBehaviorTest` unit test 7 years ago
Paul Klimov c3d8a3ddb4 `ActiveQueryTrait::createModels()` fix 7 years ago
Paul Klimov b44a461c2e `ActiveForm::$validationStateOn` restored 7 years ago
Paul Klimov a8b1f69d0c update code for 2.1 requirements 7 years ago
Klimov Paul c2694e7edc Merge branch 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
Klimov Paul 3b4412f195 'nestedLevel' added to Profiler messages 7 years ago
Alec Pritchard 523df834b0 Fixes #15490: Corrected recommended Apache config in start-installation.md (#15609) [skip ci] 7 years ago
Klimov Paul b01a749afd PHPDoc fix 7 years ago
Klimov Paul a39d1209ad fix code to match 2.1 7 years ago
Klimov Paul 29ce1e8687 Merge branches '2.1' and 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
Nikolay Oleynikov 21da0ed910 Remove legacy translation units (#15502) [skip ci] 7 years ago
Klimov Paul 7171db4e74 fix CHANGELOG.md 7 years ago
Klimov Paul fcc12fef65 remove outdated unit test 7 years ago
Klimov Paul e7da8b52a0 Merge branch '2.1' of github.com:yiisoft/yii2 into 2.1 7 years ago
Klimov Paul f1a738ec07 `InvalidParamException` usage removed 7 years ago
Klimov Paul 13d443a68a fix unit tests 7 years ago
Alexander Makarov d5f1627868
#15481: Removed Yii::powered() 7 years ago
Klimov Paul 359175c04b update code to match 2.1 7 years ago
Klimov Paul 9b86c46842 Merge branch 'master' of github.com:yiisoft/yii2 into 2.1 7 years ago
Vladimir Khramtsov 0391a367ed Improved BaseYii tests (#15467) 7 years ago
Alexander Makarov 61dec0f021
#15481: Html::powered() -> Html::poweredByYii() 7 years ago
Nikolay Oleynikov fd9384fc00 Fixes #15481: Moved `yii\BaseYii::powered()` method to `yii\helpers\Html::powered()` 7 years ago
Dmitry Naumenko 866c70d62e
Merge pull request #15448 from klimov-paul/optional-html-purifier 7 years ago
Vladimir Khramtsov 646cd73548 Fix code issues (#15450) 7 years ago
Klimov Paul da364fa419 notes improved 7 years ago
Klimov Paul 7e3f096bc0 `BaseHtmlPurifier::createConfig()` extracted 7 years ago
Klimov Paul 3666f2c957 wording improvement 7 years ago
Klimov Paul 3ff4eade2f "ezyang/htmlpurifier" package has been made optional 7 years ago
Paul Klimov bf116e6103 Fix #8452 Jquery Extraction (attempt 2) (#14865) 7 years ago
Klimov Paul 75349fdeb3 fix UPGRADE 7 years ago
Klimov Paul 796aed8d16 Merge branch '2.1' of github.com:yiisoft/yii2 into 2.1 7 years ago
Paul Klimov 874fcaaecb
`Psr\Http\Message\ServerRequestInterface` applied for `yii\web\Request` (#15416) 7 years ago
Klimov Paul a21c9fd8eb CHANGELOG fix 7 years ago
Alexander Makarov 87fde26d6d
Fixes #15410: Added serialization abstraction layer under `yii\serialize\*` namespace 7 years ago
Alexander Makarov 9a802dbf34
Fix not -> no [skip ci] 7 years ago
Klimov Paul dcc74c841a added UPGRADE and CHANGELOG 7 years ago
Klimov Paul ef3e89e36c `SerializerInterface` applied for `SimpleCache` 7 years ago
Klimov Paul 2fb0b05a0f `yii\serialize\*` package created 7 years ago
Alexander Makarov 45eed055cb
Fixed changelog [skip ci] 7 years ago
Alexander Makarov 11ecfc54f8
Fixed TargetTest 7 years ago
Alexander Makarov b997fdace6
Fixed FileValidatorTest 7 years ago
Alexander Makarov ac167cbd10
More test fixes 7 years ago
Alexander Makarov 742e7b81f6
Fixed BaseObject merge 7 years ago
Alexander Makarov 66b6e48f1a
Test fixes 7 years ago
Alexander Makarov b62077d581
Merge branch 'master' into 2.1 7 years ago
Elvira Sheina 7ce415b8c7 Fixes #9137: Added `clearErrors` parameter to `yii\base\Model` `validateMultiple()` method 7 years ago
E.Alamo 34865a7eb0 Fixed a typo in Widget description (#15063) [skip ci] 7 years ago
243083df 08cafaa2ee Change call_user_func_array to ...$args (#15029) 7 years ago
243083df cac4462e7a Updated code formatting and PHP 7 usage 7 years ago
Klimov Paul c421a121d2 `yii\profile\FileTarget` added 7 years ago
Klimov Paul 2cfbc38bf8 Fix typos at UPGRADE 7 years ago
Paul Klimov 497a073dfd Merge uploaded files into body params (#14817) 7 years ago
Paul Klimov a136f414ec Merge pull request #14853 from klimov-paul/merge-2.1-1 7 years ago
Klimov Paul d039605dd1 `DbManagerTestCase` unit test fix 7 years ago
Klimov Paul 82ea6a86ee `ListViewTest` unit test fix 7 years ago
Klimov Paul 3ff59d37ee merge fix 7 years ago
Klimov Paul fcff67548c `className()` usage remove 7 years ago
Klimov Paul a5b9af951e merge fix 7 years ago
Klimov Paul 4488a6d9af Merge branch 'master' into '2.1' 7 years ago
Klimov Paul 83fa82aceb `Requst::getRawBody()` usage removed 7 years ago
Klimov Paul ee81a042cf Docs fix 7 years ago
Paul Klimov e0a7baf631 Move uploaded files inside Request (#14801) 7 years ago
Klimov Paul 8854793834 unit test fix 7 years ago
Klimov Paul e7943971d2 `yii\web\Request::getBodyParams()` now generates 415 'Unsupported Media Type' error on invalid or missing 'Content-Type' header 7 years ago
Paul Klimov e703645b4d Change `RequestParserInterface::parse()` to accept whole `Request` instance (#14784) 7 years ago
Klimov Paul 5c7bdb32a6 fix unit tests 7 years ago
Klimov Paul 257604f19e `HeaderCollection::fromArray()` improved to handle header name different case 7 years ago
Klimov Paul 37580db6b1 unit test fix 7 years ago
Klimov Paul 722022f744 HTTP headers checks refactored to use PSR-7 abstraction 7 years ago
Alexander Makarov 3c16faa5b0 Fixes #14761: Removed Yii autoloader in favor of Composer's PSR-4 implementation 7 years ago
Klimov Paul 2e01076abc `yii\filters\ContentNegotiator` now generates 406 'Not Acceptable' instead of 415 'Unsupported Media Type' on content-type negotiation fail 7 years ago
Klimov Paul 89c14b7dea Fixed `yii\filters\VerbFilter` uses case-insensitive comparison for the HTTP method name 7 years ago
Alexander Makarov 2e267461a1
Another optimization for #11328 7 years ago
Alexander Makarov 4f9c642d74
Minor optimization for #11328 7 years ago
Paul Klimov e82b9c72f3 Fix #11328 PSR-7 HTTP Message Integration (#14701) 7 years ago
Alexander Makarov dc42a59b71
Removed reference to APC from docs [skip ci] 7 years ago
Klimov Paul 08e5e1e71b `CHANGELOG.md` fix 7 years ago
Klimov Paul c39a1ba4c3 missing "psr/log" added to `composer.json` 7 years ago
Paul Klimov 3e6f8b1c19 Fix #13702 PSR Logger (#14611) 7 years ago
Paul Klimov 4d9204d9f3 Fixes #879: Caching implementation refactored according to PSR-16 'Simple Cache' specification 7 years ago
Paul Klimov 28b26fb74b fix unit test 7 years ago
Ruitang Du 003d83c6e0 Fixes #14671: use `random_int()` instead of `mt_rand()` to generate cryptographically secure pseudo-random integers 7 years ago
Paul Klimov a015795c7b Refactor CAPTCHA extracting Driver (#14632) 7 years ago
Paul Klimov f590670ac9 Fix #9260 introduce `yii\mail\Template` class, allowing view rendering in isolation (#13809) 7 years ago
Boudewijn Vahrmeijer 209bcf0773 fix broken PHPDefaultFormat test with correct expected outputs (#14560) 7 years ago
Boudewijn Vahrmeijer 6605d9830b Fix risky test by add expects assertions (#14559) 7 years ago
Boudewijn Vahrmeijer 31a405bf80 Recreate test based on naming & consistency with previous test (#14557) 7 years ago
Alexander Makarov 42a7f2b012 Use APCu instead of APC in travis 7 years ago
Alexander Makarov cc869d2587
Fixed some OS-dependent checks in tests 7 years ago
Alexander Makarov 2875624600
::className() -> ::class 7 years ago
Alexander Makarov 0b421596a0
Fixed AssetBundleTest to work on Windows 7 years ago
Alexander Makarov e52e1124c1
Fixed ViewTest to use OS-dependent newline under Windows 7 years ago
Alexander Makarov 1b45ed9691
Merge branch 'master' into 2.1 7 years ago
Alexander Makarov a94e804ae4 Cleaned up everything that isn't needed for PHP 7.1 (#14511) 7 years ago
Alexander Makarov adca091fbf
Added note about APCu config to upgrade guide 7 years ago
Alexander Makarov fc47291b7e Fixes #13885: Removed APC support in ApcCache. APCu works as before 7 years ago
Alexander Makarov 85df384e8f Fixes #14178: Removed HHVM-specific code 7 years ago
Alexander Makarov ceaf101151
Merge branch 'master' into 2.1 7 years ago
Alexander Makarov 6100194bf7 Removed PHPUnit6 compatibility polyfill, fixed some tests 7 years ago
Alexander Makarov d4e7cf0171
Merge branch 'master' into 2.1 7 years ago
Alexander Makarov 3e688c1a6b
Updated composer.json 7 years ago
Alexander Makarov d98f0aff1a
Merged master 7 years ago
Alexander Makarov 0297c4e2aa
Fixed DataColumn 7 years ago
Alexander Makarov 2a9d4efc45
Additional merge fixes 7 years ago
Alexander Makarov 207f8cc0d5
Merge fixes 7 years ago
Alexander Makarov 66095fb89a
Merged master 7 years ago
Alexander Makarov f41399a6dc
Reverted selective code coverage 7 years ago
Alexander Makarov 7ef2cf55b3
Fixed accidental change 7 years ago
Alexander Makarov 75dda6e08a PHP 7.1 updates, part of #11397 7 years ago
Angel Guevara 0117459444 Used PHP 7 list syntax where appropriate 7 years ago
Alexander Makarov 51a5d78c95
Updated changelog and readme [skip ci] 7 years ago
Alexander Makarov c3bca69b5b
Removed inputmask dependency since it's moved to separate extension 7 years ago
Alexander Makarov 8e7ebfdad4
Removed support for memcache (without D) 7 years ago
Alexander Makarov add189e5ef
Adjusted travis not to tests against anything lower than 7.1 and drop HHVM 7 years ago
Alexander Makarov 68543a63ff
Adjusted composer.json 7 years ago
Alexander Makarov acef7e1e7c
Adjusted comment [skip ci] 7 years ago
Alexander Makarov f475affaeb
Removed duplicate handling for \Throwable and \Exception 7 years ago
Alexander Makarov 0afc410d12
Merged branch 'master' into 2.1 7 years ago
Bob van Leeuwen 7c85258c36
Fixing issue with filterInputValidation variable in DataColumn 7 years ago
刘旭 e310618168 Fixed typos in 'zh-CN' docs [skip ci] 8 years ago
Alexander Makarov 7aeb008a5d
Replaced className() with class 8 years ago
Alexander Makarov 1f97e03b4f
Merged master into 2.1 8 years ago
Alexander Makarov 68dd3d4567
Merge branch 'master' into 2.1 8 years ago
Klimov Paul 07f65f411b unit test `CommandTest` fix 8 years ago
Klimov Paul aca84c9a7a fix `db` unit tests 8 years ago
Klimov Paul 498ecb3b4f `className()` method usage removed 8 years ago
Klimov Paul bd989566ff unit test for `mail` fix 8 years ago
Klimov Paul e3f26cc5dc Methods `addHeader()`, `setHeader()`, `getHeader()`, `setHeaders()` have been added to `yii\i18n\MessageInterface` allowing setup of custom message headers 8 years ago
Alexander Makarov f7a4838026
Merge branch 'master' into 2.1 8 years ago
Alexander Makarov 0aca17dcfb
Merge branch 'master' into 2.1 8 years ago
Alexander Makarov 575609f21d
Merge branch 'master' into 2.1 8 years ago
Alexander Makarov a21c4a8dc0
Moved masked input field widget into separate extension https://github.com/yiisoft/yii2-maskedinput 8 years ago
Alexander Makarov a7b9ef650c
Adjusted widget tests 8 years ago
Alexander Makarov 9eabc170ad
Fixed merge bug 8 years ago
Alexander Makarov 736fb099fb
Fixed className() usage in tests 8 years ago
Alexander Makarov d6892d554a
Merge branch 'master' into 2.1 8 years ago
Alexey Rogachev 62932ef321 Fixed typo in CHANGELOG (#13164) 8 years ago
Alexey Rogachev 409c56c5c5 Rename `yii\base\InvalidParamException` to `yii\base\InvalidArgumentException` (#13082) 8 years ago
SilverFire - Dmitry Naumenko 8ea211771c Skip FormatConverterTest::testPHPDefaultFormat on HHVM. 8 years ago
SilverFire - Dmitry Naumenko 7a47f5f8c1 Fixed HHVM tests compatibility. Try 3 8 years ago
SilverFire - Dmitry Naumenko 511784631b Fixed HHVM tests compatibility. Try 2 8 years ago
SilverFire - Dmitry Naumenko 2ab2fd96cc Fixed HHVM tests compatibility 8 years ago
SilverFire - Dmitry Naumenko 7f8fdf9d56 Merge branch 'master' into 2.1 8 years ago
SilverFire - Dmitry Naumenko b063323547 Fixed code style for tests 8 years ago
Carsten Brandt 55a827dad9 ensure fallback format is consistent with ICU (#7800) 8 years ago
boehsermoe c2cd20ee49 Captcha:: have to start with /, otherwise it does not work in modules. (#13006) 8 years ago
SilverFire - Dmitry Naumenko a560db1a8f Fixed CHANGELOG 8 years ago
SilverFire - Dmitry Naumenko c64cfa9373 Merge branch 'lennartvdd-activeFormHiddenField' into 2.1 8 years ago
SilverFire - Dmitry Naumenko fcba5f3171 Merge branch 'activeFormHiddenField' of git://github.com/lennartvdd/yii2 into lennartvdd-activeFormHiddenField 8 years ago
SilverFire - Dmitry Naumenko a94c2e611d `yii\widgets\GridView::run() added missing return. Updated UPGRADE.md 8 years ago
SilverFire - Dmitry Naumenko a8be03f2b1 Fixed tests 8 years ago
SilverFire - Dmitry Naumenko e45f5c3b4f Replaced `::className()` in PHPDocs and some classes 8 years ago
SilverFire - Dmitry Naumenko 76e6a20cee Replaced all `::className()` calls to `::class` 8 years ago
SilverFire - Dmitry Naumenko 1e24d9a92e Fixed composer.json to build on PHP 5.5+ 8 years ago
SilverFire - Dmitry Naumenko d335fd6ea3 Merge branch 'master' into 2.1 8 years ago
Michael Härtl 224aac83ab Issue #12938 Add $params to View::renderDynamic() (#12955) 8 years ago
Dmitry Naumenko 164f35afef Merge pull request #12704 from rob006/enable-url-normalizer 8 years ago
Robert Korulczyk c597518378 Update upgrade note 8 years ago
Robert Korulczyk 41f5981561 Update guide 8 years ago
Robert Korulczyk a77749a6a1 Enable `UrlNormalizer` in `UrlManger` by default 8 years ago
Yordan Ivanov 0d72e37f3c Fixes #11058: Add `$checkAjax` parameter to method `yii\web\Controller::redirect()` which controls redirection in AJAX and PJAX requests 8 years ago
Alexander Makarov 2f53cee566 Fixed className() usage 8 years ago
Alexander Makarov 46e68bf9ec Merge branch 'master' into 2.1 8 years ago
Dmitry Naumenko 78224615ad Merge pull request #12607 from dynasource/12592-improve-performance-accesscontrol 8 years ago
Boudewijn Vahrmeijer 410ceab3ae #12592 enhance performance by ignoring rules that (in the end) are never used 8 years ago
Dmitry Naumenko eea58f3462 Merge pull request #12585 from brandonkelly/2.1-class 8 years ago
Brandon Kelly e94a46d720 ::className() => ::class in the docs 8 years ago
Alexander Makarov b5c2407c1d Merge branch 'master' into 2.1 8 years ago
Alexander Makarov f3478bb59b Fixes #11560: Removed XCache and Zend data cache support as caching backends 8 years ago
Alexander Makarov b53430f959 Replaced ::className() with ::class 8 years ago
Alexander Makarov 2722b3a7cf #12074: Updated `yii\widgets\ActiveField::hint()` method signature to match `label()` 8 years ago
Alexander Makarov 653362e6f8 Merge branch 'master' into 2.1 8 years ago
Alexander Makarov f8cf1e2b6a Merge branch 'master' into 2.1 8 years ago
Carsten Brandt 6791fdf1c4 revert ActiveRelationTrait abstract methods 8 years ago
Carsten Brandt aeadab5012 better method contract for ActiveRelationTrait 8 years ago
Carsten Brandt 8c03e6753b applied missing params for #10682 to mssql and oci query builder 8 years ago
Alexander Makarov b764b42f51 Merge branch 'master' into 2.1 8 years ago
Carsten Brandt fcfd54a28c Merge branch 'master' into 2.1 8 years ago
Carsten Brandt 9b54694bb0 fixed breadcrumb widget test 8 years ago
Carsten Brandt 98ed490c3d Consistent behavior of `run()` method in widgets 8 years ago
Kirill Pomerantsev 7f61cc81d8 change echo to return 8 years ago
Alexander Makarov c952e8052b Removed deprecated method 8 years ago
Alexander Makarov 5ebdf6c29a Merge branch 'master' into 2.1 8 years ago
Lennart van den Dool 30286387db Update CHANGELOG.md 8 years ago
Lennart van den Dool 79bdc5eb15 Automatically turn off field label on ActiveField->hiddenInput() 8 years ago
Alexander Makarov f8358acaeb Fixed usage of ::className() instead of ::class 8 years ago
Alexander Makarov a10365a3db Merge branch 'master' into 2.1 8 years ago
Carsten Brandt 04949e1ab4 Merge pull request #11477 from Faryshta/patch-2 8 years ago
Angel Guevara f978199fcc more changes 9 years ago
Angel Guevara 35d7cacfbd simplify default classes 9 years ago
Angel Guevara 0dee3509a8 simplify `::class` usage 9 years ago
Carsten Brandt 82d36df284 fixed test break 9 years ago
Angel Guevara e880ff2ff6 fix #11473 trailing backslash in class (#11474) 9 years ago
Carsten Brandt 25ac762d8c expression support in orderBy and groupBy (#10693) 9 years ago
Carsten Brandt 9e830b1fbf UPGRADE note about #10693 9 years ago
Carsten Brandt b41e720bf8 more test fixes for ::className() -> ::class 9 years ago
Carsten Brandt 9cf7ffa186 fixed tests for ::class syntax 9 years ago
Carsten Brandt 636591d284 ::class syntax in the Guide 9 years ago
Carsten Brandt 0888d6967b removed yii\base\Object::className() 9 years ago
Carsten Brandt b503dc9ff2 use ::class also in documentation and configs 9 years ago
Carsten Brandt 88a4f4ae9f Use ::class instead of ::className() 9 years ago
Alexander Makarov c5efe32c28 Fixes #11397: Minimum required version of PHP is 5.6.0 now 9 years ago
Alexander Makarov 52d70732c1 Fixed merge artifact in CHANGELOG 9 years ago
Alexander Makarov 64e134c29c Merge branch 'master' into 2.1 9 years ago
Alexander Makarov 6e947c84be Use current cache method names in tests 9 years ago
Alexander Makarov 9b1a87b776 Changelog 9 years ago
Alexander Makarov b05e01b2d4 Remove deprecated methods and constants 9 years ago
Alexander Makarov 083db9792d Merge branch 'master' into 2.1 9 years ago
  1. 2
      .gitignore
  2. 18
      .gitlab-ci.yml
  3. 90
      .travis.yml
  4. 5
      README.md
  5. 10
      build/controllers/DevController.php
  6. 8
      build/controllers/PhpDocController.php
  7. 2
      build/controllers/ReleaseController.php
  8. 35
      composer.json
  9. 1447
      composer.lock
  10. 3
      cs/src/YiiConfig.php
  11. 14
      docs/guide-es/README.md
  12. 4
      docs/guide-es/caching-data.md
  13. 20
      docs/guide-es/concept-behaviors.md
  14. 2
      docs/guide-es/concept-components.md
  15. 10
      docs/guide-es/concept-events.md
  16. 2
      docs/guide-es/db-dao.md
  17. 12
      docs/guide-es/input-file-upload.md
  18. 2
      docs/guide-es/input-validation.md
  19. 4
      docs/guide-es/output-client-scripts.md
  20. 127
      docs/guide-es/rest-authentication.md
  21. 156
      docs/guide-es/rest-controllers.md
  22. 94
      docs/guide-es/rest-error-handling.md
  23. 203
      docs/guide-es/rest-quick-start.md
  24. 44
      docs/guide-es/rest-rate-limiting.md
  25. 190
      docs/guide-es/rest-resources.md
  26. 157
      docs/guide-es/rest-response-formatting.md
  27. 92
      docs/guide-es/rest-routing.md
  28. 111
      docs/guide-es/rest-versioning.md
  29. 6
      docs/guide-es/security-authorization.md
  30. 4
      docs/guide-es/start-installation.md
  31. 22
      docs/guide-es/structure-filters.md
  32. 2
      docs/guide-es/test-fixtures.md
  33. 2
      docs/guide-es/tutorial-core-validators.md
  34. 14
      docs/guide-fr/README.md
  35. 8
      docs/guide-fr/caching-data.md
  36. 20
      docs/guide-fr/concept-behaviors.md
  37. 2
      docs/guide-fr/concept-components.md
  38. 28
      docs/guide-fr/concept-events.md
  39. 31
      docs/guide-fr/db-active-record.md
  40. 2
      docs/guide-fr/db-dao.md
  41. 12
      docs/guide-fr/input-file-upload.md
  42. 2
      docs/guide-fr/input-validation.md
  43. 4
      docs/guide-fr/output-client-scripts.md
  44. 8
      docs/guide-fr/security-authorization.md
  45. 22
      docs/guide-fr/structure-filters.md
  46. 4
      docs/guide-id/start-installation.md
  47. 4
      docs/guide-it/start-installation.md
  48. 2
      docs/guide-ja/caching-data.md
  49. 20
      docs/guide-ja/concept-behaviors.md
  50. 2
      docs/guide-ja/concept-components.md
  51. 24
      docs/guide-ja/concept-events.md
  52. 40
      docs/guide-ja/db-active-record.md
  53. 2
      docs/guide-ja/db-dao.md
  54. 12
      docs/guide-ja/input-file-upload.md
  55. 2
      docs/guide-ja/input-validation.md
  56. 4
      docs/guide-ja/output-client-scripts.md
  57. 10
      docs/guide-ja/rest-authentication.md
  58. 4
      docs/guide-ja/rest-controllers.md
  59. 8
      docs/guide-ja/security-authorization.md
  60. 2
      docs/guide-ja/structure-extensions.md
  61. 22
      docs/guide-ja/structure-filters.md
  62. 2
      docs/guide-ja/test-fixtures.md
  63. 2
      docs/guide-ja/tutorial-core-validators.md
  64. 14
      docs/guide-pl/README.md
  65. 2
      docs/guide-pl/concept-components.md
  66. 37
      docs/guide-pl/db-active-record.md
  67. 12
      docs/guide-pl/input-file-upload.md
  68. 2
      docs/guide-pl/input-validation.md
  69. 6
      docs/guide-pl/output-client-scripts.md
  70. 90
      docs/guide-pl/rest-error-handling.md
  71. 37
      docs/guide-pl/rest-rate-limiting.md
  72. 90
      docs/guide-pl/rest-routing.md
  73. 112
      docs/guide-pl/rest-versioning.md
  74. 3
      docs/guide-pl/start-installation.md
  75. 14
      docs/guide-pt-BR/README.md
  76. 6
      docs/guide-pt-BR/caching-data.md
  77. 20
      docs/guide-pt-BR/concept-behaviors.md
  78. 2
      docs/guide-pt-BR/concept-components.md
  79. 10
      docs/guide-pt-BR/concept-events.md
  80. 29
      docs/guide-pt-BR/db-active-record.md
  81. 104
      docs/guide-pt-BR/rest-authentication.md
  82. 133
      docs/guide-pt-BR/rest-controllers.md
  83. 85
      docs/guide-pt-BR/rest-error-handling.md
  84. 193
      docs/guide-pt-BR/rest-quick-start.md
  85. 38
      docs/guide-pt-BR/rest-rate-limiting.md
  86. 192
      docs/guide-pt-BR/rest-resources.md
  87. 139
      docs/guide-pt-BR/rest-response-formatting.md
  88. 85
      docs/guide-pt-BR/rest-routing.md
  89. 94
      docs/guide-pt-BR/rest-versioning.md
  90. 6
      docs/guide-pt-BR/security-authorization.md
  91. 5
      docs/guide-pt-BR/start-installation.md
  92. 22
      docs/guide-pt-BR/structure-filters.md
  93. 2
      docs/guide-pt-BR/tutorial-core-validators.md
  94. 14
      docs/guide-ru/README.md
  95. 6
      docs/guide-ru/caching-data.md
  96. 20
      docs/guide-ru/concept-behaviors.md
  97. 2
      docs/guide-ru/concept-components.md
  98. 22
      docs/guide-ru/concept-events.md
  99. 35
      docs/guide-ru/db-active-record.md
  100. 2
      docs/guide-ru/db-dao.md
  101. Some files were not shown because too many files have changed in this diff Show More

2
.gitignore vendored

@ -18,8 +18,6 @@ Thumbs.db
# composer vendor dir
/vendor
# cubrid install dir
/cubrid
# composer itself is not needed
composer.phar

18
.gitlab-ci.yml

@ -42,7 +42,7 @@ db:
- 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
- docker-compose run --rm php vendor/bin/phpunit -v --group db --exclude caching,mysql,pgsql
mysql:
@ -71,20 +71,6 @@ pgsql:
- 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:
@ -110,5 +96,5 @@ travis:
- docker-compose up --build -d
# wait for dbs ...
- sleep 10
- docker-compose run --rm php vendor/bin/phpunit -v --exclude mssql,cubrid,oci,wincache,xcache,zenddata,cubrid
- docker-compose run --rm php vendor/bin/phpunit -v --exclude wincache,xcache

90
.travis.yml

@ -17,7 +17,7 @@ group: edge
#branches:
# only:
# - master
# - 2.1
# - 3.0
#
@ -30,7 +30,6 @@ env:
global:
- DEFAULT_COMPOSER_FLAGS="--prefer-dist --no-interaction --no-progress --optimize-autoloader"
- TASK_TESTS_PHP=1
- TASK_TESTS_JS=0
- TASK_TESTS_COVERAGE=0
- TRAVIS_SECOND_USER=travis_two
@ -66,67 +65,18 @@ matrix:
# run tests coverage on PHP 7.1
- php: 7.1
env: TASK_TESTS_COVERAGE=1
- php: 7.0
- php: 5.6
- php: 5.5
- php: 5.4
# Test against HHVM 3.21 LTS version by using trusty
- php: hhvm-3.21
sudo: true
addons:
code_climate:
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
postgresql: "9.6"
apt:
sources:
- mysql-5.7-trusty
packages:
- mysql-server
services:
- mysql
- postgresql
# test against the latest pre 3.26 HHVM version by using a newer image.
# @see https://github.com/facebook/hhvm/issues/8192
- php: hhvm-3.24
sudo: true
addons:
code_climate:
repo_token: 2935307212620b0e2228ab67eadd92c9f5501ddb60549d0d86007a354d56915b
postgresql: "9.6"
apt:
sources:
- mysql-5.7-trusty
packages:
- mysql-server
services:
- mysql
- postgresql
- php: nightly
services:
- mysql
- postgresql
# have a separate branch for javascript tests
- language: node_js
node_js: 6
env: TASK_TESTS_PHP=0 TASK_TESTS_JS=1
# overwrite services used for PHP tests
services:
allow_failures:
- php: nightly
install:
- |
if [[ $TASK_TESTS_COVERAGE != 1 && $TRAVIS_PHP_VERSION != hhv* ]]; then
# disable xdebug for performance reasons when code coverage is not needed. note: xdebug on hhvm is disabled by default
if [[ $TASK_TESTS_COVERAGE != 1 ]]; then
# disable xdebug for performance reasons when code coverage is not needed
phpenv config-rm xdebug.ini || echo "xdebug is not installed"
fi
@ -138,34 +88,15 @@ install:
# setup PHP extension
- |
if [[ $TASK_TESTS_PHP == 1 && $TRAVIS_PHP_VERSION != nightly ]]; then
tests/data/travis/apc-setup.sh
tests/data/travis/apcu-setup.sh
tests/data/travis/memcache-setup.sh
tests/data/travis/imagick-setup.sh
fi
# setup JS test
- |
if [ $TASK_TESTS_JS == 1 ]; then
travis_retry npm install
fi
# Needed for FileCacheTest
- sudo useradd $TRAVIS_SECOND_USER --gid $(id -g) -M
before_script:
#
# Disable:
# 1) the HHVM JIT for faster testing;
# 2) the session GC for testing stability.
#
# The second allows to avoid accidental unpredictable failings with message:
# `ps_files_cleanup_dir: opendir(/var/lib/hhvm/sessions) failed: Permission denied (13)`
#
- if [[ $TRAVIS_PHP_VERSION = hhv* ]]; then
echo 'hhvm.jit = 0' >> /etc/hhvm/php.ini;
echo 'session.gc_probability = 0' >> /etc/hhvm/php.ini;
fi
# show some versions and env information
- php --version
- composer --version
@ -176,11 +107,6 @@ before_script:
psql --version
mysql --version
fi
- |
if [ $TASK_TESTS_JS == 1 ]; then
node --version
npm --version
fi
# initialize databases
- |
@ -212,13 +138,7 @@ script:
# PHP tests
- |
if [ $TASK_TESTS_PHP == 1 ]; then
vendor/bin/phpunit --verbose $PHPUNIT_FLAGS --exclude-group mssql,oci,wincache,xcache,zenddata,cubrid
fi
# JS tests
- |
if [ $TASK_TESTS_JS == 1 ]; then
npm test
vendor/bin/phpunit --verbose $PHPUNIT_FLAGS --exclude-group wincache,xcache
fi
after_script:

5
README.md

@ -1,3 +1,5 @@
> ⚠ 3.0 branch in this repository is deprecated. Yii 3.0 development takes place [in separate repositories](https://github.com/yiisoft/docs/blob/master/000-packages.md). Please do not use the branch in any projects.
<p align="center">
<a href="http://www.yiiframework.com/" target="_blank">
<img src="https://www.yiiframework.com/files/logo/yii.png" width="400" alt="Yii Framework" />
@ -19,8 +21,7 @@ The framework is easy to adjust to meet your needs, because Yii has been designe
Installation
------------
- The minimum required PHP version of Yii is PHP 5.4.
- It works best with PHP 7.
- The minimum required PHP version of Yii 3.0 is PHP 7.1.
- [Follow the Definitive Guide](https://www.yiiframework.com/doc-2.0/guide-start-installation.html)
in order to get step by step instructions.

10
build/controllers/DevController.php

@ -8,7 +8,7 @@
namespace yii\build\controllers;
use Yii;
use yii\base\InvalidParamException;
use yii\base\InvalidArgumentException;
use yii\console\Controller;
use yii\helpers\Console;
use yii\helpers\FileHelper;
@ -51,6 +51,7 @@ class DevController extends Controller
'apidoc' => 'git@github.com:yiisoft/yii2-apidoc.git',
'authclient' => 'git@github.com:yiisoft/yii2-authclient.git',
'bootstrap' => 'git@github.com:yiisoft/yii2-bootstrap.git',
'captcha' => 'git@github.com:yiisoft/yii2-captcha.git',
'codeception' => 'git@github.com:yiisoft/yii2-codeception.git',
'composer' => 'git@github.com:yiisoft/yii2-composer.git',
'debug' => 'git@github.com:yiisoft/yii2-debug.git',
@ -59,10 +60,15 @@ class DevController extends Controller
'gii' => 'git@github.com:yiisoft/yii2-gii.git',
'httpclient' => 'git@github.com:yiisoft/yii2-httpclient.git',
'imagine' => 'git@github.com:yiisoft/yii2-imagine.git',
'jquery' => 'git@github.com:yiisoft/yii2-jquery.git',
'jui' => 'git@github.com:yiisoft/yii2-jui.git',
'maskedinput' => 'git@github.com:yiisoft/yii2-maskedinput.git',
'mongodb' => 'git@github.com:yiisoft/yii2-mongodb.git',
'mssql' => 'git@github.com:yiisoft/yii2-mssql.git',
'oracle' => 'git@github.com:yiisoft/yii2-oracle.git',
'queue' => 'git@github.com:yiisoft/yii2-queue.git',
'redis' => 'git@github.com:yiisoft/yii2-redis.git',
'rest' => 'git@github.com:yiisoft/yii2-rest.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',
@ -323,7 +329,7 @@ class DevController extends Controller
$list = [];
$handle = opendir($dir);
if ($handle === false) {
throw new InvalidParamException("Unable to open directory: $dir");
throw new InvalidArgumentException("Unable to open directory: $dir");
}
while (($file = readdir($handle)) !== false) {
if ($file === '.' || $file === '..') {

8
build/controllers/PhpDocController.php

@ -56,7 +56,7 @@ class PhpDocController extends Controller
foreach ($files as $file) {
$result = $this->generateClassPropertyDocs($file);
if ($result !== false) {
list($className, $phpdoc) = $result;
[$className, $phpdoc] = $result;
if ($this->updateFiles) {
if ($this->updateClassPropertyDocs($file, $className, $phpdoc)) {
$nFilesUpdated++;
@ -180,7 +180,7 @@ class PhpDocController extends Controller
$extensionPath = \dirname(rtrim($root, '\\/'));
$this->setUpExtensionAliases($extensionPath);
list(, $extension) = $matches;
[, $extension] = $matches;
Yii::setAlias("@yii/$extension", (string)$root);
if (is_file($autoloadFile = Yii::getAlias("@yii/$extension/vendor/autoload.php"))) {
include $autoloadFile;
@ -203,7 +203,7 @@ class PhpDocController extends Controller
$extensionPath = \dirname(\dirname(rtrim($root, '\\/'))) . '/extensions';
$this->setUpExtensionAliases($extensionPath);
list(, $appName) = $matches;
[, $appName] = $matches;
Yii::setAlias("@app-$appName", (string)$root);
if (is_file($autoloadFile = Yii::getAlias("@app-$appName/vendor/autoload.php"))) {
include $autoloadFile;
@ -515,7 +515,7 @@ class PhpDocController extends Controller
return false;
}
if (!$ref->isSubclassOf('yii\base\Object') && $className != 'yii\base\Object' && !$ref->isSubclassOf('yii\base\BaseObject') && $className != 'yii\base\BaseObject') {
if (!$ref->isSubclassOf('yii\base\BaseObject') && $className !== 'yii\base\BaseObject') {
$this->stderr("[INFO] Skipping class $className as it is not a subclass of yii\\base\\BaseObject.\n", Console::FG_BLUE, Console::BOLD);
return false;
}

2
build/controllers/ReleaseController.php

@ -848,7 +848,7 @@ class ReleaseController extends Controller
{
foreach ($this->getChangelogs($what) as $file) {
// split the file into relevant parts
list($start, $changelog, $end) = $this->splitChangelog($file, $version);
[$start, $changelog, $end] = $this->splitChangelog($file, $version);
$changelog = $this->resortChangelog($changelog);
file_put_contents($file, implode("\n", array_merge($start, $changelog, $end)));
}

35
composer.json

@ -68,47 +68,50 @@
"yiisoft/yii2": "self.version"
},
"require": {
"php": ">=5.4.0",
"php": ">=7.1.0",
"ext-mbstring": "*",
"ext-ctype": "*",
"lib-pcre": "*",
"psr/log": "~1.0.2",
"yiisoft/yii2-composer": "~2.0.4",
"ezyang/htmlpurifier": "~4.6",
"cebe/markdown": "~1.0.0 | ~1.1.0 | ~1.2.0",
"bower-asset/jquery": "3.2.*@stable | 3.1.*@stable | 2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable",
"bower-asset/inputmask": "~3.2.2 | ~3.3.5",
"bower-asset/punycode": "1.3.*",
"bower-asset/yii2-pjax": "~2.0.1"
"psr/simple-cache": "~1.0.0",
"psr/http-message": "~1.0.0",
"cebe/markdown": "~1.0.0 | ~1.1.0"
},
"require-dev": {
"phpunit/phpunit": "4.8.34",
"ezyang/htmlpurifier": "~4.6",
"phpunit/phpunit": "~6.2.3",
"cebe/indent": "~1.0.2",
"friendsofphp/php-cs-fixer": "~2.2.3"
},
"repositories": [
{
"type": "composer",
"url": "https://asset-packagist.org"
}
],
"suggest": {
"ezyang/htmlpurifier": "required at `yii\\helpers\\HtmlPurifier` for 'html' data format support (e.g. `yii\\i18n\\Formatter:asHtml()`)",
"yiisoft/yii2-coding-standards": "you can use this package to check for code style issues when contributing to yii"
},
"autoload": {
"psr-4": {
"yii\\": "framework/",
"yii\\cs\\": "cs/src/"
},
"classmap": [
"framework/Yii.php"
]
},
"autoload-dev": {
"psr-4": {
"yiiunit\\": "tests/",
"yii\\build\\": "build/"
}
},
"config": {
"platform": {"php": "5.4"}
"platform": {"php": "7.1"}
},
"bin": [
"framework/yii"
],
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
"dev-master": "3.0.x-dev"
}
}
}

1447
composer.lock generated

File diff suppressed because it is too large Load Diff

3
cs/src/YiiConfig.php

@ -147,8 +147,9 @@ class YiiConfig extends Config
'single_blank_line_before_namespace' => true,
'single_quote' => true,
'standardize_not_equals' => true,
'ternary_operator_spaces' => true,
'trailing_comma_in_multiline_array' => true,
'ternary_operator_spaces' => true,
'ternary_to_null_coalescing' => true,
'trim_array_spaces' => true,
'unary_operator_spaces' => true,
'whitespace_after_comma_in_array' => true,

14
docs/guide-es/README.md

@ -130,20 +130,6 @@ Caché
* [Caché HTTP](caching-http.md)
Servicios Web RESTful
---------------------
* [Guía breve](rest-quick-start.md)
* [Recursos (Resources)](rest-resources.md)
* [Controladores](rest-controllers.md)
* [Gestión de rutas](rest-routing.md)
* [Formateo de respuestas](rest-response-formatting.md)
* [Autenticación](rest-authentication.md)
* [Límite de Rango](rest-rate-limiting.md)
* [Gestión de versiones](rest-versioning.md)
* [Gestión de errores](rest-error-handling.md)
Herramientas de Desarrollo
--------------------------

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

@ -79,8 +79,6 @@ se muestra un listado con los componentes de caché disponibles:
* [[yii\caching\MemCache]]: utiliza las extensiones de PHP [memcache](http://php.net/manual/es/book.memcache.php) y [memcached](http://php.net/manual/es/book.memcached.php). Esta opción puede ser considerada como la más rápida cuando la caché es manejada en una aplicación distribuida (ej. con varios servidores, con balance de carga, etc..)
* [[yii\redis\Cache]]: implementa un componente de caché basado en [Redis](http://redis.io/) que almacenan pares clave-valor (requiere la versión 2.6.12 de redis).
* [[yii\caching\WinCache]]: utiliza la extensión de PHP [WinCache](http://iis.net/downloads/microsoft/wincache-extension) ([ver también](http://php.net/manual/es/book.wincache.php)).
* [[yii\caching\XCache]] _(deprecated)_: utiliza la extensión de PHP [XCache](http://xcache.lighttpd.net/).
* [[yii\caching\ZendDataCache]] _(deprecated)_: utiliza [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm) como el medio fundamental de caché.
> Tip: Puedes utilizar diferentes tipos de almacenamiento de caché en la misma aplicación. Una estrategia común es la de usar almacenamiento de caché en memoria para almacenar datos que son pequeños pero que son utilizados constantemente (ej. datos estadísticos), y utilizar el almacenamiento de caché en archivos o en base de datos para guardar datos que son grandes y utilizados con menor frecuencia (ej. contenido de página).
@ -98,7 +96,7 @@ Todos los componentes de almacenamiento de caché provienen de la misma clase "p
* [[yii\caching\Cache::madd()|madd()]]: almacena múltiples elementos de datos en la memoria caché. Cada elemento se identifica con una clave. Si una clave ya existe en la caché, el elemento será omitido.
* [[yii\caching\Cache::exists()|exists()]]: devuelve un valor que indica si la clave especificada se encuentra en la memoria caché.
* [[yii\caching\Cache::delete()|delete()]]: elimina un elemento de datos identificado por una clave de la caché.
* [[yii\caching\Cache::flush()|flush()]]: elimina todos los elementos de datos de la cache.
* [[yii\caching\Cache::clear()|clear()]]: elimina todos los elementos de datos de la cache.
> Note: No Almacenes el valor boolean `false` en caché directamente porque el método [[yii\caching\Cache::get()|get()]] devuelve
el valor `false` para indicar que el dato no ha sido encontrado en la caché. Puedes poner `false` dentro de un array y cachear

20
docs/guide-es/concept-behaviors.md

@ -116,21 +116,21 @@ class User extends ActiveRecord
{
return [
// anonymous behavior, behavior class name only
MyBehavior::className(),
MyBehavior::class,
// named behavior, behavior class name only
'myBehavior2' => MyBehavior::className(),
'myBehavior2' => MyBehavior::class,
// anonymous behavior, configuration array
[
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
// named behavior, configuration array
'myBehavior4' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]
@ -154,11 +154,11 @@ use app\components\MyBehavior;
$component->attachBehavior('myBehavior1', new MyBehavior);
// vincular una clase comportamiento
$component->attachBehavior('myBehavior2', MyBehavior::className());
$component->attachBehavior('myBehavior2', MyBehavior::class);
// asociar una matriz de configuración
$component->attachBehavior('myBehavior3', [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]);
@ -168,7 +168,7 @@ Puede vincular múltiples comportamientos a la vez mediante el uso del método [
```php
$component->attachBehaviors([
'myBehavior1' => new MyBehavior, // un comportamiento nombrado
MyBehavior::className(), // un comportamiento anónimo
MyBehavior::class, // un comportamiento anónimo
]);
```
@ -176,10 +176,10 @@ También puedes asociar comportamientos a traves de [configuraciones](concept-co
```php
[
'as myBehavior2' => MyBehavior::className(),
'as myBehavior2' => MyBehavior::class,
'as myBehavior3' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
@ -270,7 +270,7 @@ class User extends ActiveRecord
{
return [
[
'class' => TimestampBehavior::className(),
'class' => TimestampBehavior::class,
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],

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

@ -67,7 +67,7 @@ Siguiendo esas directrices hará que tus componentes sean [configurables](concep
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// alternativamente
$component = \Yii::createObject([
'class' => MyClass::className(),
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);

10
docs/guide-es/concept-events.md

@ -217,7 +217,7 @@ use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Event::on(ActiveRecord::class, ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::debug(get_class($event->sender) . ' is inserted');
});
```
@ -236,11 +236,11 @@ invocación de los gestores de eventos a nivel de clase.
```php
use yii\base\Event;
Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
Event::on(Foo::class, Foo::EVENT_HELLO, function ($event) {
var_dump($event->sender); // displays "null"
});
Event::trigger(Foo::className(), Foo::EVENT_HELLO);
Event::trigger(Foo::class, Foo::EVENT_HELLO);
```
Tenga en cuenta que en este caso, el `$event->sender` hace referencia al nombre de la clase que lanza el evento en
@ -254,10 +254,10 @@ Para desadjuntar un gestor de eventos a nivel de clase, se tiene que llamar a [[
```php
// desadjunta $handler
Event::off(Foo::className(), Foo::EVENT_HELLO, $handler);
Event::off(Foo::class, Foo::EVENT_HELLO, $handler);
// desadjunta todos los gestores de Foo::EVENT_HELLO
Event::off(Foo::className(), Foo::EVENT_HELLO);
Event::off(Foo::class, Foo::EVENT_HELLO);
```
Eventos Globales <span id="global-events"></span>

2
docs/guide-es/db-dao.md

@ -15,7 +15,6 @@ Yii DAO soporta las siguientes bases de datos:
- [MariaDB](https://mariadb.com/)
- [SQLite](http://sqlite.org/)
- [PostgreSQL](http://www.postgresql.org/): versión 8.4 o superior.
- [CUBRID](http://www.cubrid.org/): versión 9.3 o superior.
- [Oracle](http://www.oracle.com/us/products/database/overview/index.html)
- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): versión 2008 o superior.
@ -65,7 +64,6 @@ propiedad [[yii\db\Connection::dsn|dsn]]. El formato del DSN varia para cada dif
* MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase`
* SQLite: `sqlite:/path/to/database/file`
* PostgreSQL: `pgsql:host=localhost;port=5432;dbname=mydatabase`
* CUBRID: `cubrid:dbname=demodb;host=localhost;port=33000`
* MS SQL Server (mediante sqlsrv driver): `sqlsrv:Server=localhost;Database=mydatabase`
* MS SQL Server (mediante dblib driver): `dblib:host=localhost;dbname=mydatabase`
* MS SQL Server (mediante mssql driver): `mssql:host=localhost;dbname=mydatabase`

12
docs/guide-es/input-file-upload.md

@ -1,7 +1,7 @@
Subir Archivos
==============
Subir archivos en Yii es normalmente realizado con la ayuda de [[yii\web\UploadedFile]], que encapsula cada archivo subido
Subir archivos en Yii es normalmente realizado con la ayuda de [[yii\http\UploadedFile]], que encapsula cada archivo subido
en un objeto `UploadedFile`. Combinado con [[yii\widgets\ActiveForm]] y [modelos](structure-models.md),
puedes fácilmente implementar un mecanismo seguro de subida de archivos.
@ -16,7 +16,7 @@ Por ejemplo,
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -90,7 +90,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{
@ -111,7 +111,7 @@ class SiteController extends Controller
}
```
En el código anterior, cuando se envía el formulario, el método [[yii\web\UploadedFile::getInstance()]] es llamado
En el código anterior, cuando se envía el formulario, el método [[yii\http\UploadedFile::getInstance()]] es llamado
para representar el archivo subido como una instancia de `UploadedFile`. Entonces dependemos de la validación del modelo
para asegurarnos que el archivo subido es válido y entonces subirlo al servidor.
@ -130,7 +130,7 @@ cuyo valor por defecto es 20. El método `upload()` debería también ser modifi
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -186,7 +186,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{

2
docs/guide-es/input-validation.md

@ -434,7 +434,7 @@ class EntryForm extends Model
{
return [
[['name', 'email'], 'required'],
['country', CountryValidator::className()],
['country', CountryValidator::class],
['email', 'email'],
];
}

4
docs/guide-es/output-client-scripts.md

@ -30,7 +30,7 @@ en vez de agregar uno nuevo. En caso de no proveerlo, el código JS en sí será
Un script externo puede ser agregado de esta manera:
```php
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::class]]);
```
Los argumentos para [[yii\web\View::registerJsFile()|registerJsFile()]] son similares a los de
@ -77,7 +77,7 @@ Si necesitas asegurarte que haya sólo una etiqueta style utiliza el cuarto argu
```php
$this->registerCssFile("http://example.com/css/themes/black-and-white.css", [
'depends' => [BootstrapAsset::className()],
'depends' => [BootstrapAsset::class],
'media' => 'print',
], 'css-print-theme');
```

127
docs/guide-es/rest-authentication.md

@ -1,127 +0,0 @@
Autenticación
=============
A diferencia de las aplicaciones Web, las API RESTful son usualmente sin estado (stateless), lo que permite que las sesiones o las cookies
no sean usadas. Por lo tanto, cada petición debe llevar alguna suerte de credenciales de autenticación,
porque la autenticación del usuario no puede ser mantenida por las sesiones o las cookies. Una práctica común
es enviar una pieza (token) secreta de acceso con cada petición para autenticar al usuario. Dado que una pieza de autenticación
puede ser usada para identificar y autenticar solamente a un usuario, **la API de peticiones tiene que ser siempre enviado
vía HTTPS para prevenir ataques tipo "man-in-the-middle" (MitM) **.
Hay muchas maneras de enviar una token (pieza) de acceso:
* [Autenticación Básica HTTP](https://es.wikipedia.org/wiki/Autenticaci%C3%B3n_de_acceso_b%C3%A1sica): la pieza de acceso
es enviada como nombre de usuario. Esto sólo debe de ser usado cuando la pieza de acceso puede ser guardada
de forma segura en la parte del API del consumidor. Por ejemplo, el API del consumidor es un programa ejecutándose en un servidor.
* Parámetro de la consulta: la pieza de acceso es enviada como un parámetro de la consulta en la URL de la API, p.e.,
`https://example.com/users?access-token=xxxxxxxx`. Debido que muchos servidores dejan los parámetros de consulta en los logs del servidor,
esta aproximación suele ser usada principalmente para servir peticiones `JSONP`
que no usen las cabeceras HTTP para enviar piezas de acceso.
* [OAuth 2](http://oauth.net/2/): la pieza de acceso es obtenida por el consumidor por medio de una autorización del servidor
y enviada al API del servidor según el protocolo
OAuth 2 [tokens HTTP del portador](http://tools.ietf.org/html/rfc6750).
Yii soporta todos los métodos anteriores de autenticación. Puedes crear nuevos métodos de autenticación de una forma fácil.
Para activar la autenticación para tus APIs, sigue los pasos siguientes:
1. Configura el componente `user` de la aplicación:
- Define la propiedad [[yii\web\User::enableSession|enableSession]] como `false`.
- Define la propiedad [[yii\web\User::loginUrl|loginUrl]] como `null` para mostrar un error HTTP 403 en vez de redireccionar a la pantalla de login.
2. Especifica cuál método de autenticación planeas usar configurando el comportamiento (behavior) `authenticator` en tus
clases de controladores REST.
3. Implementa [[yii\web\IdentityInterface::findIdentityByAccessToken()]] en tu [[yii\web\User::identityClass|clase de identidad de usuarios]].
El paso 1 no es necesario pero sí recomendable para las APIs RESTful, pues son sin estado (stateless).
Cuando [[yii\web\User::enableSession|enableSession]] es `false`, el estado de autenticación del usuario puede NO persistir entre peticiones usando sesiones.
Si embargo, la autenticación será realizada para cada petición, lo que se consigue en los pasos 2 y 3.
> Tip:Puedes configurar [[yii\web\User::enableSession|enableSession]] del componente de la aplicación `user` en la configuración
> de las aplicaciones si estás desarrollando APIs RESTful en términos de un aplicación. Si desarrollas un módulo de las APIs RESTful,
> puedes poner la siguiente línea en el método del módulo `init()`, tal y como sigue:
>
> ```php
> public function init()
> {
> parent::init();
> \Yii::$app->user->enableSession = false;
> }
> ```
Por ejemplo, para usar HTTP Basic Auth, puedes configurar el comportamiento (behavior) `authenticator` como sigue,
```php
use yii\filters\auth\HttpBasicAuth;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
return $behaviors;
}
```
Si quieres implementar los tres métodos de autenticación explicados antes, puedes usar `CompositeAuth` de la siguiente manera,
```php
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
];
return $behaviors;
}
```
Cada elemento en `authMethods` debe de ser el nombre de una clase de método de autenticación o un array de configuración.
La implementación de `findIdentityByAccessToken()` es específico de la aplicación. Por ejemplo, en escenarios simples
cuando cada usuario sólo puede tener un token de acceso, puedes almacenar este token en la columna `access_token`
en la tabla de usuario. El método debe de ser inmediatamente implementado en la clase `User` como sigue,
```php
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
}
```
Después que la autenticación es activada, tal y como se describe arriba, para cada petición de la API, el controlador solicitado
puede intentar autenticar al usuario en su evento `beforeAction()`.
Si la autenticación tiene éxito, el controlador realizará otras comprobaciones (como son límite del ratio, autorización)
y entonces ejecutar la acción. La identidad del usuario autenticado puede ser recuperada via `Yii::$app->user->identity`.
Si la autenticación falla, una respuesta con estado HTTP 401 será devuelta junto con otras cabeceras apropiadas
(tal como la cabecera para autenticación básica HTTP `WWW-Authenticate`).
## Autorización <span id="authorization"></span>
Después de que un usuario se ha autenticado, probablementer querrás comprobar si él o ella tiene los permisos para realizar
la acción solicitada. Este proceso es llamado *autorización (authorization)* y está cubierto en detalle
en la [Sección de Autorización](security-authorization.md).
Si tus controladores extienden de [[yii\rest\ActiveController]], puedes sobreescribir
el método [[yii\rest\ActiveController::checkAccess()|checkAccess()]] para realizar la comprobación de la autorización.
El método será llamado por las acciones contenidas en [[yii\rest\ActiveController]].

156
docs/guide-es/rest-controllers.md

@ -1,156 +0,0 @@
Controladores
=============
Después de crear las clases de recursos y especificar cómo debe ser el formato de datos de recursos, el siguiente paso
es crear acciones del controlador para exponer los recursos a los usuarios finales a través de las APIs RESTful.
Yii ofrece dos clases controlador base para simplificar tu trabajo de crear acciones REST:
[[yii\rest\Controller]] y [[yii\rest\ActiveController]]. La diferencia entre estos dos controladores
es que este último proporciona un conjunto predeterminado de acciones que están específicamente diseñado para trabajar con
los recursos representados como [Active Record](db-active-record.md). Así que si estás utilizando [Active Record](db-active-record.md)
y te sientes cómodo con las acciones integradas provistas, podrías considerar extender tus controladores
de [[yii\rest\ActiveController]], lo que te permitirá crear potentes APIs RESTful con un mínimo de código.
Ambos [[yii\rest\Controller]] y [[yii\rest\ActiveController]] proporcionan las siguientes características,
algunas de las cuales se describen en detalle en las siguientes secciones:
* Método de Validación HTTP;
* [Negociación de contenido y formato de datos](rest-response-formatting.md);
* [Autenticación](rest-authentication.md);
* [Límite de Rango](rest-rate-limiting.md).
[[yii\rest\ActiveController]] además provee de las siguientes características:
* Un conjunto de acciones comunes necesarias: `index`, `view`, `create`, `update`, `delete`, `options`;
* La autorización del usuario de acuerdo a la acción y recurso solicitado.
## Creando Clases de Controlador <span id="creating-controller"></span>
Al crear una nueva clase de controlador, una convención para nombrar la clase del controlador es utilizar
el nombre del tipo de recurso en singular. Por ejemplo, para servir información de usuario,
el controlador puede ser nombrado como `UserController`.
Crear una nueva acción es similar a crear una acción para una aplicación Web. La única diferencia
es que en lugar de renderizar el resultado utilizando una vista llamando al método `render()`, para las acciones REST
regresas directamente los datos. El [[yii\rest\Controller::serializer|serializer]] y el
[[yii\web\Response|response object]] se encargarán de la conversión de los datos originales
al formato solicitado. Por ejemplo,
```php
public function actionView($id)
{
return User::findOne($id);
}
```
## Filtros <span id="filters"></span>
La mayoría de las características API REST son proporcionadas por [[yii\rest\Controller]] son implementadas en los términos de [filtros](structure-filters.md).
En particular, los siguientes filtros se ejecutarán en el orden en que aparecen:
* [[yii\filters\ContentNegotiator|contentNegotiator]]: soporta la negociación de contenido, que se explica en
la sección [Formateo de respuestas](rest-response-formatting.md);
* [[yii\filters\VerbFilter|verbFilter]]: soporta métodos de validación HTTP;
* [[yii\filters\auth\AuthMethod|authenticator]]: soporta la autenticación de usuarios, que se explica en
la sección [Autenticación](rest-authentication.md);
* [[yii\filters\RateLimiter|rateLimiter]]: soporta la limitación de rango, que se explica en
la sección [Límite de Rango](rest-rate-limiting.md).
Estos filtros se declaran nombrándolos en el método [[yii\rest\Controller::behaviors()|behaviors()]].
Puede sobrescribir este método para configurar filtros individuales, desactivar algunos de ellos, o añadir los tuyos.
Por ejemplo, si sólo deseas utilizar la autenticación básica HTTP, puede escribir el siguiente código:
```php
use yii\filters\auth\HttpBasicAuth;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
return $behaviors;
}
```
## Extendiendo `ActiveController` <span id="extending-active-controller"></span>
Si tu clase controlador extiende de [[yii\rest\ActiveController]], debe establecer
su propiedad [[yii\rest\ActiveController::modelClass|modelClass]] con el nombre de la clase del recurso
que planeas servir a través de este controlador. La clase debe extender de [[yii\db\ActiveRecord]].
### Personalizando Acciones <span id="customizing-actions"></span>
Por defecto, [[yii\rest\ActiveController]] provee de las siguientes acciones:
* [[yii\rest\IndexAction|index]]: listar recursos página por página;
* [[yii\rest\ViewAction|view]]: devolver el detalle de un recurso específico;
* [[yii\rest\CreateAction|create]]: crear un nuevo recurso;
* [[yii\rest\UpdateAction|update]]: actualizar un recurso existente;
* [[yii\rest\DeleteAction|delete]]: eliminar un recurso específico;
* [[yii\rest\OptionsAction|options]]: devolver los métodos HTTP soportados.
Todas esta acciones se declaran a través de método [[yii\rest\ActiveController::actions()|actions()]].
Puedes configurar estas acciones o desactivar alguna de ellas sobrescribiendo el método `actions()`, como se muestra a continuación,
```php
public function actions()
{
$actions = parent::actions();
// disable the "delete" and "create" actions
unset($actions['delete'], $actions['create']);
// customize the data provider preparation with the "prepareDataProvider()" method
$actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];
return $actions;
}
public function prepareDataProvider()
{
// prepare and return a data provider for the "index" action
}
```
Por favor, consulta las referencias de clases de acciones individuales para aprender las opciones de configuración disponibles para cada una.
### Realizando Comprobación de Acceso <span id="performing-access-check"></span>
Al exponer los recursos a través de RESTful APIs, a menudo es necesario comprobar si el usuario actual tiene permiso
para acceder y manipular el/los recurso solicitado/s. Con [[yii\rest\ActiveController]], esto puede lograrse
sobrescribiendo el método [[yii\rest\ActiveController::checkAccess()|checkAccess()]] como a continuación,
```php
/**
* Checks the privilege of the current user.
*
* This method should be overridden to check whether the current user has the privilege
* to run the specified action against the specified data model.
* If the user does not have access, a [[ForbiddenHttpException]] should be thrown.
*
* @param string $action the ID of the action to be executed
* @param \yii\base\Model $model the model to be accessed. If `null`, it means no specific model is being accessed.
* @param array $params additional parameters
* @throws ForbiddenHttpException if the user does not have access
*/
public function checkAccess($action, $model = null, $params = [])
{
// check if the user can access $action and $model
// throw ForbiddenHttpException if access should be denied
if ($action === 'update' || $action === 'delete') {
if ($model->author_id !== \Yii::$app->user->id)
throw new \yii\web\ForbiddenHttpException(sprintf('You can only %s articles that you\'ve created.', $action));
}
}
```
El método `checkAccess()` será llamado por defecto en las acciones predeterminadas de [[yii\rest\ActiveController]]. Si creas
nuevas acciones y también deseas llevar a cabo la comprobación de acceso, debe llamar a este método de forma explícita en las nuevas acciones.
> Tip: Puedes implementar `checkAccess()` mediante el uso del [Componente Role-Based Access Control (RBAC)](security-authorization.md).

94
docs/guide-es/rest-error-handling.md

@ -1,94 +0,0 @@
Manejo de errores
=================
Cuando se maneja una petición de API RESTful, si ocurre un error en la petición del usuario o si algo inesperado
ocurre en el servidor, simplemente puedes lanzar una excepción para notificar al usuario que algo erróneo ocurrió.
Si puedes identificar la causa del error (p.e., el recurso solicitado no existe), debes considerar lanzar una excepción
con el código HTTP de estado apropiado (p.e., [[yii\web\NotFoundHttpException]] representa un código de estado 404).
Yii enviará la respuesta a continuación con el correspondiente código de estado HTTP y el texto. Yii puede incluir también
la representación serializada de la excepción en el cuerpo de la respuesta.
Por ejemplo:
```
HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
```
La siguiente lista sumariza los códigos de estado HTTP que son usados por el framework REST:
* `200`: OK. Todo ha funcionado como se esperaba.
* `201`: El recurso ha creado con éxito en respuesta a la petición `POST`. La cabecera de situación `Location`
contiene la URL apuntando al nuevo recurso creado.
* `204`: La petición ha sido manejada con éxito y el cuerpo de la respuesta no tiene contenido (como una petición `DELETE`).
* `304`: El recurso no ha sido modificado. Puede usar la versión en caché.
* `400`: Petición errónea. Esto puede estar causado por varias acciones de el usuario, como proveer un JSON no válido
en el cuerpo de la petición, proveyendo parámetros de acción no válidos, etc.
* `401`: Autenticación fallida.
* `403`: El usuario autenticado no tiene permitido acceder a la API final.
* `404`: El recurso pedido no existe.
* `405`: Método no permitido. Por favor comprueba la cabecera `Allow` por los métodos HTTP permitidos.
* `415`: Tipo de medio no soportado. El tipo de contenido pedido o el número de versión no es válido.
* `422`: La validación de datos ha fallado (en respuesta a una petición `POST` , por ejemplo). Por favor, comprueba en el cuerpo de la respuesta el mensaje detallado.
* `429`: Demasiadas peticiones. La petición ha sido rechazada debido a un limitación de rango.
* `500`: Error interno del servidor. Esto puede estar causado por errores internos del programa.
## Personalizar la Respuesta al Error <span id="customizing-error-response"></span>
A veces puedes querer personalizar el formato de la respuesta del error por defecto . Por ejemplo, en lugar de depender
del uso de diferentes estados HTTP para indicar los diferentes errores, puedes querer usar siempre el estado HTTP 200
y encapsular el código de estado HTTP real como parte de una estructura JSON en la respuesta, como se muestra a continuación,
```
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
```
Para lograrlo, puedes responder al evento `beforeSend` del componente `response` en la configuración de la aplicación:
```php
return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null && Yii::$app->request->get('suppress_response_code')) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];
```
El anterior código reformateará la respuesta (sea exitosa o fallida) como se explicó cuando
`suppress_response_code` es pasado como un parámetro `GET`.

203
docs/guide-es/rest-quick-start.md

@ -1,203 +0,0 @@
Guía Breve
==========
Yii ofrece todo un conjunto de herramientas para simplificar la tarea de implementar un
servicio web APIs RESTful.
En particular, Yii soporta las siguientes características sobre APIs RESTful;
* Prototipado rápido con soporte para APIs comunes para [Active Record](db-active-record.md);
* Formato de respuesta de negocio (soporta JSON y XML por defecto);
* Personalización de objetos serializados con soporte para campos de salida seleccionables;
* Formateo apropiado de colecciones de datos y validación de errores;
* Soporte para [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS);
* Eficiente enrutamiento con una adecuada comprobación del verbo(verb) HTTP;
* Incorporado soporte para las `OPTIONS` y `HEAD` verbos;
* Autenticación y autorización;
* Cacheo de datos y cacheo HTTP;
* Limitación de rango;
A continuación, utilizamos un ejemplo para ilustrar como se puede construir un conjunto de APIs RESTful con un esfuerzo mínimo de codificación.
Supongamos que deseas exponer los datos de los usuarios vía APIs RESTful. Los datos de usuario son almacenados en la tabla DB `user`,
y ya tienes creado la clase [[yii\db\ActiveRecord|ActiveRecord]] `app\models\User` para acceder a los datos del usuario.
## Creando un controlador <span id="creating-controller"></span>
Primero, crea una clase controladora `app\controllers\UserController` como la siguiente,
```php
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
```
La clase controladora extiende de [[yii\rest\ActiveController]]. Especificado por [[yii\rest\ActiveController::modelClass|modelClass]]
como `app\models\User`, el controlador sabe que modelo puede ser usado para recoger y manipular sus datos.
## Configurando las reglas de las URL <span id="configuring-url-rules"></span>
A continuación, modifica la configuración del componente `urlManager` en la configuración de tu aplicación:
```php
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
```
La configuración anterior principalmente añade una regla URL para el controlador `user` de manera
que los datos de user pueden ser accedidos y manipulados con URLs amigables y verbos HTTP significativos.
## Habilitando entradas JSON <span id="enabling-json-input"></span>
Para permitir que la API acepte datos de entrada con formato JSON, configura la propiedad [[yii\web\Request::$parsers|parsers]]
del componente de aplicación `request` para usar [[yii\web\JsonParser]] para entradas JSON:
```php
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
]
```
> Tip: La configuración anterior es opcional. Sin la configuración anterior, la API sólo reconocería
`application/x-www-form-urlencoded` y `multipart/form-data` como formatos de entrada.
## Probándolo <span id="trying-it-out"></span>
Con la mínima cantidad de esfuerzo, tienes ya finalizado tu tarea de crear las APIs RESTful
para acceder a los datos de user. Las APIs que tienes creado incluyen:
* `GET /users`: una lista de todos los usuarios página por página;
* `HEAD /users`: muestra la información general de la lista de usuarios;
* `POST /users`: crea un nuevo usuario;
* `GET /users/123`: devuelve los detalles del usuario 123;
* `HEAD /users/123`: muestra la información general del usuario 123;
* `PATCH /users/123` y `PUT /users/123`: actualiza el usuario 123;
* `DELETE /users/123`: elimina el usuario 123;
* `OPTIONS /users`: muestra los verbos compatibles respecto al punto final `/users`;
* `OPTIONS /users/123`: muestra los verbos compatibles respecto al punto final `/users/123`.
> Info: Yii automáticamente pluraliza los nombres de los controladores para usarlo en los puntos finales.
> Puedes configurar esto usando la propiedad [[yii\rest\UrlRule::$pluralize]].
Puedes acceder a tus APIs con el comando `curl` de la siguiente manera,
```
$ curl -i -H "Accept:application/json" "http://localhost/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
```
Intenta cambiar el tipo de contenido aceptado para ser `application/xml`, y verá que el resultado
se devuelve en formato XML:
```
$ curl -i -H "Accept:application/xml" "http://localhost/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<item>
<id>1</id>
...
</item>
<item>
<id>2</id>
...
</item>
...
</response>
```
El siguiente comando creará un nuevo usuario mediante el envío de una petición POST con los datos del usuario en formato JSON:
```
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XPOST "http://localhost/users" -d '{"username": "example", "email": "user@example.com"}'
HTTP/1.1 201 Created
...
Location: http://localhost/users/1
Content-Length: 99
Content-Type: application/json; charset=UTF-8
{"id":1,"username":"example","email":"user@example.com","created_at":1414674789,"updated_at":1414674789}
```
> Tip: También puedes acceder a tus APIs a través del navegador web introduciendo la URL `http://localhost/users`.
Sin embargo, es posible que necesites algunos plugins para el navegador para enviar cabeceras especificas en la petición.
Como se puede ver, en las cabeceras de la respuesta, hay información sobre la cuenta total, número de páginas, etc.
También hay enlaces que permiten navegar por otras páginas de datos. Por ejemplo, `http://localhost/users?page=2`
le daría la página siguiente de los datos de usuario.
Utilizando los parámetros `fields` y `expand`, puedes también especificar que campos deberían ser incluidos en el resultado.
Por ejemplo, la URL `http://localhost/users?fields=id,email` sólo devolverá los campos `id` y `email`.
> Info: Puedes haber notado que el resultado de `http://localhost/users` incluye algunos campos sensibles,
> tal como `password_hash`, `auth_key`. Seguramente no quieras que éstos aparecieran en el resultado de tu API.
> Puedes y deberías filtrar estos campos como se describe en la sección [Response Formatting](rest-response-formatting.md).
## Resumen <span id="summary"></span>
Utilizando el framework Yii API RESTful, implementa un punto final API en términos de una acción de un controlador, y utiliza
un controlador para organizar las acciones que implementan los puntos finales para un sólo tipo de recurso.
Los recursos son representados como modelos de datos que extienden de la clase [[yii\base\Model]].
Si estás trabajando con bases de datos (relacionales o NoSQL), es recomendable utilizar [[yii\db\ActiveRecord|ActiveRecord]]
para representar los recursos.
Puedes utilizar [[yii\rest\UrlRule]] para simplificar el enrutamiento de los puntos finales de tu API.
Aunque no es obligatorio, es recomendable que desarrolles tus APIs RESTful como una aplicación separada, diferente de
tu WEB front end y tu back end para facilitar el mantenimiento.

44
docs/guide-es/rest-rate-limiting.md

@ -1,44 +0,0 @@
Limitando el rango (rate)
=========================
Para prevenir el abuso, puedes considerar añadir un *límitación del rango (rate limiting)* para tus APIs. Por ejemplo,
puedes querer limitar el uso del API de cada usuario a un máximo de 100 llamadas al API dentro de un periodo de 10 minutos.
Si se reciben demasiadas peticiones de un usuario dentro del periodo de tiempo declarado, deveríá devolverse una respuesta con código de estado 429 (que significa "Demasiadas peticiones").
Para activar la limitación de rango, la clase [[yii\web\User::identityClass|user identity class]] debe implementar [[yii\filters\RateLimitInterface]].
Este interface requiere la implementación de tres métodos:
* `getRateLimit()`: devuelve el número máximo de peticiones permitidas y el periodo de tiempo (p.e., `[100, 600]` significa que como mucho puede haber 100 llamadas al API dentro de 600 segundos).
* `loadAllowance()`: devuelve el número de peticiones que quedan permitidas y el tiempo (fecha/hora) UNIX
con el último límite del rango que ha sido comprobado.
* `saveAllowance()`: guarda ambos, el número restante de peticiones permitidas y el tiempo actual (fecha/hora) UNIX .
Puedes usar dos columnas en la tabla de usuario para guardar la información de lo permitido y la fecha/hora (timestamp). Con ambas definidas,
entonces `loadAllowance()` y `saveAllowance()` pueden ser utilizados para leer y guardar los valores de las dos columnas correspondientes al actual usuario autenticado.
Para mejorar el desempeño, también puedes considerar almacenar esas piezas de información en caché o almacenamiento NoSQL.
Una vez que la clase de identidad implementa la interfaz requerida, Yii utilizará automáticamente [[yii\filters\RateLimiter]]
configurado como un filtro de acción para que [[yii\rest\Controller]] compruebe el límite de rango. El limitador de rango
lanzará una excepeción [[yii\web\TooManyRequestsHttpException]] cuando el límite del rango sea excedido.
Puedes configurar el limitador de rango
en tu clase controlador REST como sigue:
```php
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
```
Cuando se activa el límite de rango, por defecto todas las respuestas serán enviadas con la siguiente cabecera HTTP conteniendo
información sobre el límite actual de rango:
* `X-Rate-Limit-Limit`, el máximo número de peticiones permitidas en un periodo de tiempo
* `X-Rate-Limit-Remaining`, el número de peticiones restantes en el periodo de tiempo actual
* `X-Rate-Limit-Reset`, el número de segundos a esperar para pedir el máximo número de peticiones permitidas
Puedes desactivar estas cabeceras configurando [[yii\filters\RateLimiter::enableRateLimitHeaders]] a `false`,
tal y como en el anterior ejemplo.

190
docs/guide-es/rest-resources.md

@ -1,190 +0,0 @@
Recursos
=========
Las APIs RESTful lo son todos para acceder y manipular *recursos (resources)*. Puedes observar los recursos en el paradigma MVC en [Modelos (models)](structure-models.md) .
Mientras que no hay restricción a cómo representar un recurso, en YII usualmente, puedes representar recursos como objetos de la clase [[yii\base\Model]] o sus clases hijas (p.e. [[yii\db\ActiveRecord]]), por las siguientes razones:
* [[yii\base\Model]] implementa el interface [[yii\base\Arrayable]] , el cual te permite personalizar como exponer los datos de los recursos a travès de las APIs RESTful.
* [[yii\base\Model]] soporta [Validación de entrada (input validation)](input-validation.md), lo cual es muy usado en las APIs RESTful para soportar la entrada de datos.
* [[yii\db\ActiveRecord]] provee un poderoso soporte para el acceso a datos en bases de datos y su manipulación, lo que lo le hace servir perfectamente si sus recursos de datos están en bases de datos.
En esta sección, vamos principalmente a describir como la clase con recursos que extiende de [[yii\base\Model]] (o sus clases hijas) puede especificar qué datos puede ser devueltos vía las APIs RESTful. Si la clase de los recursos no extiende de [[yii\base\Model]], entonces todas las variables públicas miembro serán devueltas.
## Campos (fields) <span id="fields"></span>
Cuando incluimos un recurso en una respuesta de la API RESTful, el recurso necesita ser serializado en una cadena.
Yii divide este proceso en dos pasos. Primero, el recurso es convertido en un array por [[yii\rest\Serializer]].
Segundo, el array es serializado en una cadena en el formato requerido (p.e. JSON, XML) por [[yii\web\ResponseFormatterInterface|response formatters]]. El primer paso es en el que debes de concentrarte principalmente cuando desarrolles una clase de un recurso.
Sobreescribiendo [[yii\base\Model::fields()|fields()]] y/o [[yii\base\Model::extraFields()|extraFields()]],
puedes especificar qué datos, llamados *fields*, en el recursos, pueden ser colocados en el array que le representa.
La diferencia entre estos dos métodos es que el primero especifica el conjunto de campos por defecto que deben ser incluidos en el array que los representa, mientras que el último especifica campos adicionales que deben de ser incluidos en el array si una petición del usuario final para ellos vía el parámetro de consulta `expand`. Por ejemplo,
```
// devuelve todos los campos declarados en fields()
http://localhost/users
// sólo devuelve los campos id y email, provistos por su declaración en fields()
http://localhost/users?fields=id,email
// devuelve todos los campos en fields() y el campo profile siempre y cuando esté declarado en extraFields()
http://localhost/users?expand=profile
// sólo devuelve los campos id, email y profile, siempre y cuando ellos estén declarados en fields() y extraFields()
http://localhost/users?fields=id,email&expand=profile
```
### Sobreescribiendo `fields()` <span id="overriding-fields"></span>
Por defecto, [[yii\base\Model::fields()]] devuelve todos los atributos de los modelos como si fueran campos, mientras [[yii\db\ActiveRecord::fields()]] sólo devuelve los atributos que tengan datos en la base de datos.
Puedes sobreescribir `fields()` para añadir, quitar, renombrar o redefinir campos. El valor de retorno de `fields()` ha de estar en un array. Las claves del array son los nombres de los campos y los valores del array son las correspondientes definiciones de los campos que pueden ser tanto nombres de propiedades/atributos o funciones anónimas que devuelven los correspondientes valores del los campos. En el caso especial de que el nombre de un campo sea el mismo que su definición puedes omitir la clave en el array. Por ejemplo,
```php
// explícitamente lista cada campo, siendo mejor usarlo cuando quieras asegurarte que los cambios
// en una tabla de la base de datos o en un atributo del modelo no provoque el cambio de tu campo (para mantener la compatibilidad anterior).
public function fields()
{
return [
// el nombre de campo es el mismo nombre del atributo
'id',
// el nombre del campo es "email", su atributo se denomina "email_address"
'email' => 'email_address',
// el nombre del campo es "name", su valor es definido está definido por una función anónima de retrollamada (callback)
'name' => function () {
return $this->first_name . ' ' . $this->last_name;
},
];
}
// el ignorar algunos campos, es mejor usarlo cuando heredas de una implementación padre
// y pones en la lista negra (blacklist) algunos campos sensibles
public function fields()
{
$fields = parent::fields();
// quita los campos con información sensible
unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']);
return $fields;
}
```
> Warning: Dado que, por defecto, todos los atributos de un modelo pueden ser incluidos en la devolución del API, debes
> examinar tus datos para estar seguro de que no contiene información sensible. Si se da este tipo de información,
> debes sobreescribir `fields()` para filtrarlos. En el ejemplo anterior, escogemos
> quitar `auth_key`, `password_hash` y `password_reset_token`.
### Sobreescribiendo `extraFields()` <span id="overriding-extra-fields"></span>
Por defecto, [[yii\base\Model::extraFields()]] no devuelve nada, mientras que [[yii\db\ActiveRecord::extraFields()]] devuelve los nombres de las relaciones que tienen datos (populated) obtenidos de la base de datos.
El formato de devolución de los datos de `extraFields()` es el mismo que el de `fields()`. Usualmente, `extraFields()` es principalmente usado para especificar campos cuyos valores sean objetos. Por ejemplo, dado la siguiente declaración de campo,
```php
public function fields()
{
return ['id', 'email'];
}
public function extraFields()
{
return ['profile'];
}
```
la petición `http://localhost/users?fields=id,email&expand=profile` puede devolver los siguientes datos en formato JSON :
```php
[
{
"id": 100,
"email": "100@example.com",
"profile": {
"id": 100,
"age": 30,
}
},
...
]
```
## Enlaces (Links) <span id="links"></span>
[HATEOAS](http://en.wikipedia.org/wiki/HATEOAS), es una abreviación de Hipermedia es el Motor del Estado de la Aplicación (Hypermedia as the Engine of Application State), promueve que las APIs RESTfull devuelvan información que permita a los clientes descubrir las acciones que soportan los recursos devueltos. El sentido de HATEOAS es devolver un conjunto de hiperenlaces con relación a la información, cuando los datos de los recursos son servidos por las APIs.
Las clases con recursos pueden soportar HATEOAS implementando el interfaz [[yii\web\Linkable]] . El interfaz contiene sólo un método [[yii\web\Linkable::getLinks()|getLinks()]] el cual debe de de devolver una lista de [[yii\web\Link|links]].
Típicamente, debes devolver al menos un enlace `self` representando la URL al mismo recurso objeto. Por ejemplo,
```php
use yii\db\ActiveRecord;
use yii\web\Link;
use yii\web\Linkable;
use yii\helpers\Url;
class User extends ActiveRecord implements Linkable
{
public function getLinks()
{
return [
Link::REL_SELF => Url::to(['user/view', 'id' => $this->id], true),
];
}
}
```
Cuando un objeto `User` es devuelto en una respuesta, puede contener un elemento `_links` representando los enlaces relacionados con el usuario, por ejemplo,
```
{
"id": 100,
"email": "user@example.com",
// ...
"_links" => {
"self": {
"href": "https://example.com/users/100"
}
}
}
```
## Colecciones <span id="collections"></span>
Los objetos de los recursos pueden ser agrupados en *collections*. Cada colección contiene una lista de recursos objeto del mismo tipo.
Las colecciones pueden ser representadas como arrays pero, es usualmente más deseable representarlas como [proveedores de datos (data providers)](output-data-providers.md). Esto es así porque los proveedores de datos soportan paginación y ordenación de los recursos, lo cual es comunmente necesario en las colecciones devueltas con las APIs RESTful. Por ejemplo, la siguiente acción devuelve un proveedor de datos sobre los recursos post:
```php
namespace app\controllers;
use yii\rest\Controller;
use yii\data\ActiveDataProvider;
use app\models\Post;
class PostController extends Controller
{
public function actionIndex()
{
return new ActiveDataProvider([
'query' => Post::find(),
]);
}
}
```
Cuando un proveedor de datos está enviando una respuesta con el API RESTful, [[yii\rest\Serializer]] llevará la actual página de los recursos y los serializa como un array de recursos objeto. Adicionalmente, [[yii\rest\Serializer]]
puede incluir también la información de paginación a través de las cabeceras HTTP siguientes:
* `X-Pagination-Total-Count`: Número total de recursos;
* `X-Pagination-Page-Count`: Número de páginas;
* `X-Pagination-Current-Page`: Página actual (iniciando en 1);
* `X-Pagination-Per-Page`: Número de recursos por página;
* `Link`: Un conjunto de enlaces de navegación permitiendo al cliente recorrer los recursos página a página.
Un ejemplo se puede ver en la sección [Inicio rápido (Quick Start)](rest-quick-start.md#trying-it-out).

157
docs/guide-es/rest-response-formatting.md

@ -1,157 +0,0 @@
Formato de Respuesta
====================
Cuando se maneja una petición al API RESTful, una aplicación realiza usualmente los siguientes pasos que están relacionados
con el formato de la respuesta:
1. Determinar varios factores que pueden afectar al formato de la respuesta, como son el tipo de medio, lenguaje, versión, etc.
Este proceso es también conocido como [negociación de contenido (content negotiation)](http://en.wikipedia.org/wiki/Content_negotiation).
2. La conversión de objetos recurso en arrays, como está descrito en la sección [Recursos (Resources)](rest-resources.md).
Esto es realizado por la clase [[yii\rest\Serializer]].
3. La conversión de arrays en cadenas con el formato determinado por el paso de negociación de contenido. Esto es
realizado por los [[yii\web\ResponseFormatterInterface|formatos de respuesta]] registrados
con la propiedad [[yii\web\Response::formatters|formatters]] del
[componente de la aplicación](structure-application-components.md) `response`.
## Negociación de contenido (Content Negotiation) <span id="content-negotiation"></span>
Yii soporta la negociación de contenido a través del filtro [[yii\filters\ContentNegotiator]]. La clase de controlador base
del API RESTful [[yii\rest\Controller]] está equipada con este filtro bajo el nombre `contentNegotiator`.
El filtro provee tanto un formato de respuesta de negociación como una negociación de lenguaje. Por ejemplo, si la petición API RESTful
contiene la siguiente cabecera,
```
Accept: application/json; q=1.0, */*; q=0.1
```
puede obtener una respuesta en formato JSON, como a continuación:
```
$ curl -i -H "Accept: application/json; q=1.0, */*; q=0.1" "http://localhost/users"
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
X-Powered-By: PHP/5.4.20
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
```
Detrás de escena, antes de que sea ejecutada una acción del controlador del API RESTful, el filtro [[yii\filters\ContentNegotiator]]
comprobará la cabecera HTTP `Accept` de la petición y definirá el [[yii\web\Response::format|response format]]
como `'json'`. Después de que la acción sea ejecutada y devuelva el objeto recurso o la colección resultante,
[[yii\rest\Serializer]] convertirá el resultado en un array. Y finalmente, [[yii\web\JsonResponseFormatter]]
serializará el array en una cadena JSON incluyéndola en el cuerpo de la respuesta.
Por defecto, el API RESTful soporta tanto el formato JSON como el XML. Para soportar un nuevo formato, debes configurar
la propiedad [[yii\filters\ContentNegotiator::formats|formats]] del filtro `contentNegotiator` tal y como sigue,
en las clases del controlador del API:
```php
use yii\web\Response;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_HTML;
return $behaviors;
}
```
Las claves de la propiedad `formats` son los tipos MIME soportados, mientras que los valores son los nombres de formato de respuesta correspondientes,
los cuales deben ser soportados en [[yii\web\Response::formatters]].
## Serialización de Datos <span id="data-serializing"></span>
Como hemos descrito antes, [[yii\rest\Serializer]] es la pieza central responsable de convertir
objetos recurso o colecciones en arrays. Reconoce objetos tanto implementando [[yii\base\ArrayableInterface]]
como [[yii\data\DataProviderInterface]]. El primer formateador es implementado principalmente para objetos recursos,
mientras que el segundo para recursos collección.
Puedes configurar el serializador definiendo la propiedad [[yii\rest\Controller::serializer]] con un array de configuración.
Por ejemplo, a veces puedes querer ayudar a simplificar el trabajo de desarrollo del cliente incluyendo información de la paginación
directamente en el cuerpo de la respuesta. Para hacer esto, configura la propiedad [[yii\rest\Serializer::collectionEnvelope]]
como sigue:
```php
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
public $serializer = [
'class' => 'yii\rest\Serializer',
'collectionEnvelope' => 'items',
];
}
```
Puedes obtener la respuesta que sigue para la petición `http://localhost/users`:
```
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
X-Powered-By: PHP/5.4.20
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"items": [
{
"id": 1,
...
},
{
"id": 2,
...
},
...
],
"_links": {
"self": {
"href": "http://localhost/users?page=1"
},
"next": {
"href": "http://localhost/users?page=2"
},
"last": {
"href": "http://localhost/users?page=50"
}
},
"_meta": {
"totalCount": 1000,
"pageCount": 50,
"currentPage": 1,
"perPage": 20
}
}
```

92
docs/guide-es/rest-routing.md

@ -1,92 +0,0 @@
Enrutamiento
============
Con las clases de controlador y recurso preparadas, puedes acceder a los recursos usando una URL como
`http://localhost/index.php?r=user/create`, parecida a la que usas con aplicaciones Web normales.
En la práctica, querrás usualmente usar URLs limpias y obtener ventajas de los verbos HTTP.
Por ejemplo, una petición `POST /users` significaría acceder a la acción `user/create`.
Esto puede realizarse fácilmente configurando el componente de la aplicación `urlManager`
como sigue:
```php
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
```
En comparación con la gestión de URL en las aplicaciones Web, lo principalmente nuevo de lo anterior es el uso de
[[yii\rest\UrlRule]] para el enrutamiento de las peticiones con el API RESTful. Esta clase especial de regla URL creará
un conjunto completo de reglas URL hijas para soportar el enrutamiento y creación de URL para el/los controlador/es especificados.
Por ejemplo, el código anterior es equivalente a las siguientes reglas:
```php
[
'PUT,PATCH users/<id>' => 'user/update',
'DELETE users/<id>' => 'user/delete',
'GET,HEAD users/<id>' => 'user/view',
'POST users' => 'user/create',
'GET,HEAD users' => 'user/index',
'users/<id>' => 'user/options',
'users' => 'user/options',
]
```
Y los siguientes puntos finales del API son mantenidos por esta regla:
* `GET /users`: lista de todos los usuarios página a página;
* `HEAD /users`: muestra ĺa información resumén del usuario listado;
* `POST /users`: crea un nuevo usuario;
* `GET /users/123`: devuelve los detalles del usuario 123;
* `HEAD /users/123`: muestra la información resúmen del usuario 123;
* `PATCH /users/123` y `PUT /users/123`: actualizan al usuario 123;
* `DELETE /users/123`: borra el usuario 123;
* `OPTIONS /users`: muestra los verbos soportados de acuerdo al punto final `/users`;
* `OPTIONS /users/123`: muestra los verbos soportados de acuerdo al punto final `/users/123`.
Puedes configurar las opciones `only` y `except` para explícitamente listar cuáles acciones a soportar o cuáles
deshabilitar, respectivamente. Por ejemplo,
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'except' => ['delete', 'create', 'update'],
],
```
También puedes configurar las propiedades `patterns` o `extraPatterns` para redifinir patrones existentes o añadir nuevos soportados por esta regla.
Por ejemplo, para soportar una nueva acción `search` por el punto final `GET /users/search`, configura la opción `extraPatterns` como sigue,
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'extraPatterns' => [
'GET search' => 'search',
],
]
```
Puedes haber notado que el ID del controlador `user` aparece en formato plural `users` en los puntos finales de las URLs.
Esto se debe a que [[yii\rest\UrlRule]] automáticamente pluraliza los IDs de los controladores al crear reglas URL hijas.
Puedes desactivar este comportamiento definiendo la propiedad [[yii\rest\UrlRule::pluralize]] como `false`.
> Info: La pluralización de los IDs de los controladores es realizada por [[yii\helpers\Inflector::pluralize()]]. Este método respeta
reglas especiales de pluralización. Por ejemplo, la palabra `box` (caja) será pluralizada como `boxes` en vez de `boxs`.
En caso de que la pluralización automática no encaje en tus requerimientos, puedes además configurar la propiedad
[[yii\rest\UrlRule::controller]] para especificar exlpícitamente cómo mapear un nombre utilizado en un punto final URL
a un ID de controlador. Por ejemplo, el siguiente código mapea el nombre `u` al ID del controlador `user`.
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => ['u' => 'user'],
]
```

111
docs/guide-es/rest-versioning.md

@ -1,111 +0,0 @@
Versionado
==========
Una buena API ha de ser *versionada*: los cambios y las nuevas características son implementadas en las nuevas versiones del API, en vez de estar continuamente modificando sólo una versión. Al contrario que en las aplicaciones Web, en las cuales tienes total control del código de ambas partes lado del cliente y lado del servidor,
las APIs están destinadas a ser usadas por los clientes fuera de tu control. Por esta razón, compatibilidad hacia atrás (BC Backward compatibility)
de las APIs ha de ser mantenida siempre que sea posible. Si es necesario un cambio que puede romper la BC, debes de introducirla en la nueva versión del API, e incrementar el número de versión. Los clientes que la usan pueden continuar usando la antigua versión de trabajo del API; los nuevos y actualizados clientes pueden obtener la nueva funcionalidad de la nueva versión del API.
> Tip: referirse a [Semántica del versionado](http://semver.org/)
para más información en el diseño del número de versión del API.
Una manera común de implementar el versionado de la API es embeber el número de versión en las URLs de la API.
Por ejemplo, `http://example.com/v1/users` se refiere al punto final `/users` de la versión 1 de la API.
Otro método de versionado de la API,
la cual está ganando predominancia recientemente, es poner el número de versión en las cabeceras de la petición HTTP. Esto se suele hacer típicamente a través la cabecera `Accept`:
```
// vía parámetros
Accept: application/json; version=v1
// vía de el tipo de contenido del proveedor
Accept: application/vnd.company.myapp-v1+json
```
Ambos métodos tienen sus pros y sus contras, y hay gran cantidad de debates sobre cada uno. Debajo puedes ver una estrategia
práctica para el versionado de la API que es una mezcla de estos dos métodos:
* Pon cada versión superior de la implementación de la API en un módulo separado cuyo ID es el número de la versión mayor (p.e. `v1`, `v2`).
Naturalmente, las URLs de la API contendrán números de versión mayores.
* Dentro de cada versión mayor (y por lo tanto, dentro del correspondiente módulo), usa la cabecera de HTTP `Accept`
para determinar el número de la versión menor y escribe código condicional para responder a la menor versión como corresponde.
Para cada módulo sirviendo una versión mayor, el módulo debe incluir las clases de recursos y y controladores
que especifican la versión. Para separar mejor la responsabilidad del código, puedes conservar un conjunto común de
clases base de recursos y controladores, y hacer subclases de ellas en cada versión individual del módulo. Dentro de las subclases,
impementa el código concreto como por ejemplo `Model::fields()`.
Tu código puede estar organizado como lo que sigue:
```
api/
common/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
modules/
v1/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
v2/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
```
La configuración de tu aplicación puede tener este aspecto:
```php
return [
'modules' => [
'v1' => [
'basePath' => '@app/modules/v1',
'controllerNamespace' => 'app\modules\v1\controllers',
],
'v2' => [
'basePath' => '@app/modules/v2',
'controllerNamespace' => 'app\modules\v2\controllers',
],
],
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user', 'v1/post']],
['class' => 'yii\rest\UrlRule', 'controller' => ['v2/user', 'v2/post']],
],
],
],
];
```
Como consecuencia del código anterior, `http://example.com/v1/users` devolverá la lista de usuarios en la versión 1, mientras
`http://example.com/v2/users` devolverá la versión 2 de los usuarios.
Gracias a los módulos, el código de las diferentes principales versiones puede ser aislado. Pero los módulos hacen posible
reutilizar el código a través de los módulos vía clases base comunes y otros recursos compartidos.
Para tratar con versiones menores, puedes tomar ventaja de la característica de negociación de contenido
provista por el comportamiento (behavior) [[yii\filters\ContentNegotiator|contentNegotiator]]. El comportamiento `contentNegotiator`
definirá la propiedad [[yii\web\Response::acceptParams]] cuando determina qué tipo
de contenido soportar.
Por ejemplo, si una petición es enviada con la cabecera HTTP `Accept: application/json; version=v1`,
después de la negociación de contenido, [[yii\web\Response::acceptParams]] contendrá el valor `['version' => 'v1']`.
Basado en la información de versión contenida en `acceptParams`, puedes escribir código condicional en lugares
como acciones, clases de recursos, serializadores, etc. para proveer la funcionalidad apropiada.
Dado que por definición las versiones menores requireren mantener la compatibilidad hacia atrás, con suerte no tendrás demasiadas
comprobaciones de versión en tu código. De otra manera, probablemente puede ocurrir que necesites crear una versión mayor.

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

@ -25,7 +25,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['login', 'logout', 'signup'],
'rules' => [
[
@ -70,7 +70,7 @@ Puedes personalizar este comportamiento configurando la propiedad [[yii\filters\
```php
[
'class' => AccessControl::className(),
'class' => AccessControl::class,
...
'denyCallback' => function ($rule, $action) {
throw new \Exception('No tienes los suficientes permisos para acceder a esta página');
@ -126,7 +126,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['special-callback'],
'rules' => [
[

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

@ -143,9 +143,7 @@ Configurar Servidores Web <span id="configuring-web-servers"></span>
La aplicación instalada siguiendo las instrucciones mencionadas debería estar lista para usar tanto
con un [servidor HTTP Apache](http://httpd.apache.org/) como con un [servidor HTTP Nginx](http://nginx.org/),
en Windows, Mac OS X, o Linux utilizando PHP 5.4 o mayor. Yii 2.0 también es compatible con [HHVM](http://hhvm.com/)
de Facebook. De todos modos, hay algunos casos donde HHVM se comporta diferente del
PHP oficial, por lo que tendrás que tener cuidados extra al utilizarlo.
en Windows, Mac OS X, o Linux utilizando PHP 5.4 o mayor.
En un servidor de producción, podrías querer configurar el servidor Web para que la aplicación sea accedida
a través de la URL `http://www.example.com/index.php` en vez de `http://www.example.com/basic/web/index.php`. Tal configuración

22
docs/guide-es/structure-filters.md

@ -124,7 +124,7 @@ public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['create', 'update'],
'rules' => [
// permitido para usuarios autenticados
@ -160,7 +160,7 @@ public function behaviors()
{
return [
'basicAuth' => [
'class' => HttpBasicAuth::className(),
'class' => HttpBasicAuth::class,
],
];
}
@ -185,7 +185,7 @@ public function behaviors()
{
return [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -212,7 +212,7 @@ use yii\web\Response;
[
'bootstrap' => [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -242,7 +242,7 @@ public function behaviors()
{
return [
[
'class' => HttpCache::className(),
'class' => HttpCache::class,
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
@ -270,11 +270,11 @@ public function behaviors()
{
return [
'pageCache' => [
'class' => PageCache::className(),
'class' => PageCache::class,
'only' => ['index'],
'duration' => 60,
'dependency' => [
'class' => DbDependency::className(),
'class' => DbDependency::class,
'sql' => 'SELECT COUNT(*) FROM post',
],
'variations' => [
@ -307,7 +307,7 @@ public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'class' => VerbFilter::class,
'actions' => [
'index' => ['get'],
'view' => ['get'],
@ -339,7 +339,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
],
], parent::behaviors());
}
@ -366,7 +366,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
@ -387,7 +387,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],

2
docs/guide-es/test-fixtures.md

@ -129,7 +129,7 @@ class UserProfileTest extends DbTestCase
public function fixtures()
{
return [
'profiles' => UserProfileFixture::className(),
'profiles' => UserProfileFixture::class,
];
}

2
docs/guide-es/tutorial-core-validators.md

@ -221,7 +221,7 @@ Este validador comprueba que el fichero subido es el adecuado.
- `maxFiles`: el máximo número de ficheros que determinado atributo puede manejar. Por defecto a 1, lo que significa que la entrada debe de ser sólo un fichero. Si es mayor que 1, entonces la entrada tiene que ser un array conteniendo como máximo el número `maxFiles` de elementos que representan los ficheros a subir.
- `checkExtensionByMimeType`: cuando comprobar la extensión del fichero por el tipo MIME. Si la extensión producida por la comprobación del tipo MIME difiere la extensión del fichero subido, el fichero será considerado como no válido. Por defecto a `true`, significando que realiza este tipo de comprobación.
`FileValidator` es usado con [[yii\web\UploadedFile]]. Por favor, refiérase a la sección [Subida de ficheros](input-file-upload.md) para una completa cobertura sobre la subida de ficheros y llevar a cabo la validación de los ficheros subidos.
`FileValidator` es usado con [[yii\http\UploadedFile]]. Por favor, refiérase a la sección [Subida de ficheros](input-file-upload.md) para una completa cobertura sobre la subida de ficheros y llevar a cabo la validación de los ficheros subidos.
## [[yii\validators\FilterValidator|filter]] <span id="filter"></span>

14
docs/guide-fr/README.md

@ -124,20 +124,6 @@ Cache
* [Cache HTTP](caching-http.md)
Services Web RESTful
--------------------
* [Démarrage rapide](rest-quick-start.md)
* [Ressources](rest-resources.md)
* [Contrôleurs](rest-controllers.md)
* [Gestion des routes](rest-routing.md)
* [Formattage des réponses](rest-response-formatting.md)
* [Authentification](rest-authentication.md)
* [Limiter le taux d'utilisation](rest-rate-limiting.md)
* [Gestion des versions](rest-versioning.md)
* [Gestion des erreurs](rest-error-handling.md)
Outils de développement
-----------------------

8
docs/guide-fr/caching-data.md

@ -101,10 +101,6 @@ Yii prend en charge un large panel de supports de stockage pour cache. Ce qui su
* [[yii\caching\WinCache]]: utilise le [WinCache](http://iis.net/downloads/microsoft/wincache-extension) PHP
([voir aussi l'extension](http://php.net/manual/en/book.wincache.php)).
* [[yii\caching\XCache]] _(deprecated)_: utilise l'extension PHP [XCache](http://xcache.lighttpd.net/).
* [[yii\caching\ZendDataCache]] _(deprecated)_: utilise le
[cache de données Zend](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm)
en tant que médium de cache sous-jacent.
> Tip: vous pouvez utiliser différents supports de stockage pour cache dans la même application. Une stratégie courante est d'utiliser un support de stockage pour cache basé sur la mémoire pour stocker des données de petite taille mais d'usage constant (p. ex. des données statistiques), et d'utiliser des supports de stockage pour cache basés sur des fichiers ou des bases de données pour stocker des données volumineuses et utilisées moins souvent (p. ex. des contenus de pages).
@ -122,7 +118,7 @@ Tous les composants de mise en cache dérivent de la même classe de base [[yii\
* [[yii\caching\Cache::multiAdd()|multiAdd()]]: stocke de multiples données dans le cache. Chaque donnée est identifiée par une clé. Si la clé existe déjà dans le cache, la donnée est ignorée.
* [[yii\caching\Cache::exists()|exists()]]: retourne une valeur indiquant si la clé spécifiée existe dans le cache.
* [[yii\caching\Cache::delete()|delete()]]: retire du cache une donnée identifiée par une clé.
* [[yii\caching\Cache::flush()|flush()]]: retire toutes les données du cache.
* [[yii\caching\Cache::clear()|clear()]]: retire toutes les données du cache.
> Note : ne mettez pas directement en cache une valeur booléenne `false` parce que la méthode [[yii\caching\Cache::get()|get()]] utilise la valeur `false` pour indiquer que la donnée n'a pas été trouvée dans le cache. Au lieu de cela, vous pouvez placer cette donnée dans un tableau et mettre ce tableau en cache pour éviter le problème.
@ -254,7 +250,7 @@ $result = Customer::getDb()->cache(function ($db) {
### Vidage du cache <span id="cache-flushing">
Lorsque vous avez besoin d'invalider toutes les données stockées dans le cache, vous pouvez appeler [[yii\caching\Cache::flush()]].
Lorsque vous avez besoin d'invalider toutes les données stockées dans le cache, vous pouvez appeler [[yii\caching\Cache::clear()]].
Vous pouvez aussi vider le cache depuis la console en appelant `yii cache/flush`.
- `yii cache`: liste les caches disponibles dans une application

20
docs/guide-fr/concept-behaviors.md

@ -106,21 +106,21 @@ class User extends ActiveRecord
{
return [
// comportement anonyme, nom de la classe de comportement seulement
MyBehavior::className(),
MyBehavior::class,
// comportement nommé, nom de classe de comportement seulement
'myBehavior2' => MyBehavior::className(),
'myBehavior2' => MyBehavior::class,
// comportement anonyme, tableau de configuration
[
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
// comportement nommé, tableau de configuration
'myBehavior4' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]
@ -141,11 +141,11 @@ use app\components\MyBehavior;
$component->attachBehavior('myBehavior1', new MyBehavior);
// attache un classe de comportement
$component->attachBehavior('myBehavior2', MyBehavior::className());
$component->attachBehavior('myBehavior2', MyBehavior::class);
// attache un tableau de configuration
$component->attachBehavior('myBehavior3', [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]);
@ -156,7 +156,7 @@ Vous pouvez attacher plusieurs comportements à la fois en utilisant la méthode
```php
$component->attachBehaviors([
'myBehavior1' => new MyBehavior, // un comportement nommé
MyBehavior::className(), // un comportement anonyme
MyBehavior::class, // un comportement anonyme
]);
```
@ -164,10 +164,10 @@ Vous pouvez aussi attacher des comportements via les [configurations](concept-co
```php
[
'as myBehavior2' => MyBehavior::className(),
'as myBehavior2' => MyBehavior::class,
'as myBehavior3' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
@ -250,7 +250,7 @@ class User extends ActiveRecord
{
return [
[
'class' => TimestampBehavior::className(),
'class' => TimestampBehavior::class,
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],

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

@ -67,7 +67,7 @@ Le respect de ces conseils rend vos composants [configurables](concept-configur
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// alternatively
$component = \Yii::createObject([
'class' => MyClass::className(),
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);

28
docs/guide-fr/concept-events.md

@ -185,8 +185,8 @@ use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::debug(get_class($event->sender) . ' is inserted');
Event::on(ActiveRecord::class, ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::trace(get_class($event->sender) . ' is inserted');
});
```
@ -199,11 +199,11 @@ Vous pouvez déclencher un événement au *niveau de la classe* en appelant la m
```php
use yii\base\Event;
Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
Event::on(Foo::class, Foo::EVENT_HELLO, function ($event) {
var_dump($event->sender); // displays "null"
});
Event::trigger(Foo::className(), Foo::EVENT_HELLO);
Event::trigger(Foo::class, Foo::EVENT_HELLO);
```
Notez que, dans ce cas, `$event->sender` fait référence au nom de la classe qui a déclenché l'événement plutôt qu'à une instance de classe.
@ -214,10 +214,10 @@ Pour détacher un gestionnaire attaché au niveau de la classe, appelez [[yii\b
```php
// détache $handler
Event::off(Foo::className(), Foo::EVENT_HELLO, $handler);
Event::off(Foo::class, Foo::EVENT_HELLO, $handler);
// détache tous les gestionnaires de Foo::EVENT_HELLO
Event::off(Foo::className(), Foo::EVENT_HELLO);
Event::off(Foo::class, Foo::EVENT_HELLO);
```
@ -262,36 +262,36 @@ class Developer extends Component implements DanceEventInterface
Pour gérer l'évenement `EVENT_DANCE` déclenché par n'importe laquelle de ces classes, appelez [[yii\base\Event::on()|Event::on()]] et passez-lui le nom de l'interface comme premier argument :
```php
Event::on('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, function ($event) {
Yii::debug(get_class($event->sender) . ' just danced'); // Will log that Dog or Developer danced
});
Event::on(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE, function ($event) {
Yii::debug(get_class($event->sender) . ' danse'); // enregistrer le message disant que le chien ou le développeur danse.
})
```
Vous pouvez déclencher l'événement de ces classes :
```php
// trigger event for Dog class
Event::trigger(Dog::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Dog::class, DanceEventInterface::EVENT_DANCE);
// trigger event for Developer class
Event::trigger(Developer::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Developer::class, DanceEventInterface::EVENT_DANCE);
```
Notez bien que vous ne pouvez pas déclencher l'événement de toutes les classes qui implémentent l'interface :,
```php
// NE FONCTIONNE PAS
Event::trigger('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
Event::trigger(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE); // error
```
Pour détacher le gestionnaire d'événement, appelez [[yii\base\Event::off()|Event::off()]]. Par exemple :
```php
// détache $handler
Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, $handler);
Event::off(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE, $handler);
// détache tous les gestionnaires de DanceEventInterface::EVENT_DANCE
Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
Event::off(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE);
```

31
docs/guide-fr/db-active-record.md

@ -26,7 +26,6 @@ Yii assure la prise en charge de l'enregistrement actif (*Active Record*) pour l
* SQLite 2 et 3 : via [[yii\db\ActiveRecord]]
* Microsoft SQL Server 2008 ou versions postérieures : via [[yii\db\ActiveRecord]]
* Oracle : via [[yii\db\ActiveRecord]]
* CUBRID 9.3 ou versions postérieures : via [[yii\db\ActiveRecord]] (Notez que, à cause d'un [bogue](http://jira.cubrid.org/browse/APIS-658) dans l'extension CUBRID 9:3, l'entourage des valeurs par des marques de citation ne fonctionne pas, c'est pourquoi vous avez besoin de CUBRID 9.3 à la fois comme client et comme serveur)
* Sphinx : via [[yii\sphinx\ActiveRecord]], requiert l'extension `yii2-sphinx`
* ElasticSearch : via [[yii\elasticsearch\ActiveRecord]], requiert l'extension `yii2-elasticsearch`
@ -584,7 +583,7 @@ class Customer extends ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -594,7 +593,7 @@ class Order extends ActiveRecord
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -606,7 +605,7 @@ Chacune des méthodes de relation doit être nommée sous la forme `getXyz`. Nou
En déclarant une relation, vous devez spécifier les informations suivantes :
- la multiplicité de la relation : spécifiée en appelant soit la méthode [[yii\db\ActiveRecord::hasMany()|hasMany()]], soit la méthode [[yii\db\ActiveRecord::hasOne()|hasOne()]]. Dans l'exemple ci-dessus vous pouvez facilement déduire en lisant la déclaration des relations qu'un client a beaucoup de commandes, tandis qu'une commande n'a qu'un client.
- le nom de la classe d'enregistrement actif : spécifié comme le premier paramètre de [[yii\db\ActiveRecord::hasMany()|hasMany()]] ou de [[yii\db\ActiveRecord::hasOne()|hasOne()]]. Une pratique conseillée est d'appeler `Xyz::className()` pour obtenir la chaîne de caractères représentant le nom de la classe de manière à bénéficier de l'auto-complètement de l'EDI et de la détection d'erreur dans l'étape de compilation.
- le nom de la classe d'enregistrement actif : spécifié comme le premier paramètre de [[yii\db\ActiveRecord::hasMany()|hasMany()]] ou de [[yii\db\ActiveRecord::hasOne()|hasOne()]]. Une pratique conseillée est d'appeler `Xyz::class` pour obtenir la chaîne de caractères représentant le nom de la classe de manière à bénéficier de l'auto-complètement de l'EDI et de la détection d'erreur dans l'étape de compilation.
- Le lien entre les deux types de données : spécifie le(s) colonne(s) via lesquelles les deux types de données sont en relation. Les valeurs du tableau sont les colonnes des données primaires (représentées par la classe d'enregistrement actif dont vous déclarez les relations), tandis que les clés sont les colonnes des données en relation.
Une règle simple pour vous rappeler cela est, comme vous le voyez dans l'exemple ci-dessus, d'écrire la colonne qui appartient à l'enregistrement actif en relation juste à coté de lui. Vous voyez là que l'identifiant du client (`customer_id`) est une propriété de `Order` et `id` est une propriété de `Customer`.
@ -663,7 +662,7 @@ class Customer extends ActiveRecord
{
public function getBigOrders($threshold = 100)
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
return $this->hasMany(Order::class, ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
@ -692,7 +691,7 @@ class Order extends ActiveRecord
{
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->viaTable('order_item', ['order_id' => 'id']);
}
}
@ -705,12 +704,12 @@ class Order extends ActiveRecord
{
public function getOrderItems()
{
return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
return $this->hasMany(OrderItem::class, ['order_id' => 'id']);
}
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->via('orderItems');
}
}
@ -921,7 +920,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -929,7 +928,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -960,7 +959,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer');
return $this->hasMany(Order::class, ['customer_id' => 'id'])->inverseOf('customer');
}
}
```
@ -1052,7 +1051,7 @@ class Customer extends \yii\db\ActiveRecord
public function getComments()
{
// a customer has many comments
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1067,7 +1066,7 @@ class Comment extends \yii\mongodb\ActiveRecord
public function getCustomer()
{
// un commentaire (comment) a un client (customer)
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
@ -1135,7 +1134,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getActiveComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
return $this->hasMany(Comment::class, ['customer_id' => 'id'])->active();
}
}
@ -1196,7 +1195,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1287,7 +1286,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```

2
docs/guide-fr/db-dao.md

@ -11,7 +11,6 @@ Les objets d'accès aux bases de données de Yii prennent en charge les bases de
- [MariaDB](https://mariadb.com/)
- [SQLite](http://sqlite.org/)
- [PostgreSQL](http://www.postgresql.org/): version 8.4 or higher.
- [CUBRID](http://www.cubrid.org/): version 9.3 or higher.
- [Oracle](http://www.oracle.com/us/products/database/overview/index.html)
- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): version 2008 or higher.
@ -57,7 +56,6 @@ Lorsque vous conifigurez une connexion à une base de données, vous devez toujo
* MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase`
* SQLite: `sqlite:/path/to/database/file`
* PostgreSQL: `pgsql:host=localhost;port=5432;dbname=mydatabase`
* CUBRID: `cubrid:dbname=demodb;host=localhost;port=33000`
* MS SQL Server (via sqlsrv driver): `sqlsrv:Server=localhost;Database=mydatabase`
* MS SQL Server (via dblib driver): `dblib:host=localhost;dbname=mydatabase`
* MS SQL Server (via mssql driver): `mssql:host=localhost;dbname=mydatabase`

12
docs/guide-fr/input-file-upload.md

@ -1,7 +1,7 @@
Chargement de fichiers sur le serveur
=====================================
Le chargement de fichiers sur le serveur dans Yii est ordinairement effectué avec l'aide de [[yii\web\UploadedFile]] qui encapsule chaque fichier chargé dans un objet `UploadedFile`. Combiné avec les [[yii\widgets\ActiveForm]] et les [modèles](structure-models.md), vous pouvez aisément mettre en œuvre un mécanisme sûr de chargement de fichiers sur le serveur.
Le chargement de fichiers sur le serveur dans Yii est ordinairement effectué avec l'aide de [[yii\http\UploadedFile]] qui encapsule chaque fichier chargé dans un objet `UploadedFile`. Combiné avec les [[yii\widgets\ActiveForm]] et les [modèles](structure-models.md), vous pouvez aisément mettre en œuvre un mécanisme sûr de chargement de fichiers sur le serveur.
## Création de modèles <span id="creating-models"></span>
@ -12,7 +12,7 @@ Comme on le ferait avec des entrées de texte simple, pour charger un unique fic
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -79,7 +79,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{
@ -100,7 +100,7 @@ class SiteController extends Controller
}
```
Dans le code ci-dessus, lorsque le formulaire est soumis, la méthode [[yii\web\UploadedFile::getInstance()]] est appelée pour représenter le fichier chargé sous forme d'instance de `UploadedFile`. Nous comptons ensuite sur la validation du modèle pour garantir que le fichier chargé est valide et le sauvegarder sur le serveur.
Dans le code ci-dessus, lorsque le formulaire est soumis, la méthode [[yii\http\UploadedFile::getInstance()]] est appelée pour représenter le fichier chargé sous forme d'instance de `UploadedFile`. Nous comptons ensuite sur la validation du modèle pour garantir que le fichier chargé est valide et le sauvegarder sur le serveur.
## Chargement sur le serveur de plusieurs fichiers <span id="uploading-multiple-files"></span>
@ -113,7 +113,7 @@ Tout d'abord, vous devez ajuster la classe du modèle en ajoutant l'option `maxF
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -167,7 +167,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{

2
docs/guide-fr/input-validation.md

@ -370,7 +370,7 @@ class EntryForm extends Model
{
return [
[['name', 'email'], 'required'],
['country', CountryValidator::className()],
['country', CountryValidator::class],
['email', 'email'],
];
}

4
docs/guide-fr/output-client-scripts.md

@ -28,7 +28,7 @@ Le dernier argument est un identifiant unique du script utilisé pour identifier
Un script externe peut être ajouté comme expliqué ci-dessous :
```php
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::class]]);
```
Les arguments pour [[yii\web\View::registerJsFile()|registerJsFile()]] sont semblables à ceux utilisés pour [[yii\web\View::registerCssFile()|registerCssFile()]]. Dans l'exemple précédent, nous enregistrons le fichier `main.js` avec une dépendance sur `JqueryAsset`. Cela siginifie que le fichier `main.js` sera ajouté APRÈS `jquery.js`. Sans la spécification de cette dépendance, l'ordre relatif entre `main.js` et `jquery.js` resterait indéfini.
@ -65,7 +65,7 @@ Si vous désirez spécifier des propriétés additionnelles du style balise, pas
```php
$this->registerCssFile("http://example.com/css/themes/black-and-white.css", [
'depends' => [BootstrapAsset::className()],
'depends' => [BootstrapAsset::class],
'media' => 'print',
], 'css-print-theme');
```

8
docs/guide-fr/security-authorization.md

@ -20,7 +20,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['login', 'logout', 'signup'],
'rules' => [
[
@ -57,7 +57,7 @@ Vous pouvez personnaliser ce comportement en configurant la propriété [[yii\fi
```php
[
'class' => AccessControl::className(),
'class' => AccessControl::class,
...
'denyCallback' => function ($rule, $action) {
throw new \Exception('You are not allowed to access this page');
@ -99,7 +99,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['special-callback'],
'rules' => [
[
@ -390,7 +390,7 @@ public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,

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

@ -95,7 +95,7 @@ public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['create', 'update'],
'rules' => [
// autoriser les utilisateurs authentifiés
@ -127,7 +127,7 @@ public function behaviors()
{
return [
'basicAuth' => [
'class' => HttpBasicAuth::className(),
'class' => HttpBasicAuth::class,
],
];
}
@ -149,7 +149,7 @@ public function behaviors()
{
return [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -172,7 +172,7 @@ use yii\web\Response;
[
'bootstrap' => [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -202,7 +202,7 @@ public function behaviors()
{
return [
[
'class' => HttpCache::className(),
'class' => HttpCache::class,
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
@ -228,11 +228,11 @@ public function behaviors()
{
return [
'pageCache' => [
'class' => PageCache::className(),
'class' => PageCache::class,
'only' => ['index'],
'duration' => 60,
'dependency' => [
'class' => DbDependency::className(),
'class' => DbDependency::class,
'sql' => 'SELECT COUNT(*) FROM post',
],
'variations' => [
@ -262,7 +262,7 @@ public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'class' => VerbFilter::class,
'actions' => [
'index' => ['get'],
'view' => ['get'],
@ -289,7 +289,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
],
], parent::behaviors());
}
@ -316,7 +316,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
@ -336,7 +336,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],

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

@ -143,9 +143,7 @@ Konfigurasi Web Server <span id="configuring-web-servers"></span>
Aplikasi yang diinstal sesuai dengan petunjuk di atas seharusnya bekerja dengan baik
pada [Apache HTTP server](http://httpd.apache.org/) atau [Nginx HTTP server](http://nginx.org/), pada
Windows, Mac OS X, atau Linux yang menjalankan PHP 5.4 atau lebih tinggi. Yii 2.0 juga kompatibel dengan facebook
[HHVM](http://hhvm.com/). Namun, ada beberapa kasus di mana HHVM berperilaku berbeda dari PHP asli,
sehingga Anda harus mengambil beberapa perlakuan ekstra ketika menggunakan HHVM.
Windows, Mac OS X, atau Linux yang menjalankan PHP 5.4 atau lebih tinggi.
Pada server produksi, Anda mungkin ingin mengkonfigurasi server Web Anda sehingga aplikasi dapat diakses
melalui URL `http://www.example.com/index.php` bukannya `http://www.example.com/dasar/web/index.php`. konfigurasi seperti itu

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

@ -116,9 +116,7 @@ Configurazione del webserver <span id="configuring-web-servers"></span>
> Informazione: puoi saltare questa parte per ora se stai solo provando Yii e non hai intenzione di installarlo su un server di produzione.
L'applicazione installata secondo le istruzioni sopra dovrebbe funzionare senza problemi su un server
[Apache](http://httpd.apache.org/) o [Nginx](http://nginx.org/), su Windows, Mac OS X, or Linux equipaggiati con PHP 5.4 o successivo.
Yii 2.0 è anche compatibile con le librerie [HHVM](http://hhvm.com/) di Facebook, tuttavia ci sono alcuni casi limite dove HHVM si
comporta diversamente dal PHP nativo, quindi devi avere maggiore cura se intendi usare HHVM.
[Apache](http://httpd.apache.org/) o [Nginx](http://nginx.org/), su Windows, Mac OS X, or Linux equipaggiati con PHP 5.4 o successivo.
Su un server di produzione vorrai probabilmente che la tua applicazione sia accessibile tramite l'url
`http://www.example.com/index.php` invece di `http://www.example.com/basic/web/index.php`. Questo risultato richiede che punti la

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

@ -155,7 +155,7 @@ Yii はさまざまなキャッシュ・ストレージをサポートしてい
各データはキーによって識別されます。もしキャッシュ内にキーがすでに存在する場合はスキップされます。
* [[yii\caching\Cache::exists()|exists()]]: 指定されたキーがキャッシュ内で見つかったかどうかを示す値を返します。
* [[yii\caching\Cache::delete()|delete()]]: キャッシュからキーによって識別されるデータを削除します。
* [[yii\caching\Cache::flush()|flush()]]: キャッシュからすべてのデータを削除します。
* [[yii\caching\Cache::clear()|clear()]]: キャッシュからすべてのデータを削除します。
> Note: boolean 型の `false` を直接にキャッシュしてはいけません。
なぜなら、[[yii\caching\Cache::get()|get()]] メソッドは、データがキャッシュ内に見つからないことを示すために戻り値として `false` を使用しているからです。

20
docs/guide-ja/concept-behaviors.md

@ -120,21 +120,21 @@ class User extends ActiveRecord
{
return [
// 無名ビヘイビア ビヘイビア・クラス名のみ
MyBehavior::className(),
MyBehavior::class,
// 名前付きビヘイビア ビヘイビア・クラス名のみ
'myBehavior2' => MyBehavior::className(),
'myBehavior2' => MyBehavior::class,
// 無名ビヘイビア 構成情報配列
[
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
// 名前付きビヘイビア 構成情報配列
'myBehavior4' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]
@ -156,11 +156,11 @@ use app\components\MyBehavior;
$component->attachBehavior('myBehavior1', new MyBehavior);
// ビヘイビア・クラスをアタッチ
$component->attachBehavior('myBehavior2', MyBehavior::className());
$component->attachBehavior('myBehavior2', MyBehavior::class);
// 構成情報配列をアタッチ
$component->attachBehavior('myBehavior3', [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]);
@ -171,7 +171,7 @@ $component->attachBehavior('myBehavior3', [
```php
$component->attachBehaviors([
'myBehavior1' => new MyBehavior, // 名前付きビヘイビア
MyBehavior::className(), // 無名ビヘイビア
MyBehavior::class, // 無名ビヘイビア
]);
```
@ -179,10 +179,10 @@ $component->attachBehaviors([
```php
[
'as myBehavior2' => MyBehavior::className(),
'as myBehavior2' => MyBehavior::class,
'as myBehavior3' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
@ -272,7 +272,7 @@ class User extends ActiveRecord
{
return [
[
'class' => TimestampBehavior::className(),
'class' => TimestampBehavior::class,
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],

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

@ -76,7 +76,7 @@ class MyClass extends BaseObject
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// あるいは、また
$component = \Yii::createObject([
'class' => MyClass::className(),
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);

24
docs/guide-ja/concept-events.md

@ -211,7 +211,7 @@ use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Event::on(ActiveRecord::class, ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::debug(get_class($event->sender) . ' が挿入されました');
});
```
@ -229,11 +229,11 @@ Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function
```php
use yii\base\Event;
Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
Event::on(Foo::class, Foo::EVENT_HELLO, function ($event) {
var_dump($event->sender); // "null" を表示
});
Event::trigger(Foo::className(), Foo::EVENT_HELLO);
Event::trigger(Foo::class, Foo::EVENT_HELLO);
```
この場合、`$event->sender` は、オブジェクト・インスタンスではなく、`null` になることに注意してください。
@ -245,10 +245,10 @@ Event::trigger(Foo::className(), Foo::EVENT_HELLO);
```php
// $handler をデタッチ
Event::off(Foo::className(), Foo::EVENT_HELLO, $handler);
Event::off(Foo::class, Foo::EVENT_HELLO, $handler);
// Foo::EVENT_HELLO のすべてのハンドラをデタッチ
Event::off(Foo::className(), Foo::EVENT_HELLO);
Event::off(Foo::class, Foo::EVENT_HELLO);
```
@ -295,36 +295,36 @@ class Developer extends Component implements DanceEventInterface
[[yii\base\Event::on()|Event::on()]] を呼びます。
```php
Event::on('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, function ($event) {
Event::on(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE, function ($event) {
Yii::debug(get_class($event->sender) . ' が躍り上がって喜んだ。'); // 犬または開発者が躍り上がって喜んだことをログに記録。
});
})
```
これらのクラスのイベントをトリガすることも出来ます。
```php
// trigger event for Dog class
Event::trigger(Dog::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Dog::class, DanceEventInterface::EVENT_DANCE);
// trigger event for Developer class
Event::trigger(Developer::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Developer::class, DanceEventInterface::EVENT_DANCE);
```
ただし、このインタフェイスを実装する全クラスのイベントをトリガすることは出来ない、ということに注意して下さい。
```php
// これは動かない。このインタフェイスを実装するクラスのイベントはトリガされない。
Event::trigger('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
Event::trigger(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE); // エラー
```
イベント・ハンドラをデタッチするためには、[[yii\base\Event::off()|Event::off()]] を呼びます。例えば、
```php
// $handler をデタッチ
Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, $handler);
Event::off(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE, $handler);
// DanceEventInterface::EVENT_DANCE の全てのハンドラをデタッチ
Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
Event::off(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE);
```

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

@ -804,7 +804,7 @@ class Customer extends ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -814,7 +814,7 @@ class Order extends ActiveRecord
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -832,7 +832,7 @@ class Order extends ActiveRecord
上記の例では、リレーションの宣言において、顧客は複数の注文を持ち得るが、一方、注文は一人の顧客しか持たない、ということが容易に読み取れます。
- 関連するアクティブ・レコード・クラスの名前: [[yii\db\ActiveRecord::hasMany()|hasMany()]] または [[yii\db\ActiveRecord::hasOne()|hasOne()]]
の最初のパラメータとして指定されます。
クラス名を取得するのに `Xyz::className()` を呼ぶのが推奨されるプラクティスです。
クラス名を取得するのに `Xyz::class` を呼ぶのが推奨されるプラクティスです。
そうすれば、IDE の自動補完のサポートを得ることことが出来るだけでなく、コンパイル段階でエラーを検出することが出来ます。
- 二つの型のデータ間のリンク: 二つの型のデータの関連付けに用いられるカラムを指定します。
配列の値は主たるデータ (リレーションを宣言しているアクティブ・レコード・クラスによって表されるデータ) のカラムであり、
@ -910,7 +910,7 @@ class Customer extends ActiveRecord
{
public function getBigOrders($threshold = 100)
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
return $this->hasMany(Order::class, ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
@ -945,7 +945,7 @@ class Order extends ActiveRecord
{
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->viaTable('order_item', ['order_id' => 'id']);
}
}
@ -958,12 +958,12 @@ class Order extends ActiveRecord
{
public function getOrderItems()
{
return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
return $this->hasMany(OrderItem::class, ['order_id' => 'id']);
}
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->via('orderItems');
}
}
@ -997,21 +997,21 @@ class Customer extends ActiveRecord
public function getPurchasedItems()
{
// 顧客の購入品目、すなわち、`Item` の 'id' カラムが OrderItem の 'item_id' に合致するもの
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->via('orderItems');
}
public function getOrderItems()
{
// 顧客の OrderItems、すなわち、`Order` の `id` カラムが `OrderItem` の 'order_id' に合致するもの
return $this->hasMany(OrderItem::className(), ['order_id' => 'id'])
return $this->hasMany(OrderItem::class, ['order_id' => 'id'])
->via('orders');
}
public function getOrders()
{
// 顧客の注文
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1264,7 +1264,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -1272,7 +1272,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -1306,7 +1306,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer');
return $this->hasMany(Order::class, ['customer_id' => 'id'])->inverseOf('customer');
}
}
```
@ -1417,7 +1417,7 @@ class Customer extends \yii\db\ActiveRecord
public function getComments()
{
// Customer は多くの Comment を持つ
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1432,7 +1432,7 @@ class Comment extends \yii\mongodb\ActiveRecord
public function getCustomer()
{
// Comment は 一つの Customer を持つ
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
@ -1516,7 +1516,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getActiveComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
return $this->hasMany(Comment::class, ['customer_id' => 'id'])->active();
}
}
@ -1527,7 +1527,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1593,7 +1593,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1688,7 +1688,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1719,7 +1719,7 @@ class Customer extends \yii\db\ActiveRecord
*/
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
/**

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

@ -19,7 +19,7 @@ Yii 2.0 では、DAO は下記の DBMS のサポートを内蔵しています
- [Oracle](http://www.oracle.com/us/products/database/overview/index.html)
- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): バージョン 2008 以上。
> Info: Yii 2.1 以降では、CUBRID、Oracle および MSSQL に対する DAO サポートは、フレームワーク内蔵のコア・コンポーネント
> Info: Yii 3 以降では、CUBRID、Oracle および MSSQL に対する DAO サポートは、フレームワーク内蔵のコア・コンポーネント
としては提供されていません。それらは、独立した [エクステンション](structure-extensions.md) としてインストールされる
必要があります。[yiisoft/yii2-oracle](https://www.yiiframework.com/extension/yiisoft/yii2-oracle) および
[yiisoft/yii2-mssql](https://www.yiiframework.com/extension/yiisoft/yii2-mssql) が

12
docs/guide-ja/input-file-upload.md

@ -2,7 +2,7 @@
==========================
Yii におけるファイルのアップロードは、通常、アップロードされる個々のファイルを `UploadedFile` としてカプセル化する
[[yii\web\UploadedFile]] の助けを借りて実行されます。これを [[yii\widgets\ActiveForm]] および [モデル](structure-models.md)
[[yii\http\UploadedFile]] の助けを借りて実行されます。これを [[yii\widgets\ActiveForm]] および [モデル](structure-models.md)
と組み合わせることで、安全なファイル・アップロード・メカニズムを簡単に実装することが出来ます。
@ -16,7 +16,7 @@ Yii におけるファイルのアップロードは、通常、アップロー
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -90,7 +90,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{
@ -111,7 +111,7 @@ class SiteController extends Controller
}
```
上記のコードでは、フォームが送信されると [[yii\web\UploadedFile::getInstance()]] メソッドが呼ばれて、
上記のコードでは、フォームが送信されると [[yii\http\UploadedFile::getInstance()]] メソッドが呼ばれて、
アップロードされたファイルが `UploadedFile` のインスタンスとして表現されます。
そして、次に、モデルの検証によってアップロードされたファイルが有効なものであることを確かめ、サーバにファイルを保存します。
@ -130,7 +130,7 @@ class SiteController extends Controller
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -186,7 +186,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{

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

@ -465,7 +465,7 @@ class EntryForm extends Model
{
return [
[['name', 'email'], 'required'],
['country', CountryValidator::className()],
['country', CountryValidator::class],
['email', 'email'],
];
}

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

@ -56,7 +56,7 @@ $this->registerJs(
```php
$this->registerJsFile(
'@web/js/main.js',
['depends' => [\yii\web\JqueryAsset::className()]]
['depends' => [\yii\web\JqueryAsset::class]]
);
```
@ -95,7 +95,7 @@ CSS ファイルは次のようにして登録することが出来ます。
```php
$this->registerCssFile("@web/css/themes/black-and-white.css", [
'depends' => [\yii\bootstrap\BootstrapAsset::className()],
'depends' => [\yii\bootstrap\BootstrapAsset::class],
'media' => 'print',
], 'css-print-theme');
```

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

@ -57,7 +57,7 @@ public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
'class' => HttpBasicAuth::class,
];
return $behaviors;
}
@ -75,11 +75,11 @@ public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'class' => CompositeAuth::class,
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
HttpBasicAuth::class,
HttpBearerAuth::class,
QueryParamAuth::class,
],
];
return $behaviors;

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

@ -69,7 +69,7 @@ public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
'class' => HttpBasicAuth::class,
];
return $behaviors;
}
@ -98,7 +98,7 @@ public function behaviors()
// CORS フィルタを追加する
$behaviors['corsFilter'] = [
'class' => \yii\filters\Cors::className(),
'class' => \yii\filters\Cors::class,
];
// 認証フィルタを再度追加する

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

@ -25,7 +25,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['login', 'logout', 'signup'],
'rules' => [
[
@ -70,7 +70,7 @@ ACF による権限付与のプロセスにおいては、現在の実行コン
```php
[
'class' => AccessControl::className(),
'class' => AccessControl::class,
...
'denyCallback' => function ($rule, $action) {
throw new \Exception('このページにアクセスする権限がありません。');
@ -129,7 +129,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['special-callback'],
'rules' => [
[
@ -538,7 +538,7 @@ public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'rules' => [
[
'allow' => true,

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

@ -441,7 +441,7 @@ Yii は下記のコア・エクステンション (または ["公式エクス
- [yiisoft/yii2-twig](https://github.com/yiisoft/yii2-twig):
[Twig](http://twig.sensiolabs.org/) に基づいたテンプレート・エンジンを提供します。
下記の公式エクステンションは Yii 2.1 以上のためのものです。
下記の公式エクステンションは Yii 3 以上のためのものです。
これらは、Yii 2.0 ではコア・フレームワークに含まれていますので、インストールする必要はありません。.
- [yiisoft/yii2-captcha](https://www.yiiframework.com/extension/yiisoft/yii2-captcha):

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

@ -121,7 +121,7 @@ public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['create', 'update'],
'rules' => [
// 認証されたユーザに許可する
@ -157,7 +157,7 @@ public function behaviors()
{
return [
'basicAuth' => [
'class' => HttpBasicAuth::className(),
'class' => HttpBasicAuth::class,
],
];
}
@ -183,7 +183,7 @@ public function behaviors()
{
return [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -210,7 +210,7 @@ use yii\web\Response;
[
'bootstrap' => [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -241,7 +241,7 @@ public function behaviors()
{
return [
[
'class' => HttpCache::className(),
'class' => HttpCache::class,
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
@ -269,11 +269,11 @@ public function behaviors()
{
return [
'pageCache' => [
'class' => PageCache::className(),
'class' => PageCache::class,
'only' => ['index'],
'duration' => 60,
'dependency' => [
'class' => DbDependency::className(),
'class' => DbDependency::class,
'sql' => 'SELECT COUNT(*) FROM post',
],
'variations' => [
@ -307,7 +307,7 @@ public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'class' => VerbFilter::class,
'actions' => [
'index' => ['get'],
'view' => ['get'],
@ -339,7 +339,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
],
], parent::behaviors());
}
@ -366,7 +366,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
@ -387,7 +387,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],

2
docs/guide-ja/test-fixtures.md

@ -130,7 +130,7 @@ class UserProfileTest extends \Codeception\Test\Unit
{
return [
'profiles' => [
'class' => UserProfileFixture::className(),
'class' => UserProfileFixture::class,
// フィクスチャ・データは tests/_data/user.php に配置されている
'dataFile' => codecept_data_dir() . 'user.php'
],

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

@ -351,7 +351,7 @@ function foo($model, $attribute) {
MIME タイプのチェックから導かれる拡張子がアップロードされたファイルの拡張子と違う場合に、そのファイルは無効であると見なされます。
デフォルト値は `true` であり、そのようなチェックが行われることを意味します。
`FileValidator` は [[yii\web\UploadedFile]] と一緒に使用されます。
`FileValidator` は [[yii\http\UploadedFile]] と一緒に使用されます。
ファイルのアップロードおよびアップロードされたファイルの検証の実行に関する完全な説明は、[ファイルをアップロードする](input-file-upload.md) のセクションを参照してください。

14
docs/guide-pl/README.md

@ -129,20 +129,6 @@ Pamięć podręczna
* [Pamięć podręczna HTTP](caching-http.md)
Webserwisy z wykorzystaniem REST
--------------------------------
* [Szybki start](rest-quick-start.md)
* [Zasoby](rest-resources.md)
* [Kontrolery](rest-controllers.md)
* [Routing](rest-routing.md)
* [Formatowanie odpowiedzi](rest-response-formatting.md)
* [Uwierzytelnianie](rest-authentication.md)
* [Limit użycia](rest-rate-limiting.md)
* [Wersjonowanie](rest-versioning.md)
* [Obsługa błędów](rest-error-handling.md)
Narzędzia wspomagające tworzenie aplikacji
------------------------------------------

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

@ -73,7 +73,7 @@ Postępowanie zgodnie z tymi zasadami zapewni [konfigurowalność](concept-confi
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// lub alternatywnie
$component = \Yii::createObject([
'class' => MyClass::className(),
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);

37
docs/guide-pl/db-active-record.md

@ -31,9 +31,6 @@ Yii zapewnia wsparcie Active Record dla następujących typów relacyjnych baz d
* SQLite 2 i 3: poprzez [[yii\db\ActiveRecord]]
* Microsoft SQL Server 2008 lub nowszy: poprzez [[yii\db\ActiveRecord]]
* Oracle: poprzez [[yii\db\ActiveRecord]]
* CUBRID 9.3 lub nowszy: poprzez [[yii\db\ActiveRecord]] (zwróć uwagę, że z powodu [błędu](http://jira.cubrid.org/browse/APIS-658)
w rozszerzeniu PDO cubrid, umieszczanie wartości w cudzysłowie nie będzie działać, zatem wymagane jest zainstalowanie CUBRID 9.3 zarówno
jako klienta jak i serwer)
* Sphinx: poprzez [[yii\sphinx\ActiveRecord]], wymaga rozszerzenia `yii2-sphinx`
* ElasticSearch: poprzez [[yii\elasticsearch\ActiveRecord]], wymaga rozszerzenia `yii2-elasticsearch`
@ -719,7 +716,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -727,7 +724,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -744,7 +741,7 @@ Deklarując relację powinno się zwrócić uwagę na następujące dane:
klient może mieć wiele zamówień, podczas gdy zamówienie ma tylko jednego klienta.
- nazwę powiązanej klasy Active Record: określoną jako pierwszy argument w [[yii\db\ActiveRecord::hasMany()|hasMany()]] lub
[[yii\db\ActiveRecord::hasOne()|hasOne()]].
Rekomendowany sposób uzyskania nazwy klasy to wywołanie `Xyz::className()`, dzięki czemu możemy posiłkować się wsparciem autouzupełniania IDE
Rekomendowany sposób uzyskania nazwy klasy to wywołanie `Xyz::class`, dzięki czemu możemy posiłkować się wsparciem autouzupełniania IDE
i wykrywaniem błędów na poziomie kompilacji.
- powiązanie pomiędzy dwoma rodzajami danych: określone jako kolumna(y), poprzez którą dane nawiązują relację.
Wartości tablicy są kolumnami głównych danych (reprezentowanymi przez klasę Active Record, w której deklaruje się relacje), a klucze tablicy są
@ -818,7 +815,7 @@ class Customer extends ActiveRecord
{
public function getBigOrders($threshold = 100)
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
return $this->hasMany(Order::class, ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
@ -852,7 +849,7 @@ class Order extends ActiveRecord
{
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->viaTable('order_item', ['order_id' => 'id']);
}
}
@ -865,12 +862,12 @@ class Order extends ActiveRecord
{
public function getOrderItems()
{
return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
return $this->hasMany(OrderItem::class, ['order_id' => 'id']);
}
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->via('orderItems');
}
}
@ -1123,7 +1120,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -1131,7 +1128,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -1163,7 +1160,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer');
return $this->hasMany(Order::class, ['customer_id' => 'id'])->inverseOf('customer');
}
}
```
@ -1267,7 +1264,7 @@ class Customer extends \yii\db\ActiveRecord
public function getComments()
{
// klient posiada wiele komentarzy
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1282,7 +1279,7 @@ class Comment extends \yii\mongodb\ActiveRecord
public function getCustomer()
{
// komentarz jest przypisany do jednego klienta
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
@ -1365,7 +1362,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getActiveComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
return $this->hasMany(Comment::class, ['customer_id' => 'id'])->active();
}
}
@ -1376,7 +1373,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1440,7 +1437,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1534,7 +1531,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1565,7 +1562,7 @@ class Customer extends \yii\db\ActiveRecord
*/
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
/**

12
docs/guide-pl/input-file-upload.md

@ -1,7 +1,7 @@
Wysyłanie plików
===============
Przesyłanie plików w Yii jest zazwyczaj wykonywane przy użyciu klasy [[yii\web\UploadedFile|UploadedFile]], która hermetyzuje każdy przesłany plik jako obiekt `UploadedFile`.
Przesyłanie plików w Yii jest zazwyczaj wykonywane przy użyciu klasy [[yii\http\UploadedFile|UploadedFile]], która hermetyzuje każdy przesłany plik jako obiekt `UploadedFile`.
W połączeniu z [[yii\widgets\ActiveForm|ActiveForm]] oraz [modelem](structure-models.md), możesz w łatwy sposób zaimplementować bezpieczny mechanizm przesyłania plików.
## Tworzenie modeli <span id="creating-models"></span>
@ -14,7 +14,7 @@ Dla przykładu:
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -86,7 +86,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{
@ -107,7 +107,7 @@ class SiteController extends Controller
}
```
W powyższym kodzie, kiedy formularz jest wysłany, metoda [[yii\web\UploadedFile::getInstance()|getInstance()]] wywoływana jest do reprezentowania pliku jako instancji `UploadedFile`.
W powyższym kodzie, kiedy formularz jest wysłany, metoda [[yii\http\UploadedFile::getInstance()|getInstance()]] wywoływana jest do reprezentowania pliku jako instancji `UploadedFile`.
Następnie przystępujemy do walidacji modelu, aby upewnić się, że przesłany plik jest prawidłowy, po czym zapisujemy go na serwerze.
## Przesyłanie wielu plików <span id="uploading-multiple-files"></span>
@ -121,7 +121,7 @@ Metoda `upload()` powinna również zostać zaktualizowana, aby zapisywać pliki
namespace app\models;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class UploadForm extends Model
{
@ -176,7 +176,7 @@ namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;
use yii\http\UploadedFile;
class SiteController extends Controller
{

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

@ -428,7 +428,7 @@ class EntryForm extends Model
{
return [
[['name', 'email'], 'required'],
['country', CountryValidator::className()],
['country', CountryValidator::class],
['email', 'email'],
];
}

6
docs/guide-pl/output-client-scripts.md

@ -29,7 +29,7 @@ Jeśli ten argument nie zostanie podany, kod JavaScript zostanie użyty jako ID.
Skrypt zewnętrzny może zostać dodany następująco:
```php
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('http://example.com/js/main.js', ['depends' => [\yii\web\JqueryAsset::class]]);
```
Argumenty dla metod [[yii\web\View::registerCssFile()|registerCssFile()]] są podobne do [[yii\web\View::registerJsFile()|registerJsFile()]].
@ -73,7 +73,7 @@ Jeśli chcesz się upewnić, że jest tylko jeden tag `style`, użyj trzeciego a
```php
$this->registerCssFile("http://example.com/css/themes/black-and-white.css", [
'depends' => [BootstrapAsset::className()],
'depends' => [BootstrapAsset::class],
'media' => 'print',
], 'css-print-theme');
```
@ -86,4 +86,4 @@ Kod powyżej doda link w sekcji `head` strony do pliku CSS.
* Ostatni argument określa ID identyfikujące ten plik CSS. W przypadku jego braku, zostanie użyty do tego celu adres URL pliku CSS.
Jest mocno wskazane używanie [assetów](structure-assets.md) do rejestrowania zewnętrznych plików CSS. Użycie ich pozwala Ci na łączenie i kompresowanie
wielu plików CSS, które jest wręcz niezbędne na stronach internetowych o dużym natężeniu ruchu.
wielu plików CSS, które jest wręcz niezbędne na stronach internetowych o dużym natężeniu ruchu.

90
docs/guide-pl/rest-error-handling.md

@ -1,90 +0,0 @@
Obsługa błędów
==============
Podczas obsługi żądania RESTfulowego API, w przypadku wystąpienia błędu w zapytaniu użytkownika lub gdy stanie się coś nieprzewidywanego
z serwerem, możesz po prostu rzucić wyjątkiem, aby powiadomić użytkownika, że coś poszło nieprawidłowo.
Jeśli możesz zidentyfikować przyczynę błędu (np. żądany zasób nie istnieje), powinieneś rozważyć rzucenie wyjątkiem razem z odpowiednim kodem statusu HTTP
(np. [[yii\web\NotFoundHttpException|NotFoundHttpException]] odpowiada statusowi o kodzie 404).
Yii wyśle odpowiedź razem z odpowiadającym jej kodem i treścią statusu HTTP. Yii dołączy również do samej odpowiedzi zserializowaną reprezentację
wyjątku. Przykładowo:
```
HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
```
Poniższa lista zawiera kody statusów HTTP, które są używane przez Yii REST framework:
* `200`: OK. Wszystko działa w porządku.
* `201`: Zasób został poprawnie stworzony w odpowiedzi na żądanie `POST`. Nagłówek `Location` zawiera URL kierujący do nowoutworzonego zasobu.
* `204`: Żądanie zostało poprawnie przetworzone, ale odpowiedź nie zawiera treści (jak w przypadku żądania `DELETE`).
* `304`: Zasób nie został zmodyfikowany. Można użyć wersji przetrzymywanej w pamięci podręcznej.
* `400`: Nieprawidłowe żądanie. Może być spowodowane przez wiele czynników po stronie użytkownika, takich jak przekazanie nieprawidłowych danych JSON,
nieprawidłowych parametrów akcji, itp.
* `401`: Nieudana autentykacja.
* `403`: Autoryzowany użytkownik nie ma uprawnień do danego punktu końcowego API.
* `404`: Żądany zasób nie istnieje.
* `405`: Niedozwolona metoda. Sprawdź nagłówek `Allow`, aby poznać dozwolone metody HTTP.
* `415`: Niewspierany typ mediów. Żądany typ zawartości lub numer wersji jest nieprawidłowy.
* `422`: Nieudana walidacja danych (dla przykładu w odpowiedzi na żądanie `POST`). Sprawdź treść odpowiedzi, aby poznać szczegóły błędu.
* `429`: Zbyt wiele żądań. Żądanie zostało odrzucone z powodu osiagnięcia limitu użycia.
* `500`: Wewnętrzny błąd serwera. To może być spowodowane wewnętrznymi błędami programu.
## Modyfikowanie błędnej odpowiedzi <span id="customizing-error-response"></span>
Czasem wymagane może być dostosowanie domyślnego formatu błędnej odpowiedzi. Dla przykładu, zamiast używać różnych statusów HTTP dla oznaczenia różnych błędów,
można serwować zawsze status 200 i dodawać prawidłowy kod statusu HTTP jako część struktury JSON w odpowiedzi, jak pokazano to poniżej:
```
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
```
Aby osiągnąć powyższy efekt, należy skonfigurować odpowiedź na event `beforeSend` dla komponentu `response` w aplikacji:
```php
return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null && Yii::$app->request->get('suppress_response_code')) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];
```
Powyższy kod zreformatuje odpowiedź (zarówno typu sukces jak i błąd), kiedy `suppress_response_code` zostanie przekazane jako parametr `GET`.

37
docs/guide-pl/rest-rate-limiting.md

@ -1,37 +0,0 @@
Limit użycia
============
W celu zapobiegnięcia nadużyciom, powinno się rozważyć wprowadzenie *limitu użycia* swojego API. Może to być na przykład ograniczenie
do maksymalnie 100 zapytań do API dla każdego użytkownika w czasie 10 minut. Jeśli użytkownik przekroczy ten limit w zadanym czasie,
należy zwrócić odpowiedź ze statusem 429 (oznaczającym "Zbyt dużo zapytań").
Aby ustalić limit użycia, [[yii\web\User::identityClass|klasa identyfikująca użytkownika]] powinna zaimplementować [[yii\filters\RateLimitInterface|RateLimitInterface]].
Interfejs ten wymaga dodania trzech metod:
* `getRateLimit()`: zwraca maksymalną liczbę zapytań i okres czasu (np. `[100, 600]` oznacza maksymalnie 100 zapytań do API w czasie 600 sekund).
* `loadAllowance()`: zwraca liczbę pozostałych dozwolonych zapytań z limitu i uniksowy znacznik czasu wskazujący datę ostatniego sprawdzenia limitu.
* `saveAllowance()`: zapisuje liczbę pozostałych dozwolonych zapytań i aktualny uniksowy znacznik czasu.
Do celów obsługi powyższych metod można wykorzystać dwie dodatkowe kolumny w bazie danych użytkowników dla liczby dokonanych połączeń i znacznika czasu.
Po ustaleniu tych wartości, metody `loadAllowance()` i `saveAllowance()` mogą być poprawnie zaimplementowane do odczytu i zapisu tych wartości dla aktualnego
zautoryzowanego użytkownika. Aby zwiększyć wydajność tego mechanizmu, należy rozważyć użycie pamięci podręcznej lub bazy typu NoSQL.
Po zaimplemetowaniu wymaganego interfejsu, Yii automatycznie użyje [[yii\filters\RateLimiter|RateLimiter]], skonfigurowanego jako filtr akcji dla [[yii\rest\Controller|Controller]],
aby pilnować limitu użycia API. Mechanizm rzuci wyjątek [[yii\web\TooManyRequestsHttpException|TooManyRequestsHttpException]], kiedy limit zostanie przekroczony.
Po dodaniu limitu, każda odpowiedź będzie domyślnie zawierała następujące nagłówki HTTP, zawierające informacje o aktualnym użyciu limitu:
* `X-Rate-Limit-Limit`, maksymalna liczba zapytań w zadanym okresie czasu,
* `X-Rate-Limit-Remaining`, liczba pozostałych dozwolonych zapytań z limitu w aktualnym okresie czasu,
* `X-Rate-Limit-Reset`, liczba sekund, którą należy odczekać, aby uzyskać ponownie maksymalną liczbę zapytań z limitu.
Wysyłanie powyższych nagłówków można wyłączyć konfigurując [[yii\filters\RateLimiter::enableRateLimitHeaders|enableRateLimitHeaders]] w klasie kontrolera REST jak w poniższym przykładzie.
```php
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
```

90
docs/guide-pl/rest-routing.md

@ -1,90 +0,0 @@
Routing
=======
Po przygotowaniu klas zasobów i kontrolerów dostęp do nich można uzyskać w ten sam sposób, jak w przypadku zwykłej aplikacji, używając URL np.
`http://localhost/index.php?r=user/create`.
W praktyce zwykle chcemy skorzystać z opcji "ładnych" URLi i metod HTTP.
Przykładowo żądanie `POST /users` może oznaczać wywołanie akcji `user/create`, co możemy uzyskać w łatwy sposób konfigurując
[komponent aplikacji](structure-application-components.md) `urlManager` w pliku konfiguracyjnym jak poniżej:
```php
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
```
Porównując to z menadżerem URLi dla aplikacji Web, główną nowością tutaj jest użycie [[yii\rest\UrlRule|UrlRule]] do routingu RESTfulowych zasobów API.
Ta specjalna klasa zasad URL stworzy cały zestaw potomnych zasad URL obsługujących routing i tworzenie URLi dla wyznaczonego kontrolera.
Dla przykładu, kod powyżej jest zgrubnym odpowiednikiem następujących zasad:
```php
[
'PUT,PATCH users/<id>' => 'user/update',
'DELETE users/<id>' => 'user/delete',
'GET,HEAD users/<id>' => 'user/view',
'POST users' => 'user/create',
'GET,HEAD users' => 'user/index',
'users/<id>' => 'user/options',
'users' => 'user/options',
]
```
I poniższe punkty końcowe API są obsługiwane przez tę zasadę:
* `GET /users`: lista wszystkich użytkowników strona po stronie;
* `HEAD /users`: pokazuje streszczenie informacji listy użytkowników;
* `POST /users`: tworzy nowego użytkownika;
* `GET /users/123`: zwraca szczegóły na temat użytkownika 123;
* `HEAD /users/123`: zwraca streszczenie informacji o użytkowniku 123;
* `PATCH /users/123` i `PUT /users/123`: aktualizuje użytkownika 123;
* `DELETE /users/123`: usuwa użytkownika 123;
* `OPTIONS /users`: pokazuje obsługiwane metody dla punktu końcowego `/users`;
* `OPTIONS /users/123`: pokazuje obsługiwane metody dla punktu końcowego `/users/123`.
Możesz skonfigurować opcje `only` i `except`, aby wskazać listę akcji, które mają być odpowiednio: tylko obsługiwane lub pominięte.
Przykładowo,
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'except' => ['delete', 'create', 'update'],
],
```
Dodatkowo można dodać opcję `patterns` lub `extraPatterns`, aby zredefiniować istniejące wzorce lub dodać nowe obsługiwane przez tę zasadę.
Dla przykładu, aby dodać obsługę nowej akcji `search` dla punktu końcowego `GET /users/search`, skonfiguruj opcję `extraPatterns` jak następuje,
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'extraPatterns' => [
'GET search' => 'search',
],
]
```
Na pewno zwróciłeś uwagę na to, że ID kontrolera `user` występuje tu w formie mnogiej jako `users` dla URLi punktu końcowego.
Dzieje się tak, ponieważ [[yii\rest\UrlRule|UrlRule]] automatycznie przechodzi na formę mnogą dla ID kontrolerów podczas tworzenia potomnych zasad URL.
Zachowanie to można wyłączyć ustawiając [[yii\rest\UrlRule::pluralize|pluralize]] na `false`.
> Info: forma mnoga ID kontrolerów jest tworzona poprzez metodę [[yii\helpers\Inflector::pluralize()|pluralize()]]. Uwzględnia ona specjalne zasady tworzenia form mnogich.
> Dla przykładu, od słowa `box` zostanie utworzona liczba mnoga `boxes` a nie `boxs`.
W przypadku, gdy mechanizm automatycznego tworzenia formy mnogiej nie spełnia Twoich oczekiwań, możesz również skonfigurować właściwość
[[yii\rest\UrlRule::controller|controller]], aby bezpośrednio określić w jaki sposób nazwa użyta w punkcie końcowym URLi ma być zmapowana na ID kontrolera.
Dla przykładu, poniższy kod mapuje nazwę `u` na ID kontrolera `user`.
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => ['u' => 'user'],
]
```

112
docs/guide-pl/rest-versioning.md

@ -1,112 +0,0 @@
Wersjonowanie
=============
Cechą dobrego API jest jego *wersjonowanie*: zmiany i nowe funkcjonalności powinny być implementowane w nowych wersjach API, zamiast
ciągłych modyfikacji jednej już istniejącej. W przeciwieństwie do aplikacji Web, nad którymi ma się pełną kontrolę zarówno po stronie
klienta, jak i serwera, nad API zwykle nie posiada się kontroli po stronie klienta. Z tego powodu niezwykle istotnym jest, aby zachować
pełną wsteczną kompatybilność (BC = backward compatibility), kiedy to tylko możliwe. Jeśli konieczne jest wprowadzenie zmiany, która
może nie spełniać BC, należy wprowadzić ją w nowej wersji API, z kolejnym numerem. Istniejące klienty mogą wciąż używać starej,
działającej wersji API, a nowe lub uaktualnione klienty mogą otrzymać nową funkcjonalność oferowaną przez kolejną wersję API.
> Tip: Zapoznaj się z [Wersjonowaniem semantycznym](http://semver.org/lang/pl/), aby uzyskać więcej informacji na temat nazewnictwa
numerów wersji.
Jedną z często spotykanych implementacji wersjonowania API jest dodawanie numeru wersji w adresach URL API.
Dla przykładu `http://example.com/v1/users` oznacza punkt końcowy `/users` API w wersji 1.
Inną metodą wersjonowania API, która zyskuje ostatnio popularność, jest umieszczanie numeru wersji w nagłówkach HTTP żądania. Zwykle
używa się do tego nagłówka `Accept`:
```
// poprzez parametr
Accept: application/json; version=v1
// poprzez dostarczany typ zasobu
Accept: application/vnd.company.myapp-v1+json
```
Obie metody mają swoje wady i zalety i wciąż prowadzone są dyskusje na ich temat. Poniżej prezentujemy strategię wersjonowania, która
w praktyczny sposób łączy je obie:
* Umieść każdą główną wersję implementacji API w oddzielnym module, którego ID odpowiada numerowi głównej wersji (np. `v1`, `v2`).
Adresy URL API będą zawierały numery głównych wersji.
* Wewnątrz każdej głównej wersji (i w związku z tym w każdym odpowiadającym jej module), użyj nagłówka HTTP `Accept`, aby określić
pomniejszy numer wersji i napisz warunkowy kod odpowiadający temu numerowi.
Każdy moduł obsługujący główną wersję powinien zawierać klasy zasobów i kontrolerów odpowiednie dla tej wersji. W celu lepszego
rozdzielenia zadań kodu, możesz trzymać razem zestaw podstawowych wspólnych klas zasobów i kontrolerów w jednym miejscu i rozdzielać go
na podklasy w każdym module wersji. W podklasie implementujesz bazowy kod, taki jak `Model::fields()`.
Struktura Twojego kodu może wyglądać jak poniższa:
```
api/
common/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
modules/
v1/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
Module.php
v2/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
Module.php
```
Konfiguracja Twojej aplikacji mogłaby wyglądać następująco:
```php
return [
'modules' => [
'v1' => [
'class' => 'app\modules\v1\Module',
],
'v2' => [
'class' => 'app\modules\v2\Module',
],
],
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user', 'v1/post']],
['class' => 'yii\rest\UrlRule', 'controller' => ['v2/user', 'v2/post']],
],
],
],
];
```
Rezultatem powyższego kodu będzie skierowanie pod adresem `http://example.com/v1/users` do listy użytkowników w wersji 1, podczas gdy
`http://example.com/v2/users` pokaże użytkowników w wersji 2.
Dzięki podziałowi na moduły, kod różnych głównych wersji może być dobrze izolowany, ale jednocześnie wciąż możliwe jest ponowne
wykorzystanie wspólnego kodu poprzez wspólną bazę klas i dzielonych zasobów.
Aby prawidłowo obsłużyć pomniejsze numery wersji, możesz wykorzystać funkcjonalność negocjatora zawartości dostarczaną przez behavior
[[yii\filters\ContentNegotiator|contentNegotiator]]. Ustawi on właściwość [[yii\web\Response::acceptParams]], kiedy już zostanie
ustalone, który typ zasobów wspierać.
Przykładowo, jeśli żądanie jest wysłane z nagłówkiem HTTP `Accept: application/json; version=v1`, po negocjacji zawartości
[[yii\web\Response::acceptParams]] będzie zawierać wartość `['version' => 'v1']`.
Bazując na informacji o wersji w `acceptParams`, możesz napisać obsługujący ją warunkowy kod w miejscach takich jak akcje, klasy
zasobów, serializatory, itp., aby zapewnić odpowiednią funkcjonalność.
Ponieważ pomniejsze wersje z definicji wymagają zachowania wstecznej kompatybilności, w kodzie nie powinno znaleźć się zbyt wiele
miejsc, gdzie numer wersji będzie sprawdzany. W przeciwnym wypadku możliwe, że konieczne będzie utworzenie kolejnej głównej wersji API.

3
docs/guide-pl/start-installation.md

@ -158,9 +158,6 @@ Konfigurowanie serwerów WWW <span id="configuring-web-servers"></span>
Aplikacja zainstalowana według powyższych instrukcji powinna działać bezproblemowo zarówno na
[serwerze HTTP Apache](http://httpd.apache.org) jak i [serwerze HTTP Nginx](http://nginx.org), na systemie
operacyjnym Windows, Mac OS X oraz Linux, posiadającym zainstalowane PHP 5.4 lub wyższe.
Yii 2.0 jest również kompatybilne z [facebookowym HHVM](http://hhvm.com).
Są jednak przypadki, gdzie Yii zachowuje się inaczej w HHVM niż w natywnym PHP, dlatego powinieneś zachować
szczególną ostrożność używając HHVM.
Na serwerze produkcyjnym możesz skonfigurować swój host tak, aby aplikacja była dostępna pod adresem `http://www.example.com/index.php` zamiast
`http://www.example.com/basic/web/index.php`.

14
docs/guide-pt-BR/README.md

@ -126,20 +126,6 @@ Cache
* [Cache HTTP](caching-http.md)
Web Services RESTful
------------------------
* [Introdução](rest-quick-start.md)
* [Recursos](rest-resources.md)
* [Controllers (Controladores)](rest-controllers.md)
* [Roteamento](rest-routing.md)
* [Formatando Respostas](rest-response-formatting.md)
* [Autenticação](rest-authentication.md)
* [Limitador de Acesso](rest-rate-limiting.md)
* [Versionamento](rest-versioning.md)
* [Tratamento de Erros](rest-error-handling.md)
Ferramentas de Desenvolvimento
------------------------------

6
docs/guide-pt-BR/caching-data.md

@ -96,10 +96,6 @@ Yii suporta uma ampla gama de sistemas de cache. A seguir um resumo:
[Redis](http://redis.io/) (requer redis versão 2.6.12 ou mais recente).
* [[yii\caching\WinCache]]: usa a extensão PHP [WinCache](http://iis.net/downloads/microsoft/wincache-extension)
([veja também](http://php.net/manual/en/book.wincache.php)).
* [[yii\caching\XCache]] _(deprecated)_: usa a extensão PHP [XCache](http://xcache.lighttpd.net/).
* [[yii\caching\ZendDataCache]] _(deprecated)_: usa
[Cache de Dados Zend](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm)
como o meio de cache subjacente.
> Dica: Você pode usar vários tipos de cache na mesma aplicação. Uma estratégia comum é usar caches baseados
@ -123,7 +119,7 @@ Todos os componentes de caches estendem a mesma classe base [[yii\caching\Cache]
Se a chave já existir em cache, o registro é ignorado.
* [[yii\caching\Cache::exists()|exists()]]: retorna se a chave específica é encontrada no cache.
* [[yii\caching\Cache::delete()|delete()]]: remove um registro do cache identificado por uma chave.
* [[yii\caching\Cache::flush()|flush()]]: remove todos os registros do cache.
* [[yii\caching\Cache::clear()|clear()]]: remove todos os registros do cache.
> Observação: Não armazene o valor boleano `false` diretamente, porque o método [[yii\caching\Cache::get()|get()]] retorna `false`para indicar que o registro não foi encontrado em cache. Você pode armazena `false` em um array e armazenar este em cache para evitar este problema.

20
docs/guide-pt-BR/concept-behaviors.md

@ -111,21 +111,21 @@ class User extends ActiveRecord
{
return [
// behavior anônimo, somente o nome da classe
MyBehavior::className(),
MyBehavior::class,
// behavior nomeado, somente o nome da classe
'myBehavior2' => MyBehavior::className(),
'myBehavior2' => MyBehavior::class,
// behavior anônimo, array de configuração
[
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
// behavior nomeado, array de configuração
'myBehavior4' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]
@ -145,11 +145,11 @@ use app\components\MyBehavior;
$component->attachBehavior('myBehavior1', new MyBehavior);
// anexando uma classe behavior
$component->attachBehavior('myBehavior2', MyBehavior::className());
$component->attachBehavior('myBehavior2', MyBehavior::class);
// anexando através de um array de configuração
$component->attachBehavior('myBehavior3', [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]);
@ -160,7 +160,7 @@ Você pode anexar vários behaviors de uma só vez usando o método [[yii\base\C
```php
$component->attachBehaviors([
'myBehavior1' => new MyBehavior, // um behavior nomeado
MyBehavior::className(), // um behavior anônimo
MyBehavior::class, // um behavior anônimo
]);
```
@ -168,10 +168,10 @@ Você também pode anexar behaviors através de [configurações](concept-config
```php
[
'as myBehavior2' => MyBehavior::className(),
'as myBehavior2' => MyBehavior::class,
'as myBehavior3' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
@ -255,7 +255,7 @@ class User extends ActiveRecord
{
return [
[
'class' => TimestampBehavior::className(),
'class' => TimestampBehavior::class,
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],

2
docs/guide-pt-BR/concept-components.md

@ -68,7 +68,7 @@ Seguindo essas orientações fará com que seus componentes sejam [configurávei
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// alternatively
$component = \Yii::createObject([
'class' => MyClass::className(),
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);

10
docs/guide-pt-BR/concept-events.md

@ -191,7 +191,7 @@ use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Event::on(ActiveRecord::class, ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::debug(get_class($event->sender) . ' is inserted');
});
```
@ -205,11 +205,11 @@ Você pode disparar um evento de *nível de classe* chamando o método estático
```php
use yii\base\Event;
Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
Event::on(Foo::class, Foo::EVENT_HELLO, function ($event) {
var_dump($event->sender); // displays "null"
});
Event::trigger(Foo::className(), Foo::EVENT_HELLO);
Event::trigger(Foo::class, Foo::EVENT_HELLO);
```
Note que, neste caso, `$event->sender` refere-se ao nome da classe acionando o evento em vez de uma instância do objeto.
@ -220,10 +220,10 @@ Para desvincular um manipulador de evento de nível de classe, chame [[yii\base\
```php
// desvincula $handler
Event::off(Foo::className(), Foo::EVENT_HELLO, $handler);
Event::off(Foo::class, Foo::EVENT_HELLO, $handler);
// Desvincula todos os manipuladores de Foo::EVENT_HELLO
Event::off(Foo::className(), Foo::EVENT_HELLO);
Event::off(Foo::class, Foo::EVENT_HELLO);
```

29
docs/guide-pt-BR/db-active-record.md

@ -26,7 +26,6 @@ O Yii fornece suporte Active Record para os seguintes bancos de dados relacionai
* SQLite 2 e 3: via [[yii\db\ActiveRecord]]
* Microsoft SQL Server 2008 ou superior: via [[yii\db\ActiveRecord]]
* Oracle: via [[yii\db\ActiveRecord]]
* CUBRID 9.3 ou superior: via [[yii\db\ActiveRecord]] (observe que devido a um [bug](http://jira.cubrid.org/browse/APIS-658) na extensão PDO do cubrid, o tratamento de aspas não funciona, então você precisa do CUBRID 9.3 como o cliente, bem como servidor)
* Sphinx: via [[yii\sphinx\ActiveRecord]], requer a extensão `yii2-sphinx`
* ElasticSearch: via [[yii\elasticsearch\ActiveRecord]], requer a extensão `yii2-elasticsearch`. Adicionalmente, o Yii também suporta o uso de Active Record com os seguintes bancos de dados NoSQL:
@ -576,7 +575,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -584,7 +583,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -596,7 +595,7 @@ Cada método de relação deve ser nomeado como `getXyz`. Nós chamamos de `xyz`
Ao declarar uma relação, você deve especificar as seguintes informações:
- A multiplicidade da relação: especificada chamando tanto o método [[yii\db\ActiveRecord::hasMany()|hasMany()]] quanto o método [[yii\db\ActiveRecord::hasOne()|hasOne()]]. No exemplo acima você pode facilmente ler nas declarações de relação que um `customer` tem vários `orders` enquanto uma `order` só tem um `customer`.
- O nome da classe Active Record relacionada: especificada no primeiro parâmetro dos métodos [[yii\db\ActiveRecord::hasMany()|hasMany()]] e [[yii\db\ActiveRecord::hasOne()|hasOne()]]. Uma prática recomendada é chamar `Xyz::className()` para obter o nome da classe para que você possa receber suporte do preenchimento automático de IDEs bem como detecção de erros.
- O nome da classe Active Record relacionada: especificada no primeiro parâmetro dos métodos [[yii\db\ActiveRecord::hasMany()|hasMany()]] e [[yii\db\ActiveRecord::hasOne()|hasOne()]]. Uma prática recomendada é chamar `Xyz::class` para obter o nome da classe para que você possa receber suporte do preenchimento automático de IDEs bem como detecção de erros.
- A ligação entre os dois tipos de dados: especifica a(s) coluna(s) por meio do qual os dois tipos de dados se relacionam. Os valores do array são as colunas da tabela primária (representada pela classe Active Record que você declarou as relações), enquanto as chaves do array são as colunas da tabela relacionada.
Uma regra fácil de lembrar é, como você pode ver no exemplo acima, você escreve a coluna que pertence ao Active Record relacionado diretamente ao lado dele. Você pode ver que `customer_id` é uma propriedade de `Order` e `id` é uma propriedade de `Customer`.
@ -654,7 +653,7 @@ class Customer extends ActiveRecord
{
public function getBigOrders($threshold = 100)
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
return $this->hasMany(Order::class, ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
@ -683,7 +682,7 @@ class Order extends ActiveRecord
{
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->viaTable('order_item', ['order_id' => 'id']);
}
}
@ -696,12 +695,12 @@ class Order extends ActiveRecord
{
public function getOrderItems()
{
return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
return $this->hasMany(OrderItem::class, ['order_id' => 'id']);
}
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->via('orderItems');
}
}
@ -892,7 +891,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -900,7 +899,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -930,7 +929,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer');
return $this->hasMany(Order::class, ['customer_id' => 'id'])->inverseOf('customer');
}
}
```
@ -1023,7 +1022,7 @@ class Customer extends \yii\db\ActiveRecord
public function getComments()
{
// a customer tem muitos comments
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1038,7 +1037,7 @@ class Comment extends \yii\mongodb\ActiveRecord
public function getCustomer()
{
// um comment tem um customer
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
@ -1106,7 +1105,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getActiveComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
return $this->hasMany(Comment::class, ['customer_id' => 'id'])->active();
}
}
@ -1166,7 +1165,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```

104
docs/guide-pt-BR/rest-authentication.md

@ -1,104 +0,0 @@
Autenticação
==============
Ao contrário de aplicações Web, APIs RESTful são geralmente stateless, o que significa que as sessões ou os cookies não devem ser utilizados. Portanto, cada requisição deve vir com algum tipo de credencial de autenticação pois o estado de autenticação do usuário não pode ser mantido por sessões ou cookies. Uma prática comum é enviar um token de acesso secreto com cada solicitação para autenticar o usuário. Uma vez que um token de acesso pode ser utilizado para identificar de forma exclusiva e autenticar um usuário. **Solicitações de API devem sempre ser enviadas via HTTPS para evitar ataques man-in-the-middle (MitM)**.
Existem diferentes maneiras de enviar um token de acesso:
* [Autenticação Básica HTTP](http://en.wikipedia.org/wiki/Basic_access_authentication): o token de acesso é enviado como um nome de usuário. Isso só deve ser usado quando um token de acesso puder ser armazenado com segurança no lado do consumidor da API. Por exemplo, o consumidor API é um programa executado em um servidor.
* Parâmetro de consulta da URL: o token de acesso é enviado como um parâmetro de consulta na URL da API, ex., `https://example.com/users?access-token=xxxxxxxx`. Como a maioria dos servidores Web manterão os parâmetros de consulta nos logs do servidor, esta abordagem deve ser utilizada principalmente para servir requisições `JSONP` que não pode usar cabeçalhos HTTP para enviar tokens de acesso.
* [OAuth 2](http://oauth.net/2/): o token de acesso é obtido pelo consumidor a partir de um servidor de autorização e enviado para o servidor da API via [HTTP Bearer Tokens] (http://tools.ietf.org/html/rfc6750), de acordo com o protocolo OAuth2.
Yii suporta todos os métodos de autenticação descritos acima. Você também pode criar facilmente um novo método de autenticação.
Para ativar a autenticação nas suas APIs, siga os seguintes passos:
1. Configure o [componente de aplicação](structure-application-components.md) `user`:
- Defina a propriedade [[yii\web\User::enableSession|enableSession]] como `false`.
- Defina a propriedade [[yii\web\User::loginUrl|loginUrl]] como `null` para mostrar o erro HTTP 403 em vez de redirecionar para a página de login.
2. Especificar quais métodos de autenticação você planeja usar configurando o behavior `authenticator` na sua classe controller REST.
3. Implemente [[yii\web\IdentityInterface::findIdentityByAccessToken()]] na sua [[yii\web\User::identityClass|classe de identidade do usuário]].
Passo 1 não é obrigatório, mas é recomendado para APIs RESTful stateless. Quando [[yii\web\User::enableSession|enableSession]] está marcado como falso, o status de autenticação de usuário NÃO será mantido entre as requisições usando sessões. Em lugar disso, autenticação será realizada para cada requisição, que é realizado no passo 2 e 3.
> Dica: Você pode configurar [[yii\web\User::enableSession|enableSession]] do componente `user`
> nas configurações da aplicação se você estiver desenvolvendo APIs RESTful para sua aplicação. Se você desenvolver
> APIs RESTful como um módulo, você pode colocar a seguinte linha no método `init()` do módulo, conforme exemplo a seguir:
>
> ```php
> public function init()
> {
> parent::init();
> \Yii::$app->user->enableSession = false;
> }
> ```
Por exemplo, para usar autenticação HTTP básica, você pode configurar o behavior `authenticator` como o seguinte:
```php
use yii\filters\auth\HttpBasicAuth;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
return $behaviors;
}
```
Se você quiser dar suporte a todos os três métodos de autenticação explicado acima, você pode utilizar o `CompositeAuth` conforme mostrado a seguir:
```php
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
];
return $behaviors;
}
```
Cada elemento em `authMethods` deve ser o nome de uma classe de método de autenticação ou um array de configuração.
Implementação de `findIdentityByAccessToken()` é específico por aplicação. Por exemplo, em cenários simples quando cada usuário só pode ter um token de acesso, você pode armazenar o token de acesso em uma coluna `access_token` na tabela `user`. O método pode então ser facilmente implementado na classe `User` como o seguinte:
```php
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
}
```
Após a autenticação ser ativada, conforme descrito acima, para todas as requisições da API, o controller requisitado irá tentar autenticar o usuário no passo `beforeAction()`.
Se a autenticação retornar com sucesso, o controller irá executar outras verificações (tais como limitação de taxa, autorização) e então executará a ação. As informações de identidade do usuário autenticado podem ser recuperadas através de `Yii::$app->user->identity`.
Se a autenticação falhar, uma resposta HTTP com status 401 será enviado de volta junto com outros cabeçalhos apropriados (tal como um `WWW-Authenticate` cabeçalho HTTP para Autenticação Básica).
## Autorização <span id="authorization"></span>
Após um usuário se autenticar, você provavelmente vai querer verificar se ele ou ela tem a permissão para executar a ação do recurso solicitado. Este processo é chamado de *autorização* que é tratada em pormenor na seção de [Autorização](security-authorization.md).
Se o seu controller estende de [[yii\rest\ActiveController]], você pode sobrescrever o método [[yii\rest\Controller::checkAccess()|checkAccess()]] para executar a verificação de autorização. O método será chamado pelas ações incorporadas fornecidas pelo [[yii\rest\ActiveController]].

133
docs/guide-pt-BR/rest-controllers.md

@ -1,133 +0,0 @@
Controllers (Controladores)
===========
Depois de criar as classes de recursos e especificar como os dados de recursos devem ser formatados, a próxima coisa a fazer é criar ações do controller para expor os recursos para os usuários finais através das APIs RESTful.
O Yii fornece duas classes básicas de controller para simplificar seu trabalho de criar ações RESTful: [[yii\rest\Controller]] e [[yii\rest\ActiveController]]. A diferença entre os dois controllers é que o último fornece um conjunto padrão de ações que são especificamente concebidos para lidar com recursos do [Active Record](db-active-record.md). Então, se você estiver usando [Active Record](db-active-record.md) e está confortável com as ações fornecidas, você pode considerar estender suas classes de controller de [[yii\rest\ActiveController]], que permitirá criar poderosas APIs RESTful com um mínimo de código.
Ambas classes [[yii\rest\Controller]] e [[yii\rest\ActiveController]] fornecem os seguintes recursos, algumas das quais serão descritas em detalhes nas próximas seções:
* Validação de Método HTTP;
* [Negociação de conteúdo e formatação de dados](rest-response-formatting.md);
* [Autenticação](rest-authentication.md);
* [Limitação de taxa](rest-rate-limiting.md).
O [[yii\rest\ActiveController]] oferece também os seguintes recursos:
* Um conjunto de ações comumente necessárias: `index`, `view`, `create`, `update`, `delete`, `options`;
* Autorização do usuário em relação à ação solicitada e recursos.
## Criando Classes Controller <span id="creating-controller"></span>
Ao criar uma nova classe de controller, uma convenção na nomenclatura da classe é usar o nome do tipo de recurso no singular. Por exemplo, para disponibilizar as informações do usuário, o controlador pode ser nomeado como `UserController`. Criar uma nova ação é semelhante à criação de uma ação de uma aplicação Web. A única diferença é que em vez de renderizar o resultado usando uma view e chamando o método `render()`, para ações RESTful você retorna diretamente os dados. O [[yii\rest\Controller::serializer|serializer]] e o [[yii\web\Response|objeto response]] vão converter os dados originais para o formato solicitado. Por exemplo:
```php
public function actionView($id)
{
return User::findOne($id);
}
```
## Filtros <span id="filters"></span>
A maioria dos recursos da API RESTful fornecidos por [[yii\rest\Controller]] são implementadas por [filtros](structure-filters.md).
Em particular, os seguintes filtros serão executados na ordem em que estão listados:
* [[yii\filters\ContentNegotiator|contentNegotiator]]: suporta a negociação de conteúdo, a ser explicado na seção [Formatação de Resposta](rest-response-formatting.md);
* [[yii\filters\VerbFilter|verbFilter]]: suporta validação de métodos HTTP;
* [[yii\filters\auth\AuthMethod|authenticator]]: suporta autenticação de usuários, que será explicado na seção [Autenticação](rest-authentication.md);
* [[yii\filters\RateLimiter|rateLimiter]]: suporta limitação de taxa, que será explicado na seção
[Limitação de taxa](rest-rate-limiting.md).
Estes filtros são declarados no método [[yii\rest\Controller::behaviors()|behaviors()]].
Você pode sobrescrever esse método para configurar alguns filtros, desativar outros, ou adicionar seus próprios filtros. Por exemplo, se você precisar somente de autenticação básica de HTTP, poderá utilizar o seguinte código:
```php
use yii\filters\auth\HttpBasicAuth;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => HttpBasicAuth::className(),
];
return $behaviors;
}
```
## Estendendo `ActiveController` <span id="extending-active-controller"></span>
Se a sua classe controller estende de [[yii\rest\ActiveController]], você deve configurar a propriedade [[yii\rest\ActiveController::modelClass|modelClass]] para ser o nome da classe de recurso que você pretende servir através deste controller. A classe deve estender de [[yii\db\ActiveRecord]].
### Customizando Ações <span id="customizing-actions"></span>
Por padrão, o [[yii\rest\ActiveController]] fornece as seguintes ações:
* [[yii\rest\IndexAction|index]]: recursos de lista página por página;
* [[yii\rest\ViewAction|view]]: retorna os detalhes de um recurso especificado;
* [[yii\rest\CreateAction|create]]: cria um novo recurso;
* [[yii\rest\UpdateAction|update]]: atualiza um recurso existente;
* [[yii\rest\DeleteAction|delete]]: excluir o recurso especificado;
* [[yii\rest\OptionsAction|options]]: retorna os métodos HTTP suportados.
Todas essas ações são declaradas através do método [[yii\rest\ActiveController::actions()|actions()]]. Você pode configurar essas ações ou desativar algumas delas, sobrescrevendo o método `actions()`, como mostrado a seguir:
```php
public function actions()
{
$actions = parent::actions();
// desabilita as ações "delete" e "create"
unset($actions['delete'], $actions['create']);
// customiza a preparação do data provider com o método "prepareDataProvider()"
$actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];
return $actions;
}
public function prepareDataProvider()
{
// preparar e retornar um data provider para a ação "index"
}
```
Por favor, consulte as referências de classe para classes de ação individual para saber as opções de configuração que estão disponíveis.
### Executando Verificação de Acesso <span id="performing-access-check"></span>
Ao disponibilizar recursos por meio de APIs RESTful, muitas vezes você precisa verificar se o usuário atual tem permissão para acessar e manipular o(s) recurso(s) solicitado(s). Com o [[yii\rest\ActiveController]], isso pode ser feito sobrescrevendo o método [[yii\rest\ActiveController::checkAccess()|checkAccess()]] conforme a seguir:
```php
/**
* Verifica os privilégios do usuário corrente.
*
* Este método deve ser sobrescrito para verificar se o usuário atual tem o privilégio
* para executar a ação especificada diante do modelo de dados especificado.
* se o usuário não tiver acesso, uma [[ForbiddenHttpException]] deve ser lançada.
*
* @param string $action o ID da ação a ser executada
* @param \yii\base\Model $model o model a ser acessado. Se `null`, isso significa que nenhum model específico está sendo acessado.
* @param array $params parâmetros adicionais
* @throws ForbiddenHttpException se o usuário não tiver acesso
*/
public function checkAccess($action, $model = null, $params = [])
{
// verifica se o usuário pode acessar $action and $model
// lança a ForbiddenHttpException se o acesso for negado
if ($action === 'update' || $action === 'delete') {
if ($model->author_id !== \Yii::$app->user->id)
throw new \yii\web\ForbiddenHttpException(sprintf('You can only %s articles that you\'ve created.', $action));
}
}
```
O método `checkAccess()` será chamado pelas ações padrões do [[yii\rest\ActiveController]]. Se você criar novas ações e também desejar executar a verificação de acesso, deve chamar esse método explicitamente nas novas ações.
> Dica: Você pode implementar `checkAccess()` usando o [componente de Role-Based Access Control (RBAC)](security-authorization.md).

85
docs/guide-pt-BR/rest-error-handling.md

@ -1,85 +0,0 @@
Tratamento de Erros
==============
Ao manusear uma requisição da API RESTful, se existir um erro na requisição do usuário ou se alguma coisa inesperada acontecer no servidor, você pode simplesmente lançar uma exceção para notificar o usuário de que algo deu errado.
Se você puder identificar a causa do erro (ex., o recurso requisitado não existe), você deve considerar lançar uma exceção juntamente com um código de status HTTP adequado (ex., [[yii\web\NotFoundHttpException]] representa um código de status 404). O Yii enviará a resposta juntamente com o código e o texto do status HTTP correspondente. O Yii também incluirá a representação serializada da exceção no corpo da resposta. Por exemplo:
```
HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
```
A lista a seguir descrimina os códigos de status HTTP que são usados pelo framework REST do Yii:
* `200`: OK. Tudo funcionou conforme o esperado;
* `201`: Um recurso foi criado com êxito em resposta a uma requisição `POST`. O cabeçalho `location` contém a URL que aponta para o recurso recém-criado;
* `204`: A requisição foi tratada com sucesso e a resposta não contém nenhum conteúdo no corpo (por exemplo uma requisição `DELETE`);
* `304`: O recurso não foi modificado. Você pode usar a versão em cache;
* `400`: Requisição malfeita. Isto pode ser causado por várias ações por parte do usuário, tais como o fornecimento de um JSON inválido no corpo da requisição, fornecendo parâmetros inválidos, etc;
* `401`: Falha de autenticação;
* `403`: O usuário autenticado não tem permissão para acessar o recurso da API solicitado;
* `404`: O recurso requisitado não existe;
* `405`: Método não permitido. Favor verificar o cabeçalho `Allow` para conhecer os métodos HTTP permitidos;
* `415`: Tipo de mídia não suportada. O número de versão ou o content type requisitado são inválidos;
* `422`: Falha na validação dos dados (na resposta a uma requisição `POST`, por exemplo). Por favor, verifique o corpo da resposta para visualizar a mensagem detalhada do erro;
* `429`: Excesso de requisições. A requisição foi rejeitada devido a limitação de taxa;
* `500`: Erro interno do servidor. Isto pode ser causado por erros internos do programa.
## Customizando Resposta de Erro<span id="customizing-error-response"></span>
Às vezes você pode querer personalizar o formato de resposta de erro padrão. Por exemplo, em vez de confiar em usar diferentes status HTTP para indicar os diversos erros, você pode querer usar sempre o status 200 como resposta e colocar o código de status real como parte da estrutura JSON da resposta, como mostrado abaixo,
```
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"success": false,
"data": {
"name": "Not Found Exception",
"message": "The requested resource was not found.",
"code": 0,
"status": 404
}
}
```
Para atingir este objetivo, você pode responder o evento `beforeSend` do componente `response` na configuração da aplicação:
```php
return [
// ...
'components' => [
'response' => [
'class' => 'yii\web\Response',
'on beforeSend' => function ($event) {
$response = $event->sender;
if ($response->data !== null && Yii::$app->request->get('suppress_response_code')) {
$response->data = [
'success' => $response->isSuccessful,
'data' => $response->data,
];
$response->statusCode = 200;
}
},
],
],
];
```
O código acima formatará a resposta (para ambas as respostas, bem-sucedidas e com falha) como explicado quando `suppress_response_code` é passado como um parâmetro `GET`.

193
docs/guide-pt-BR/rest-quick-start.md

@ -1,193 +0,0 @@
Introdução
===========
O Yii fornece um conjunto de ferramentas para simplificar a tarefa de implementar APIs RESTful Web Service. Em particular, o Yii suporta os seguintes recursos sobre APIs RESTful:
* Prototipagem rápida com suporte para APIs comuns de [Active Record](db-active-record.md);
* Negociação de formato do Response (suporte JSON e XML por padrão);
* Serialização de objeto configurável com suporte a campos de saída selecionáveis;
* Formatação adequada para a coleção e dados e validação de erros;
* Suporte a [HATEOAS](http://en.wikipedia.org/wiki/HATEOAS);
* Roteamento eficiente com verificação dos verbs (métodos) HTTP;
* Construído com suporte aos métodos `OPTIONS` e `HEAD`;
* Autenticação e autorização;
* Data caching e HTTP caching;
* Limitação de taxa;
Abaixo, utilizamos um exemplo para ilustrar como você pode construir um conjunto de APIs RESTful com um mínimo de codificação.
Suponha que você deseja expor os dados do usuário via APIs RESTful. Os dados do usuário estão guardados na tabela `user` e você já criou a classe [active record](db-active-record.md) `app\models\User` para acessar os dados do usuário.
## Criando um Controller (Controlador) <span id="creating-controller"></span>
Primeiramente, crie uma classe [controller](structure-controllers.md) `app\controllers\UserController` como a seguir,
```php
namespace app\controllers;
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
```
A classe controller estende de [[yii\rest\ActiveController]], que implementa um conjunto comum de ações RESTful. Especificando [[yii\rest\ActiveController::modelClass|modelClass]]
como `app\models\User`, o controller sabe qual o model que pode ser usado para a recuperação e manipulação de dados.
## Configurando Regras de URL <span id="configuring-url-rules"></span>
Em seguida, modifique a configuração do componente `urlManager` na configuração da aplicação:
```php
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
```
A configuração acima primeiramente adiciona uma regra de URL para o controller `user` de modo que os dados do usuário podem ser acessados e manipulados com URLs amigáveis e métodos HTTP significativos.
## Ativando o Input via JSON <span id="enabling-json-input"></span>
Para fazer a API aceitar dados no formato JSON, configure a propriedade [[yii\web\Request::$parsers|parsers]] do [componente de aplicação](structure-application-components.md) `request` para usar o [[yii\web\JsonParser]] para realizar input via JSON:
```php
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
]
```
> Observação: A configuração acima é opcional. Sem esta configuração, a API só iria reconhecer os formatos de input `application/x-www-form-urlencoded` e `multipart/form-data`.
## Testando <span id="trying-it-out"></span>
Com o mínimo de esforço acima, você já terminou sua tarefa de criar as APIs RESTful para acessar os dados do usuário. As APIs que você criou incluem:
* `GET /users`: listar todos os usuários página por página;
* `HEAD /users`: mostrar a informações gerais da listagem de usuários;
* `POST /users`: criar um novo usuário;
* `GET /users/123`: retorna detalhes do usuário 123;
* `HEAD /users/123`: mostra informações gerais do usuário 123;
* `PATCH /users/123` e `PUT /users/123`: atualiza o usuário 123;
* `DELETE /users/123`: deleta o usuário 123;
* `OPTIONS /users`: mostra os métodos suportados em relação à URL `/users`;
* `OPTIONS /users/123`: mostra os métodos suportados em relação à URL `/users/123`.
> Observação: O Yii vai pluralizar automaticamente nomes de controllers para uso em URLs (também chamadas *endpoints*).
> Você pode configurar isso usando a propriedade [[yii\rest\UrlRule::$pluralize]].
Você pode acessar suas APIs com o comando `curl` mostrado abaixo,
```
$ curl -i -H "Accept:application/json" "http://localhost/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
```
Tente alterar o tipo de conteúdo para `application/xml` e você vai ver o resultado retornado em formato XML:
```
$ curl -i -H "Accept:application/xml" "http://localhost/users"
HTTP/1.1 200 OK
...
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<item>
<id>1</id>
...
</item>
<item>
<id>2</id>
...
</item>
...
</response>
```
O seguinte comando irá criar um novo usuário, enviando uma solicitação POST com os dados do usuário em formato JSON:
```
$ curl -i -H "Accept:application/json" -H "Content-Type:application/json" -XPOST "http://localhost/users" -d '{"username": "example", "email": "user@example.com"}'
HTTP/1.1 201 Created
...
Location: http://localhost/users/1
Content-Length: 99
Content-Type: application/json; charset=UTF-8
{"id":1,"username":"example","email":"user@example.com","created_at":1414674789,"updated_at":1414674789}
```
> Dica: Você também pode acessar suas APIs via navegador, digitando a URL `http://localhost/users`. No entanto, você pode precisar de alguns plugins do navegador para enviar cabeçalhos de solicitações específicas.
Como você pode ver, no cabeçalho da resposta, há informações sobre a contagem total, número de páginas, etc. Há também links que permitem navegar para outras páginas de dados. Por exemplo, `http://localhost/users?page=2` lhe daria a próxima página dos dados de usuário.
Usando os parâmetros `fields` e `expand`, você também pode especificar os campos que devem ser incluídos no resultado. Por exemplo, a URL `http://localhost/users?fields=id,email` só retornará os campos `id` e `email`.
> Observação: Você deve ter notado que o resultado de `http://localhost/users`
> inclui alguns campos confidenciais,
> Tal como `password_hash`, `auth_key`. Você certamente não quer que
> eles apareçam no resultado da sua API.
> Você pode e deve filtrar esses campos, conforme descrito na seção
> [Response Formatting](rest-response-formatting.md).
## Resumo <span id="summary"></span>
Usando o framework API RESTful do Yii, você implementa uma URL desses campos, conforme descrito na seção de ações do controller, um controller para organizar as ações que implementam as URLs para um único tipo de recurso.
Os recursos são representados como modelos de dados, que se estendem a partir da classe [[yii\base\Model]]. Se você estiver trabalhando com bancos de dados (relacional ou NoSQL), é recomendado que você use [[yii\db\ActiveRecord|ActiveRecord]] para representar recursos.
Você pode usar [[yii\rest\UrlRule]] para simplificar o roteamento para suas URLs da API.
Embora não seja exigido, é recomendável que você desenvolva suas APIs RESTful como uma aplicação separada, diferente do seu frontend e backend para facilitar a manutenção.

38
docs/guide-pt-BR/rest-rate-limiting.md

@ -1,38 +0,0 @@
Limitador de Acesso
=============
Para prevenir abusos, você pode considerar a utilização de um *limitador de acesso* nas suas APIs. Por exemplo, você pode querer limitar o uso da API para cada usuário em no máximo 100 chamadas a cada 10 minutos. Se o número de solicitações recebidas por usuário ultrapassar este limite, uma resposta com status 429 (significa "Muitas Requisições") deve ser retornada.
Para habilitar o limitador de acesso, a [[yii\web\User::identityClass|classe de identidade do usuário]] deve implementar [[yii\filters\RateLimitInterface]]. Esta interface requer a implementação de três métodos:
* `getRateLimit()`: retorna o número máximo de pedidos permitidos e o período de tempo (ex., `[100, 600]` significa que pode haver, no máximo, 100 chamadas de API dentro de 600 segundo);
* `loadAllowance()`: retorna o número restante de pedidos permitidos e a hora da última verificação;
* `saveAllowance()`: salva tanto o número restante de requisições e a hora atual.
Você pode usar duas colunas na tabela de usuários para registrar estas informações. Com esses campos definidos, então `loadAllowance()` e `saveAllowance()` podem ser implementados para ler e guardar os valores das duas colunas correspondentes ao atual usuário autenticado.
Para melhorar o desempenho, você também pode considerar armazenar essas informações em um cache ou armazenamento NoSQL.
Uma vez que a classe de identidade do usuário estiver com a interface necessária implementada, o Yii automaticamente usará a classe [[yii\filters\RateLimiter]] configurada como um filtro da ação para o [[yii\rest\Controller]] realizar a verificação da limitação do acesso. O limitador de acesso lançará uma exceção [[yii\web\TooManyRequestsHttpException]] quando o limite for excedido.
Você pode configurar o limitador de acesso da seguinte forma em suas classes controller REST:
```php
public function behaviors()
{
$behaviors =
parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders']
= false;
return $behaviors;
}
```
Quando o limitador de acesso está habilitado, por padrão a cada resposta será enviada com o seguinte cabeçalho HTTP contendo a informação da atual taxa de limitação:
* `X-Rate-Limit-Limit`, o número máximo permitido de pedidos em um período de tempo;
* `X-Rate-Limit-Remaining`, o número de pedidos restantes no período de tempo atual;
* `X-Rate-Limit-Reset`, o número de segundos de espera a fim de obter o número máximo de pedidos permitidos.
Você pode desativar esses cabeçalhos, configurando [[yii\filters\RateLimiter::enableRateLimitHeaders]] para `false`, como mostrado no exemplo acima.

192
docs/guide-pt-BR/rest-resources.md

@ -1,192 +0,0 @@
Recursos
=========
APIs RESTful tratam de como acessar e manipular *recursos*. Você pode ver recursos como [models](structure-models.md) no paradigma MVC.
Embora não haja restrição na forma de representar um recurso, no Yii você normalmente representaria recursos como objetos de [[yii\base\Model]] ou de uma classe filha (ex. [[yii\db\ActiveRecord]]), pelas seguintes razões:
* [[yii\base\Model]] implementa a interface [[yii\base\Arrayable]], que permite que você personalize como você deseja expor dados de recursos através das APIs RESTful.
* [[yii\base\Model]] suporta [validação de dados de entrada](input-validation.md), que é importante se as suas APIs RESTful precisarem suportar entrada de dados.
* [[yii\db\ActiveRecord]] fornece acesso poderoso a banco de dados com suporte a manipulação dos dados, o que o torna um ajuste perfeito se seus dados de recursos estiverem armazenado em bases de dados.
Nesta seção, vamos principalmente descrever como uma classe de recurso que se estende de [[yii\base\Model]] (ou alguma classe filha) pode especificar quais os dados podem ser retornados via APIs RESTful. Se a classe de recurso não estender de [[yii\base\Model]], então todas as suas variáveis públicas serão retornadas.
## Campos <span id="fields"></span>
Ao incluir um recurso em uma resposta da API RESTful, o recurso precisa ser serializado em uma string. O Yii quebra este processo em duas etapas. Primeiro, o recurso é convertido em um array utilizando [[yii\rest\Serializer]]. Por último, o array é serializado em uma string no formato solicitado (ex. JSON, XML) através do [[yii\web\ResponseFormatterInterface|response formatters]]. O primeiro passo é o que você deve centrar-se principalmente no desenvolvimento de uma classe de recurso.
Sobrescrevendo [[yii\base\Model::fields()|fields()]] e/ou [[yii\base\Model::extraFields()|extraFields()]], você pode especificar quais os dados, chamados *fields*, no recurso podem ser colocados no array.
A diferença entre estes dois métodos é que o primeiro especifica o conjunto padrão de campos que devem ser incluídos no array, enquanto que o último especifica campos adicionais que podem ser incluídos no array, se um usuário final solicitá-los via o parâmetro de pesquisa `expand`. Por exemplo:
```
// retorna todos os campos declarados em fields()
http://localhost/users
// retorna apenas os campos id e email, desde que estejam declarados em fields()
http://localhost/users?fields=id,email
// retorna todos os campos de fields() e o campo profile se este estiver no extraFields()
http://localhost/users?expand=profile
// retorna apenas o campo id, email e profile, desde que estejam em fields() e extraFields()
http://localhost/users?fields=id,email&expand=profile
```
### Sobrescrevendo `fields()` <span id="overriding-fields"></span>
Por padrão, [[yii\base\Model::fields()]] retorna todos os atributos do model como campos, enquanto [[yii\db\ActiveRecord::fields()]] só retorna os atributos que tenham sido preenchidos a partir do DB.
Você pode sobrescrever `fields()` para adicionar, remover, renomear ou redefinir campos. O valor do retorno de `fields()` deve ser um array. As chaves do array são os nomes dos campos e os valores são as definições dos campos correspondentes, que podem ser tanto nomes de propriedade/atributo ou funções anônimas retornando o valor do campo correspondente. No caso especial de um nome de um campo for o mesmo que sua definição de nome de atributo, você pode omitir a chave do array. Por exemplo:
```php
// explicitamente lista todos os campos,
// melhor usado quando você quer ter certeza de que as alterações
// na sua tabela ou atributo do model não causaram alterações
// nos seus campos (Manter compatibilidade da API).
public function fields()
{
return [
// Nome do campo é igual ao nome do atributo
'id',
// nome do campo é "email", o nome do atributo correspondente é "email_address"
'email' => 'email_address',
// nome do campo é "name", seu valor é definido por um PHP callback
'name' => function ($model) {
return $model->first_name . ' ' . $model->last_name;
},
];
}
// filtrar alguns campos, melhor usado quando você deseja herdar a implementação do pai
// e deseja esconder alguns campos confidenciais.
public function fields()
{
$fields = parent::fields();
// remove campos que contém informações confidenciais
unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']);
return $fields;
}
```
> Aviso: Como o padrão é ter todos os atributos de um model incluídos
> no resultados da API, você deve examinar os seus dados para certificar-se de que
> eles não contenham informações confidenciais.
> Se existirem tais informações, você deve sobrescrever `fields()` para filtrá-los.
> No exemplo acima, nós escolhemos filtrar `auth_key`,
> `password_hash` e `password_reset_token`.
### Sobrescrevendo `extraFields()` <span id="overriding-extra-fields"></span>
Por padrão, o [[yii\base\Model::extraFields()]] não retorna nada, enquanto o [[yii\db\ActiveRecord::extraFields()]] retorna os nomes das relações que foram populadas a partir do DB.
O formato do retorno dos dados do `extraFields()` é o mesmo de `fields()`. Geralmente, `extraFields()` é mais usado para especificar os campos cujos valores são objetos. Por exemplo, dada a seguinte declaração de campo,
```php
public function fields()
{
return ['id', 'email'];
}
public function extraFields()
{
return ['profile'];
}
```
o request com `http://localhost/users?fields=id,email&expand=profile` pode retornar o seguinte dados em formato JSON:
```php
[
{
"id": 100,
"email": "100@example.com",
"profile": {
"id": 100,
"age": 30,
}
},
...
]
```
## Links <span id="links"></span>
[HATEOAS](http://en.wikipedia.org/wiki/HATEOAS) é uma abreviação de “Hypermedia as the Engine of Application State”, que promove as APIs Restfull retornarem informações para permitir aos clientes descobrirem quais ações são suportadas pelos recursos retornados. O sentido de HATEOAS é retornar um conjunto de hiperlinks em relação às informações quando os recursos de dados são servidos pelas APIs.
Suas classes de recursos podem suportar HATEOAS implementando a interface [[yii\web\Linkable]]. Esta interface contém um único método [[yii\web\Linkable::getLinks()|getLinks()]] que deve retornar uma lista de [[yii\web\Link|links]].
Tipicamente, você deve retornar pelo menos o link `self` representando a URL para o mesmo objeto de recurso. Por exemplo:
```php
use yii\db\ActiveRecord;
use yii\web\Link;
use yii\web\Linkable;
use yii\helpers\Url;
class User extends ActiveRecord implements Linkable
{
public function getLinks()
{
return [
Link::REL_SELF => Url::to(['user/view', 'id' => $this->id], true),
];
}
}
```
Quando o objeto `User` for retornado em uma resposta, será composto de um elemento `_links` representando os links relacionados ao *user*, por exemplo:
```
{
"id": 100,
"email": "user@example.com",
// ...
"_links" => {
"self": {
"href": "https://example.com/users/100"
}
}
}
```
## Collections (Coleções) <span id="collections"></span>
Objetos de recursos podem ser agrupados em *collections*. Cada collection contém uma lista de objetos de recurso do mesmo tipo.
Embora os collections podem ser representados como arrays, normalmente, é preferível representá-los como [data providers](output-data-providers.md). Isto porque data providers suportam ordenação e paginação de recursos, que é um recurso comumente necessário para APIs RESTful retornarem collections. Por exemplo, ação a seguir retorna um data provider sobre o recurso *post*:
```php
namespace app\controllers;
use yii\rest\Controller;
use yii\data\ActiveDataProvider;
use app\models\Post;
class PostController extends Controller
{
public function actionIndex()
{
return new ActiveDataProvider([
'query' => Post::find(),
]);
}
}
```
Quando um data provider está enviando uma resposta com a API RESTful, o [[yii\rest\Serializer]] pegará a página atual de recursos e a serializa como um array de objetos de recurso. Adicionalmente, o [[yii\rest\Serializer]] também incluirá as informações de paginação pelo seguinte cabeçalho HTTP:
* `X-Pagination-Total-Count`: O número total de recursos;
* `X-Pagination-Page-Count`: O número de páginas;
* `X-Pagination-Current-Page`: A página atual (a primeira página é 1);
* `X-Pagination-Per-Page`: O numero de recursos em cada página;
* `Link`: Um conjunto de links de navegação, permitindo que o cliente percorra os recursos página por página.
Um exemplo pode ser encontrado na seção [Introdução](rest-quick-start.md#trying-it-out).

139
docs/guide-pt-BR/rest-response-formatting.md

@ -1,139 +0,0 @@
Formatando Respostas
===================
Ao manipular uma requisição da API RESTful, a aplicação normalmente realiza as seguintes etapas que estão relacionadas com a formatação da resposta:
1. Determinar diversos fatores que podem afetar o formato da resposta, tais como tipo de mídia, idioma, versão, etc. Este processo também é conhecido como [negociação de conteúdo (*content negotiation*)](http://en.wikipedia.org/wiki/Content_negotiation).
2. Converter objetos de recursos em arrays, como descrito na seção [Recursos](rest-resources.md). Isto é feito por [[yii\rest\Serializer]].
3. Converte arrays em uma string no formato como determinado pela etapa de negociação de conteúdo. Isto é feito pelos [[yii\web\ResponseFormatterInterface|formatadores de respostas]] registrados na propriedade [[yii\web\Response::formatters|formatters]] do [componente de aplicação](structure-application-components.md) `response`.
## Negociação de Conteúdo <span id="content-negotiation"></span>
O Yii suporta a negociação de conteúdo através do filtro [[yii\filters\ContentNegotiator]]. A classe base de controller API RESTful [[yii\rest\Controller]] está equipado com este filtro sob o nome de `contentNegotiator`. O filtro fornece negociação de formato de resposta, bem como negociação de idioma. Por exemplo, se uma requisição da API RESTful tiver o seguinte cabeçalho,
```
Accept: application/json; q=1.0, */*; q=0.1
```
ele obterá uma resposta em formato JSON, como o seguinte:
```
$ curl -i -H "Accept: application/json; q=1.0, */*; q=0.1" "http://localhost/users"
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
X-Powered-By: PHP/5.4.20
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
[
{
"id": 1,
...
},
{
"id": 2,
...
},
...
]
```
Por baixo dos panos, antes de uma ação do controlador API RESTful ser executada, o filtro [[yii\filters\ContentNegotiator]] verificará o `Accept` do cabeçalho HTTP na requisição e definirá o [[yii\web\Response::format|response format]] para `'json'`. Após a ação ser executada e retornar o objeto resultante de recursos ou coleção, [[yii\rest\Serializer]] converterá o resultado em um array. E finalmente, [[yii\web\JsonResponseFormatter]] irá serializar o array em uma string JSON e incluí-la no corpo da resposta.
Por padrão, APIs RESTful suportam tanto os formatos JSON quanto XML. Para suportar um novo formato, você deve configurar a propriedade [[yii\filters\ContentNegotiator::formats|formats]] do filtro `contentNegotiator` como mostrado no exemplo a seguir em suas classes do controlador da API:
```php
use yii\web\Response;
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_HTML;
return $behaviors;
}
```
As chaves da propriedade `formats` são os tipos MIME suportados, enquanto os valores são os nomes de formato de resposta correspondentes que devem ser suportados em
[[yii\web\Response::formatters]].
## Serializando Dados <span id="data-serializing"></span>
Como foi descrito acima, [[yii\rest\Serializer]] é a peça central responsável pela conversão de objetos de recursos ou coleções em arrays. Ele reconhece objetos que implementam a interface [[yii\base\ArrayableInterface]] bem como [[yii\data\DataProviderInterface]]. O primeiro é aplicado principalmente pelos objetos de recursos, enquanto o último se aplica mais a coleções de recursos.
Você pode configurar o serializador, definindo a propriedade [[yii\rest\Controller::serializer]] com um array de configuração.
Por exemplo, às vezes você pode querer ajudar a simplificar o trabalho de desenvolvimento do cliente, incluindo informações de paginação diretamente no corpo da resposta. Para fazê-lo, configure a propriedade [[yii\rest\Serializer::collectionEnvelope]] como a seguir:
```php
use yii\rest\ActiveController;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
public $serializer = [
'class' => 'yii\rest\Serializer',
'collectionEnvelope' => 'items',
];
}
```
Você pode, então, obter a seguinte resposta para a url `http://localhost/users`:
```
HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
X-Powered-By: PHP/5.4.20
X-Pagination-Total-Count: 1000
X-Pagination-Page-Count: 50
X-Pagination-Current-Page: 1
X-Pagination-Per-Page: 20
Link: <http://localhost/users?page=1>; rel=self,
<http://localhost/users?page=2>; rel=next,
<http://localhost/users?page=50>; rel=last
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8
{
"items": [
{
"id": 1,
...
},
{
"id": 2,
...
},
...
],
"_links": {
"self": {
"href": "http://localhost/users?page=1"
},
"next": {
"href": "http://localhost/users?page=2"
},
"last": {
"href": "http://localhost/users?page=50"
}
},
"_meta": {
"totalCount": 1000,
"pageCount": 50,
"currentPage": 1,
"perPage": 20
}
}
```

85
docs/guide-pt-BR/rest-routing.md

@ -1,85 +0,0 @@
Roteamento
=======
Com as classes de recurso e controller prontas, você pode acessar os recursos utilizando uma URL como `http://localhost/index.php?r=user/create`, semelhante ao que você pode fazer com aplicações Web normais.
Na prática, normalmente você desejará utilizar URLs amigáveis e tirar proveito dos métodos HTTP.
Por exemplo, uma requisição `POST /users` seria o mesmo que a ação `user/create`.
Isto pode ser feito facilmente através da configuração do [componente de aplicação](structure-application-components.md) `urlManager` conforme mostrado a seguir:
```php
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => 'user'],
],
]
```
Em comparação com o gerenciamento de URL para aplicações Web, a principal novidade acima é o uso de [[yii\rest\UrlRule]] para rotear requisições API RESTful. Esta classe especial criará um conjunto de regras de URL filhas para dar suporte ao roteamento e a criação de URL para o controller especificado.
Por exemplo, o código acima é mais ou menos equivalente às seguintes regras:
```php
[
'PUT,PATCH users/<id>' => 'user/update',
'DELETE users/<id>' => 'user/delete',
'GET,HEAD users/<id>' => 'user/view',
'POST users' => 'user/create',
'GET,HEAD users' => 'user/index',
'users/<id>' => 'user/options',
'users' => 'user/options',
]
```
E as seguintes URLs (também chamadas de *endpoints*) da API são suportados por esta regra:
* `GET /users`: lista todos os usuários página por página;
* `HEAD /users`: mostrar a informações gerais da listagem de usuários;
* `POST /users`: cria um novo usuário;
* `GET /users/123`: retorna detalhes do usuário 123;
* `HEAD /users/123`: mostrar a informações gerais do usuário 123;
* `PATCH /users/123` and `PUT /users/123`: atualiza o usuário 123;
* `DELETE /users/123`: deleta o usuário 123;
* `OPTIONS /users`: exibe os métodos suportados pela URL `/users`;
* `OPTIONS /users/123`: exibe os métodos suportados pela URL `/users/123`.
Você pode configurar as opções `only` e `except` para listar explicitamente quais ações são suportadas ou quais ações devem ser desativadas, respectivamente. Por exemplo,
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'except' => ['delete', 'create', 'update'],
],
```
Você também pode configurar `patterns` ou `extraPatterns` para redefinir padrões existentes ou adicionar novos padrões suportados por esta regra. Por exemplo, para acessar a uma nova ação `search` pela URL `GET /users/search`, configure a opção `extraPatterns` como a seguir,
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => 'user',
'extraPatterns' => [
'GET search' => 'search',
],
]
```
Você deve ter notado que o ID `user` de controller aparece no plural como `users` na extremidade das URLs. Isto acontece porque [[yii\rest\UrlRule]] pluraliza os IDs de controllers automaticamente na criação de regras de URLs filhas.
Você pode desabilitar este comportamento configurando [[yii\rest\UrlRule::pluralize]] para `false`.
> Observação: A pluralização dos IDs de controllers são feitas pelo método [[yii\helpers\Inflector::pluralize()]]. O método respeita as regras especiais de pluralização. Por exemplo, a palavra `box` será pluralizada para `boxes` em vez de `boxs`.
Caso a pluralização automática não encontre uma opção para a palavra requerida, você pode configurar a propriedade [[yii\rest\UrlRule::controller]] para especificar explicitamente como mapear um nome para ser usado como uma URL para um ID de controller. Por exemplo, o seguinte código mapeia o nome `u` para o ID `user` de controller.
```php
[
'class' => 'yii\rest\UrlRule',
'controller' => ['u' => 'user'],
]
```

94
docs/guide-pt-BR/rest-versioning.md

@ -1,94 +0,0 @@
Versionamento
==========
Uma boa API é *versionada*: Mudanças e novos recursos são implementados em novas versões da API em vez de alterar continuamente apenas uma versão. Diferente de aplicações Web, com a qual você tem total controle do código de ambos os lados cliente e servidor, APIs são destinadas a ser utilizadas por clientes além de seu controle. Por esta razão, a compatibilidade (BC) entre as APIs deve ser mantida sempre que possível. Se uma mudança que pode quebrar esta compatibilidade é necessária, você deve introduzi-la em uma nova versão de API e subir o número da versão. Os clientes existentes podem continuar a usar a versão antiga da API; e os clientes novos ou atualizados podem obter a nova funcionalidade na nova versão da API.
> Dica: Consulte o artigo [Semantic Versioning](http://semver.org/) para obter mais informações sobre como projetar números de versão da API.
Uma maneira comum de implementar versionamento de API é incorporar o número da versão nas URLs da API. Por exemplo, `http://example.com/v1/users` representa o terminal `/users` da API versão 1.
Outro método de versionamento de API, que tem sido muito utilizado recentemente, é colocar o número da versão nos cabeçalhos das requisições HTTP. Isto é tipicamente feito através do cabeçalho `Accept`:
```
// Através de um parâmetro
Accept: application/json; version=v1
// através de um vendor content type
Accept: application/vnd.company.myapp-v1+json
```
Ambos os métodos tem seus prós e contras, e há uma série de debates sobre cada abordagem. A seguir, você verá uma estratégia prática para o controle de versão de API que é uma mistura dos dois métodos:
* Coloque cada versão principal de implementação da API em um módulo separado cuja identificação é o número de versão principal (ex. `v1`, `v2`). Naturalmente, as URLs da API irão conter os números da versão principal.
* Dentro de cada versão principal (e, assim, dentro do módulo correspondente), utilize o cabeçalho `Accept` da requisição HTTP para determinar o número de versão secundária e escrever código condicional para responder às versões menores em conformidade.
Para cada módulo destinado a uma versão principal, deve incluir o recurso e a classe de controller destinados a esta versão específica.
Para melhor separar a responsabilidade do código, você pode manter um conjunto comum de classes base de recursos e de controller e criar subclasses delas para cada versão individual do módulo. Dentro das subclasses, implementar o código concreto, tais como `Model::fields()`.
Seu código pode ser organizado da seguinte maneira:
```
api/
common/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
modules/
v1/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
Module.php
v2/
controllers/
UserController.php
PostController.php
models/
User.php
Post.php
Module.php
```
A configuração da sua aplicação seria algo como:
```php
return [
'modules' => [
'v1' => [
'class' => 'app\modules\v1\Module',
],
'v2' => [
'class' => 'app\modules\v2\Module',
],
],
'components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
['class' => 'yii\rest\UrlRule', 'controller' => ['v1/user', 'v1/post']],
['class' => 'yii\rest\UrlRule', 'controller' => ['v2/user', 'v2/post']],
],
],
],
];
```
Como resultado do código acima, `http://example.com/v1/users` retornará a lista de usuários na versão 1, enquanto `http://example.com/v2/users` retornará a lista de usuários na versão 2.
Graças aos módulos, o código para diferentes versões principais pode ser bem isolado. Entretanto esta abordagem torna possível a reutilização de código entre os módulos através de classes bases comuns e outros recursos partilhados.
Para lidar com números de subversões, você pode tirar proveito da negociação de conteúdo oferecida pelo behavior [[yii\filters\ContentNegotiator|contentNegotiator]]. O behavior `contentNegotiator` irá configurar a propriedade [[yii\web\Response::acceptParams]] que determinará qual versão é suportada.
Por exemplo, se uma requisição é enviada com o cabeçalho HTTP `Accept: application/json; version=v1`, Após a negociação de conteúdo, [[yii\web\Response::acceptParams]] terá o valor `['version' => 'v1']`.
Com base na informação da versão em `acceptParams`, você pode escrever um código condicional em lugares tais como ações, classes de recursos, serializadores, etc. para fornecer a funcionalidade apropriada.
Uma vez que subversões por definição devem manter compatibilidades entre si, esperamos que não haja muitas verificações de versão em seu código. De outra forma, você pode precisar criar uma nova versão principal.

6
docs/guide-pt-BR/security-authorization.md

@ -20,7 +20,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['login', 'logout', 'signup'],
'rules' => [
[
@ -59,7 +59,7 @@ Você pode personalizar este behavior configurando a propriedade [[yii\filters\
```php
[
'class' => AccessControl::className(),
'class' => AccessControl::class,
...
'denyCallback' => function ($rule, $action) {
throw new \Exception('Você não está autorizado a acessar esta página');
@ -103,7 +103,7 @@ class SiteController extends Controller
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['special-callback'],
'rules' => [
[

5
docs/guide-pt-BR/start-installation.md

@ -148,10 +148,7 @@ Configurando os Servidores Web <span id="configuring-web-servers"></span>
A aplicação instalada de acordo com as instruções acima deve funcionar imediatamente
com um [Servidor HTTP Apache](http://httpd.apache.org/) ou um [Servidor HTTP Nginx](http://nginx.org/),
no Windows, Mac OS X ou Linux usando PHP 5.4 ou superior. O Yii 2.0 também é compatível
com o [HHVM](http://hhvm.com/) do Facebook, no entanto, existem alguns casos extremos
que o HHVM se comporta diferente no PHP nativo, então, terá que tomar um cuidado
extra quando usar o HHVM.
no Windows, Mac OS X ou Linux usando PHP 5.4 ou superior.
Em um servidor de produção, você pode querer configurar o seu servidor Web de
modo que a aplicação possa ser acessada pela URL `http://www.example.com/index.php`

22
docs/guide-pt-BR/structure-filters.md

@ -140,7 +140,7 @@ public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'class' => AccessControl::class,
'only' => ['create', 'update'],
'rules' => [
// permite aos usuários autenticados
@ -180,7 +180,7 @@ public function behaviors()
{
return [
'basicAuth' => [
'class' => HttpBasicAuth::className(),
'class' => HttpBasicAuth::class,
],
];
}
@ -208,7 +208,7 @@ public function behaviors()
{
return [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -238,7 +238,7 @@ use yii\web\Response;
[
'bootstrap' => [
[
'class' => ContentNegotiator::className(),
'class' => ContentNegotiator::class,
'formats' => [
'application/json' => Response::FORMAT_JSON,
'application/xml' => Response::FORMAT_XML,
@ -270,7 +270,7 @@ public function behaviors()
{
return [
[
'class' => HttpCache::className(),
'class' => HttpCache::class,
'only' => ['index'],
'lastModified' => function ($action, $params) {
$q = new \yii\db\Query();
@ -301,11 +301,11 @@ public function behaviors()
{
return [
'pageCache' => [
'class' => PageCache::className(),
'class' => PageCache::class,
'only' => ['index'],
'duration' => 60,
'dependency' => [
'class' => DbDependency::className(),
'class' => DbDependency::class,
'sql' => 'SELECT COUNT(*) FROM post',
],
'variations' => [
@ -343,7 +343,7 @@ public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'class' => VerbFilter::class,
'actions' => [
'index' => ['get'],
'view' => ['get'],
@ -380,7 +380,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
],
], parent::behaviors());
}
@ -414,7 +414,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],
@ -436,7 +436,7 @@ public function behaviors()
{
return ArrayHelper::merge([
[
'class' => Cors::className(),
'class' => Cors::class,
'cors' => [
'Origin' => ['http://www.myserver.net'],
'Access-Control-Request-Method' => ['GET', 'HEAD', 'OPTIONS'],

2
docs/guide-pt-BR/tutorial-core-validators.md

@ -244,7 +244,7 @@ Este validador verifica se o dados de entrada é um arquivo válido.
- `maxFiles`: o número máximo de arquivos que o atributo pode receber. O padrão é 1, ou seja, a entrada de dados deve ser composto de um único arquivo. Se o `maxFiles` for maior que 1, então a entrada de dados deve ser composto por um array constituído de no máximo `maxFiles` arquivos.
- `checkExtensionByMimeType`: verificação da extensão do arquivo por tipo MIME do arquivo. Se a extensão produzido pela verificação do tipo MIME difere da extensão do arquivo carregado, o arquivo será considerado inválido. O padrão é `true`, o que significa realizar tal verificação.
`FileValidator` é usado junto com [[yii\web\UploadedFile]]. Consulte a seção [Upload de Arquivos](input-file-upload.md) para mais informações sobre o upload de arquivos e de uma validação sobre os arquivos carregados.
`FileValidator` é usado junto com [[yii\http\UploadedFile]]. Consulte a seção [Upload de Arquivos](input-file-upload.md) para mais informações sobre o upload de arquivos e de uma validação sobre os arquivos carregados.
## [[yii\validators\FilterValidator|filter]] <span id="filter"></span>

14
docs/guide-ru/README.md

@ -128,20 +128,6 @@ All Rights Reserved.
* [HTTP кэширование](caching-http.md)
Веб-сервисы REST
----------------
* [Быстрый старт](rest-quick-start.md)
* [Ресурсы](rest-resources.md)
* [Контроллеры](rest-controllers.md)
* [Роутинг](rest-routing.md)
* [Форматирование ответа](rest-response-formatting.md)
* [Аутентификация](rest-authentication.md)
* [Ограничение частоты запросов](rest-rate-limiting.md)
* [Версионирование](rest-versioning.md)
* [Обработка ошибок](rest-error-handling.md)
Инструменты разработчика
------------------------

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

@ -102,8 +102,6 @@ Yii поддерживает множество хранилищ кэша:
* [[yii\caching\MemCache]]: использует расширения PHP [memcache](http://php.net/manual/en/book.memcache.php) и [memcached](http://php.net/manual/en/book.memcached.php). Этот вариант может рассматриваться как самый быстрый при работе в распределенных приложениях (например, с несколькими серверами, балансировкой нагрузки и так далее);
* [[yii\redis\Cache]]: реализует компонент кэша на основе [Redis](http://redis.io/), хранилища ключ-значение (требуется Redis версии 2.6.12 или выше);
* [[yii\caching\WinCache]]: использует расширение PHP [WinCache](http://iis.net/downloads/microsoft/wincache-extension) ([смотрите также](http://php.net/manual/en/book.wincache.php));
* [[yii\caching\XCache]] _(deprecated)_: использует расширение PHP [XCache](http://xcache.lighttpd.net/);
* [[yii\caching\ZendDataCache]] _(deprecated)_: использует [Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm).
> Tip: Вы можете использовать разные способы хранения кэша в одном приложении. Общая стратегия заключается в использовании памяти под хранение небольших часто используемых данных (например, статистические данные). Для больших и реже используемых данных (например, содержимое страницы) лучше использовать файлы или базу данных.
@ -123,7 +121,7 @@ Yii поддерживает множество хранилищ кэша:
Если ключ уже существует, то сохранения не происходит;
* [[yii\caching\Cache::exists()|exists()]]: есть ли указанный ключ в кэше;
* [[yii\caching\Cache::delete()|delete()]]: удаляет указанный ключ;
* [[yii\caching\Cache::flush()|flush()]]: удаляет все данные.
* [[yii\caching\Cache::clear()|clear()]]: удаляет все данные.
> Note: Не кэшируйте непосредственно значение `false`, потому что [[yii\caching\Cache::get()|get()]] использует
`false` для случая, когда данные не найдены в кэше. Вы можете обернуть `false` в массив и закэшировать его, чтобы
@ -256,7 +254,7 @@ $result = Customer::getDb()->cache(function ($db) {
Для очистки всего кэша, вы можете вызвать [[yii\caching\Cache::flush()]].
Также вы можете очистить кэш из консоли, вызвав `yii cache/flush`.
Также вы можете очистить кэш из консоли, вызвав `yii cache/clear`.
- `yii cache`: отображает список доступных кэширующих компонентов приложения
- `yii cache/flush cache1 cache2`: очищает кэш в компонентах `cache1`, `cache2` (можно передать несколько названий
компонентов кэширования, разделяя их пробелом)

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

@ -126,21 +126,21 @@ class User extends ActiveRecord
{
return [
// анонимное поведение, прикрепленное по имени класса
MyBehavior::className(),
MyBehavior::class,
// именованное поведение, прикрепленное по имени класса
'myBehavior2' => MyBehavior::className(),
'myBehavior2' => MyBehavior::class,
// анонимное поведение, сконфигурированное с использованием массива
[
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
// именованное поведение, сконфигурированное с использованием массива
'myBehavior4' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]
@ -164,11 +164,11 @@ use app\components\MyBehavior;
$component->attachBehavior('myBehavior1', new MyBehavior);
// прикрепляем по имени класса поведения
$component->attachBehavior('myBehavior2', MyBehavior::className());
$component->attachBehavior('myBehavior2', MyBehavior::class);
// прикрепляем используя массив конфигураций
$component->attachBehavior('myBehavior3', [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
]);
@ -180,7 +180,7 @@ $component->attachBehavior('myBehavior3', [
```php
$component->attachBehaviors([
'myBehavior1' => new MyBehavior, // именованное поведение
MyBehavior::className(), // анонимное поведение
MyBehavior::class, // анонимное поведение
]);
```
@ -188,10 +188,10 @@ $component->attachBehaviors([
```php
[
'as myBehavior2' => MyBehavior::className(),
'as myBehavior2' => MyBehavior::class,
'as myBehavior3' => [
'class' => MyBehavior::className(),
'class' => MyBehavior::class,
'prop1' => 'value1',
'prop2' => 'value2',
],
@ -280,7 +280,7 @@ class User extends ActiveRecord
{
return [
[
'class' => TimestampBehavior::className(),
'class' => TimestampBehavior::class,
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],

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

@ -77,7 +77,7 @@ class MyClass extends BaseObject
$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// альтернативный способ
$component = \Yii::createObject([
'class' => MyClass::className(),
'class' => MyClass::class,
'prop1' => 3,
'prop2' => 4,
], [1, 2]);

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

@ -187,7 +187,7 @@ use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Event::on(ActiveRecord::class, ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
Yii::debug(get_class($event->sender) . ' добавлен');
});
```
@ -201,11 +201,11 @@ Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function
```php
use yii\base\Event;
Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
Event::on(Foo::class, Foo::EVENT_HELLO, function ($event) {
var_dump($event->sender); // выводит "null"
});
Event::trigger(Foo::className(), Foo::EVENT_HELLO);
Event::trigger(Foo::class, Foo::EVENT_HELLO);
```
Обратите внимание, что в данном случае `$event->sender` имеет значение `null` вместо экзепляра класса, который инициировал событие.
@ -216,10 +216,10 @@ Event::trigger(Foo::className(), Foo::EVENT_HELLO);
```php
// отсоединение $handler
Event::off(Foo::className(), Foo::EVENT_HELLO, $handler);
Event::off(Foo::class, Foo::EVENT_HELLO, $handler);
// отсоединяются все обработчики Foo::EVENT_HELLO
Event::off(Foo::className(), Foo::EVENT_HELLO);
Event::off(Foo::class, Foo::EVENT_HELLO);
```
Обработчики событий на уровне интерфейсов <span id="interface-level-event-handlers"></span>
@ -265,7 +265,7 @@ class Developer extends Component implements DanceEventInterface
вызовите [[yii\base\Event::on()|Event:on()]], передав ему в качестве первого параметра имя интерфейса.
```php
Event::on('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, function ($event) {
Event::on(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE, function ($event) {
Yii::debug(get_class($event->sender) . ' just danced'); // Оставит запись в журнале о том, что кто-то танцевал
});
```
@ -274,27 +274,27 @@ Event::on('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE
```php
// trigger event for Dog class
Event::trigger(Dog::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Dog::class), DanceEventInterface::EVENT_DANCE);
// trigger event for Developer class
Event::trigger(Developer::className(), DanceEventInterface::EVENT_DANCE);
Event::trigger(Developer::class, DanceEventInterface::EVENT_DANCE);
```
Однако, невозможно инициализировать событие во всех классах, которые реализуют интерфейс:
```php
// НЕ БУДЕТ РАБОТАТЬ
Event::trigger('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
Event::trigger(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE); // ошибка
```
Отсоединить обработчик события можно с помощью метода [[yii\base\Event::off()|Event::off()]]. Например:
```php
// отсоединяет $handler
Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE, $handler);
Event::off(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE, $handler);
// отсоединяются все обработчики DanceEventInterface::EVENT_DANCE
Event::off('app\interfaces\DanceEventInterface', DanceEventInterface::EVENT_DANCE);
Event::off(DanceEventInterface::class, DanceEventInterface::EVENT_DANCE);
```
Глобальные события <span id="global-events"></span>

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

@ -32,9 +32,6 @@ Yii поддерживает работу с Active Record для следующ
* SQLite 2 и 3: посредством [[yii\db\ActiveRecord]]
* Microsoft SQL Server 2008 и выше: посредством [[yii\db\ActiveRecord]]
* Oracle: посредством [[yii\db\ActiveRecord]]
* CUBRID 9.3 и выше: посредством [[yii\db\ActiveRecord]] (Имейте ввиду, что вследствие
[бага](http://jira.cubrid.org/browse/APIS-658) в PDO-расширении для CUBRID, заключение значений в кавычки не работает,
поэтому необходимо использовать CUBRID версии 9.3 как на клиентской стороне, так и на сервере)
* Sphinx: посредством [[yii\sphinx\ActiveRecord]], потребуется расширение `yii2-sphinx`
* ElasticSearch: посредством [[yii\elasticsearch\ActiveRecord]], потребуется расширение `yii2-elasticsearch`
@ -791,7 +788,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -799,7 +796,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -816,7 +813,7 @@ class Order extends ActiveRecord
что покупатель может иметь много заказов в то время, как заказ может быть сделан лишь одним покупателем.
- название связного Active Record класса: указывается в качестве первого параметра для метода
[[yii\db\ActiveRecord::hasMany()|hasMany()]] или для метода [[yii\db\ActiveRecord::hasOne()|hasOne()]]. Рекомендуется
использовать код `Xyz::className()`, чтобы получить строку с именем класса, при этом вы сможете воспользоваться
использовать код `Xyz::class`, чтобы получить строку с именем класса, при этом вы сможете воспользоваться
возможностями авто-дополнения кода, встроенного в IDE, а также получите обработку ошибок на этапе компиляции.
- связь между двумя типами данных: указываются столбцы с помощью которых два типа данных связаны. Значения массива - это
столбцы основного объекта данных (представлен классом Active Record, в котором объявляется связь), в то время как
@ -892,7 +889,7 @@ class Customer extends ActiveRecord
{
public function getBigOrders($threshold = 100)
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])
return $this->hasMany(Order::class, ['customer_id' => 'id'])
->where('subtotal > :threshold', [':threshold' => $threshold])
->orderBy('id');
}
@ -928,7 +925,7 @@ class Order extends ActiveRecord
{
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->viaTable('order_item', ['order_id' => 'id']);
}
}
@ -941,12 +938,12 @@ class Order extends ActiveRecord
{
public function getOrderItems()
{
return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
return $this->hasMany(OrderItem::class, ['order_id' => 'id']);
}
public function getItems()
{
return $this->hasMany(Item::className(), ['id' => 'item_id'])
return $this->hasMany(Item::class, ['id' => 'item_id'])
->via('orderItems');
}
}
@ -1217,7 +1214,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
@ -1225,7 +1222,7 @@ class Order extends ActiveRecord
{
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
```
@ -1259,7 +1256,7 @@ class Customer extends ActiveRecord
{
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id'])->inverseOf('customer');
return $this->hasMany(Order::class, ['customer_id' => 'id'])->inverseOf('customer');
}
}
```
@ -1372,7 +1369,7 @@ class Customer extends \yii\db\ActiveRecord
public function getComments()
{
// у покупателя может быть много комментариев
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
return $this->hasMany(Comment::class, ['customer_id' => 'id']);
}
}
@ -1387,7 +1384,7 @@ class Comment extends \yii\mongodb\ActiveRecord
public function getCustomer()
{
// комментарий принадлежит одному покупателю
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
return $this->hasOne(Customer::class, ['id' => 'customer_id']);
}
}
@ -1467,7 +1464,7 @@ class Customer extends \yii\db\ActiveRecord
{
public function getActiveComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
return $this->hasMany(Comment::class, ['customer_id' => 'id'])->active();
}
}
@ -1538,7 +1535,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1634,7 +1631,7 @@ class Customer extends \yii\db\ActiveRecord
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
}
```
@ -1665,7 +1662,7 @@ class Customer extends \yii\db\ActiveRecord
*/
public function getOrders()
{
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
return $this->hasMany(Order::class, ['customer_id' => 'id']);
}
/**

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

@ -16,7 +16,6 @@ Yii DAO из коробки поддерживает следующие базы
- [MariaDB](https://mariadb.com/)
- [SQLite](http://sqlite.org/)
- [PostgreSQL](http://www.postgresql.org/): версии 8.4 или выше.
- [CUBRID](http://www.cubrid.org/): версии 9.3 или выше.
- [Oracle](http://www.oracle.com/us/products/database/overview/index.html)
- [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): версии 2008 или выше.
@ -68,7 +67,6 @@ return [
* MySQL, MariaDB: `mysql:host=localhost;dbname=mydatabase`
* SQLite: `sqlite:/path/to/database/file`
* PostgreSQL: `pgsql:host=localhost;port=5432;dbname=mydatabase`
* CUBRID: `cubrid:dbname=demodb;host=localhost;port=33000`
* MS SQL Server (via sqlsrv driver): `sqlsrv:Server=localhost;Database=mydatabase`
* MS SQL Server (via dblib driver): `dblib:host=localhost;dbname=mydatabase`
* MS SQL Server (via mssql driver): `mssql:host=localhost;dbname=mydatabase`

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

Loading…
Cancel
Save