Commit 353625b7 by funson86
parents e36ffded 6dfa7610
before_commands:
- composer global require "fxp/composer-asset-plugin:1.0.0-beta3" --no-interaction
imports:
- php
......
......@@ -20,22 +20,27 @@ matrix:
services:
- redis-server
- memcached
- elasticsearch
- mongodb
# faster builds on new travis setup not using sudo
sudo: false
# Disabled for install and use latest elasticsearch version
# sudo: false
# cache vendor dirs
cache:
directories:
# - cubrid # caching cubrid breaks the build on a regular basis and has nearly no speedup
- vendor
- $HOME/.composer/cache
# try running against postgres 9.3
addons:
postgresql: "9.3"
before_install:
- wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.4.deb && sudo dpkg -i --force-confnew elasticsearch-1.3.4.deb
- sudo service elasticsearch start
install:
- composer self-update && composer --version
- composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
......
......@@ -23,6 +23,28 @@ if (!is_dir($frameworkPath)) {
require_once($frameworkPath . '/requirements/YiiRequirementChecker.php');
$requirementsChecker = new YiiRequirementChecker();
$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.';
$gdOK = $imagickOK = false;
if (extension_loaded('imagick')) {
$imagick = new Imagick();
$imagickFormats = $imagick->queryFormats('PNG');
if (in_array('PNG', $imagickFormats)) {
$imagickOK = true;
} else {
$imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.';
}
}
if (extension_loaded('gd')) {
$gdInfo = gd_info();
if (!empty($gdInfo['FreeType Support'])) {
$gdOK = true;
} else {
$gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.';
}
}
/**
* Adjust requirements according to your application specifics.
*/
......@@ -69,6 +91,21 @@ $requirements = array(
'condition' => extension_loaded('apc'),
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
),
// CAPTCHA:
array(
'name' => 'GD PHP extension with FreeType support',
'mandatory' => false,
'condition' => $gdOK,
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
'memo' => $gdMemo,
),
array(
'name' => 'ImageMagick PHP extension with PNG support',
'mandatory' => false,
'condition' => $imagickOK,
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
'memo' => $imagickMemo,
),
// PHP ini :
'phpSafeMode' => array(
'name' => 'PHP safe mode',
......
......@@ -15,6 +15,6 @@ set YII_PATH=%~dp0
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
"%PHP_COMMAND%" "%YII_PATH%yii_acceptance" %*
"%PHP_COMMAND%" "%YII_PATH%yii" %*
@endlocal
......@@ -23,6 +23,28 @@ if (!is_dir($frameworkPath)) {
require_once($frameworkPath . '/requirements/YiiRequirementChecker.php');
$requirementsChecker = new YiiRequirementChecker();
$gdMemo = $imagickMemo = 'Either GD PHP extension with FreeType support or ImageMagick PHP extension with PNG support is required for image CAPTCHA.';
$gdOK = $imagickOK = false;
if (extension_loaded('imagick')) {
$imagick = new Imagick();
$imagickFormats = $imagick->queryFormats('PNG');
if (in_array('PNG', $imagickFormats)) {
$imagickOK = true;
} else {
$imagickMemo = 'Imagick extension should be installed with PNG support in order to be used for image CAPTCHA.';
}
}
if (extension_loaded('gd')) {
$gdInfo = gd_info();
if (!empty($gdInfo['FreeType Support'])) {
$gdOK = true;
} else {
$gdMemo = 'GD extension should be installed with FreeType support in order to be used for image CAPTCHA.';
}
}
/**
* Adjust requirements according to your application specifics.
*/
......@@ -69,6 +91,21 @@ $requirements = array(
'condition' => extension_loaded('apc'),
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-caching-apccache.html">ApcCache</a>',
),
// CAPTCHA:
array(
'name' => 'GD PHP extension with FreeType support',
'mandatory' => false,
'condition' => $gdOK,
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
'memo' => $gdMemo,
),
array(
'name' => 'ImageMagick PHP extension with PNG support',
'mandatory' => false,
'condition' => $imagickOK,
'by' => '<a href="http://www.yiiframework.com/doc-2.0/yii-captcha-captcha.html">Captcha</a>',
'memo' => $imagickMemo,
),
// PHP ini :
'phpSafeMode' => array(
'name' => 'PHP safe mode',
......
......@@ -15,6 +15,6 @@ set YII_PATH=%~dp0
if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exe
"%PHP_COMMAND%" "%YII_PATH%yii_acceptance" %*
"%PHP_COMMAND%" "%YII_PATH%yii" %*
@endlocal
......@@ -131,7 +131,7 @@ Servicios Web RESTful
* **TBD** [Guía breve](rest-quick-start.md)
* **TBD** [Recursos (Resources)](rest-resources.md)
* **TBD** [Controladores](rest-controllers.md)
[Controladores](rest-controllers.md)
* **TBD** [Gestión de rutas](rest-routing.md)
* **TBD** [Formateo de respuestas](rest-response-formatting.md)
* **TBD** [Autenticación](rest-authentication.md)
......
......@@ -11,10 +11,9 @@ de artículos que han sido extraídos de la base de datos; y en el nivel superio
almacenar fragmentos o un conjuto de páginas Web, tales como el resultado de la representación de los artículos más
recientes.
Caching can occur at different levels and places in a Web application. On the server side, at the lower level,
cache may be used to store basic data, such as a list of most recent article information fetched from database;
and at the higher level, cache may be used to store fragments or whole of Web pages, such as the rendering result
of the most recent articles. En el lado del cliente, el almacenamiento en caché HTTP puede ser utilizado para mantener
El almacenamiento en caché se puede usar en diferentes niveles y lugares en una aplicación web. En el lado del servidor, al más bajo nivel,
la caché puede ser usada para almacenar datos básicos, tales como una una lista de los artículos más recientes obtenidos de una base de datos;
y en el más alto nivel, la caché puede ser usada para almacenar fragmentos o la totalidad de las páginas web, tales como el resultado del renderizado de los artículos más recientes. En el lado del cliente, el almacenamiento en caché HTTP puede ser utilizado para mantener
el contenido de la página que ha sido visitada más recientemente en el caché del navegador.
Yii soporta los siguientes mecanismos de almacenamiento de caché:
......
Caché de Páginas
================
El caché de páginas se refiere a guardar el contenido de toda una página en el almacenamiento de caché del servidor.
Posteriormente, cuando la misma página sea requerida de nuevo, su contenido será devuelto desde el caché en vez de
La caché de páginas se refiere a guardar el contenido de toda una página en el almacenamiento de caché del servidor.
Posteriormente, cuando la misma página sea requerida de nuevo, su contenido será devuelto desde la caché en vez de
volver a generarlo desde cero.
El almacenamiento en caché de páginas está soportado por [[yii\filters\PageCache]], un [filtro de acción](structure-filters.md).
......@@ -33,10 +33,9 @@ contenido de la página debería almacenarse durante un máximo de 60 segundos y
aplicación; además, el almacenamiento de la página en caché debería ser invalidado si el número total de
artículos ha cambiado.
Como puedes ver, el caché de páginas es muy similar al [caché de fragmentos](caching-fragment.md). Ambos soportan opciones
tales como `duration`, `dependencies`, `variations`, y `enabled`. Su principal diferencia es que el caché de páginas es
implementado como un [filtro de acción](structure-filters.md) mientras que el caché de fragmentos se hace en un [widget](structure-widgets.md).
Puedes usar el [caché de fragmentos](caching-fragment.md) así como [contenido dinámico](caching-fragment.md#dynamic-content)
junto con el caché de páginas.
Como puedes ver, la caché de páginas es muy similar a la [caché de fragmentos](caching-fragment.md). Ambos soportan opciones
tales como `duration`, `dependencies`, `variations`, y `enabled`. Su principal diferencia es que la caché de páginas está
implementado como un [filtro de acción](structure-filters.md) mientras que la caché de fragmentos se hace en un [widget](structure-widgets.md).
Puedes usar la [caché de fragmentos](caching-fragment.md) así como el [contenido dinámico](caching-fragment.md#dynamic-content)
junto con la caché de páginas.
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 a través de las APIs RESTful finales.
Yii ofrece dos clases de controlador base para simplificar su 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ñadas para hacer frente a los recursos representados con [Active Record](db-active-record.md). Así que si usted está utilizando [Active Record](db-active-record.md) y se siente cómodo con las acciones integradas que proporciona, es posible considerar la prolongación de sus clases de controlador de [[yii\rest\ActiveController]], que le 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étodos 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 en cuanto a la acción solicitada y recursos.
## Creando Clases Controladoras <a name="creating-controller"></a>
Al crear una nueva clase de controlador, una convención para nombrar la clase del controlador es utilizar el nombre del tipo de recurso y el uso en singular. Por ejemplo, para servir información de usuario, el controlador puede ser nombrado como `UserController`.
Creación de una nueva acción es similar a crear una acción para una aplicación Web. La única diferencia es que en lugar de hacer que el resultado utilicé una vista llamando al método `render()`, para las acciones REST regresá directamente los datos. El [[yii\rest\Controller::serializer|serializer]] y el [[yii\web\Response|response object]] se encargará de la conversión de los datos originales al formato solicitado. Por ejemplo,
```php
public function actionView($id)
{
return User::findOne($id);
}
```
## Filtros <a name="filters"></a>
La mayoría de las características API REST son proporcionadas por [[yii\rest\Controller]] que son implementadas por los terminos de los [filtros](structure-filters.md).
En particular, los siguientes filtros se ejecutarán en el orden en que aparecen:
* [[yii\filters\ContentNegotiator|contentNegotiator]]: apoya la negociación de contenido, que se explica en la sección el [Formateo de respuestas](rest-response-formatting.md);
* [[yii\filters\VerbFilter|verbFilter]]: apoya métodos de validación HTTP;
* [[yii\filters\AuthMethod|authenticator]]: apoya autenticación de usuarios, que se explica en la sección [Autenticación](rest-authentication.md);
* [[yii\filters\RateLimiter|rateLimiter]]: apoya 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 reemplazar este método para configurar los filtros individuales, desactivar algunos de ellos o añadir sus propios filtros. Por ejemplo, si sólo desea 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` <a name="extending-active-controller"></a>
Si su clase controlador extiende de [[yii\rest\ActiveController]], debe establecer su propiedad [[yii\rest\ActiveController::modelClass||modelClass]] a ser el nombre del recurso de la clase que va a servir a través de este controlador. La clase debe extender de [[yii\db\ActiveRecord]].
### Personalizando Acciones <a name="customizing-actions"></a>
Por defecto, [[yii\rest\ActiveController]] provee de las siguientes acciones:
* [[yii\rest\IndexAction|index]]: lista de recursos pagina por pagina;
* [[yii\rest\ViewAction|view]]: retorna 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]]: retorna los métodos HTTP soportados.
Todas esta acciones se declaran a través del métodos [[yii\rest\ActiveController::actions()|actions()]]. Usted puede configurar todas estas acciones o desactivar alguna de ellas reescribiendo 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, consulte las referencias de clases para la clase de acción individuales para aprender las opciones de configuración que se dispone.
### Realizando Comprobación de Acceso <a name="performing-access-check"></a>
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 recurso solicitado. Con [[yii\rest\ActiveController]], puede hacerse reemplazando el método [[yii\rest\ActiveController::checkAccess()|checkAccess()]] con lo siguiente,
```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
}
```
El método `checkAccess()` será llamado por defecto en las acciones predeterminadas de [[yii\rest\ActiveController]]. Si crea nuevas acciones y también desea llevar a cabo la comprobación de acceso, debe llamar a este método de forma explícita en las nuevas acciones.
> Consejo: Usted puede implementar `checkAccess()` mediante el uso del [Componente Role-Based Access Control (RBAC)](security-authorization.md).
......@@ -52,7 +52,7 @@ $headers = Yii::$app->response->headers;
$headers->add('Pragma', 'no-cache');
// asigna una cabecera Pragma. Cualquier cabecera Pragma existente será descartada.
$headers->add('Pragma', 'no-cache');
$headers->set('Pragma', 'no-cache');
// Elimina las cabeceras Pragma y devuelve los valores de las eliminadas en un array
$values = $headers->remove('Pragma');
......
......@@ -187,7 +187,7 @@ Al igual que los datos de sesión regulares, puede almacenar datos arbitrarios c
Cuando llamas a [yii\web\Session::setFlash()]], sobrescribirá cualquier Flash data que tenga el mismo nombre.
Para añadir un nuevo flash data a el/los existes con el mismo nombre, puedes llamar a [[yii\web\Session::addFlash()]].
Por ejemplo,
Por ejemplo:
```php
$session = Yii::$app->session;
......
......@@ -21,8 +21,12 @@ En Windows, tendrás que descargar y ejecutar [Composer-Setup.exe](https://getco
Por favor, consulta la [Documentación de Composer](https://getcomposer.org/doc/) si encuentras algún problema
o deseas obtener un conocimiento más profundo sobre su utilización.
Teniendo Composer instalado, puedes instalar Yii ejecutando el siguiente comando en un directorio accesible vía Web:
Si ya tienes composer instalado asegurate que esté actualizado ejecutando `composer self-update`
Teniendo Composer instalado, puedes instalar Yii ejecutando los siguientes comandos en un directorio accesible vía Web:
Nota: es posible que en al ejecutar el primer comando te pida tu username
composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
El comando anterior instala Yii dentro del directorio `basic`.
......
......@@ -27,7 +27,7 @@ Se hai già Composer installato assicurati di avere una versione aggiornata. Puo
Una volta installato Composer, puoi installare Yii eseguendo questo comando in una directory accessbile via web:
composer global require "fxp/composer-asset-plugin:1.0.0-beta2"
composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Il primo comando installa il [plugin composer asset](https://github.com/francoispluchino/composer-asset-plugin/)
......
......@@ -21,7 +21,7 @@ All Rights Reserved.
* [Yii をインストールする](start-installation.md)
* [アプリケーションを走らせる](start-workflow.md)
* [ハローと言う](start-hello.md)
* [「こんにちは」と言う](start-hello.md)
* [フォームを扱う](start-forms.md)
* [データベースを扱う](start-databases.md)
* [Gii でコードを生成する](start-gii.md)
......
Gii でコードを生成する
======================
この節では、[Gii](tool-gii.md) を使って、ウェブサイトの一般的な機能のいくつかを実装するコードを
自動的に生成する方法を説明します。Gii を使ってコードを自動生成することは、Gii のウェブページに
表示される指示に対して正しい情報を入力するだけのことです。
このチュートリアルを通じて、次のことをする方法を学びます:
* アプリケーションで Gii を有効にする
* Gii を使って、アクティブレコードのクラスを生成する
* Gii を使って、DB テーブルの CRUD 操作を実装するコードを生成する
* Gii によって生成されるコードをカスタマイズする
Gii を開始する<a name="starting-gii"></a>
--------------
[Gii](tool-gii.md) は Yii の [モジュール](structure-modules.md) として提供されます。
Gii は、アプリケーションの [[yii\base\Application::modules|modules]] プロパティの中で設定することで有効にすることが出来ます。
アプリケーションを生成した仕方にもよりますが、`config/web.php` の設定ファイルの中に、多分、下記のコードが既に提供されているでしょう:
```php
$config = [ ... ];
if (YII_ENV_DEV) {
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
}
```
上記の設定は、[開発環境](concept-configurations.md#environment-constants) において、アプリケーションは
`gii` という名前のモジュールをインクルードすべきこと、そして `gii`[[yii\gii\Module]] というクラスのものであることを記述しています。
アプリケーションの [エントリスクリプト](structure-entry-scripts.md) である `web/index.php` をチェックすると、次の行があることに気付くでしょう。
これは本質的には `YII_ENV_DEV` を true に設定するものです。
```php
defined('YII_ENV') or define('YII_ENV', 'dev');
```
この行のおかげで、アプリケーションは開発モードになり、上記の設定によって、Gii が有効になります。
これで、下記の URL によって Gii にアクセスすることが出来ます:
```
http://hostname/index.php?r=gii
```
> Note|注意: ローカルホスト以外のマシンから GII にアクセスしようとすると、既定ではセキュリティ上の
> 目的からアクセスが拒否されます。下記のように Gii を設定して、許可される IP アドレスを追加することが出来ます。
>
```php
'gii' => [
'class' => 'yii\gii\Module',
'allowedIPs' => ['127.0.0.1', '::1', '192.168.0.*', '192.168.178.20'] // 必要に応じて調整
],
```
![Gii](images/start-gii.png)
アクティブレコードのクラスを生成する<a name="generating-ar"></a>
------------------------------------
Gii を使ってアクティブレコードのクラスを生成するためには、(Gii のインデックスページのリンクをクリックして) "Model Generator" を選びます。
そして、次のようにフォームに入力します:
* Table Name: `country`
* Model Class: `Country`
![Model Generator](images/start-gii-model.png)
次に、"Preview" ボタンをクリックします。
そうすると、結果として作成されるクラスファイルのリストに `models/Country.php` が挙ってきます。
クラスファイルの名前をクリックすると、内容をプレビュー出来ます。
Gii を使うときに、既に同じファイルを作成していて、それを上書きしようとしている場合は、
ファイル名の隣の `diff` ボタンをクリックして、生成されようとしているコードと既存のバージョンの
違いを見てください。
![Model Generator のプレビュー](images/start-gii-model-preview.png)
既存のファイルを上書きしようとしているときは、"overwrite" の隣のチェックボックスをチェックしてから "Generate" ボタンをクリックします。
新しいファイルを作成しようとしているときは、単に "Generate" を押せば大丈夫です。
次に、コードの生成が成功したことを示す確認ページが表示されます。既存のファイルがあった場合は、
それが新しく生成されたコードで上書きされたことを示すメッセージも同じく表示されます。
CRUD コードを生成する<a name="generating-crud"></a>
---------------------
CRUD は Create(作成)、Read(読出し)、Update(更新)、そして Delete(削除) を意味しており、
ほとんどのウェブサイトでデータを扱うときによく用いられる4つのタスクを表しています。
Gii を使って CRUD 機能を作成するためには、(Gii のインデックスページのリンクをクリックして) "CRUD Generator" を選びます。
「国リスト」のサンプルのためには、以下のようにフォームに入力します:
* Model Class: `app\models\Country`
* Search Model Class: `app\models\CountrySearch`
* Controller Class: `app\controllers\CountryController`
![CRUD Generator](images/start-gii-crud.png)
次に、"Preview" ボタンをクリックします。
生成されるファイルのリストは、次のようになります。
![CRUD Generator のプレビュー](images/start-gii-crud-preview.png)
以前に(ガイドのデータベースの節で)`controllers/CountryController.php`
`views/country/index.php` のファイルを作成していた場合は、それらを置き換えるために "overwrite" の
チェックボックスをチェックしてください。(以前のバージョンは フル機能の CRUD をサポートしていません。)
試してみる<a name="trying-it-out"></a>
----------
どのように動作するかを見るために、ブラウザを使って下記の URL にアクセスしてください:
```
http://hostname/index.php?r=country/index
```
データグリッドがデータベーステーブルから取得した国を表示しているページが表示されます。
グリッドをソートしたり、カラムのヘッダに検索条件を入力してグリッドをフィルターしたりすることが出来ます。
グリッドに表示されているそれぞれの国について、詳細を見たり、更新したり、または削除したりすることが出来ます。また、グリッドの上にある "Create Country" ボタンをクリックすると、新しい国データを作成するためのフォームが利用に供されます。
![国リストのデータグリッド](images/start-gii-country-grid.png)
![国データを更新する](images/start-gii-country-update.png)
下記が Gii によって生成されるファイルのリストです。
これらの機能がどのように実装されているかを調査したい場合、また、これらの機能をカスタマイズしたいときに参照してください:
* Controller: `controllers/CountryController.php`
* Models: `models/Country.php` and `models/CountrySearch.php`
* Views: `views/country/*.php`
> Info|情報: Gii は非常にカスタマイズしやすく拡張しやすいコード生成ツールとして設計されています。
これを賢く使うと、アプリケーションの開発速度を大いに高めることが出来ます。
更なる詳細は、[Gii](tool-gii.md) の節を参照してください。
まとめ<a name="summary"></a>
------
この節では、Gii を使ってコードを生成して、データベーステーブルに保存されているコンテンツのための完全な CRUD 機能を実装する方法を学びました。
アプリケーションを走らせる
==========================
Yii のインストールが終ると、実際に動く Yii のアプリケーションにアクセスすることが出来るようになります。
その URL は、`http://hostname/basic/web/index.php` あるいは `http://hostname/index.php` など、設定によつて異なります。
この節では、アプリケーションに組み込み済みの機能を紹介し、コードがどのように組織されているか、
そして、一般にアプリケーションがリクエストをどのように処理するかを説明します。
> Info|情報: 話を簡単にするために、この「始めよう」のチュートリアルを通じて、
`basic/web` をウェブサーバのドキュメントルートとして設定したと仮定します。そして、
アプリケーションにアクセスするための URL は `http://hostname/index.php` またはそれに似たものになるように
設定したと仮定します。
必要に応じて、説明の中の URL を読み替えてください。
機能<a name="functionality"></a>
----
インストールされた基本的なアプリケーションは4つのページを持っています:
* ホームページ: `http://hostname/index.php` の URL にアクセスすると表示されます。
* 「について」のページ。
* 「コンタクト」のページ: エンドユーザがメールであなたに連絡を取ることが出来るコンタクトフォームが表示されます。
* 「ログイン」ページ: エンドユーザを認証するためのログインフォームが表示されます。
"admin/admin" でログインしてみてください。
「ログイン」のメインメニュー項目が「ログアウト」に変ることに気付くでしょう。
これらのページは共通のヘッダとフッタを持っています。
ヘッダには、異なるページ間を行き来することを可能にするメインメニューバーがあります。
ブラウザのウィンドウの下部にツールバーがあることにも気がつくはずです。
これは Yii によって提供される便利な [デバッグツールバー](tool-debugger.md) であり、ログメッセージ、
レスポンスのステータス、データベースクエリの実行状況、その他、たくさんのデバッグ情報を記録・表示するものです。
アプリケーションの構造<a name="application-structure"></a>
----------------------
アプリケーションにとって最も重要なディレクトリとファイルは (アプリケーションのルートディレクトリが `basic` だと仮定すると) 以下の通りです:
```
basic/ アプリケーションのベースパス
composer.json Composer によって使用される。パッケージ情報を記述
config/ アプリケーションその他の設定を格納
console.php コンソールアプリケーションの設定
web.php ウェブアプリケーションの設定
commands/ コンソールコマンドのクラスを格納
controllers/ コントローラのクラスを格納
models/ モデルのクラスを格納
runtime/ 実行時に Yii によって生成されるファイル (ログやキャッシュなど) を格納
vendor/ インストールされた Composer パッケージ (Yii フレームワークそのものを含む) を格納
views/ ビューファイルを格納
web/ アプリケーションのウェブルート。ウェブからアクセス可能なファイルを格納
assets/ Yii によって公開されるアセットファイル (javascript と CSS) を格納
index.php アプリケーションのエントリスクリプト (ブートストラップスクリプト)
yii Yii コンソールコマンド実行スクリプト
```
一般に、アプリケーションのファイルは二種類に分けることが出来ます: `basic/web` の下にあるファイルとその他のディレクトリの下にあるファイルです。
前者は HTTP で (すなわちブラウザで) 直接にアクセスすることが出来ますが、後者は直接のアクセスは出来ませんし、許可すべきでもありません。
Yii は [モデル・ビュー・コントローラ (MVC)](http://wikipedia.org/wiki/Model-view-controller) デザインパターンを実装していますが、それが上記のディレクトリ構成にも反映されています。
`models` ディレクトリが全ての [モデルクラス](structure-models.md) を格納し、`views` ディレクトリが全ての [ビュースクリプト](structure-views.md) を格納し、
`controllers` ディレクトリが全ての [コントローラクラス](structure-controllers.md) を格納します。
次の図がアプリケーションの静的な構造を示すものです。
![アプリケーションの静的な構造](images/application-structure.png)
各アプリケーションは一つのエントリスクリプト `web/index.php` を持ちます。これはアプリケーション中で唯一ウェブからアクセス可能な PHP スクリプトです。
エントリスクリプトは入力されたリクエストを受け取って、[アプリケーション](structure-applications.md) のインスタンスを作成します。
[アプリケーション](structure-applications.md)[コンポーネント](concept-components.md) の助力を得てリクエストを解決し、リクエストを MVC 要素に対して送出します。
[ウィジェット](structure-widgets.md) は、複雑で動的なユーザインタフェイス要素を構築するために、[ビュー](structure-views.md) の中で使われます。
リクエストのライフサイクル<a name="request-lifecycle"></a>
--------------------------
次の図は、アプリケーションがどのようにリクエストを処理するかを示すものです。
![リクエストのライフサイクル](images/application-lifecycle.png)
1. ユーザが [エントリスクリプト](structure-entry-scripts.md) `web/index.php` に対してリクエストを出します。
2. エントリスクリプトはアプリケーションの [設定](concept-configurations.md) を読み出して、
リクエストを処理する [アプリケーション](structure-applications.md) のインスタンスを作成します。
3. アプリケーションは、[リクエスト](runtime-requests.md) アプリケーションコンポーネントの助力を得て、
リクエストされた [ルート](runtime-routing.md) を解決します。
4. アプリケーションがリクエストを処理する [コントローラ](structure-controllers.md) のインスタンスを作成します。
5. コントローラが [アクション](structure-controllers.md) のインスタンスを作成し、アクションのためのフィルタを実行します。
6. 一つでもフィルタが失敗したときは、アクションはキャンセルされます。
7. すべてのフィルタを通ったとき、アクションが実行されます。
8. アクションはデータモデルを、おそらくはデータベースから、読み出します。
9. アクションはデータモデルをビューに提供して、ビューを表示します。
10. 表示された結果が [レスポンス](runtime-responses.md) アプリケーションコンポーネントに返されます。
11. レスポンスコンポーネントが表示された結果をユーザのブラウザに送信します。
Componentes de Aplicação
========================
Aplicações são [service locators](concept-service-locator.md). Elas hospedam um
conjunto de assim chamados *componentes de aplicação* que fornecem diferentes
serviços para o processamento de requisições. Por exemplo, o componente
`urlManager` é responsável pelo roteamento de requisições Web aos controllers
adequados; o componente `db` fornece serviços relacionados a bancos de dados; e
assim por diante.
Cada componente de aplicação tem um ID que o identifica de maneira única dentre
os outros componentes de uma mesma aplicação. Você pode acessar um componente de
aplicação através da expressão
```php
\Yii::$app->componentID
```
Por exemplo, você pode usar `\Yii::$app->db` para obter a [[yii\db\Connection|conexão do BD]],
e `\Yii::$app->cache` para obter o [[yii\caching\Cache|cache primário]] registrado
com a aplicação.
Um componente de aplicação é criado na primeira vez em que é acessado através
da expressão acima. Quaisquer acessos posteriores retornarão a mesma instância
do componente.
Componentes de aplicação podem ser quaisquer objetos. Você pode registrá-los
configurando a propriedade [[yii\base\Application::components]] nas
[configurações da aplicação](structure-applications.md#application-configurations).
Por exemplo,
```php
[
'components' => [
// registra o componente "cache" usando um nome de classe
'cache' => 'yii\caching\ApcCache',
// registra o componente "db" usando um array de configuração
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
],
// registra o componente "search" usando uma função anônima
'search' => function () {
return new app\components\SolrService;
},
],
]
```
> Info: Embora você possa registrar quantos componentes de aplicação você quiser,
você deveria fazer isso com juízo. Componentes de aplicação são como variáveis
globais. Usar componentes de aplicação demais pode tornar seu código
potencialmente mais difícil de testar e manter. Em muitos casos, você pode
simplesmente criar um componente local e utilizá-lo quando necessário.
## Components de Inicialização <a name="bootstrapping-components"></a>
Conforme mencionado acima, um componente de aplicação só será instanciado quando
ele estiver sendo acessado pela primeira vez. Se ele nunca for acessado durante
uma requisição, ele não será instanciado. No entanto, algumas vezes você pode
querer instanciar um componente de aplicação em todas as requisições, mesmo que
ele não seja explicitamente acessado. Para fazê-lo, você pode listar seu ID na
propriedade [[yii\base\Application::bootstrap|bootstrap]] da aplicação.
Por exemplo, a configuração de aplicação a seguir assegura-se que o componente
`log` sempre esteja carregado:
```php
[
'bootstrap' => [
'log',
],
'components' => [
'log' => [
// configuração para o componente "log"
],
],
]
```
## Componentes de Aplicação do Core <a name="core-application-components"></a>
O yii define um conjunto de componentes de aplicação do **core** com IDs fixos
e configurações padrão. Por exemplo, o componente [[yii\web\Application::request|request]]
é usado para coletar as informações sobre uma requisição do usuário e resolvê-la
em uma [rota](runtime-routing.md); o componente [[yii\base\Application::db|db]]
representa uma conexão do banco de dados através da qual você pode realizar
consultas. É com a ajuda destes componentes de aplicação do core que as aplicações
Yii conseguem tratar as requisições dos usuários.
Segue abaixo uma lista dos componentes de aplicação pré-definidos do core. Você
pode configurá-los e personalizá-los como você faz com componentes de aplicação
normais. Quando você estiver configurando um componente de aplicação do core,
se você não especificar sua classe, a padrão será utilizada.
* [[yii\web\AssetManager|assetManager]]: gerencia os asset bundles e a publicação
de assets. Por favor consulte a seção [Gerenciando Assets](structure-assets.md)
para mais detalhes.
* [[yii\db\Connection|db]]: representa uma conexão do banco de dados através da
qual você poderá realizar consultas. Perceba que quando você configura esse
componente, você precisa especificar a classe do componente bem como as outras
propriedades obrigatórios, tais como [[yii\db\Connection::dsn]]. Por favor
consulte a seção [Data Access Objects](db-dao.md) (Objeto de Acesso a Dados)
para mais detalhes.
* [[yii\base\Application::errorHandler|errorHandler]]: manipula erros e exceções
do PHP. Por favor consulte a seção [Tratamento de Erros](runtime-handling-errors.md)
para mais detalhes.
* [[yii\i18n\Formatter|formatter]]: formata dados quando são exibidos aos
usuários finais. Por exemplo, um número pode ser exibido com um separador de
milhares, uma data pode ser formatada em um formato longo. Por favor consulte
a seção [Formatação de Dados](output-formatter.md) para mais detalhes.
* [[yii\i18n\I18N|i18n]]: suporta a tradução e formatação de mensagens. Por favor
consulte a seção [Internacionalização](tutorial-i18n.md) para mais detalhes.
* [[yii\log\Dispatcher|log]]: gerencia alvos de logs. Por favor consulte a seção
[Gerenciamento de Logs](runtime-logging.md) para mais detalhes.
* [[yii\swiftmailer\Mailer|mail]]: suporta a composição e envio de e-mails. Por
favor consulte a seção [Enviando E-mails](tutorial-mailing.md) para mais
detalhes.
* [[yii\base\Application::response|response]]: representa a resposta sendo enviada
para os usuários finais. Por favor consulte a seção [Respostas](runtime-responses.md)
para mais detalhes.
* [[yii\base\Application::request|request]]: representa a requisição recebida dos
usuários finais. Por favor consulte a seção [Requisições](runtime-requests.md)
para mais detalhes.
* [[yii\web\Session|session]]: representa as informações da sessão. Esse componente
só está disponível em [[yii\web\Application|aplicações Web]]. Por favor consulte
a seção [Sessões e Cookies](runtime-sessions-cookies.md) para mais detalhes.
* [[yii\web\UrlManager|urlManager]]: suporta a análise e criação de URLs. Por
favor consulte a seção [Análise e Geração de URLs](runtime-url-handling.md)
para mais detalhes.
* [[yii\web\User|user]]: representa as informações de autenticação do usuário.
Esse componente só está disponível em [[yii\web\Application|aplicações Web]].
Por favor consulte a seção [Autenticação](security-authentication.md) para
mais detalhes.
* [[yii\web\View|view]]: suporta a renderização de views. Por favor consulte a
seção [Views](structure-views.md) para mais detalhes.
Scripts de Entrada
==================
Scripts de entrada são o primeiro passo no processo de inicialização da aplicação.
Uma aplicação (seja uma aplicação Web ou do console) possui um único script de
entrada. Os usuários finais fazem requisições a scripts de entrada que criam
as instâncias da aplicação e redirecionam as requisições para elas.
Os scripts de entrada para aplicações Web devem estar armazenados em diretórios
acessíveis pela Web, de modo que eles possam ser acessados pelos usuários finais.
Frequentemente são chamados de `index.php`, mas também podem usar outros nomes,
desde que os servidores Web consigam localizá-los.
Os scripts de entrada para aplicações do console são geralmente armazenados no
[caminho base](structure-applications.md) das aplicações e são chamados de `yii`
(com o sufixo `.php`). Eles devem ser tornados executáveis para que os usuários
possam executar aplicações do console através do comando
`./yii <rota> [argumentos] [opções]`.
O trabalho principal dos scripts de entrada é o seguinte:
* Definir constantes globais;
* Registrar o [autoloader do Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Incluir o arquivo da classe [[Yii]];
* Carregar a configuração da aplicação;
* Criar e configurar uma instância da [aplicação](structure-applications.md);
* Chamar [[yii\base\Application::run()]] para processar as requisições que chegam.
## Aplicações da Web <a name="web-applications"></a>
Este é o código no script de entrada para o [Modelo Básico de Aplicação Web](start-installation.md).
```php
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
// registra o autoloader do Composer
require(__DIR__ . '/../vendor/autoload.php');
// inclui o arquivo da classe Yii
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
// carrega a configuração da aplicação
$config = require(__DIR__ . '/../config/web.php');
// cria, configura e executa a aplicação
(new yii\web\Application($config))->run();
```
## Aplicações do Console <a name="console-applications"></a>
De forma semelhante, o seguinte é o código do script de entrada de uma aplicação
do console:
```php
#!/usr/bin/env php
<?php
/**
* Yii console bootstrap file.
*
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
defined('YII_DEBUG') or define('YII_DEBUG', true);
// o fcgi não tem STDIN e STDOUT definidos por padrão
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
// registra o autoloader do Composer
require(__DIR__ . '/vendor/autoload.php');
// inclui o arquivo da classe Yii
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
// carrega a configuração da aplicação
$config = require(__DIR__ . '/config/console.php');
$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);
```
## Definindo Constantes <a name="defining-constants"></a>
Os scrips de entrada são o melhor lugar para definir as constantes globais. O
Yii suporta as seguintes três constantes:
* `YII_DEBUG`: especifica se a aplicação está rodando no modo de depuração. No
modo de depuração, uma aplicação manterá mais informações de log, e revelará
stacks de chamadas de erros detalhadas se forem lançadas exceções. Por este
motivo, o modo de depuração deveria ser usado principalmente durante o
desenvolvimento. O valor padrão de `YII_DEBUG` é `false`.
* `YII_ENV`: especifica em qual ambiente a aplicação está rodando. Isso foi
descrito em maiores detalhes na seção [Configurações](concept-configurations.md#environment-constants).
O valor padrão de `YII_ENV` é `'prod'`, significando que a aplicação está
executando em ambiente de produção.
* `YII_ENABLE_ERROR_HANDLER`: especifica se deve ativar o manipulador de erros
fornecido pelo Yii. O valor padrão desta constante é `true`.
Ao definir uma constante, frequentemente usamos código como o a seguir:
```php
defined('YII_DEBUG') or define('YII_DEBUG', true);
```
que é equivalente ao seguinte código:
```php
if (!defined('YII_DEBUG')) {
define('YII_DEBUG', true);
}
```
Claramente o primeiro é mais sucinto e fácil de entender.
A definição de constantes deveria ser feita logo no início de um script de entrada,
de modo que obtenha efeito quando outros arquivos PHP estiverem sendo inclusos.
Visão Geral
===========
As aplicações do Yii são organizadas de acordo com o padrão de projeto
[model-view-controller (MVC)](http://pt.wikipedia.org/wiki/MVC)
(modelo-visão-controlador). Os [models](structure-models.md) representam dados,
lógica e regras de negócio; as [views](structure-views.md) são a representação
da saída dos modelos; e os [controllers](structure-controllers.md) recebem entradas
e as convertem em comandos para os [models](structure-models.md) e as [views](structure-views.md).
Além do MVC, as aplicações do Yii também possuem as seguintes entidades:
* [scripts de entrada](structure-entry-scripts.md): são scripts PHP que são
diretamente acessíveis aos usuários finais. São responsáveis por iniciar o
ciclo de tratamento de uma requisição.
* [aplicações](structure-applications.md): são objetos globalmente acessíveis que
gerenciam os componentes da aplicação e os coordenam para atender às requisições.
* [componentes de aplicação](structure-application-components.md): são objetos
registrados com as aplicações e fornecem vários serviços para atender às
requisições.
* [módulos](structure-modules.md): são pacotes auto-contidos que contém um MVC
completo por si sós. Uma aplicação pode ser organizada em termos de múltiplos
módulos.
* [filtros](structure-filters.md): representam código que precisa ser chamado
pelos controllers antes e depois do tratamento propriamente dito de cada
requisição.
* [widgets](structure-widgets.md): são objetos que podem ser embutidos em
[views](structure-views.md). Podem conter lógica de controller e podem ser
reutilizados em diferentes views.
O diagrama a seguir demonstra a estrutura estática de uma aplicação:
![Estrutura Estática da Aplicação](images/application-structure.png)
......@@ -100,7 +100,7 @@ $cache = new FileCache([
Заранее определённые псевдонимы <a name="predefined-aliases"></a>
----------------------------------------------------------
В Yii заранее определны псевдонимы для часто используемых путей к файлам и URL:
В Yii заранее определены псевдонимы для часто используемых путей к файлам и URL:
- `@yii`: директория, в которой находится файл `BaseYii.php` (директория фреймворка).
- `@app`: [[yii\base\Application::basePath|базовый путь]] текущего приложения.
......
......@@ -75,7 +75,7 @@ require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
```
Вы можете использовать автозагрузчик Composer без автозагрузчика Yii. Однако, скорость автозагрузки в этом случае
может уменьшится. Также вам будет необходимо сдедовать правилам автозагрузчика Composer.
может уменьшится. Также вам будет необходимо следовать правилам автозагрузчика Composer.
> Информация: Если вы не хотите использовать автозагрузчик Yii, создайте свою версию файла `Yii.php`
и подключите его в [входном скрипте](structure-entry-scripts.md).
......
......@@ -338,7 +338,7 @@ $user->touch('login_time');
### Плюсы трейтов <a name="pros-for-traits"></a>
Трейты являются гораздо более производительными, чем поведения поведений, которые, являясь объектами, требуют
Трейты являются гораздо более производительными, чем поведения, которые, являясь объектами, требуют
дополнительного времени и памяти.
Многие IDE поддерживают работу с трейтами, так как они являются стандартными конструкциями языка.
......
......@@ -84,7 +84,7 @@ $component = \Yii::createObject([
> Информация: Способ инициализации через вызов [[Yii::createObject()]] выглядит более сложным. Но в то же время он более
мощный из-за того, что он реализован на самом верху [контейнера внедрения зависимостей](concept-di-container.md).
Жизненый цикл объектов класса [[yii\base\Object]] содержит следующие этапы:
Жизненный цикл объектов класса [[yii\base\Object]] содержит следующие этапы:
1. Предварительная инициализация в конструкторе. Здесь вы можете установить значения свойств по умолчанию.
2. Конфигурация объекта с помощью `$config`. Во время конфигурации могут быть перезаписаны значения свойств по умолчанию,
......
......@@ -90,7 +90,7 @@ $foo = $container->get('Foo');
------------------------
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а так же определение зависимости.
Именем звисимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP calback'ом.
Именем зависимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP calback'ом.
```php
$container = new \yii\di\Container;
......@@ -251,7 +251,7 @@ Yii создаёт контейнер внедрения зависимосте
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]);
```
Теперь, если вы вызовете в представлении виджет, используя следующий код, то свойство `maxButtonCount` будет инициальзировано, как 5, вместо значения по умолчанию 10, как это определено в классе.
Теперь, если вы вызовете в представлении виджет, используя следующий код, то свойство `maxButtonCount` будет инициализировано, как 5, вместо значения по умолчанию 10, как это определено в классе.
```php
echo \yii\widgets\LinkPager::widget();
......
......@@ -11,8 +11,7 @@ $object->label = trim($label);
```
Недостатком приведённого выше кода является то, что вам придется вызывать функцию `trim()` во всех местах, где вы
присваиваете значение полю `label`. Если в будущем понадобится производить еще какие-либо действие, например приобразовать
первую букву в верхний регистр, вам придётся изменить каждый участок кода, где производится присваивание значения
присваиваете значение полю `label`. Если в будущем понадобится производить еще какие-либо действие, например преобразовать первую букву в верхний регистр, вам придётся изменить каждый участок кода, где производится присваивание значения
полю `label`. Повторение кода приводит к ошибкам и его необходимо избегать всеми силами.
Что бы решить эту проблему, в Yii был добавлен базовый класс [[yii\base\Object]] который реализует работу со свойствами
......
......@@ -46,7 +46,7 @@ Yii 2.0 широко использует [Composer](https://getcomposer.org/),
Одним из основных изменений в Yii 2.0 является использование пространств имён. Почти каждый класс фреймворка
находится в пространстве имён, например, `yii\web\Request`. Префикс "С" в именах классов больше не используется.
Имена классов соответствуют структуре директорий. Например, `yii\web\Request` указывает, что соответсвующий класс
Имена классов соответствуют структуре директорий. Например, `yii\web\Request` указывает, что соответствующий класс
находится в файле `web/Request.php` в директории фреймворка.
Благодаря загрузчику классов Yii, вы можете использовать любой класс фреймворка без необходимости непосредственно
......
......@@ -21,7 +21,7 @@
информацию в кеше или NoSQL хранилище.
Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения
частоты запросв при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышеии
частоты запросов при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышении
ограничений будет выброшено исключение [[yii\web\TooManyRequestsHttpException]].
Вы можете настроить ограничитель частоты запросов в ваших классах REST-контроллеров следующим образом:
......
......@@ -94,7 +94,7 @@ public function fields()
По умолчанию, [[yii\base\Model::extraFields()]] ничего не возвращает, а [[yii\db\ActiveRecord::extraFields()]]
возвращает названия заданных в БД связей.
Формат вовзращаемызх `extraFields()` данных такой же как у `fields()`. Как правило, `extraFields()`
Формат возвращаемых `extraFields()` данных такой же как у `fields()`. Как правило, `extraFields()`
используется для указания полей, значения которых являются объектами. Например учитывая следующее объявление полей
```php
......
......@@ -82,7 +82,7 @@ public function behaviors()
## Сериализация данных <a name="data-serializing"></a>
Как уже описывалось выше, [[yii\rest\Serializer]] - это центральное место, отвечащее за конвертацию объектов ресурсов
Как уже описывалось выше, [[yii\rest\Serializer]] - это центральное место, отвечающее за конвертацию объектов ресурсов
или коллекций в массивы. Он реализует интерфейсы [[yii\base\ArrayableInterface]] и [[yii\data\DataProviderInterface]].
Для объектов ресурсов как правило реализуется интерфейс [[yii\base\ArrayableInterface]], а для коллекций -
[[yii\data\DataProviderInterface]].
......
......@@ -4,7 +4,7 @@
> Раздел находится в разработке
В Yii встроен гибкий и расширяемый логгер, который способен обрабатывать сообщения в соответствии с их уровнем важности и типом.
С его помощью также можно фильтровать вообщения по разными критериям и пересылать их в файлы, email, в дебаггер и т.п.
С его помощью также можно фильтровать сообщения по разными критериям и пересылать их в файлы, email, в дебаггер и т.п.
Основы логгирования
-------------------
......
......@@ -3,7 +3,7 @@
>Замечание: раздел находится в разработке.
Концепция работы с URL в Yii довольно проста. Предполагается, что в приложении используются внутренние маршруты и параметры вместо жестко заданных URL. Тогда фреймворк сам преобразует маршруты в URL и обратно, в соотвествии с конфигурацией URL менеджера. Такой подход позволяет изменять вид URL на всем сайте, редактируя единственный конфигурационный файл не трогая код самого приложения.
Концепция работы с URL в Yii довольно проста. Предполагается, что в приложении используются внутренние маршруты и параметры вместо жестко заданных URL. Тогда фреймворк сам преобразует маршруты в URL и обратно, в соответствии с конфигурацией URL менеджера. Такой подход позволяет изменять вид URL на всем сайте, редактируя единственный конфигурационный файл не трогая код самого приложения.
Внутренние маршруты
-------------------
......
......@@ -64,7 +64,7 @@ http://hostname/index.php?r=gii
Если необходимо перезаписать существующего файла, установите флажок рядом с "переписать", а затем нажмите кнопку "Создать". При создании нового файла, вы можете просто нажать "Создать".
Далее, вы увидите страницу подтверждения, указывающую что код был успешно создана. Если ваш файл уже существующествует, вы также увидите сообщение о том, что он был переписан с вновь сгенерированным кодом.
Далее, вы увидите страницу подтверждения, указывающую что код был успешно создана. Если ваш файл уже существует, вы также увидите сообщение о том, что он был переписан с вновь сгенерированным кодом.
Создание CRUD кода <a name="generating-crud"></a>
......@@ -115,4 +115,4 @@ http://hostname/index.php?r=country/index
Заключение <a name="summary"></a>
-------
В этом разделе, Вы узнали как использовать Gii чтобы генерировать код который реализует полный функциональность CRUD для содержимого которое хранится в таблице базы данных.
\ No newline at end of file
В этом разделе, Вы узнали как использовать Gii чтобы генерировать код который реализует полный функциональность CRUD для содержимого которое хранится в таблице базы данных.
......@@ -23,7 +23,7 @@
В случае возникновения проблем или если вам необходима дополнительная информация, обращайтесь
к [документации Composer](https://getcomposer.org/doc/) .
После установки Composer устанавливать Yii можно запуститив следующую команду в папке доступной через веб:
После установки Composer устанавливать Yii можно запустив следующую команду в папке доступной через веб:
```
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
......
......@@ -34,7 +34,7 @@
'password' => '',
],
// регистрация "search" компонента с помошью анонимной функции
// регистрация "search" компонента с помощью анонимной функции
'search' => function () {
return new app\components\SolrService;
},
......
......@@ -508,7 +508,7 @@ $width = \Yii::$app->params['thumbnail.size'][0];
На момент возникновения данного события, обработка запроса завершена и вы можете воспользоваться этим для произведения постобработки
запроса, с целью настройки ответа.
Обратите внимаени что в компоненте [[yii\web\Response|response]] также возникают события в процессе отправки данных
Обратите внимание, что в компоненте [[yii\web\Response|response]] также возникают события в процессе отправки данных
конечному пользователю. Эти события возникают *после* текущего события.
......
......@@ -216,7 +216,7 @@ echo \Yii::$app->view->renderFile('@app/views/site/license.php');
Данные можно передавать в вид явно или подгружать их динамически, обращаясь к контексту из вида.
Передавая данные через второй параметр медодов рендеринга вида, вы явно передаете данные в вид.
Передавая данные через второй параметр методов рендеринга вида, вы явно передаете данные в вид.
Данные должны быть представлены как обычный массив: ключ-значение. При рендеринге вида, php вызывает встроенную функцию PHP `extract()` на переданном массиве, чтобы переменные из массива "распаковались" в переменные вида. Например, следующий код в контроллере передаст две переменные виду `report` :
`$foo = 1` и `$bar = 2`.
......
Автозавантаження класів
=================
Пошук і підключення файлів класів в Yii реалізовано за допомогою
[автозавантаження класів](http://www.php.net/manual/ru/language.oop5.autoload.php). Фреймворк надає свій швидкий сумісний з [PSR-4](https://github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md)
автозавантажувач, який встановлюється в момент підключення `Yii.php`.
> Примітка: Для простоти оповіді, в цьому розділі ми будемо говорити тільки про автозавантаження класів. Тим не менш, все описане застосовно до інтерфейсів і трейтам.
Як використовувати автозавантажувач Yii <a name="using-yii-autoloader"></a>
--------------------------------------------------------------
При використанні автозавантажувач класів Yii слід дотримуватися два простих правила створення і іменування класів:
* Кожен клас повинен належати простору імен (тобто `foo\bar\MyClass`).
* Кожен клас повинен знаходитися в окремому файлі, шлях до якого визначаться наступним правилом:
```php
// $className — це абсолютне ім'я класу, що починається з "\"
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');
```
Наприклад, якщо абсолютне ім'я класу `foo\bar\MyClass`, то [псевдонім шляху](concept-aliases.md) даного файлу буде
`@foo/bar/MyClass.php`. Для того, щоб даний псевдонім можна було перетворити в шлях до файлу, необхідно щоб або `@foo` або `@foo/bar` був [кореневим псевдонімом](concept-aliases.md#defining-aliases).
при використанні [шаблону додатку basic](start-basic.md) ви можете зберігати свої класи в просторі імен `app`.
В цьому випадку вони будуть завантажуватися автоматично без створення нового псевдоніма. Це працює тому як `@app`
є [заздалегідь певним псевдонімом](concept-aliases.md#predefined-aliases) і таке ім'я класу як
`app\components\MyClass` відповідно до описаного вище алготімом перетвориться в шлях
`директорияПриложения/components/MyClass.php`.
В [шаблоні додатку advanced](tutorial-advanced-app.md) кожен рівень додатку володіє власним кореневим псевдонімом. Наприклад, для frontend кореневим псевдонімом є `@frontend`, а для backend — `@backend`. Це дозволяє
розмістити класи frontend в простір імен `frontend`, а класи backend в простір імен `backend`. При цьому класи будуть завантажені автоматично.
Карта класів <a name="class-map"></a>
---------------------------------
Автозавантажувач Yii підтримує *карту класів*. Ця можливість дозволяє вказати шлях до файлу для кожного імені класу.
При завантаженні класу автозавантажувач перевіряє наявність класу в карті. Якщо він там є, відповідний файл буде завантажений
безпосередньо без будь-яких додаткових перевірок. Це робить автозагрузку дуже швидкою. Всі класи самого фреймворка
завантажуються саме цим способом.
Ви маєте можливість додати клас в карту `Yii::$classMap` наступним чином:
```php
Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';
```
Для вказівки шляхів до файлів класів можна використовувати [псевдоніми](concept-aliases.md). Карту класів необхідно сформувати в процесі [первинного завантаження](runtime-bootstrapping.md) так як вона повинна бути готова до використання класів.
Використання інших автозавантажувачів <a name="using-other-autoloaders"></a>
------------------------------------------------------------------
Так як Yii використовує Composer в якості менеджера залежностей, рекомендується додатково встановити його автозавантажувач.
Якщо ви використовуєте які-небудь сторонні бібліотеки, в яких є свої Автозавантажувач, ці Автозавантажувач також необхідно
встановити.
При використанні додаткових автозавантажувач файл `Yii.php` повинен бути підключений *після* їх установки. це дозволить
автозавантажувачу Yii першим пробувати завантажити клас. Приміром, наведений нижче код взятий з
[вхідного скрипта](structure-entry-scripts.md) [шаблону додатку basic](start-basic.md). Перший рядок встановлює автозавантажувач Composer, а друга - автозавантажувач Yii:
```php
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
```
Ви можете використовувати автозавантажувач Composer без автозавантажувач Yii. Однак, швидкість автозавантаження в цьому випадку може зменшиться. Також вам буде необхідно слідувати правилам автозавантажувача Composer.
> Інформація: Якщо ви не хочете використовувати автозавантажувач Yii, створіть свою версію файлу `Yii.php`
і підключіть його в [вхідному скрипті](structure-entry-scripts.md).
Автозагрузка класів розширень <a name="autoloading-extension-classes"></a>
-------------------------------------------------------------------
Автозавантажувач Yii може автоматично завантажувати класи [розширень](structure-extensions.md) в тому випадку, якщо дотримується єдине правило. Розширення повинно правильно описати розділ 'autoload' у файлі 'composer.json'. Більш докладно про це можна дізнатися з [офіційній документації Composer](https://getcomposer.org/doc/04-schema.md#autoload).
Якщо ви не використовуєте автозавантажувач Yii, то класи розширень можуть бути автоматично завантажені з допомогою автозавантажувач Composer.
启动引导(Bootstrapping)
=============
启动引导是指:在应用开始解析并处理新接受请求之前,一个预先准备环境的过程。启动引导会在两个地方具体进行:[入口脚本(Entry Script)](structure-entry-scripts.md)
[应用主体(application)](structure-applications.md)
[入口脚本](structure-entry-scripts.md)里,需注册各个类库的类文件自动加载器(Class Autoloader,简称自动加载器)。这主要包括通过其 `autoload.php` 文件加载的
Composer 自动加载器,以及通过 `Yii` 类加载的 Yii 自动加载器。之后,入口脚本会加载应用的
[配置(configuration)](concept-configurations.md)
并创建一个 [应用主体](structure-applications.md) 的实例。
在应用主体的构造函数中,会执行以下引导工作:
1. 调用 [[yii\base\Application::preInit()|preInit()]](预初始化)方法,配置一些高优先级的应用属性,比如 [[yii\base\Application::basePath|basePath]] 属性。
2. 注册[[yii\base\Application::errorHandler|错误处理器(ErrorHandler)]]。
3. 通过给定的应用配置初始化应用的各属性。
4. 通过调用 [[yii\base\Application::init()|init()]](初始化)方法,它会顺次调用
[[yii\base\Application::bootstrap()|bootstrap()]] 从而运行引导组件。
- 加载扩展清单文件(extension manifest file) `vendor/yiisoft/extensions.php`
- 创建并运行各个扩展声明的 [引导组件(bootstrap components)](structure-extensions.md#bootstrapping-classes)
- 创建并运行各个 [应用组件](structure-application-components.md) 以及在应用的 [Bootstrap 属性](structure-applications.md#bootstrap)中声明的各个
[模块(modules)组件](structure-modules.md)(如果有)。
因为引导工作必须在处理**每一次**请求之前都进行一遍,因此让该过程尽可能轻量化就异常重要,请尽可能地优化这一步骤。
请尽量不要注册太多引导组件。只有他需要在 HTTP 请求处理的全部生命周期中都作用时才需要使用它。举一个用到它的范例:一个模块需要注册额外的 URL 解析规则,就应该把它列在应用的
[bootstrap 属性](structure-applications.md#bootstrap)之中,这样该 URL 解析规则才能在解析请求之前生效。(译者注:换言之,为了性能需要,除了 URL
解析等少量操作之外,绝大多数组件都应该按需加载,而不是都放在引导过程中。)
在生产环境中,可以开启字节码缓存,比如 APC,来进一步最小化加载和解析 PHP 文件所需的时间。
一些大型应用都包含有非常复杂的应用[配置](concept-configurations.md),它们会被分割到许多更小的配置文件中。此时,可以考虑将整个配置数组缓存起来,并在入口脚本创建应用实例之前直接从缓存中加载。
......@@ -177,14 +177,14 @@ Special Topics
Widgets
-------
* GridView: link to demo page
* ListView: link to demo page
* DetailView: link to demo page
* ActiveForm: link to demo page
* Pjax: link to demo page
* Menu: link to demo page
* LinkPager: link to demo page
* LinkSorter: link to demo page
* GridView: **TBD** link to demo page
* ListView: **TBD** link to demo page
* DetailView: **TBD** link to demo page
* ActiveForm: **TBD** link to demo page
* Pjax: **TBD** link to demo page
* Menu: **TBD** link to demo page
* LinkPager: **TBD** link to demo page
* LinkSorter: **TBD** link to demo page
* [Bootstrap Widgets](widget-bootstrap.md)
* [Jquery UI Widgets](widget-jui.md)
......
......@@ -258,7 +258,7 @@ Global Events <a name="global-events"></a>
Yii supports a so-called *global event*, which is actually a trick based on the event mechanism described above.
The global event requires a globally accessible Singleton, such as the [application](structure-applications.md) instance itself.
To create the global evant, an event sender calls the Singleton's `trigger()` method
To create the global event, an event sender calls the Singleton's `trigger()` method
to trigger the event, instead of calling the sender's own `trigger()` method. Similarly, the event handlers are attached to the event on the Singleton. For example:
```php
......
Elasticsearch
=============
> Note: This section is under development.
>
> It has no content yet.
Mongo DB
========
> Note: This section is under development.
>
> It has no content yet.
......@@ -85,6 +85,15 @@ When specifying columns, you may include the table prefixes or column aliases, e
If you are using array to specify the columns, you may also use the array keys to specify the column aliases,
e.g., `['user_id' => 'user.id', 'user_name' => 'user.name']`.
Starting from version 2.0.1, you may also select sub-queries as columns. For example,
```php
$subQuery = (new Query)->select('COUNT(*)')->from('user');
$query = (new Query)->select(['id', 'count' => $subQuery])->from('post');
// $query represents the following SQL:
// SELECT `id`, (SELECT COUNT(*) FROM `user`) AS `count` FROM `post`
```
To select distinct rows, you may call `distinct()`, like the following:
```php
......
Redis
=====
> Note: This section is under development.
>
> It has no content yet.
Sphinx Search
=============
> Note: This section is under development.
>
> It has no content yet.
......@@ -15,12 +15,13 @@ use yii\helpers\Html;
echo Html::encode('Test > test');
```
> Note: To support [extending helper classes](#extending-helper-classes), Yii breaks each core helper class
> Note: To support [customizing helper classes](#customizing-helper-classes), Yii breaks each core helper class
into two classes: a base class (e.g. `BaseArrayHelper`) and a concrete class (e.g. `ArrayHelper`).
When you use a helper, you should only use the concrete version and never use the base class.
## Core Helper Classes
Core Helper Classes
-------------------
The following core helper classes are provided in the Yii releases:
......@@ -39,19 +40,21 @@ The following core helper classes are provided in the Yii releases:
- VarDumper
## Extending Helper Classes
Customizing Helper Classes <a name="customizing-helper-classes"></a>
--------------------------
To custom a core helper class (e.g. `yii\helpers\ArrayHelper`), you should extend from its corresponding base class
(e.g. `yii\helpers\BaseArrayHelper`) and name your class the same as the corresponding concrete class
(e.g. `yii\helpers\ArrayHelper`), including its namespace.
To customize a core helper class (e.g. [[yii\helpers\ArrayHelper]]), you should create a new class extending
from the helpers corresponding base class (e.g. [[yii\helpers\BaseArrayHelper]]) and name your class the same
as the corresponding concrete class (e.g. [[yii\helpers\ArrayHelper]]), including its namespace. This class
will then be set up to replace the original implementation of the framework.
The following example shows how to customize the [[yii\helpers\ArrayHelper::merge()|merge()]] method of the
[[yii\helpers\ArrayHelper]] class:
```php
namespace yii\helpers;
<?php
use yii\helpers\BaseArrayHelper;
namespace yii\helpers;
class ArrayHelper extends BaseArrayHelper
{
......@@ -62,14 +65,16 @@ class ArrayHelper extends BaseArrayHelper
}
```
Save your class in a file named `ArrayHelper.php`. The file can be in any directory, such as `@app/components`.
Save your class in a file named `ArrayHelper.php`. The file can be in any directory, for example `@app/components`.
Next, in your application's [entry script](structure-entry-scripts.md), add the following line of code
after including the `yii.php` file:
after including the `yii.php` file to tell the [Yii class autoloader](concept-autoloading.md) to load your custom
class instead of the original helper class from the framework:
```php
Yii::$classMap['yii\helpers\ArrayHelper'] = 'path/to/ArrayHelper.php';
Yii::$classMap['yii\helpers\ArrayHelper'] = '@app/components/ArrayHelper.php';
```
The above line instructs the [Yii class autoloader](concept-autoloading.md) to load your version of the helper
class, instead of the one included in the Yii releases.
Note that customizing of helper classes is only useful if you want to change the behavior of an existing function
of the helpers. If you want to add additional functions to use in your application you may better create a separate
helper for that.
......@@ -113,7 +113,7 @@ $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->e
If you're using "basic" application template then folder `uploads` should be created under `web`.
That's it. Load the page and try uploading. Uplaods should end up in `basic/web/uploads`.
That's it. Load the page and try uploading. Uploads should end up in `basic/web/uploads`.
Additional information
----------------------
......
Complex Forms with Multiple Models
==================================
> Note: This section is under development.
>
> It has no content yet.
......@@ -518,7 +518,7 @@ class StatusValidator extends Validator
public function clientValidateAttribute($model, $attribute, $view)
{
$statuses = json_encode(Status::find()->select('id')->asArray()->column());
$message = json_encode($this->message);
$message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
return <<<JS
if (!$.inArray(value, $statuses)) {
messages.push($message);
......
Pagination
==========
> Note: This section is under development.
>
> It has no content yet.
Sorting
=======
> Note: This section is under development.
>
> It has no content yet.
......@@ -53,6 +53,7 @@ api/
models/
User.php
Post.php
Module.php
v2/
controllers/
UserController.php
......@@ -60,6 +61,7 @@ api/
models/
User.php
Post.php
Module.php
```
Your application configuration would look like:
......@@ -68,12 +70,10 @@ Your application configuration would look like:
return [
'modules' => [
'v1' => [
'basePath' => '@app/modules/v1',
'controllerNamespace' => 'app\modules\v1\controllers',
'class' => 'app\modules\v1\Module',
],
'v2' => [
'basePath' => '@app/modules/v2',
'controllerNamespace' => 'app\modules\v2\controllers',
'class' => 'app\modules\v2\Module',
],
],
'components' => [
......
......@@ -67,7 +67,7 @@ $headers = Yii::$app->response->headers;
$headers->add('Pragma', 'no-cache');
// set a Pragma header. Any existing Pragma headers will be discarded.
$headers->add('Pragma', 'no-cache');
$headers->set('Pragma', 'no-cache');
// remove Pragma header(s) and return the removed Pragma header values in array
$values = $headers->remove('Pragma');
......
......@@ -304,8 +304,9 @@ on the client side. This is achieved by signing each cookie with a hash string,
tell if a cookie is modified on the client side or not. If so, the cookie will NOT be accessible through the
[[yii\web\Request::cookies|cookie collection]] of the `request` component.
> Info: If a cookie fails the validation, you may still access it through `$_COOKIE`. This is because third-party
libraries may manipulate cookies in their own way, which does not involve cookie validation.
> Note: Cookie validation only protects cookie values from being modified. If a cookie fails the validation,
you may still access it through `$_COOKIE`. This is because third-party libraries may manipulate cookies
in their own way, which does not involve cookie validation.
Cookie validation is enabled by default. You can disable it by setting the [[yii\web\Request::enableCookieValidation]]
property to be false, although we strongly recommend you do not do so.
......
Auth Clients
============
> Note: This section is under development.
>
> It has no content yet.
......@@ -342,6 +342,8 @@ The rule above checks if the `post` is created by `$user`. We'll create a specia
command we've used previously:
```php
$auth = Yii::$app->authManager;
// add the rule
$rule = new \app\rbac\AuthorRule;
$auth->add($rule);
......@@ -444,6 +446,8 @@ class UserGroupRule extends Rule
}
}
$auth = Yii::$app->authManager;
$rule = new \app\rbac\UserGroupRule;
$auth->add($rule);
......
Security best practice
======================
> Note: This section is under development.
>
> It has no content yet.
......@@ -70,20 +70,20 @@ $data = Yii::$app->getSecurity()->decrypt($encryptedData, $secretKey);
Confirming data integrity
--------------------------------
There are situations in which you need to verify that your data hasn't been tampered with by a third party or even corrupted in some way. Yii provides an easy way to confirm data integrity in the form of two helper functions.
There are situations in which you need to verify that your data hasn't been tampered with by a third party or even corrupted in some way. Yii provides an easy way to confirm data integrity in the form of two helper functions.
Prefix the data with a hash generated from the secret key and data
```php
// $secretKey our application or user secret, $genuineData obtained from a reliable source
// $secretKey our application or user secret, $genuineData obtained from a reliable source
$data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey);
```
Checks if the data integrity has been compromised
```php
// $secretKey our application or user secret, $data obtained from an unreliable source
// $secretKey our application or user secret, $data obtained from an unreliable source
$data = Yii::$app->getSecurity()->validateData($data, $secretKey);
```
......@@ -136,5 +136,5 @@ Securing Cookies
See also
--------
- [Views security](view.md#security)
- [Views security](structure-views.md#security)
......@@ -160,6 +160,12 @@ This will cause a CSS file in the bundle to be included using the following HTML
<![endif]-->
```
To wrap link tag with `<noscript>` the following can be used:
```php
public $cssOptions = ['noscript' => true];
```
To include a JavaScript file in the head section of a page (by default, JavaScript files are included at the end
of the body section), use the following option:
......
......@@ -320,7 +320,7 @@ two choices to make the asset files directly accessible via Web:
copy the files listed in the asset bundle to a Web-accessible folder.
We recommend you use the second approach so that your extension can be more easily used by other people.
Please refer to the [Assets] section for more details about how to work with assets in general.
Please refer to the [Assets](structure-assets.md) section for more details about how to work with assets in general.
#### Internationalization and Localization <a name="i18n-l10n"></a>
......
Generating Api Documentation
============================
> Note: This section is under development.
>
> It has no content yet.
......@@ -163,3 +163,23 @@ There are some predefined constants you can use:
- `Controller::EXIT_CODE_NORMAL` with value of `0`;
- `Controller::EXIT_CODE_ERROR` with value of `1`.
It's a good practice to define meaningful constants for your controller in case you have more error code types.
### Formatting and colors
Yii console supports formatted output that is automatically degraded to non-formatted one if it's not supported
by terminal running the command.
Outputting formatted strings is simple. Here's how to output some bold text:
```php
$this->stdout("Hello?\n", Console::BOLD);
```
If you need to build string dynamically combining multiple styles it's better to use `ansiFormat`:
```php
$name = $this->ansiFormat('Alex', Console::FG_YELLOW);
echo "Hello, my name is $name.";
```
......@@ -5,12 +5,12 @@ From time to time, you may need to use some third-party code in your Yii applica
use Yii as a library in some third-party systems. In this section, we will show how to achieve these goals.
## Using Third-Party Libraries in Yii <a name="using-libs-in-yii"></a>
Using Third-Party Libraries in Yii <a name="using-libs-in-yii"></a>
----------------------------------
To use a third-party library in a Yii application, you mainly need to make sure the classes in the library
are properly included or can be autoloaded.
### Using Composer Packages <a name="using-composer-packages"></a>
Many third-party libraries are released in terms of [Composer](https://getcomposer.org/) packages.
......@@ -31,7 +31,6 @@ require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
```
### Using Downloaded Libraries <a name="using-downloaded-libs"></a>
If a library is not released as a Composer package, you should follow its installation instructions to install it.
......@@ -71,7 +70,8 @@ Yii::$classMap['Class2'] = 'path/to/Class2.php';
```
## Using Yii in Third-Party Systems <a name="using-yii-in-others"></a>
Using Yii in Third-Party Systems <a name="using-yii-in-others"></a>
--------------------------------
Because Yii provides many excellent features, sometimes you may want to use some of its features to support
developing or enhancing 3rd-party systems, such as WordPress, Joomla, or applications developed using other PHP
......@@ -82,10 +82,15 @@ take two steps: install Yii, and bootstrap Yii.
If the third-party system uses Composer to manage its dependencies, you can simply run the following commands
to install Yii:
```
composer require "yiisoft/yii2:*"
composer install
```
composer global require "fxp/composer-asset-plugin:1.0.0-beta3"
composer require "yiisoft/yii2:*"
composer install
The first command installs the [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/)
which allows managing bower and npm package dependencies through Composer. Even if you only want to use the database
layer or other non-asset related features of Yii, this is required to install the Yii composer package.
See also the general [section about installing Yii](start-installation.md#installing-via-composer) for more information
on Composer and solution to possible issues popping up during the installation.
Otherwise, you can [download](http://www.yiiframework.com/download/) the Yii release file and unpack it in
the `BasePath/vendor` directory.
......@@ -112,7 +117,8 @@ Now you can use most features provided by Yii. For example, you can create Activ
to work with databases.
## Using Yii 2 with Yii 1 <a name="using-both-yii2-yii1"></a>
Using Yii 2 with Yii 1 <a name="using-both-yii2-yii1"></a>
----------------------
If you were using Yii 1 previously, it is likely you have a running Yii 1 application. Instead of rewriting
the whole application in Yii 2, you may just want to enhance it using some of the features only available in Yii 2.
......
......@@ -14,7 +14,7 @@ git clone git@github.com:YOUR-GITHUB-USERNAME/yii2.git
Linux において、GitHub で GIT を設定するのに問題が生じたり、"Permission Denied (publickey)" のようなエラーが発生したりする場合は、
[setup your GIT installation to work with GitHub](http://help.github.com/linux-set-up-git/) に従ってください。
### 2. メインの Yii リポジトリを "upstream" という名前でリモートリポジトリとして追加する
### 2. メインの Yii リポジトリを "upstream" という名前でリモートとして追加する
Yii をクローンしたディレクトリ、すなわち "yii2" に入って、以下のコマンドを打ち込みます:
......@@ -113,7 +113,7 @@ git push -u origin 999-name-of-your-branch-goes-here
`-u` パラメータによって、あなたのブランチが今後は自動的に github のブランチに対してプッシュおよびプルを行うようになります。
つまり、次回 `git push` とタイプしたときには、git は既にどこにプッシュすればよいか知っている、ということです。
### 11. upstream に対してプルリクエスト ( [pull request](http://help.github.com/send-pull-requests/)) を発行する
### 11. upstream に対して [プルリクエスト](http://help.github.com/send-pull-requests/) を発行する
github 上のあなたのリポジトリに入って、"Pull Request" をクリックし、右側にあるブランチを選び、コメントボックスにもう少し詳細を記述します。
プルリクエストを課題とリンクさせるために、プルコメントのどこかに `#999` という書式で課題番号を記載します。
......@@ -126,9 +126,8 @@ github 上のあなたのリポジトリに入って、"Pull Request" をクリ
(現在のプルリクエストが open である限りは、別の新しいプルリクエストをする必要はありません)。
あなたのコードが受け入れられた場合は、コードはメインブランチにマージされて、次回の Yii のリリースの一部となります。
受け入れられなくても、落胆しないでください。
必要とする機能は人によってさまざまに異なります。
Yii は全ての人に対して全てを提供することは出来ません。
その場合でも、あなたのコードは github 上で公開され続けて、それを必要とする人々が参照することが出来ます。
必要とする機能は人によってさまざまに異なりますし、Yii は全ての人に対して全てを提供することは出来ません。
また、却下された場合でも、あなたのコードはそれを必要とする人々から参照されるように github 上で公開され続けます。
### 13. クリーンアップする
......@@ -149,7 +148,7 @@ git push origin --delete 999-name-of-your-branch-goes-here
* javascript、css または画像ファイルだけに影響する場合
* ドキュメンテーションを更新する場合
* 固定の文字列だけを修正する場合 (例えば、翻訳のアップデート)
* 固定の文字列だけを修正する(例えば、翻訳をアップデートする)場合
がそうです。
......
課題を報告する
==============
あなたが報告する課題(issue 問題)がより迅速に解決されるように、課題を作成するときには下記のガイドラインに従って下さい:
あなたが報告する課題(issue)がより迅速に解決されるように、課題を作成するときには下記のガイドラインに従って下さい:
* 以下の情報を提供して下さい: PHP と Yii のバージョン、オペレーティングシステムとウェブサーバのタイプ、ブラウザのタイプとバージョン;
* 出来れば、**完全な**エラーのコールスタックを提供して下さい。問題を説明するスクリーンショットは大いに歓迎ます。
* PHP と Yii のバージョン、オペレーティングシステムとウェブサーバのタイプ、および、ブラウザのタイプとバージョンについて、情報を提供してください;
* 出来れば、**完全な**エラーのコールスタックを提供して下さい。問題を説明するスクリーンショットは大いに歓迎されます。
* 問題を再現する手順を記述して下さい。問題を再現するコードを提供してくださるならば、なお一層良いでしょう。
**以下の場合は課題を報告しないでください**
......
......@@ -26,13 +26,13 @@ Yii は国際的なアプリケーションと開発者にとって役に立つ
値が空白の場合は、メッセージは翻訳されないものと見なされます。
翻訳が不要になったメッセージは、翻訳が一組の '@@' マークで囲まれます。
メッセージ文字列は複数形書式とともに使うことが出来ます。
詳細は [ガイドの国際化の章](../guide-ja/tutorial-i18n.md) を参照してください。
詳細はガイドの [国際化](../guide-ja/tutorial-i18n.md) の節を参照してください。
ドキュメンテーション
--------------------
ドキュメンテーションの翻訳は `docs/<original>-<language>` の下に置きます。
ここで `<original>` は、`guide``internals` などの元の文書の名前であり、`<language>` は文書が翻訳先の言語のコードです。
ここで `<original>` は、`guide``internals` などの元の文書の名前であり、`<language>` は文書の翻訳先の言語コードです。
例えば、ロシア語のガイドの翻訳は `docs/guide-ru` です。
初期の仕事が完了した後は、最新の翻訳以後に変更された元の文書の箇所を取得するために、`build` ディレクトリにある専用のコマンドを使うことが出来ます:
......
Yii バージョン番号規約
======================
Yii バージョン規約
==================
リリース
--------
この文書は Yii のバージョン番号に関するポリシーを要約するものです。
概して言えば、Yii は [Semantic Versioning](http://semver.org/) に従います。
A.B.C
## パッチリリース `2.x.Y`
A = Yii2 では常に 2。
B = メジャーバージョン。アップグレードのための説明をともなう非後方互換な変更。
C = 後方互換な変更と追加。
* `2.x` という名前のブランチ上で保守される。
* 主としてバグ修正と小さな機能強化を含む。
* 大きな機能拡張はしない。
* 不安無しのアップグレードを保証するために、100% 後方互換でなければならない。唯一の例外はセキュリティ問題で、その場合は後方互換性が破られることもある。
* リリースのサイクルは1~2ヶ月程度。
* プレリリース (alpha, beta, RC) は不要。
* 常にマスターブランチにマージバックされるべき (少なくとも週に一回は手作業で)。
リリース候補
------------
A.B.C-rc
A.B.C-rc2
## マイナーリリース `2.X.0`
リリース候補を出したいときに用います。RC 番号は、安定したリリースを得て、致命的なバグと後方互換性に関する問題報告が無くなるまで、増加します。
* マスターブランチ上で開発。
* 主として新機能とバグ修正を含む。
* パッチリリースからマージされた小さな機能強化とバグ修正を含む。
* `UPGRADE-2.X.md` ファイルに記録される非後方互換な変更を含みうる。
* リリースのサイクルは6~8ヶ月程度。
* プレリリースが必要: `2.X.0-alpha`, `2.X.0-beta`, `2.X.0-rc`
* 大きなニュースのリリースとマーケティングの試みを要求する。
アルファとベータ
----------------
A.B.C-alpha
A.B.C-alpha2
## メジャーリリース `X.0.0`
アルファは、著しいバグがおそらく存在するであろう、不安定なバージョンです。
API はまだ固まっておらず、大きく変更されるかもしれません。
`alpha2` などは、コードと API の全体的な安定性によって、リリースされたり、リリースされなかったりします。
A.B.C-beta
A.B.C-beta2
ベータはアルファに比べていくらか安定して、バグや API の不安定性が少なくなったものです。
まだ API が変更されることがあり得ますが、そのためにはかなりの理由がなければならないでしょう。
計画はない。
Como Colaborar Com a Tradução Para o Português do Brasil
========================================================
O Yii tem tradução para vários idiomas, incluindo o Português do Brasil. Existem duas áreas onde a contribuição para a tradução é muito bem-vindo. A primeira é a documentação e a segunda são as mensagens do framework.
O Yii tem tradução para vários idiomas, incluindo o Português do Brasil. Existem
duas áreas onde a contribuição para a tradução é muito bem-vindo. A primeira é a
documentação e a segunda são as mensagens do framework.
Mensagens do Framework
----------------------
O Framework tem dois tipos de mensagens: as exceções que são destinadas para o desenvolvedor e nunca são traduzidas, e as mensagens que são realmente visíveis para o usuário final, tais como erros de validação.
O Framework tem dois tipos de mensagens: as exceções que são destinadas para o
desenvolvedor e nunca são traduzidas, e as mensagens que são realmente visíveis
para o usuário final, tais como erros de validação.
Os passos para iniciar a tradução de mensagens são:
1. Com o `console` entre na pasta `yii2/framework` e execute o seguinte comando: `yii message/extract messages/config.php`.
2. As mensagens a serem traduzidas encontram-se no seguinte caminho: `framework/messages/pt-BR/yii.php`. Certifique-se de salvar o arquivo com a codificação UTF-8 (Plain).
3. Após realizar as devidas traduções o passo seguinte é enviar as suas modificações para o respositório do Yii no github. [Veja aqui](https://github.com/yiisoft/yii2/blob/master/docs/internals/git-workflow.md) os passos necessários para o envio dos arquivos.
Para manter as traduções sempre atualizadas, certifique-se que seu fork do Yii esteja com a última versão. Em seguida, basta executar o comando `yii message/extract messages/config.php` novamente e o mesmo irá adicionar automaticamente as novas mensagens a serem traduzidas.
No arquivo de tradução cada elemento do array representa a tradução de uma mensagem. Sendo que a "chave" representa o texto a ser traduzido e o "valor" a sua tradução. Se o "valor" estiver vazio, a mensagem é considerada como não traduzida. As mensagens que não precisam de tradução terão seus valores cercadas por um par de '@@'. Atentar para algumas mensagens que estão no formato de plural, para isso verifique a [seção i18n do guia](../guide-pt-BR/tutorial-i18n.md) para mais detalhes.
1. Com o `console` entre na pasta `yii2/framework` e execute o seguinte comando:
`yii message/extract messages/config.php`.
2. As mensagens a serem traduzidas encontram-se no seguinte caminho:
`framework/messages/pt-BR/yii.php`. Certifique-se de salvar o arquivo com a
codificação UTF-8 (Plain).
3. Após realizar as devidas traduções o passo seguinte é enviar as suas
modificações para o respositório do Yii no Github.
[Veja aqui](https://github.com/yiisoft/yii2/blob/master/docs/internals/git-workflow.md)
os passos necessários para o envio dos arquivos.
Para manter as traduções sempre atualizadas, certifique-se que seu fork do Yii
esteja com a última versão. Em seguida, basta executar o comando
`yii message/extract messages/config.php` novamente e o mesmo irá adicionar
automaticamente as novas mensagens a serem traduzidas.
No arquivo de tradução cada elemento do array representa a tradução de uma
mensagem. Sendo que a "chave" representa o texto a ser traduzido e o "valor" a
sua tradução. Se o "valor" estiver vazio, a mensagem é considerada como não
traduzida. As mensagens que não precisam de tradução terão seus valores cercadas
por um par de '@@'. Atentar para algumas mensagens que estão no formato de plural,
para isso verifique a [seção i18n do guia](../guide-pt-BR/tutorial-i18n.md) para
mais detalhes.
Documentação
------------
As traduções da documentação para o português do Brasil devem ficar dentro do diretório `docs/` seguindo o padrão `docs/<original>-<pt-BR>` onde `<original>` corresponde ao nome da pasta tal como `guide` ou `internals`.
As traduções da documentação para o português do Brasil devem ficar dentro do
diretório `docs/` seguindo o padrão `docs/<original>-<pt-BR>` onde `<original>`
corresponde ao nome da pasta tal como `guide` ou `internals`.
Com a tradução do documento concluída, você pode obter um diff das mudanças desde a última tradução, para isso, execute o seguinte comando a partir do diretório `build/` do framework:
Com a tradução do documento concluída, você pode obter um diff das mudanças desde
a última tradução, para isso, execute o seguinte comando a partir do diretório
`build/` do framework:
```
build translation "../docs/guide" "../docs/guide-pt-BR" > report-guide-pt-BR.html
```
Antes de iniciar seus trabalhos de tradução certifique-se que o arquivo em qual irá trabalhar esteja disponível para ser traduzido. Para isso, acesse a [planilha no Google Docs](https://docs.google.com/spreadsheets/d/17JOpAjkJz2YZCjD6gWaUx32wskGRB-2CdFbed111iys/edit?usp=sharing).
Antes de iniciar seus trabalhos de tradução certifique-se que o arquivo em qual
irá trabalhar esteja disponível para ser traduzido. Para isso, acesse a
[planilha no Google Docs](https://docs.google.com/spreadsheets/d/17JOpAjkJz2YZCjD6gWaUx32wskGRB-2CdFbed111iys/edit?usp=sharing).
Regras e Observações
--------------------
- Alguns termos não tem uma tradução muito boa para o português, em casos como esse convém escrever a palavra ou expressão em inglês primeiro em seguida sua possível tradução em parênteses.
- Se você acredita que alguma parte de sua tradução não faz sentido e você não tem certeza de como traduzi-la corretamente. Coloque este bloco de texto em itálico, isso ajudará na revisão.
- Para reduzir erros de digitação você pode utilizar um editor de texto como o MS Word para escrever pequenos blocos textos e em seguida copiar estes blocos para um editor visual de Markdown como o http://dillinger.io/.
- Alguns termos não tem uma tradução muito boa para o português, em casos como
esse convém escrever a palavra ou expressão em inglês primeiro em seguida sua
possível tradução em parênteses.
- Se você acredita que alguma parte de sua tradução não faz sentido e você não
tem certeza de como traduzi-la corretamente. Coloque este bloco de texto em
*itálico*, isso ajudará na revisão.
- Para reduzir erros de digitação você pode utilizar um editor de texto como o
MS Word para escrever pequenos blocos textos e em seguida copiar estes blocos
para um editor visual de Markdown como o http://dillinger.io/.
Convenções Para Tradução
------------------------
### Convenções Para Tradução
- action — ação
- active record — sem tradução
- cache — sem tradução
- CamelCase — sem tradução
- application system - sistema
- controller — controller (controlador)
- eager loading — eager loading (carregamento na inicialização)
- framework — sem tradução
- hash — sem tradução
- helper — sem tradução
- id — sem tradução
- lazy loading — lazy loading (carregamento retardado)
- model — model (modelo)
- view — view (visão)
- query builder — query builder (construtor de consulta)
- widget — sem tradução
- view — view (visão)
### Termos Sem Tradução
- active record
- alias
- cache
- CamelCase
- core
- framework
- hash
- helper
- id
- runtime
- widget
Getting started with Yii2 development
=====================================
1. Clone your fork of yii2 `git clone git@github.com:<yourname>/yii2`.
1. Clone your fork of yii2 `git clone git@github.com:<yourname>/yii2.git`.
2. Change into the repo folder `cd yii2`.
3. run `./build/build app/link basic` to install composer dependecies for the basic app.
This command will install foreign composer packages as normal but will link the yii2 repo to
......
......@@ -24,7 +24,7 @@ Change to the directory where you cloned Yii, normally, "yii2". Then enter the f
git remote add upstream git://github.com/yiisoft/yii2.git
```
### 3. Make sure there is an issue created for the thing you are working on if it requires signifcant effort to fix
### 3. Make sure there is an issue created for the thing you are working on if it requires significant effort to fix
All new features and bug fixes should have an associated issue to provide a single point of reference for discussion
and documentation. Take a few minutes to look through the existing issue list for one that matches the contribution you
......
Yii version numbering
=====================
Yii Versioning
==============
Releases
--------
This document summarizes the versioning policy of Yii. In general, Yii follows the [Semantic Versioning](http://semver.org/).
```
A.B.C
```
## Patch Releases `2.x.Y`
* Maintained on a branch named `2.x`
* Mainly contain bug fixes and minor feature enhancements
* No major features.
* Must be 100% backward compatible to ensure worry-free upgrade. Only exception is security issues that may require breaking BC.
* Release cycle is around 1 to 2 months.
* No pre-releases (alpha, beta, RC) needed.
* Should be merged back to master branch constantly (at least once every week manually).
- A = For Yii2 it's always 2.
- B = Major version. Non-BC changes with upgrade instructions.
- C = BC changes and additions.
Release candidates
------------------
## Minor Releases `2.X.0`
```
A.B.C-rc
A.B.C-rc2
```
* Developed on master branch
* Mainly contain new features and bug fixes
* Contain minor features and bug fixes merged from patch releases
* May contain BC-breaking changes which are recorded in `UPGRADE-2.X.md` file
* Release cycle is around 6 to 8 months
* Require pre-releases: `2.X.0-alpha`, `2.X.0-beta`, `2.X.0-rc`
* Requires major news releases and marketing effort.
This is when we want to do a release candidate. RC number increments till we're getting a stable release with no
critical bugs and backwards incompatibility reports.
Alphas and betas
----------------
## Major Releases `X.0.0`
```
A.B.C-alpha
A.B.C-alpha2
```
Alphas are unstable versions where significant bugs may and probably do exist. API isn't fixed yet and may be changed
significantly. `alpha2` etc. may or may not be released based on overall stability of code and API.
```
A.B.C-beta
A.B.C-beta2
```
Beta is more or less stable with less bugs and API instability than alphas. There still could be changes in API but
there should be a significant reason for it.
None in plan.
......@@ -4,7 +4,7 @@ Yii Framework 2 apidoc extension Change Log
2.0.1 under development
-----------------------
- no changes in this release.
- Bug #5623: Fixed crash when a class contains a setter that has no arguments e.g. `setXyz()` (cebe)
2.0.0 October 12, 2014
......
......@@ -26,7 +26,7 @@
"nikic/php-parser": "0.9.*",
"cebe/js-search": "*",
"cebe/markdown": "~1.0.0",
"cebe/markdown-latex": "*"
"cebe/markdown-latex": "~1.0.0"
},
"autoload": {
"psr-4": { "yii\\apidoc\\": "" }
......
......@@ -37,6 +37,11 @@ class ApiMarkdownLaTeX extends GithubMarkdown
return $latex;
}
protected function renderBrokenApiLink($block)
{
return $this->renderApiLink($block);
}
/**
* Converts markdown into HTML
*
......
......@@ -48,7 +48,7 @@ trait ApiMarkdownTrait
];
return [
['text', '<span style="background: #f00;">' . $typeName . '::' . $subjectName . '</span>'],
['brokenApiLink', '<span style="background: #f00;">' . $typeName . '::' . $subjectName . '</span>'],
$offset
];
} else {
......@@ -71,7 +71,7 @@ trait ApiMarkdownTrait
];
return [
['text', '<span style="background: #ff0;">' . $type->name . '</span><span style="background: #f00;">::' . $subjectName . '</span>'],
['brokenApiLink', '<span style="background: #ff0;">' . $type->name . '</span><span style="background: #f00;">::' . $subjectName . '</span>'],
$offset
];
}
......@@ -104,7 +104,7 @@ trait ApiMarkdownTrait
];
return [
['text', '<span style="background: #f00;">' . $object . '</span>'],
['brokenApiLink', '<span style="background: #f00;">' . $object . '</span>'],
$offset
];
}
......@@ -116,4 +116,9 @@ trait ApiMarkdownTrait
{
return $block[1];
}
protected function renderBrokenApiLink($block)
{
return $block[1];
}
}
......@@ -271,7 +271,7 @@ class Context extends Component
if ($method->isStatic) {
continue;
}
if (!strncmp($name, 'get', 3) && strlen($name) > 3 && $this->paramsOptional($method)) {
if (!strncmp($name, 'get', 3) && strlen($name) > 3 && $this->hasNonOptionalParams($method)) {
$propertyName = '$' . lcfirst(substr($method->name, 3));
if (isset($class->properties[$propertyName])) {
$property = $class->properties[$propertyName];
......@@ -299,7 +299,7 @@ class Context extends Component
]);
}
}
if (!strncmp($name, 'set', 3) && strlen($name) > 3 && $this->paramsOptional($method, 1)) {
if (!strncmp($name, 'set', 3) && strlen($name) > 3 && $this->hasNonOptionalParams($method, 1)) {
$propertyName = '$' . lcfirst(substr($method->name, 3));
if (isset($class->properties[$propertyName])) {
$property = $class->properties[$propertyName];
......@@ -331,18 +331,20 @@ class Context extends Component
}
/**
* Check whether a method has `$number` non-optional parameters.
* @param MethodDoc $method
* @param integer $number number of not optional parameters
* @return bool
*/
private function paramsOptional($method, $number = 0)
private function hasNonOptionalParams($method, $number = 0)
{
$count = 0;
foreach ($method->params as $param) {
if (!$param->isOptional && $number-- <= 0) {
return false;
if (!$param->isOptional) {
$count++;
}
}
return true;
return $count == $number;
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment