diff --git a/.travis.yml b/.travis.yml index 5bc7658..839abcb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,6 +56,8 @@ matrix: fast_finish: true include: # run tests coverage on PHP 7.1 + - php: 7.2 + - php: 7.1 env: TASK_TESTS_COVERAGE=1 - php: nightly @@ -69,6 +71,7 @@ matrix: allow_failures: - php: nightly + - php: 7.2 install: - | diff --git a/build/controllers/DevController.php b/build/controllers/DevController.php index f5b23dd..796c035 100644 --- a/build/controllers/DevController.php +++ b/build/controllers/DevController.php @@ -14,7 +14,7 @@ use yii\helpers\Console; use yii\helpers\FileHelper; /** - * This command helps to set up a dev environment with all extensions and applications + * This command helps to set up a dev environment with all extensions and applications. * * It will clone an extension or app repo and link the yii2 dev installation to the containted applications/extensions vendor dirs * to help working on yii using the application to test it. @@ -62,7 +62,7 @@ class DevController extends Controller /** - * Install all extensions and advanced + basic app + * Install all extensions and advanced + basic app. */ public function actionAll() { @@ -88,7 +88,7 @@ class DevController extends Controller } /** - * Runs a command in all extension and application directories + * Runs a command in all extension and application directories. * * Can be used to run e.g. `git pull`. * @@ -118,7 +118,7 @@ class DevController extends Controller } /** - * This command installs a project template in the `apps` directory and links the framework and extensions + * This command installs a project template in the `apps` directory and links the framework and extensions. * * It basically runs the following commands in the dev repo root: * @@ -178,7 +178,7 @@ class DevController extends Controller } /** - * This command installs an extension in the `extensions` directory and links the framework and other extensions + * This command installs an extension in the `extensions` directory and links the framework and other extensions. * * @param string $extension the application name e.g. `basic` or `advanced`. * @param string $repo url of the git repo to clone if it does not already exist. @@ -237,12 +237,13 @@ class DevController extends Controller if (in_array($actionID, ['ext', 'app', 'all'], true)) { $options[] = 'useHttp'; } + return $options; } /** - * Remove all symlinks in the vendor subdirectory of the directory specified + * Remove all symlinks in the vendor subdirectory of the directory specified. * @param string $dir base directory */ protected function cleanupVendorDir($dir) @@ -261,7 +262,7 @@ class DevController extends Controller } /** - * Creates symlinks to framework and extension sources for the application + * Creates symlinks to framework and extension sources for the application. * @param string $dir application directory * @param string $base Yii sources base directory * @@ -293,7 +294,7 @@ class DevController extends Controller } /** - * Properly removes symlinked directory under Windows, MacOS and Linux + * Properly removes symlinked directory under Windows, MacOS and Linux. * * @param string $file path to symlink */ @@ -307,7 +308,7 @@ class DevController extends Controller } /** - * Get a list of subdirectories for directory specified + * Get a list of subdirectories for directory specified. * @param string $dir directory to read * * @return array list of subdirectories @@ -336,7 +337,7 @@ class DevController extends Controller } /** - * Finds linkable applications + * Finds linkable applications. * * @param string $dir directory to search in * @return array list of applications command can link diff --git a/build/controllers/MimeTypeController.php b/build/controllers/MimeTypeController.php index 768aac5..8faf653 100644 --- a/build/controllers/MimeTypeController.php +++ b/build/controllers/MimeTypeController.php @@ -13,7 +13,7 @@ use yii\helpers\Console; use yii\helpers\VarDumper; /** - * MimeTypeController generates a map of file extensions to MIME types + * MimeTypeController generates a map of file extensions to MIME types. * * It uses `mime.types` file from apache http located under * http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=markup diff --git a/build/controllers/PhpDocController.php b/build/controllers/PhpDocController.php index 0c716dc..9c7a998 100644 --- a/build/controllers/PhpDocController.php +++ b/build/controllers/PhpDocController.php @@ -13,7 +13,7 @@ use yii\helpers\Console; use yii\helpers\FileHelper; /** - * PhpDocController is there to help maintaining PHPDoc annotation in class files + * PhpDocController is there to help maintaining PHPDoc annotation in class files. * * @author Carsten Brandt * @author Alexander Makarov @@ -34,7 +34,7 @@ class PhpDocController extends Controller /** - * Generates `@property` annotations in class files from getters and setters + * Generates `@property` annotations in class files from getters and setters. * * Property description will be taken from getter or setter or from an `@property` annotation * in the getters docblock if there is one defined. @@ -70,7 +70,7 @@ class PhpDocController extends Controller } /** - * Fix some issues with PHPdoc in files + * Fix some issues with PHPDoc in files. * * @param string $root the directory to parse files from. Defaults to YII2_PATH. */ @@ -243,7 +243,7 @@ class PhpDocController extends Controller } /** - * Fix file PHPdoc + * Fix file PHPDoc. */ protected function fixFileDoc(&$lines) { @@ -284,7 +284,7 @@ class PhpDocController extends Controller } /** - * Markdown aware fix of whitespace issues in doc comments + * Markdown aware fix of whitespace issues in doc comments. */ protected function fixDocBlockIndentation(&$lines) { @@ -350,12 +350,15 @@ class PhpDocController extends Controller case 'boolean': $types[$i] = 'bool'; break; } } + return '@' . $matches[1] . ' ' . implode('|', $types); }, $line); } /** - * Fixes line spacing code style for properties and constants + * Fixes line spacing code style for properties and constants. + * @param string[] $lines + * @return string[] */ protected function fixLineSpacing($lines) { @@ -551,7 +554,7 @@ class PhpDocController extends Controller } /** - * remove multi empty lines and trim trailing whitespace + * remove multi empty lines and trim trailing whitespace. * * @param $doc * @return string @@ -571,7 +574,7 @@ class PhpDocController extends Controller } /** - * Replace property annotations in doc comment + * Replace property annotations in doc comment. * @param $doc * @param $properties * @return string @@ -759,6 +762,7 @@ class PhpDocController extends Controller $sets[] = $set; } } + return $sets; } @@ -768,6 +772,7 @@ class PhpDocController extends Controller if ($str == '') { return ''; } + return strtoupper(substr($str, 0, 1)) . substr($str, 1) . ($str[strlen($str) - 1] != '.' ? '.' : ''); } diff --git a/build/controllers/ReleaseController.php b/build/controllers/ReleaseController.php index 375bc91..bc6857e 100644 --- a/build/controllers/ReleaseController.php +++ b/build/controllers/ReleaseController.php @@ -71,6 +71,7 @@ class ReleaseController extends Controller } elseif ($actionID === 'info') { $options[] = 'update'; } + return array_merge(parent::options($actionID), $options); } @@ -140,6 +141,7 @@ class ReleaseController extends Controller $w = $l; } } + return $w; } @@ -367,6 +369,7 @@ class ReleaseController extends Controller /** * @param array $what list of items * @param array $limit list of things to allow, or empty to allow any, can be `app`, `framework`, `extension` + * @param bool $ensureGitClean * @throws \yii\base\Exception */ protected function validateWhat(array $what, $limit = [], $ensureGitClean = true) @@ -434,11 +437,11 @@ class ReleaseController extends Controller $this->dryRun || Yii::$app->runAction('mime-type', ["$frameworkPath/helpers/mimeTypes.php"]); $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD); - $this->stdout("fixing various PHPdoc style issues...\n", Console::BOLD); + $this->stdout("fixing various PHPDoc style issues...\n", Console::BOLD); $this->dryRun || Yii::$app->runAction('php-doc/fix', [$frameworkPath]); $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD); - $this->stdout("updating PHPdoc @property annotations...\n", Console::BOLD); + $this->stdout("updating PHPDoc @property annotations...\n", Console::BOLD); $this->dryRun || Yii::$app->runAction('php-doc/property', [$frameworkPath]); $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD); @@ -558,13 +561,13 @@ class ReleaseController extends Controller // adjustments - $this->stdout("fixing various PHPdoc style issues...\n", Console::BOLD); + $this->stdout("fixing various PHPDoc style issues...\n", Console::BOLD); $this->setAppAliases($name, $path); $this->dryRun || Yii::$app->runAction('php-doc/fix', [$path, 'skipFrameworkRequirements' => true]); $this->resetAppAliases(); $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD); - $this->stdout("updating PHPdoc @property annotations...\n", Console::BOLD); + $this->stdout("updating PHPDoc @property annotations...\n", Console::BOLD); $this->setAppAliases($name, $path); $this->dryRun || Yii::$app->runAction('php-doc/property', [$path, 'skipFrameworkRequirements' => true]); $this->resetAppAliases(); @@ -676,11 +679,11 @@ class ReleaseController extends Controller // adjustments - $this->stdout("fixing various PHPdoc style issues...\n", Console::BOLD); + $this->stdout("fixing various PHPDoc style issues...\n", Console::BOLD); $this->dryRun || Yii::$app->runAction('php-doc/fix', [$path]); $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD); - $this->stdout("updating PHPdoc @property annotations...\n", Console::BOLD); + $this->stdout("updating PHPDoc @property annotations...\n", Console::BOLD); $this->dryRun || Yii::$app->runAction('php-doc/property', [$path]); $this->stdout("done.\n", Console::FG_GREEN, Console::BOLD); @@ -846,7 +849,10 @@ class ReleaseController extends Controller } /** - * Extract changelog content for a specific version + * Extract changelog content for a specific version. + * @param string $file + * @param string $version + * @return array */ protected function splitChangelog($file, $version) { @@ -875,11 +881,14 @@ class ReleaseController extends Controller ${$state}[] = $line; } } + return [$start, $changelog, $end]; } /** - * Ensure sorting of the changelog lines + * Ensure sorting of the changelog lines. + * @param string[] $changelog + * @return string[] */ protected function resortChangelog($changelog) { @@ -895,6 +904,7 @@ class ReleaseController extends Controller $o = ['Bug' => 'C', 'Enh' => 'D', 'Chg' => 'E', 'New' => 'F']; return $o[$m[1]] . ' ' . (!empty($m[2]) ? $m[2] : 'AAAA' . $i++); } + return 'B' . $i++; }, SORT_ASC, SORT_NATURAL); @@ -929,6 +939,7 @@ class ReleaseController extends Controller return true; } } + return false; }); } @@ -1001,6 +1012,7 @@ class ReleaseController extends Controller rsort($tags, SORT_NATURAL); // TODO this can not deal with alpha/beta/rc... $versions[$ext] = reset($tags); } + return $versions; } @@ -1034,6 +1046,7 @@ class ReleaseController extends Controller } $versions[$k] = implode('.', $parts); } + return $versions; } } diff --git a/build/controllers/TranslationController.php b/build/controllers/TranslationController.php index 9adc9c9..0200ad9 100644 --- a/build/controllers/TranslationController.php +++ b/build/controllers/TranslationController.php @@ -83,7 +83,7 @@ class TranslationController extends Controller } /** - * Checks for files existence + * Checks for files existence. * * @param string $translatedFilePath * @param string $sourceFilePath @@ -104,7 +104,7 @@ class TranslationController extends Controller } /** - * Getting DIFF from git + * Getting DIFF from git. * * @param string $translatedFilePath path pointing to translated file * @param string $sourceFilePath path pointing to original file @@ -117,7 +117,7 @@ class TranslationController extends Controller } /** - * Adds all necessary HTML tags and classes to diff output + * Adds all necessary HTML tags and classes to diff output. * * @param string $diff DIFF * @return string highlighted DIFF diff --git a/build/controllers/Utf8Controller.php b/build/controllers/Utf8Controller.php index 133928a..64e8c0a 100644 --- a/build/controllers/Utf8Controller.php +++ b/build/controllers/Utf8Controller.php @@ -96,7 +96,7 @@ class Utf8Controller extends Controller } /** - * Equvalent for ord() just for unicode + * Equivalent for ord() just for unicode. * * http://stackoverflow.com/a/10333324/1106908 * diff --git a/composer.json b/composer.json index 06bd6e4..05f7396 100644 --- a/composer.json +++ b/composer.json @@ -78,7 +78,7 @@ "psr/http-message": "~1.0.0", "ezyang/htmlpurifier": "~4.6", "cebe/markdown": "~1.0.0 | ~1.1.0", - "bower-asset/jquery": "2.2.*@stable | 2.1.*@stable | 1.11.*@stable | 1.12.*@stable", + "bower-asset/jquery": "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" diff --git a/cs/src/YiiConfig.php b/cs/src/YiiConfig.php index 0ff0ebf..4e2e28f 100644 --- a/cs/src/YiiConfig.php +++ b/cs/src/YiiConfig.php @@ -95,7 +95,7 @@ class YiiConfig extends Config 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, -// 'non_printable_character' => true, // breaks Formatter::asCurrency() tests + 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, // 'ordered_class_elements' => [ // needs more discussion @@ -124,9 +124,7 @@ class YiiConfig extends Config 'php_unit_dedicate_assert' => true, 'php_unit_fqcn_annotation' => true, // 'php_unit_strict' => true, // needs more attention -// 'phpdoc_add_missing_param_annotation' => [ // needs more attention -// 'only_untyped' => false, -// ], + 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_indent' => true, // 'phpdoc_inline_tag' => true, // see https://github.com/yiisoft/yii2/issues/11635 'phpdoc_no_access' => true, @@ -137,10 +135,10 @@ class YiiConfig extends Config 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_single_line_var_spacing' => true, -// 'phpdoc_summary' => true, // needs more attention (summary should be separated by blank line from description) + 'phpdoc_summary' => true, // 'phpdoc_to_comment' => true, // breaks phpdoc for define('CONSTANT', $value); 'phpdoc_trim' => true, -// 'phpdoc_types' => true, // conflicts with yii\base\Object typehits https://github.com/yiisoft/yii2/pull/12699 + 'phpdoc_types' => true, 'phpdoc_var_without_name' => true, 'protected_to_private' => true, 'psr4' => true, diff --git a/docs/guide-es/caching-data.md b/docs/guide-es/caching-data.md index b07eaef..b699742 100644 --- a/docs/guide-es/caching-data.md +++ b/docs/guide-es/caching-data.md @@ -96,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 diff --git a/docs/guide-fr/caching-data.md b/docs/guide-fr/caching-data.md index 6302394..d3cd58d 100644 --- a/docs/guide-fr/caching-data.md +++ b/docs/guide-fr/caching-data.md @@ -122,7 +122,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 +254,7 @@ $result = Customer::getDb()->cache(function ($db) { ### Vidage du cache -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 diff --git a/docs/guide-fr/output-data-widgets.md b/docs/guide-fr/output-data-widgets.md index d41eb1a..b5fa958 100644 --- a/docs/guide-fr/output-data-widgets.md +++ b/docs/guide-fr/output-data-widgets.md @@ -586,7 +586,7 @@ class UserView extends ActiveRecord /** * @inheritdoc */ - public static function attributeLabels() + public function attributeLabels() { return [ // définissez vos étiquettes d'attribut ici diff --git a/docs/guide-ja/caching-data.md b/docs/guide-ja/caching-data.md index 840c0f2..c521424 100644 --- a/docs/guide-ja/caching-data.md +++ b/docs/guide-ja/caching-data.md @@ -129,7 +129,7 @@ Yii はさまざまなキャッシュストレージをサポートしていま * [[yii\caching\Cache::multiAdd()|multiAdd()]]: キャッシュに複数のデータを格納します。各データはキーによって識別されます。もしキャッシュ内にキーがすでに存在する場合はスキップされます。 * [[yii\caching\Cache::exists()|exists()]]: 指定されたキーがキャッシュ内で見つかったかどうかを示す値を返します。 * [[yii\caching\Cache::delete()|delete()]]: キャッシュからキーによって識別されるデータを削除します。 -* [[yii\caching\Cache::flush()|flush()]]: キャッシュからすべてのデータを削除します。 +* [[yii\caching\Cache::clear()|clear()]]: キャッシュからすべてのデータを削除します。 > Note: [[yii\caching\Cache::get()|get()]] メソッドは、データがキャッシュ内に見つからないことを示すために戻り値として false を使用しているので、直接 boolean 型の `false` をキャッシュしないでください。 代りに配列内に `false` を置いてキャッシュすることによって、この問題を回避できます。 @@ -278,7 +278,7 @@ $result = Customer::getDb()->cache(function ($db) { ### キャッシュのフラッシュ -保存されている全てのキャッシュデータを無効化する必要がある場合は、[[yii\caching\Cache::flush()]] を呼ぶことが出来ます。 +保存されている全てのキャッシュデータを無効化する必要がある場合は、[[yii\caching\Cache::clear()]] を呼ぶことが出来ます。 コンソールから `yii cache/flush` を呼ぶことによっても、キャッシュをフラッシュすることが出来ます。 - `yii cache`: アプリケーションで利用可能なキャッシュのリストを表示します。 diff --git a/docs/guide-ja/db-active-record.md b/docs/guide-ja/db-active-record.md index 422bd22..590e0f2 100644 --- a/docs/guide-ja/db-active-record.md +++ b/docs/guide-ja/db-active-record.md @@ -1363,7 +1363,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']); } } @@ -1553,7 +1553,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']); } /** diff --git a/docs/guide-ja/output-client-scripts.md b/docs/guide-ja/output-client-scripts.md index aae33b2..c587b71 100644 --- a/docs/guide-ja/output-client-scripts.md +++ b/docs/guide-ja/output-client-scripts.md @@ -97,7 +97,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'); ``` diff --git a/docs/guide-ja/output-data-widgets.md b/docs/guide-ja/output-data-widgets.md index 8cedf18..b5367ea 100644 --- a/docs/guide-ja/output-data-widgets.md +++ b/docs/guide-ja/output-data-widgets.md @@ -662,7 +662,7 @@ class UserView extends ActiveRecord /** * @inheritdoc */ - public static function attributeLabels() + public function attributeLabels() { return [ // ここで属性のラベルを定義 diff --git a/docs/guide-pl/db-active-record.md b/docs/guide-pl/db-active-record.md index 7cbfbb7..2d2a686 100644 --- a/docs/guide-pl/db-active-record.md +++ b/docs/guide-pl/db-active-record.md @@ -1376,7 +1376,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']); } } @@ -1565,7 +1565,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']); } /** diff --git a/docs/guide-pt-BR/caching-data.md b/docs/guide-pt-BR/caching-data.md index 29b022a..19cb533 100644 --- a/docs/guide-pt-BR/caching-data.md +++ b/docs/guide-pt-BR/caching-data.md @@ -119,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. diff --git a/docs/guide-ru/caching-data.md b/docs/guide-ru/caching-data.md index f98cf41..8e06102 100644 --- a/docs/guide-ru/caching-data.md +++ b/docs/guide-ru/caching-data.md @@ -121,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` в массив и закэшировать его, чтобы @@ -252,9 +252,9 @@ $result = Customer::getDb()->cache(function ($db) { ### Очистка кэша -Для очистки всего кэша, вы можете вызвать [[yii\caching\Cache::flush()]]. +Для очистки всего кэша, вы можете вызвать [[yii\caching\Cache::clear()]]. -Также вы можете очистить кэш из консоли, вызвав `yii cache/flush`. +Также вы можете очистить кэш из консоли, вызвав `yii cache/clear`. - `yii cache`: отображает список доступных кэширующих компонентов приложения - `yii cache/flush cache1 cache2`: очищает кэш в компонентах `cache1`, `cache2` (можно передать несколько названий компонентов кэширования, разделяя их пробелом) diff --git a/docs/guide-ru/concept-service-locator.md b/docs/guide-ru/concept-service-locator.md index 7680d05..1c6ab96 100644 --- a/docs/guide-ru/concept-service-locator.md +++ b/docs/guide-ru/concept-service-locator.md @@ -62,7 +62,7 @@ $cache = $locator->cache; Поскольку Service Locator часто используется с [конфигурациями](concept-configurations.md), в нём имеется доступное для записи свойство [[yii\di\ServiceLocator::setComponents()|components]]. Это позволяет настроить и зарегистрировать сразу несколько компонентов. Следующий код демонстрирует конфигурационный массив, который может использоваться -для регистрации компонентов `db`, `cache` и `search` в Service Locator (то есть в [приложении](structure-applications.md)): +для регистрации компонентов `db`, `cache`, `tz` и `search` в Service Locator (то есть в [приложении](structure-applications.md)): ```php return [ @@ -75,6 +75,9 @@ return [ 'password' => '', ], 'cache' => 'yii\caching\ApcCache', + 'tz' => function() { + return new \DateTimeZone(Yii::$app->formatter->defaultTimeZone); + }, 'search' => function () { $solr = new app\components\SolrService('127.0.0.1'); // ... дополнительная инициализация ... diff --git a/docs/guide-ru/output-data-widgets.md b/docs/guide-ru/output-data-widgets.md index 11d7b66..71f173a 100644 --- a/docs/guide-ru/output-data-widgets.md +++ b/docs/guide-ru/output-data-widgets.md @@ -644,7 +644,7 @@ class UserView extends ActiveRecord /** * @inheritdoc */ - public static function attributeLabels() + public function attributeLabels() { return [ // здесь определяйте ваши метки атрибутов diff --git a/docs/guide-ru/structure-applications.md b/docs/guide-ru/structure-applications.md index 47c4e66..0045c19 100644 --- a/docs/guide-ru/structure-applications.md +++ b/docs/guide-ru/structure-applications.md @@ -136,12 +136,12 @@ ID в качестве элемента данного свойства. > будет использован компонент приложения. Если Вы вместо этого хотите использовать модуль, то можете указать его при > помощи анонимной функции похожей на эту: > ```php -[ - function () { - return Yii::$app->getModule('user'); - }, -] -``` +> [ +> function () { +> return Yii::$app->getModule('user'); +> }, +> ] +> ``` В процессе [начальной загрузки](runtime-bootstrapping.md), каждый компонент будет создан. Если класс компонента имеет интерфейс [[yii\base\BootstrapInterface]], то также будет вызван метод [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]]. diff --git a/docs/guide-ru/test-overview.md b/docs/guide-ru/test-overview.md index 9486dcd..3c7668e 100644 --- a/docs/guide-ru/test-overview.md +++ b/docs/guide-ru/test-overview.md @@ -1,21 +1,15 @@ Тестирование ============ -Тестирование является важной составляющей разработки программного обеспечения. Мы проводим тестирование непрерывно, осознаем мы это или нет. -Например, когда мы пишем класс на языке PHP, мы можем отлаживать его шаг за шагом или просто использовать `echo` или `die` для проверки, что -реализация работает в соответствии с намеченным планом. В случае веб приложения, мы вводим некоторые тестовые данные в форму для того, чтобы -убедиться, что страница взаимодействует с нами, как ожидается. - -Процесс тестирования может быть автоматизирован так, что каждый раз когда нам нужно что-то проверить, мы просто должны -вызвать код, который сделает это за нас. Код, который проверяет, что результат совпадает с тем, что мы планировали, называется тестом, а процесс -создания тестов и их последующего использования - автоматизированным тестированием, что и является главной темой данного раздела. +Тестирование является важной составляющей разработки программного обеспечения. Мы проводим тестирование непрерывно, осознаем мы это или нет. Например, когда мы пишем класс на языке PHP, мы можем отлаживать его шаг за шагом или просто использовать `echo` или `die` для проверки, что реализация работает в соответствии с намеченным планом. В случае веб приложения, мы вводим некоторые тестовые данные в форму для того, чтобы убедиться, что страница взаимодействует с нами, как ожидается. +Процесс тестирования может быть автоматизирован так, что каждый раз, когда нам нужно что-то проверить, мы просто должны +вызвать код, который сделает это за нас. Код, который проверяет, что результат совпадает с тем, что мы планировали, называется тестом, а процесс создания тестов и их последующего использования - автоматизированным тестированием, что и является главной темой данного раздела. Разработка с тестами -------------------- -Разработка через тестирование (TDD) и разработка через поведение (BDD) - это подходы разработки программного обеспечения, в рамках которых -поведение части кода или целая фича описывается в виде набора сценариев или тестов ДО написания фактического кода и только +Разработка через тестирование (TDD) и разработка через поведение (BDD) - это подходы разработки программного обеспечения, в рамках которых поведение части кода или целая фича описывается в виде набора сценариев или тестов ДО написания фактического кода и только затем создается реализация. Тем самым мы можем использовать данные тесты для проверки, что достигается заданное поведение. Процесс разработки фичи следующий: @@ -26,8 +20,7 @@ - Запустить все тесты и убедиться, что они отрабатывают без ошибок - Улучшить код и убедиться, что все тесты все еще отрабатывают без ошибок -После того как это завершено процесс повторяется снова для другой фичи или улучшения. Если существующая фича должна быть изменена, то и тесты -также должны быть изменены. +После того как это завершено, процесс повторяется снова для другой фичи или улучшения. Если существующая фича должна быть изменена, то и тесты также должны быть изменены. > Tip: Если вы чувствуете, что вы теряете время выполняя много мелких и простых итераций, попробуйте покрыть это > вашим тестовым сценарием перед следующим выполнением тестов. Если вы слишком много отлаживаете, попробуйте сделать обратное. @@ -35,12 +28,12 @@ Написание тестов до реализации конкретного функционала позволяет нам сосредоточиться на том, что мы хотим достичь и полностью погрузиться в "как это сделать" впоследствии. -Обычно это приводит к лучшим абстракциям и более легкой поддержке тестов, когда речь идет о корректировки фичи или уменьшении связанности компонентов. +Обычно это приводит к лучшим абстракциям и более легкой поддержке тестов, когда речь идет о корректировке фичи или уменьшении связанности компонентов. -Таким образом плюсы этого подхода следующие: +Таким образом, плюсы этого подхода следующие: - Позволяет вам сосредоточиться на одной вещи, что в свою очередь приводит к улучшению планирования и реализации. -- Более подробное покрытие тестами функционала, таким образом, если все тесты отрабатывают без ошибок, скорее всего, ничего не сломано. +- Более подробное покрытие тестами функционала. Таким образом, если все тесты отрабатывают без ошибок, скорее всего, ничего не сломано. В долгосрочной перспективе это, как правило, дает вам хороший эффект экономии времени. @@ -50,8 +43,7 @@ Когда и как тестировать ----------------------- -Принцип разработки описанный выше имеет смысл применять для долгосрочных и относительно сложных проектов, в то время как для простых это может быть -излишним. Есть несколько показателей того, когда данный подход уместен: +Принцип разработки, описанный выше, имеет смысл применять для долгосрочных и относительно сложных проектов, в то время как для простых это может быть излишним. Есть несколько показателей того, когда данный подход уместен: - Проект уже большой и сложный. - Требования к проекту начинают усложняться. Проект постоянно растет. @@ -63,7 +55,7 @@ - Legacy-проект который постоянно обновляется. - Вам поручили работу над проектом, в котором нет ни одного теста. -В некоторых случаях автоматизированно тестирование может быть излишним: +В некоторых случаях автоматизированное тестирование может быть излишним: - Проект простой и не станет более сложным. - Это одноразовый проект, который больше не будет дорабатываться. @@ -73,4 +65,4 @@ Что почитать ------------ -- Экстремальное программирование. Разработка через тестирование / Кент Бек. ISBN: 0321146530. \ No newline at end of file +- Экстремальное программирование. Разработка через тестирование / Кент Бек. ISBN: 0321146530. diff --git a/docs/guide-zh-CN/caching-data.md b/docs/guide-zh-CN/caching-data.md index 3ea1b73..e720d61 100644 --- a/docs/guide-zh-CN/caching-data.md +++ b/docs/guide-zh-CN/caching-data.md @@ -90,7 +90,7 @@ Yii 支持一系列缓存存储器,概况如下: * [[yii\caching\Cache::madd()|madd()]]:将多项数据存储到缓存中,每项数据对应一个键。如果某个键已经存在于缓存中,则该项数据会被跳过。 * [[yii\caching\Cache::exists()|exists()]]:返回一个值,指明某个键是否存在于缓存中。 * [[yii\caching\Cache::delete()|delete()]]:通过一个键,删除缓存中对应的值。 -* [[yii\caching\Cache::flush()|flush()]]:删除缓存中的所有数据。 +* [[yii\caching\Cache::clear()|clear()]]:删除缓存中的所有数据。 有些缓存存储器如 MemCache,APC 支持以批量模式取回缓存值,这样可以节省取回缓存数据的开支。 [[yii\caching\Cache::mget()|mget()]] 和 [[yii\caching\Cache::madd()|madd()]] API提供对该特性的支持。如果底层缓存存储器不支持该特性,Yii 也会模拟实现。 diff --git a/docs/guide-zh-CN/concept-service-locator.md b/docs/guide-zh-CN/concept-service-locator.md index c9f278d..b6eb5ab 100644 --- a/docs/guide-zh-CN/concept-service-locator.md +++ b/docs/guide-zh-CN/concept-service-locator.md @@ -50,6 +50,7 @@ $cache = $locator->cache; 你可以通过 [[yii\di\ServiceLocator::has()]] 检查某组件 ID 是否被注册。若你用一个无效的 ID 调用 [[yii\di\ServiceLocator::get()]],则会抛出一个异常。 因为服务定位器,经常会在创建时附带[配置信息](concept-configurations.md),因此我们提供了一个可写的属性,名为 [[yii\di\ServiceLocator::setComponents()|components]],这样就可以配置该属性,或一次性注册多个组件。下面的代码展示了如何用一个配置数组,配置一个应用并注册"db","cache" 和 "search" 三个组件: + ```php return [ // ... diff --git a/docs/guide-zh-CN/db-dao.md b/docs/guide-zh-CN/db-dao.md index 0aa6036..4fbfad7 100644 --- a/docs/guide-zh-CN/db-dao.md +++ b/docs/guide-zh-CN/db-dao.md @@ -1,9 +1,10 @@ 数据库访问 (DAO) ======== -Yii 包含了一个建立在 PHP PDO 之上的数据访问层 (DAO). DAO为不同的数据库提供了一套统一的API. 其中```ActiveRecord``` 提供了数据库与模型(MVC 中的 M,Model) 的交互,```QueryBuilder``` 用于创建动态的查询语句. DAO提供了简单高效的SQL查询,可以用在与数据库交互的各个地方. +Yii 包含了一个建立在 PHP PDO 之上的数据访问层 (DAO). DAO为不同的数据库提供了一套统一的API. 其中 `ActiveRecord` 提供了数据库与模型(MVC 中的 M,Model) 的交互, `QueryBuilder` 用于创建动态的查询语句. DAO提供了简单高效的SQL查询,可以用在与数据库交互的各个地方. Yii 默认支持以下数据库 (DBMS): + - [MySQL](http://www.mysql.com/) - [MariaDB](https://mariadb.com/) - [SQLite](http://sqlite.org/) @@ -12,7 +13,7 @@ Yii 默认支持以下数据库 (DBMS): - [Oracle](http://www.oracle.com/us/products/database/overview/index.html) - [MSSQL](https://www.microsoft.com/en-us/sqlserver/default.aspx): 版本>=2005. -##配置 +## 配置 开始使用数据库首先需要配置数据库连接组件,通过添加 db 组件到应用配置实现("基础的" Web 应用是 config/web.php),DSN( Data Source Name )是数据源名称,用于指定数据库信息.如下所示: @@ -45,10 +46,10 @@ return [ ```$connection = \Yii::$app->db;``` -请参考```[[yii\db\Connection]]```获取可配置的属性列表。 +请参考 `[[yii\db\Connection]]` 获取可配置的属性列表。 如果你想通过ODBC连接数据库,则需要配置[[yii\db\Connection::driverName]] 属性,例如: -``` +```php 'db' => [ 'class' => 'yii\db\Connection', 'driverName' => 'mysql', @@ -67,29 +68,30 @@ return [ // ... 'db' => [ 'class' => 'yii\db\Connection', - 'dsn' => 'mysql:host=localhost;dbname=mydatabase', + 'dsn' => 'mysql:host=localhost;dbname=mydatabase', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], 'secondDb' => [ 'class' => 'yii\db\Connection', - 'dsn' => 'sqlite:/path/to/database/file', + 'dsn' => 'sqlite:/path/to/database/file', ], ], // ... ]; ``` + 在代码中通过以下方式使用: -``` +```php $primaryConnection = \Yii::$app->db; $secondaryConnection = \Yii::$app->secondDb; ``` 如果不想定义数据库连接为全局[应用](structure-application-components.md)组件,可以在代码中直接初始化使用: -``` +```php $connection = new \yii\db\Connection([ 'dsn' => $dsn, 'username' => $username, @@ -98,9 +100,9 @@ $connection = new \yii\db\Connection([ $connection->open(); ``` ->小提示:如果在创建了连接后需要执行额外的 SQL 查询,可以添加以下代码到应用配置文件: +> 小提示:如果在创建了连接后需要执行额外的 SQL 查询,可以添加以下代码到应用配置文件: -``` +```php return [ // ... 'components' => [ @@ -117,43 +119,48 @@ return [ ]; ``` -##SQL 基础查询 +## SQL 基础查询 一旦有了连接实例就可以通过[[yii\db\Command]]执行 SQL 查询。 -###SELECT 查询 +### SELECT 查询 查询返回多行: -``` +```php $command = $connection->createCommand('SELECT * FROM post'); $posts = $command->queryAll(); ``` + 返回单行: -``` + +```php $command = $connection->createCommand('SELECT * FROM post WHERE id=1'); $post = $command->queryOne(); ``` 查询多行单值: -``` + +```php $command = $connection->createCommand('SELECT title FROM post'); $titles = $command->queryColumn(); ``` + 查询标量值/计算值: -``` +```php $command = $connection->createCommand('SELECT COUNT(*) FROM post'); $postCount = $command->queryScalar(); ``` -###UPDATE, INSERT, DELETE 更新、插入和删除等 +### UPDATE, INSERT, DELETE 更新、插入和删除等 如果执行 SQL 不返回任何数据可使用命令中的 execute 方法: -``` +```php $command = $connection->createCommand('UPDATE post SET status=1 WHERE id=1'); $command->execute(); ``` + 你可以使用`insert`,`update`,`delete` 方法,这些方法会根据参数生成合适的SQL并执行. ```php @@ -177,7 +184,7 @@ $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execu $connection->createCommand()->delete('user', 'status = 0')->execute(); ``` -###引用的表名和列名 +### 引用的表名和列名 大多数时间都使用以下语法来安全地引用表名和列名: @@ -185,7 +192,8 @@ $connection->createCommand()->delete('user', 'status = 0')->execute(); $sql = "SELECT COUNT([[$column]]) FROM {{table}}"; $rowCount = $connection->createCommand($sql)->queryScalar(); ``` -以上代码`[[$column]]` 会转变为引用恰当的列名,而`{{table}}` 就转变为引用恰当的表名。 + +以上代码 `[[$column]]` 会转变为引用恰当的列名,而 `{{table}}` 就转变为引用恰当的表名。 表名有个特殊的变量 {{%Y}} ,如果设置了表前缀使用该变体可以自动在表名前添加前缀: ```php @@ -217,9 +225,9 @@ $sql = "SELECT COUNT($column) FROM $table"; $rowCount = $connection->createCommand($sql)->queryScalar(); ``` -###预处理语句 +### 预处理语句 -为安全传递查询参数可以使用预处理语句,首先应当使用`:placeholder`占位,再将变量绑定到对应占位符: +为安全传递查询参数可以使用预处理语句,首先应当使用 `:placeholder` 占位,再将变量绑定到对应占位符: ```php $command = $connection->createCommand('SELECT * FROM post WHERE id=:id'); @@ -239,11 +247,12 @@ $command->execute(); $id = 2; $command->execute(); ``` ->提示,在执行前绑定变量,然后在每个执行中改变变量的值(一般用在循环中)比较高效. -##事务 +> 提示: 在执行前绑定变量,然后在每个执行中改变变量的值(一般用在循环中)比较高效. + +## 事务 -当你需要顺序执行多个相关的的`query`时,你可以把他们封装到一个事务中去保护数据一致性.Yii提供了一个简单的接口来实现事务操作. +当你需要顺序执行多个相关的的 `query` 时,你可以把他们封装到一个事务中去保护数据一致性.Yii提供了一个简单的接口来实现事务操作. 如下执行 SQL 事务查询语句: ```php @@ -257,7 +266,8 @@ try { $transaction->rollBack(); } ``` -我们通过[[yii\db\Connection::beginTransaction()|beginTransaction()]]开始一个事务,通过`try catch` 捕获异常.当执行成功,通过[[yii\db\Transaction::commit()|commit()]]提交事务并结束,当发生异常失败通过[[yii\db\Transaction::rollBack()|rollBack()]]进行事务回滚. + +我们通过[[yii\db\Connection::beginTransaction()|beginTransaction()]]开始一个事务,通过 `try catch` 捕获异常.当执行成功,通过[[yii\db\Transaction::commit()|commit()]]提交事务并结束,当发生异常失败通过[[yii\db\Transaction::rollBack()|rollBack()]]进行事务回滚. 如需要也可以嵌套多个事务: @@ -281,9 +291,10 @@ try { $transaction1->rollBack(); } ``` ->注意你使用的数据库必须支持`Savepoints`才能正确地执行,以上代码在所有关系数据中都可以执行,但是只有支持`Savepoints`才能保证安全性。 -Yii 也支持为事务设置隔离级别`isolation levels`,当执行事务时会使用数据库默认的隔离级别,你也可以为事物指定隔离级别. +> 注意: 你使用的数据库必须支持 `Savepoints` 才能正确地执行,以上代码在所有关系数据中都可以执行,但是只有支持 `Savepoints` 才能保证安全性。 + +Yii 也支持为事务设置隔离级别 `isolation levels`,当执行事务时会使用数据库默认的隔离级别,你也可以为事务指定隔离级别. Yii 提供了以下常量作为常用的隔离级别 - [[\yii\db\Transaction::READ_UNCOMMITTED]] - 允许读取改变了的还未提交的数据,可能导致脏读、不可重复读和幻读 @@ -291,19 +302,19 @@ Yii 提供了以下常量作为常用的隔离级别 - [[\yii\db\Transaction::REPEATABLE_READ]] - 对相同字段的多次读取结果一致,可导致幻读。 - [[\yii\db\Transaction::SERIALIZABLE]] - 完全服从ACID的原则,确保不发生脏读、不可重复读和幻读。 -你可以使用以上常量或者使用一个string字符串命令,在对应数据库中执行该命令用以设置隔离级别,比如对于`postgres`有效的命令为`SERIALIZABLE READ ONLY DEFERRABLE`. +你可以使用以上常量或者使用一个string字符串命令,在对应数据库中执行该命令用以设置隔离级别,比如对于 `postgres` 有效的命令为 `SERIALIZABLE READ ONLY DEFERRABLE`. -> Note: 某些数据库只能针对连接来设置事务隔离级别,所以你必须要为连接明确制定隔离级别.目前受影响的数据库:`MSSQL SQLite` +> Note: 某些数据库只能针对连接来设置事务隔离级别,所以你必须要为连接明确制定隔离级别.目前受影响的数据库: `MSSQL SQLite` -> Note: SQLite 只支持两种事务隔离级别,所以你只能设置`READ UNCOMMITTED` 和 `SERIALIZABLE`.使用其他隔离级别会抛出异常. +> Note: SQLite 只支持两种事务隔离级别,所以你只能设置 `READ UNCOMMITTED` 和 `SERIALIZABLE`.使用其他隔离级别会抛出异常. > Note: PostgreSQL 不允许在事务开始前设置隔离级别,所以你不能在事务开始时指定隔离级别.你可以在事务开始之后调用[[yii\db\Transaction::setIsolationLevel()]] 来设置. 关于隔离级别[isolation levels]: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Isolation_levels -##数据库复制和读写分离 +## 数据库复制和读写分离 -很多数据库支持数据库复制 [database replication](http://en.wikipedia.org/wiki/Replication_(computing)#Database_replication)来提高可用性和响应速度. 在数据库复制中,数据总是从*主服务器* 到 *从服务器*. 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行. +很多数据库支持数据库复制 [database replication](http://en.wikipedia.org/wiki/Replication_(computing)#Database_replication) 来提高可用性和响应速度. 在数据库复制中,数据总是从*主服务器* 到 *从服务器*. 所有的插入和更新等写操作在主服务器执行,而读操作在从服务器执行. 通过配置[[yii\db\Connection]]可以实现数据库复制和读写分离. @@ -335,6 +346,7 @@ Yii 提供了以下常量作为常用的隔离级别 ], ] ``` + 以上的配置实现了一主多从的结构,从服务器用以执行读查询,主服务器执行写入查询,读写分离的功能由后台代码自动完成.调用者无须关心.例如: ```php @@ -347,9 +359,10 @@ $rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); // 通过主服务器执行更新操作 $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute(); ``` + > Note: 通过[[yii\db\Command::execute()]] 执行的查询被认为是写操作,所有使用[[yii\db\Command]]来执行的其他查询方法被认为是读操作.你可以通过`$db->slave`得到当前正在使用能够的从服务器. -`Connection`组件支持从服务器的负载均衡和故障转移,当第一次执行读查询时,会随即选择一个从服务器进行连接,如果连接失败则又选择另一个,如果所有从服务器都不可用,则会连接主服务器。你可以配置[[yii\db\Connection::serverStatusCache|server status cache]]来记住那些不能连接的从服务器,使Yii 在一段时间[[yii\db\Connection::serverRetryInterval]].内不会重复尝试连接那些根本不可用的从服务器. +`Connection` 组件支持从服务器的负载均衡和故障转移,当第一次执行读查询时,会随即选择一个从服务器进行连接,如果连接失败则又选择另一个,如果所有从服务器都不可用,则会连接主服务器。你可以配置[[yii\db\Connection::serverStatusCache|server status cache]]来记住那些不能连接的从服务器,使Yii 在一段时间[[yii\db\Connection::serverRetryInterval]].内不会重复尝试连接那些根本不可用的从服务器. > Note: 在上述配置中,每个从服务器连接超时时间被指定为10s. 如果在10s内不能连接,则被认为该服务器已经挂掉.你也可以自定义超时参数. @@ -394,7 +407,8 @@ $db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute(); ], ] ``` -上述配置制定了2个主服务器和4个从服务器.`Connection`组件也支持主服务器的负载均衡和故障转移,与从服务器不同的是,如果所有主服务器都不可用,则会抛出异常. + +上述配置制定了2个主服务器和4个从服务器.`Connection` 组件也支持主服务器的负载均衡和故障转移,与从服务器不同的是,如果所有主服务器都不可用,则会抛出异常. > Note: 当你使用[[yii\db\Connection::masters|masters]]来配置一个或多个主服务器时,`Connection`中关于数据库连接的其他属性(例如:`dsn`, `username`, `password`)都会被忽略. @@ -422,18 +436,19 @@ try { $transaction = $db->slave->beginTransaction(); ``` -有时你想强制使用主服务器来执行读查询,你可以调用`seMaster()`方法. +有时你想强制使用主服务器来执行读查询,你可以调用 `seMaster()` 方法. ```php $rows = $db->useMaster(function ($db) { return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll(); }); ``` -你也可以设置`$db->enableSlaves` 为`false`来使所有查询都在主服务器上执行. -##操作数据库模式 +你也可以设置 `$db->enableSlaves` 为 `false` 来使所有查询都在主服务器上执行. + +## 操作数据库模式 -###获得模式信息 +### 获得模式信息 你可以通过 [[yii\db\Schema]]实例来获取Schema信息: @@ -446,9 +461,10 @@ $schema = $connection->getSchema(); ```php $tables = $schema->getTableNames(); ``` + 更多信息请参考[[yii\db\Schema]] -###修改模式 +### 修改模式 除了基础的 SQL 查询,[[yii\db\Command]]还包括一系列方法来修改数据库模式: @@ -468,4 +484,5 @@ $connection->createCommand()->createTable('post', [ 'text' => 'text', ]); ``` + 完整参考请查看[[yii\db\Command]]. diff --git a/docs/guide-zh-CN/images/start-country-list.png b/docs/guide-zh-CN/images/start-country-list.png new file mode 100644 index 0000000..3754194 Binary files /dev/null and b/docs/guide-zh-CN/images/start-country-list.png differ diff --git a/docs/guide-zh-CN/images/start-entry-confirmation.png b/docs/guide-zh-CN/images/start-entry-confirmation.png new file mode 100644 index 0000000..ed442a4 Binary files /dev/null and b/docs/guide-zh-CN/images/start-entry-confirmation.png differ diff --git a/docs/guide-zh-CN/images/start-form-validation.png b/docs/guide-zh-CN/images/start-form-validation.png new file mode 100644 index 0000000..f386528 Binary files /dev/null and b/docs/guide-zh-CN/images/start-form-validation.png differ diff --git a/docs/guide-zh-CN/images/start-gii-country-grid.png b/docs/guide-zh-CN/images/start-gii-country-grid.png new file mode 100644 index 0000000..746663c Binary files /dev/null and b/docs/guide-zh-CN/images/start-gii-country-grid.png differ diff --git a/docs/guide-zh-CN/images/start-gii-country-update.png b/docs/guide-zh-CN/images/start-gii-country-update.png new file mode 100644 index 0000000..51f2d38 Binary files /dev/null and b/docs/guide-zh-CN/images/start-gii-country-update.png differ diff --git a/docs/guide-zh-CN/images/start-gii-crud-preview.png b/docs/guide-zh-CN/images/start-gii-crud-preview.png new file mode 100644 index 0000000..a8912e2 Binary files /dev/null and b/docs/guide-zh-CN/images/start-gii-crud-preview.png differ diff --git a/docs/guide-zh-CN/images/start-gii-crud.png b/docs/guide-zh-CN/images/start-gii-crud.png new file mode 100644 index 0000000..948e6cd Binary files /dev/null and b/docs/guide-zh-CN/images/start-gii-crud.png differ diff --git a/docs/guide-zh-CN/images/start-gii-model-preview.png b/docs/guide-zh-CN/images/start-gii-model-preview.png new file mode 100644 index 0000000..3b6eb9f Binary files /dev/null and b/docs/guide-zh-CN/images/start-gii-model-preview.png differ diff --git a/docs/guide-zh-CN/images/start-gii-model.png b/docs/guide-zh-CN/images/start-gii-model.png new file mode 100644 index 0000000..9c506de Binary files /dev/null and b/docs/guide-zh-CN/images/start-gii-model.png differ diff --git a/docs/guide-zh-CN/images/start-hello-world.png b/docs/guide-zh-CN/images/start-hello-world.png new file mode 100644 index 0000000..30d1aca Binary files /dev/null and b/docs/guide-zh-CN/images/start-hello-world.png differ diff --git a/docs/guide-zh-CN/input-forms.md b/docs/guide-zh-CN/input-forms.md new file mode 100644 index 0000000..da4da1c --- /dev/null +++ b/docs/guide-zh-CN/input-forms.md @@ -0,0 +1,213 @@ +创建表单 +==== + +基于活动记录(ActiveRecord)的表单:ActiveForm +----------------------- +在yii中使用表单的主要方式是通过[[yii\widgets\ActiveForm]]。当某个表单是基于一个模型时,应该首选这种方式。此外,在[[yii\helpers\Html]]中有很多实用的方法为表单添加按钮和帮助文档。 + +在客户端显示的表单,大多数情况下都有一个相应的[模型](structure-models.md),用来在服务器上验证其输入的数据(可在[输入验证](input-validation.md)一节获取关于验证的细节)。当创建一个基于模型的表单时,第一步是定义模型本身。该模型可以是一个基于[活动记录](db-active-record.md)的类,表示数据库中的数据,也可以是一个基于通用模型的类(继承自[[yii\base\Model]]),来获取任意的输入数据,如登录表单。 + +> Tip: 如果一个表单的输入域与数据库的字段不匹配,或者它存在只适用于它的特殊的格式或者方法,则最好为它创建一个单独的继承自[[yii\base\Model]]的模型。 + +在接下来的例子中,我们展示了通用模型如何用于登录表单: + +```php + 'login-form', + 'options' => ['class' => 'form-horizontal'], +]) ?> + field($model, 'username') ?> + field($model, 'password')->passwordInput() ?> + +
+
+ 'btn btn-primary']) ?> +
+
+ +``` + +### 用 `begin()` 和 `end()` 包裹 + +在上面的代码中,[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]] 不仅创建了一个表单实例,同时也标志的表单的开始。所有在[[yii\widgets\ActiveForm::begin()|ActiveForm::begin()]]与[[yii\widgets\ActiveForm::end()|ActiveForm::end()]]之中的内容都会被HTML中的 `
`标签包裹。与其他小部件一样,你可以制定一些选项,通过传递数组到到 `begin` 中来配置小部件。在这种情况下,一个额外的CSS类和ID会在 `` 标签中使用。要查看更多可用的选项,请查看API文档的 [[yii\widgets\ActiveForm]]。 + +### ActiveField + +为了在表单中创建表单元素与元素的标签,以及任意适用的Javascript验证,需要使用[[yii\widgets\ActiveForm::field()]|ActiveForm::field()]方法,其返回一个[[yii\widgets\ActiveField]]实例。当直接输出该方法时,结果是一个普通的(文本)输入。要自定义输出,可以附加上[[yii\widgets\ActiveField|ActiveField]]的其他方法来一起调用: + +```php +// 密码输入框 +field($model, 'password')->passwordInput() ?> +// 增加提示与自定义标签 +field($model, 'username')->textInput()->hint('Please enter your name')->label('Name') ?> +// 创建一个HTML5邮件输入元素 +field($model, 'email')->input('email') ?> +``` + +它会通过[[yii\widgets\ActiveField|ActiveField]]中定义的表单字段来创建`