Aleksandr
10 years ago
12 changed files with 1125 additions and 8 deletions
@ -0,0 +1,202 @@ |
|||||||
|
La guida definitiva a Yii 2.0 |
||||||
|
============================= |
||||||
|
|
||||||
|
Questa guida è rilasciata nei [termini della documnetazione di Yii](http://www.yiiframework.com/doc/terms/). |
||||||
|
|
||||||
|
Tutti i diritti riservati. |
||||||
|
|
||||||
|
2014 (c) Yii Software LLC. |
||||||
|
|
||||||
|
Traduzione italiana a cura di Lorenzo Milesi ([yetopen.it](http://www.yetopen.it)). |
||||||
|
|
||||||
|
|
||||||
|
Introduzione |
||||||
|
------------ |
||||||
|
|
||||||
|
* [Informazioni su Yii](intro-yii.md) |
||||||
|
* [Aggiornare dalla versione 1.1](intro-upgrade-from-v1.md) |
||||||
|
|
||||||
|
|
||||||
|
Primi passi |
||||||
|
----------- |
||||||
|
|
||||||
|
* [Installare Yii](start-installation.md) |
||||||
|
* [Esecuzione applicazioni](start-workflow.md) |
||||||
|
* [Dire Ciao](start-hello.md) |
||||||
|
* [Utilizzo dei form](start-forms.md) |
||||||
|
* [Utilizzo dei database](start-databases.md) |
||||||
|
* [Generare codice con Gii](start-gii.md) |
||||||
|
* [Passi successivi](start-looking-ahead.md) |
||||||
|
|
||||||
|
|
||||||
|
Struttura dell'applicazione |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
* [Panoramica](structure-overview.md) |
||||||
|
* [Entry Scripts](structure-entry-scripts.md) |
||||||
|
* [Applicazioni](structure-applications.md) |
||||||
|
* [Componenti applicazioni](structure-application-components.md) |
||||||
|
* [Controller](structure-controllers.md) |
||||||
|
* [Modelli](structure-models.md) |
||||||
|
* [Viste](structure-views.md) |
||||||
|
* [Moduli](structure-modules.md) |
||||||
|
* [Filtri](structure-filters.md) |
||||||
|
* [Widget](structure-widgets.md) |
||||||
|
* [Asset](structure-assets.md) |
||||||
|
* [Estensioni](structure-extensions.md) |
||||||
|
|
||||||
|
|
||||||
|
Gestione delle richieste |
||||||
|
------------------------ |
||||||
|
|
||||||
|
* [Panoramica](runtime-overview.md) |
||||||
|
* [Bootstrapping](runtime-bootstrapping.md) |
||||||
|
* [Instradamenti (routing)](runtime-routing.md) |
||||||
|
* [Richieste](runtime-requests.md) |
||||||
|
* [Risposte](runtime-responses.md) |
||||||
|
* **TBD** [Sessioni e cookie](runtime-sessions-cookies.md) |
||||||
|
* [Analisi e generazione URL](runtime-url-handling.md) |
||||||
|
* [Gestione errori](runtime-handling-errors.md) |
||||||
|
* [Log](runtime-logging.md) |
||||||
|
|
||||||
|
|
||||||
|
Concetti chiave |
||||||
|
--------------- |
||||||
|
|
||||||
|
* [Componenti](concept-components.md) |
||||||
|
* [Proprietà](concept-properties.md) |
||||||
|
* [Eventi](concept-events.md) |
||||||
|
* [Behavior](concept-behaviors.md) |
||||||
|
* [Configurazioni](concept-configurations.md) |
||||||
|
* [Alias](concept-aliases.md) |
||||||
|
* [Caricamento automatico delle classi (autoload)](concept-autoloading.md) |
||||||
|
* [Service Locator](concept-service-locator.md) |
||||||
|
* [Container per Dependency Injection](concept-di-container.md) |
||||||
|
|
||||||
|
|
||||||
|
Utilizzo del database |
||||||
|
------------------------ |
||||||
|
|
||||||
|
* [Data Access Objects](db-dao.md): Connessione ad un database, query semplici, transazioni e modifiche allo schema |
||||||
|
* [Query Builder](db-query-builder.md): Esecuzione di query al database usando un semplice livello di astrazione |
||||||
|
* [Active Record](db-active-record.md): The Active Record ORM, retrieving and manipulating records, and defining relations |
||||||
|
* [Migrazoni](db-migrations.md): Applicare il controllo di versione al database in un ambiente di sviluppo di gruppo |
||||||
|
* **TBD** [Sphinx](db-sphinx.md) |
||||||
|
* **TBD** [Redis](db-redis.md) |
||||||
|
* **TBD** [MongoDB](db-mongodb.md) |
||||||
|
* **TBD** [ElasticSearch](db-elasticsearch.md) |
||||||
|
|
||||||
|
|
||||||
|
Ricezione dati dagli utenti |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
* [Creare form](input-forms.md) |
||||||
|
* [Validazione informazioni](input-validation.md) |
||||||
|
* **TBD** [Caricamento file](input-file-upload.md) |
||||||
|
* **TBD** [Raccogliere dati per più modelli](input-multiple-models.md) |
||||||
|
|
||||||
|
|
||||||
|
Visualizzazione dei dati |
||||||
|
------------------------ |
||||||
|
|
||||||
|
* **TBD** [Formattazione](output-formatter.md) |
||||||
|
* **TBD** [Paginazione](output-pagination.md) |
||||||
|
* **TBD** [Ordinamento](output-sorting.md) |
||||||
|
* [Data Provider](output-data-providers.md) |
||||||
|
* [Data Widget](output-data-widgets.md) |
||||||
|
* [Utilizzo del Client Scripts](output-client-scripts.md) |
||||||
|
* [Temi](output-theming.md) |
||||||
|
|
||||||
|
|
||||||
|
Sicurezza |
||||||
|
--------- |
||||||
|
|
||||||
|
* [Autenticazione](security-authentication.md) |
||||||
|
* [Autorizzazione](security-authorization.md) |
||||||
|
* [Utilizzo delle password](security-passwords.md) |
||||||
|
* **TBD** [Auth Clients](security-auth-clients.md) |
||||||
|
* **TBD** [Buona prassi](security-best-practices.md) |
||||||
|
|
||||||
|
|
||||||
|
Cache |
||||||
|
----- |
||||||
|
|
||||||
|
* [Panoramica](caching-overview.md) |
||||||
|
* [Cache dati](caching-data.md) |
||||||
|
* [Fragment Caching](caching-fragment.md) |
||||||
|
* [Cache pagina](caching-page.md) |
||||||
|
* [Cache HTTP](caching-http.md) |
||||||
|
|
||||||
|
|
||||||
|
Servizi web RESTful |
||||||
|
------------------- |
||||||
|
|
||||||
|
* [Avvio veloce](rest-quick-start.md) |
||||||
|
* [Risorse](rest-resources.md) |
||||||
|
* [Controller](rest-controllers.md) |
||||||
|
* [Instradamenti](rest-routing.md) |
||||||
|
* [Formattazione risposte](rest-response-formatting.md) |
||||||
|
* [Autenticazione](rest-authentication.md) |
||||||
|
* [Limitazione di utilizzo](rest-rate-limiting.md) |
||||||
|
* [Versioning](rest-versioning.md) |
||||||
|
* [Gestione degli errori](rest-error-handling.md) |
||||||
|
|
||||||
|
|
||||||
|
Strumenti di sviluppo |
||||||
|
--------------------- |
||||||
|
|
||||||
|
* [Barra di debug e debugger](tool-debugger.md) |
||||||
|
* [Generazione codice con Gii](tool-gii.md) |
||||||
|
* **TBD** [Generazione documentazione API](tool-api-doc.md) |
||||||
|
|
||||||
|
|
||||||
|
Test |
||||||
|
---- |
||||||
|
|
||||||
|
* [Panoramica](test-overview.md) |
||||||
|
* [Inizializzazione ambiente di test](test-environment-setup.md) |
||||||
|
* [Unit Test](test-unit.md) |
||||||
|
* [Functional Test](test-functional.md) |
||||||
|
* [Acceptance Test](test-acceptance.md) |
||||||
|
* [Fixture](test-fixtures.md) |
||||||
|
|
||||||
|
|
||||||
|
Argomenti speciali |
||||||
|
------------------ |
||||||
|
|
||||||
|
* [Modello di applicazione avanzata](tutorial-advanced-app.md) |
||||||
|
* [Creazione di una applicazione da zero](tutorial-start-from-scratch.md) |
||||||
|
* [Comandi da console](tutorial-console.md) |
||||||
|
* [Validazioni predefinite](tutorial-core-validators.md) |
||||||
|
* [Internazionalizzazione](tutorial-i18n.md) |
||||||
|
* [Invio email](tutorial-mailing.md) |
||||||
|
* [Ottimizzazione delle prestazioni](tutorial-performance-tuning.md) |
||||||
|
* **TBD** [Ambienti di hosting condiviso](tutorial-shared-hosting.md) |
||||||
|
* [Template Engine](tutorial-template-engines.md) |
||||||
|
* [Utilizzo di codice di terze parti](tutorial-yii-integration.md) |
||||||
|
|
||||||
|
|
||||||
|
Widget |
||||||
|
------ |
||||||
|
|
||||||
|
* 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 |
||||||
|
* [Widget Bootstrap](widget-bootstrap.md) |
||||||
|
* [Widget Jquery UI](widget-jui.md) |
||||||
|
|
||||||
|
|
||||||
|
Helper |
||||||
|
------ |
||||||
|
|
||||||
|
* [Panoramica](helper-overview.md) |
||||||
|
* **TBD** [ArrayHelper](helper-array.md) |
||||||
|
* **TBD** [Html](helper-html.md) |
||||||
|
* **TBD** [Url](helper-url.md) |
||||||
|
* **TBD** [Security](helper-security.md) |
||||||
|
|
@ -0,0 +1,59 @@ |
|||||||
|
Cos'è Yii |
||||||
|
=========== |
||||||
|
|
||||||
|
Yii è un framework PHP ad alte prestazioni, basato su component, per lo sviluppo veloce di applicazioni web moderne. |
||||||
|
Il nome Yii (pronunciato `Yii` o `[ji:]`) significa "semplice ed evoutivo" in cinese. Può anche essere visto come un acronimo di **Yes It Iss** (si lo è)! |
||||||
|
|
||||||
|
|
||||||
|
Qual'è il migliore impiego di Yii? |
||||||
|
---------------------------------- |
||||||
|
|
||||||
|
Yii è un framework di programmazione, il che significa che può essere utilizzato per sviluppare ogni |
||||||
|
tipo di appicazione con PHP. Grazie alla sua architettura basata sui componenti e al suo avanzato |
||||||
|
supporto della cache, è particolarmente adeguato per lo sviluppo di applicazioni su larga scala quali |
||||||
|
portali, forum, gestori di contenuti (CMS), progetti di e-commerce, servizi web RESTful, e così via. |
||||||
|
|
||||||
|
|
||||||
|
Come si pone Yii rispetto ad altri framework? |
||||||
|
--------------------------------------------- |
||||||
|
|
||||||
|
Se hai già familiarità con altri framework potrai apprezzare questi punti in comune: |
||||||
|
- Come la maggior parte dei framework, Yii implementa il paradigma di sviluppo MVC (Model-View-Controller) e |
||||||
|
promuove l'organizzazione del codice secondo quelle regole. |
||||||
|
- Yii usa la filosofia secondo cui il codice dovrebbe essere semplice ed elegante. Yii non cercherà mai di |
||||||
|
ridisegnare le cose solo per seguire dei pattern di sviluppo. |
||||||
|
- Yii è un framework completo in grado di fornire diverse funzionalità testate e pronte all'uso: costruttori di |
||||||
|
query ed ActiveRecord sia per i database relazionali che NoSQL; supporto allo sviluppo di applicazioni RESTful; |
||||||
|
supporto di caching a diversi livelli; e altro. |
||||||
|
- Yii è estremamente estensibile. Puoi pesonalizzare o sostituire quasi ogni singolo pezzo del codice base. Puoi anche |
||||||
|
sfuttare la solida architettura delle estensioni di Yii per usare o sviluppare estensioni ridistribuibili. |
||||||
|
- Le prestazioni elevate sono sempre il focus primario di Yii. |
||||||
|
|
||||||
|
Yii non è frutto di un uomo solo, ma è supportato da un [folto gruppo di sviluppatori][], così come da una numerosa |
||||||
|
comunità di professionisti che contribuiscono costantemente allo sviluppo. Il gruppo di sviluppatori tiene sempre |
||||||
|
sott'occhio le ultime tendenze e tecnologie di sviluppo web, sulle pratiche ottimali e funzionalità degli altri |
||||||
|
framework e progetti. Le peculiarità più rilevanti che si trovano altrove sono regolarmente incorporate nel |
||||||
|
codice principale del framework, e rese disponibili tramite semplici ed eleganti interfacce. |
||||||
|
|
||||||
|
[folto gruppo di sviluppatori]: http://www.yiiframework.com/about/ |
||||||
|
|
||||||
|
Versioni di Yii |
||||||
|
--------------- |
||||||
|
|
||||||
|
Yii al momento ha due versioni principali disponibili: 1.1 e 2.0. La versione 1.1 è la vecchia generazione ed è ora in |
||||||
|
uno stato di manutenzione. La versione 2.0 è una riscrittura completa di Yii che utilizza le ultime tecnologie e protocolli, |
||||||
|
inclusi Composer, PSR, namespace, trait, e così via. La versione 2.0 rappresenta l'attuale generazione del framework e |
||||||
|
riceverà i maggiori sforzi di sviluppo nei prossimi anni. |
||||||
|
Questa guida è focalizzata principalmente sulla versione 2.0. |
||||||
|
|
||||||
|
|
||||||
|
Richieste e requisiti di sistema |
||||||
|
--------------------------------- |
||||||
|
|
||||||
|
Yii 2.0 richiede PHP 5.4.0 o successivo. Puoi trovare maggiori dettagli sulle richieste delle singole funzionalità |
||||||
|
eseguendo lo script di verifica requisiti incluso in ogni versione di Yii. |
||||||
|
|
||||||
|
L'uso di Yii richiede una conoscenza base della programmazione ad oggetti (OOP), dato che Yii è un framework puramente OOP. |
||||||
|
Yii 2.0 fa uso delle più recenti funzionalità di PHP, come i [namespace](http://www.php.net/manual/it/language.namespaces.php) e |
||||||
|
[trait](http://www.php.net/manual/it/language.oop5.traits.php). La compresione di questi concetti ti aiuterà a semplificare |
||||||
|
l'uso di Yii 2.0. |
@ -0,0 +1,317 @@ |
|||||||
|
Контейнер внедрения зависимостей |
||||||
|
============================== |
||||||
|
|
||||||
|
Контейнер внедрения зависимостей - это объект, который знает, как создать и настроить экземпляр объекта и зависимых от него объектов. |
||||||
|
[Статья Мартина Фаулера](http://martinfowler.com/articles/injection.html) хорошо объясняет, почему контейнер внедрения зависимостей является полезным. Здесь, преимущественно, будет объясняться использование контейнера внедрения зависимостей, предоставляемого в Yii. |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Внедрение зависимостей <a name="dependency-injection"></a> |
||||||
|
-------------------- |
||||||
|
|
||||||
|
Yii обеспечивает функционал контейнера внедрения зависимостей через класс [[yii\di\Container]]. Он поддерживает следующие виды внедрения зависимостей: |
||||||
|
|
||||||
|
* Внедрение зависимости через конструктор. |
||||||
|
* Внедрение зависимости через сеттер и свойство. |
||||||
|
* Внедрение зависимости через PHP callback. |
||||||
|
|
||||||
|
|
||||||
|
### Внедрение зависимости через конструктор <a name="constructor-injection"></a> |
||||||
|
|
||||||
|
Контейнер внедрения зависимостей поддерживает внедрение зависимости через конструктор при помощи указания типов для параметров конструктора. |
||||||
|
Указанные типы сообщают контейнеру, какие классы или интерфейсы зависят от него при создании нового объекта. |
||||||
|
Контейнер попытается получить экземпляры зависимых классов или интерфейсов, а затем передать их в новый объект через конструктор. Например, |
||||||
|
|
||||||
|
```php |
||||||
|
class Foo |
||||||
|
{ |
||||||
|
public function __construct(Bar $bar) |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$foo = $container->get('Foo'); |
||||||
|
// что равносильно следующему: |
||||||
|
$bar = new Bar; |
||||||
|
$foo = new Foo($bar); |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
### Внедрение зависимости через сеттер и свойство <a name="setter-and-property-injection"></a> |
||||||
|
|
||||||
|
Внедрение зависимости через сеттер и свойство поддерживается через [конфигурации](concept-configurations.md). |
||||||
|
При регистрации зависимости или при создании нового объекта, вы можете предоставить конфигурацию, которая |
||||||
|
будет использована контейнером для внедрения зависимостей через соответствующие сеттеры или свойства. |
||||||
|
Например, |
||||||
|
|
||||||
|
```php |
||||||
|
use yii\base\Object; |
||||||
|
|
||||||
|
class Foo extends Object |
||||||
|
{ |
||||||
|
public $bar; |
||||||
|
|
||||||
|
private $_qux; |
||||||
|
|
||||||
|
public function getQux() |
||||||
|
{ |
||||||
|
return $this->_qux; |
||||||
|
} |
||||||
|
|
||||||
|
public function setQux(Qux $qux) |
||||||
|
{ |
||||||
|
$this->_qux = $qux; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$container->get('Foo', [], [ |
||||||
|
'bar' => $container->get('Bar'), |
||||||
|
'qux' => $container->get('Qux'), |
||||||
|
]); |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
### Внедрение зависимости через PHP callback <a name="php-callable-injection"></a> |
||||||
|
|
||||||
|
В данном случае, контейнер будет использовать зарегистрированный PHP callback для создания новых экземпляров класса. |
||||||
|
Callback отвечает за разрешения зависимостей и внедряет их в соответствии с вновь создаваемыми объектами. Например, |
||||||
|
|
||||||
|
```php |
||||||
|
$container->set('Foo', function () { |
||||||
|
return new Foo(new Bar); |
||||||
|
}); |
||||||
|
|
||||||
|
$foo = $container->get('Foo'); |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
Регистрация зависимостей <a name="registering-dependencies"></a> |
||||||
|
------------------------ |
||||||
|
|
||||||
|
Вы можете использовать [[yii\di\Container::set()]] для регистрации зависимостей. При регистрации требуется имя зависимости, а так же определение зависимости. |
||||||
|
Именем звисимости может быть имя класса, интерфейса или алиас, так же определением зависимости может быть имя класса, конфигурационным массивом, или PHP calback'ом. |
||||||
|
|
||||||
|
```php |
||||||
|
$container = new \yii\di\Container; |
||||||
|
|
||||||
|
// регистрация имени класса, как есть. это может быть пропущено. |
||||||
|
$container->set('yii\db\Connection'); |
||||||
|
|
||||||
|
// регистраци интерфейса |
||||||
|
// Когда класс зависит от интерфейса, соответствующий класс |
||||||
|
// будет использован в качестве зависимости объекта |
||||||
|
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer'); |
||||||
|
|
||||||
|
// регистрация алиаса. Вы можете использовать $container->get('foo') |
||||||
|
// для создания экземпляра Connection |
||||||
|
$container->set('foo', 'yii\db\Connection'); |
||||||
|
|
||||||
|
// Регистрация класса с конфигурацией. Конфигурация |
||||||
|
// будет применена при создании экземпляра класса через get() |
||||||
|
$container->set('yii\db\Connection', [ |
||||||
|
'dsn' => 'mysql:host=127.0.0.1;dbname=demo', |
||||||
|
'username' => 'root', |
||||||
|
'password' => '', |
||||||
|
'charset' => 'utf8', |
||||||
|
]); |
||||||
|
|
||||||
|
// регистрация алиаса с конфигурацией класса |
||||||
|
// В данном случае, параметр "class" требуется для указания класса |
||||||
|
$container->set('db', [ |
||||||
|
'class' => 'yii\db\Connection', |
||||||
|
'dsn' => 'mysql:host=127.0.0.1;dbname=demo', |
||||||
|
'username' => 'root', |
||||||
|
'password' => '', |
||||||
|
'charset' => 'utf8', |
||||||
|
]); |
||||||
|
|
||||||
|
// регистрация PHP callback'a |
||||||
|
// Callback будет выполняться каждый раз при вызове $container->get('db') |
||||||
|
$container->set('db', function ($container, $params, $config) { |
||||||
|
return new \yii\db\Connection($config); |
||||||
|
}); |
||||||
|
|
||||||
|
// регистрация экземпляра компонента |
||||||
|
// $container->get('pageCache') вернёт тот же экземпляр при каждом вызове |
||||||
|
$container->set('pageCache', new FileCache); |
||||||
|
``` |
||||||
|
|
||||||
|
> Подсказка: Если имя зависимости такое же, как и определение соответствующей зависимости, то её повторная регистрация в контейнере внедрения зависимостей не нужна. |
||||||
|
|
||||||
|
Зависимость, зарегистрированная через `set()` создаёт экземпляр каждый раз, когда зависимость необходима. |
||||||
|
Вы можете использовать [[yii\di\Container::setSingleton()]] для регистрации зависимости, которая создаст только один экземпляр: |
||||||
|
|
||||||
|
```php |
||||||
|
$container->setSingleton('yii\db\Connection', [ |
||||||
|
'dsn' => 'mysql:host=127.0.0.1;dbname=demo', |
||||||
|
'username' => 'root', |
||||||
|
'password' => '', |
||||||
|
'charset' => 'utf8', |
||||||
|
]); |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
Разрешение зависимостей <a name="resolving-dependencies"></a> |
||||||
|
---------------------- |
||||||
|
После регистрации зависимостей, вы можете использовать контейнер внедрения зависимостей для создания новых объектов, |
||||||
|
и контейнер автоматически разрешит зависимости их экземпляра и их внедрений во вновь создаваемых объектах. Разрешение зависимостей рекурсивно, то есть |
||||||
|
если зависимость имеет другие зависимости, эти зависимости также будут автоматически разрешены. |
||||||
|
|
||||||
|
Вы можете использовать [[yii\di\Container::get()]] для создания новых объектов. Метод принимает имя зависимости, которым может быть имя класса, имя интерфейса или псевдоним. |
||||||
|
Имя зависимости может быть или не может быть зарегистрировано через `set()` или `setSingleton()`. |
||||||
|
Вы можете опционально предоставить список параметров конструктора класса и [конфигурацию](concept-configurations.md) для настройки созданного объекта. |
||||||
|
Например, |
||||||
|
|
||||||
|
```php |
||||||
|
// "db" ранее зарегистрированный псевдоним |
||||||
|
$db = $container->get('db'); |
||||||
|
|
||||||
|
// эквивалентно: $engine = new \app\components\SearchEngine($apiKey, ['type' => 1]); |
||||||
|
$engine = $container->get('app\components\SearchEngine', [$apiKey], ['type' => 1]); |
||||||
|
``` |
||||||
|
|
||||||
|
За кулисами, контейнер внедрения зависимостей делает гораздо больше работы, чем просто создание нового объекта. |
||||||
|
Прежде всего, контейнер, осмотрит конструктор класса, что бы узнать имя зависимого класса или интерфейса, а затем автоматически разрешит эти зависимости рекурсивно. |
||||||
|
|
||||||
|
Следующий код демонстрирует более сложный пример. Класс `UserLister` зависит от объекта, реализующего интерфейс `UserFinderInterface`; класс `UserFinder` реализует этот интерфейс и зависит от |
||||||
|
объекта `Connection`. Все эти зависимости были объявлены через тип подсказки параметров конструктора класса. |
||||||
|
При регистрации зависимости через свойство, контейнер внедрения зависимостей позволяет автоматически разрешить эти зависимости и создаёт новый экземпляр `UserLister` простым вызовом `get('userLister')`. |
||||||
|
|
||||||
|
```php |
||||||
|
namespace app\models; |
||||||
|
|
||||||
|
use yii\base\Object; |
||||||
|
use yii\db\Connection; |
||||||
|
use yii\di\Container; |
||||||
|
|
||||||
|
interface UserFinderInterface |
||||||
|
{ |
||||||
|
function findUser(); |
||||||
|
} |
||||||
|
|
||||||
|
class UserFinder extends Object implements UserFinderInterface |
||||||
|
{ |
||||||
|
public $db; |
||||||
|
|
||||||
|
public function __construct(Connection $db, $config = []) |
||||||
|
{ |
||||||
|
$this->db = $db; |
||||||
|
parent::__construct($config); |
||||||
|
} |
||||||
|
|
||||||
|
public function findUser() |
||||||
|
{ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class UserLister extends Object |
||||||
|
{ |
||||||
|
public $finder; |
||||||
|
|
||||||
|
public function __construct(UserFinderInterface $finder, $config = []) |
||||||
|
{ |
||||||
|
$this->finder = $finder; |
||||||
|
parent::__construct($config); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$container = new Container; |
||||||
|
$container->set('yii\db\Connection', [ |
||||||
|
'dsn' => '...', |
||||||
|
]); |
||||||
|
$container->set('app\models\UserFinderInterface', [ |
||||||
|
'class' => 'app\models\UserFinder', |
||||||
|
]); |
||||||
|
$container->set('userLister', 'app\models\UserLister'); |
||||||
|
|
||||||
|
$lister = $container->get('userLister'); |
||||||
|
|
||||||
|
// что эквивалентно: |
||||||
|
|
||||||
|
$db = new \yii\db\Connection(['dsn' => '...']); |
||||||
|
$finder = new UserFinder($db); |
||||||
|
$lister = new UserLister($finder); |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
Практическое использование <a name="practical-usage"></a> |
||||||
|
--------------- |
||||||
|
|
||||||
|
Yii создаёт контейнер внедрения зависимостей когда вы подключаете файл `Yii.php` во [входном скрипте](structure-entry-scripts.md) |
||||||
|
вашего приложения. Контейнер внедрения зависимостей доступен через [[Yii::$container]]. При вызове [[Yii::createObject()]], |
||||||
|
метод на самом деле вызовет метод контейнера [[yii\di\Container::get()|get()]], что бы создать новый объект. |
||||||
|
Как упомянуто выше, контейнер внедрения зависимостей автоматически разрешит зависимости (если таковые имеются) и внедрит их в только что созданный объект. |
||||||
|
Поскольку Yii использует [[Yii::createObject()]] в большей части кода своего ядра для создания новых объектов, это означает, |
||||||
|
что вы можете настроить глобальные объекты, имея дело с [[Yii::$container]]. |
||||||
|
|
||||||
|
Например, вы можете настроить по умолчанию глобальное количество кнопок в пейджере [[yii\widgets\LinkPager]]: |
||||||
|
|
||||||
|
```php |
||||||
|
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]); |
||||||
|
``` |
||||||
|
|
||||||
|
Теперь, если вы вызовете в представлении виджет, используя следующий код, то свойство `maxButtonCount` будет инициальзировано, как 5, вместо значения по умолчанию 10, как это определено в классе. |
||||||
|
|
||||||
|
```php |
||||||
|
echo \yii\widgets\LinkPager::widget(); |
||||||
|
``` |
||||||
|
|
||||||
|
Хотя, вы всё ещё можете переопределить установленное значение через контейнер внедрения зависимостей: |
||||||
|
|
||||||
|
```php |
||||||
|
echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]); |
||||||
|
``` |
||||||
|
Другим примером является использование автоматического внедрения зависимости через конструктор контейнера внедрения зависимостей. |
||||||
|
Предположим, ваш класс контроллера зависит от ряда других объектов, таких как сервис бронирования гостиницы. Вы |
||||||
|
можете объявить зависимость через параметр конструктора и позволить контейнеру внедрения зависимостей, разрешить её за вас. |
||||||
|
|
||||||
|
```php |
||||||
|
namespace app\controllers; |
||||||
|
|
||||||
|
use yii\web\Controller; |
||||||
|
use app\components\BookingInterface; |
||||||
|
|
||||||
|
class HotelController extends Controller |
||||||
|
{ |
||||||
|
protected $bookingService; |
||||||
|
|
||||||
|
public function __construct($id, $module, BookingInterface $bookingService, $config = []) |
||||||
|
{ |
||||||
|
$this->bookingService = $bookingService; |
||||||
|
parent::__construct($id, $module, $config); |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Если у вас есть доступ к этому контроллеру из браузера, вы увидите сообщение об ошибке, который жалуется на то, что `BookingInterface` |
||||||
|
не может быть создан. Это потому что вы должны указать контейнеру внедрения зависимостей, как обращаться с этой зависимостью: |
||||||
|
|
||||||
|
```php |
||||||
|
\Yii::$container->set('app\components\BookingInterface', 'app\components\BookingService'); |
||||||
|
``` |
||||||
|
|
||||||
|
Теперь, если вы попытаетесь получить доступ к контроллеру снова, то экземпляр `app\components\BookingService` будет создан и введён в качестве 3-го параметра конструктора контроллера. |
||||||
|
|
||||||
|
|
||||||
|
Когда следует регистрировать зависимости <a name="when-to-register-dependencies"></a> |
||||||
|
----------------------------- |
||||||
|
|
||||||
|
Поскольку зависимости необходимы тогда, когда создаются новые объекты, то их регистрация должна быть сделана |
||||||
|
как можно раньше. Ниже приведены рекомендуемые практики: |
||||||
|
|
||||||
|
* Если вы разработчик приложения, то вы можете зарегистрировать зависимости во [входном скрипте](structure-entry-scripts.md) вашего приложения или в скрипте, подключённого во входном скрипте. |
||||||
|
* Если вы разработчик распространяемого [расширения](structure-extensions.md), то вы можете зарегистрировать зависимости в загрузочном классе расширения. |
||||||
|
|
||||||
|
|
||||||
|
Итог <a name="summary"></a> |
||||||
|
------- |
||||||
|
Как dependency injection, так и [service locator](concept-service-locator.md) являются популярными паттернами проектирования, которые позволяют |
||||||
|
создавать программное обеспечение в слабосвязаной и более тестируемой манере. |
||||||
|
Мы настоятельно рекомендуем к прочтению |
||||||
|
[статью Мартина Фаулера](http://martinfowler.com/articles/injection.html), для более глубокого понимания dependency injection и service locator. |
||||||
|
|
||||||
|
Yii реализует свой [service locator](concept-service-locator.md) поверх контейнера внедрения зависимостей. |
||||||
|
Когда service locator пытается создать новый экземпляр объекта, он перенаправляет вызов на контейнер внедрения зависимостей. |
||||||
|
Последний будет разрешать зависимости автоматически, как описано выше. |
||||||
|
|
@ -0,0 +1,210 @@ |
|||||||
|
Yii 2.0 bo`yicha to`liq qo`llanma |
||||||
|
============================= |
||||||
|
|
||||||
|
Ushbu qo`llanma [Yii qo`llanmalarining holati bilan](http://www.yiiframework.com/doc/terms/) bilan mos holda yo`lga qo`yildi. |
||||||
|
|
||||||
|
<<<<<<< HEAD |
||||||
|
All Rights Reserved. |
||||||
|
|
||||||
|
2014 © Yii Software LLC. |
||||||
|
|
||||||
|
Kirish |
||||||
|
------ |
||||||
|
|
||||||
|
* [Yii haqida](intro-yii.md) |
||||||
|
* [1.1 dan keyingi yangilanishlar](intro-upgrade-from-v1.md) |
||||||
|
|
||||||
|
|
||||||
|
Birinchi tanishuv |
||||||
|
----------------- |
||||||
|
|
||||||
|
* [Yii ni o`rnatish](start-installation.md) |
||||||
|
* [Ilovani ishga tushirish](start-workflow.md) |
||||||
|
* [«Salom» deymiz](start-hello.md) |
||||||
|
* [Formalar bilan ishlash](start-forms.md) |
||||||
|
* [Ma`lumotlar ombori bilan ishlash](start-databases.md) |
||||||
|
* [Gii yordamida kodlarni generatsiya qilish](start-gii.md) |
||||||
|
* [Keyin nima?](start-looking-ahead.md) |
||||||
|
|
||||||
|
|
||||||
|
Ilova strukturasi |
||||||
|
----------------- |
||||||
|
|
||||||
|
* [Sharh](structure-overview.md) |
||||||
|
* [Kirish skriptlari](structure-entry-scripts.md) |
||||||
|
* [Ilova](structure-applications.md) |
||||||
|
* [Ilova komponentlari](structure-application-components.md) |
||||||
|
* [Kontrollerlar](structure-controllers.md) |
||||||
|
* [Namoyish](structure-views.md) |
||||||
|
* [Modellar](structure-models.md) |
||||||
|
* **TBD** [Filtrlar](structure-filters.md) |
||||||
|
* **TBD** [Vidjetlar](structure-widgets.md) |
||||||
|
* **TBD** [Modullar](structure-modules.md) |
||||||
|
* [Ресурсы](structure-assets.md) |
||||||
|
* **TBD** [Kengaytmalar](structure-extensions.md) |
||||||
|
|
||||||
|
|
||||||
|
So`rovlarni qayta ishlash |
||||||
|
------------------------- |
||||||
|
|
||||||
|
* **TBD** [Bootstrapping](runtime-bootstrapping.md) |
||||||
|
* **TBD** [Routing](runtime-routing.md) |
||||||
|
* **TBD** [So`rovlar](runtime-requests.md) |
||||||
|
* **TBD** [Javoblar](runtime-responses.md) |
||||||
|
* **TBD** [Sessiyalar va kuklar](runtime-sessions-cookies.md) |
||||||
|
* [URL ni tahlil va generatsiya qilish](runtime-url-handling.md) |
||||||
|
* [Xatolilarni qayta ishlash](runtime-handling-errors.md) |
||||||
|
* [Jurnallarga yozish](runtime-logging.md) |
||||||
|
|
||||||
|
|
||||||
|
Asosiy tushunchalar |
||||||
|
------------------- |
||||||
|
|
||||||
|
* [Komponentlar](concept-components.md) |
||||||
|
* [Xususiyat](concept-properties.md) |
||||||
|
* [Xodisa](concept-events.md) |
||||||
|
* [O`zini tutish](concept-behaviors.md) |
||||||
|
* [Muxim sozlashlar](concept-configurations.md) |
||||||
|
* [Taxalluslar](concept-aliases.md) |
||||||
|
* [Sinflarni avtoyuklash](concept-autoloading.md) |
||||||
|
* [Service Locator](concept-service-locator.md) |
||||||
|
* [Dependency Injection Container](concept-di-container.md) |
||||||
|
|
||||||
|
|
||||||
|
Ma`lumotlar ombori bilan ishlash |
||||||
|
-------------------------------- |
||||||
|
|
||||||
|
* [Ma`lumotlarga imkon beruvchi obektlar(DAO)](db-dao.md) - Ma`lumotlar ombori bilan bog`lanish, oddiy so`rovlar, tranzaksiya va sxema bilan ishlash. |
||||||
|
* [So`rovlarni yaratuvchi](db-query-builder.md) - Ma`lumotlar omboriga abstraksiyaning oddiy qatlamidan so`rovlar. |
||||||
|
* [Active Record](db-active-record.md) - AR obektlarini olish, ular bilan ishlash va bog`lanishlarni aniqlash. |
||||||
|
* [Migratsiyalar](db-migrations.md) - Komandada ishlaganda ma`lumotlar sxemasini talqinlarini boshqarish. |
||||||
|
* **TBD** [Sphinx](db-sphinx.md) |
||||||
|
* **TBD** [Redis](db-redis.md) |
||||||
|
* **TBD** [MongoDB](db-mongodb.md) |
||||||
|
* **TBD** [ElasticSearch](db-elastic-search.md) |
||||||
|
|
||||||
|
|
||||||
|
Foydalanuvchidan ma`lumotlarni qabul qilish |
||||||
|
------------------------------------------- |
||||||
|
|
||||||
|
* [Formani yaratish](input-forms.md) |
||||||
|
* [Validatsiya](input-validation.md) |
||||||
|
* **TBD** [Fayllarni yuklash](input-file-uploading.md) |
||||||
|
* **TBD** [Bir nechta modellar bilan ishlash](input-multiple-models.md) |
||||||
|
|
||||||
|
|
||||||
|
Ma`lumotlarni namoyish etish |
||||||
|
---------------------------- |
||||||
|
|
||||||
|
* **TBD** [Ma`lumotlarni formatlash](output-formatting.md) |
||||||
|
* **TBD** [Sahifalar bo`yicha bo`ajratish](output-pagination.md) |
||||||
|
* **TBD** [Saralash](output-sorting.md) |
||||||
|
* [Ma`lumotlar provayderlari](output-data-providers.md) |
||||||
|
* [Ma`lumotlar uchun vidjetlar](output-data-widgets.md) |
||||||
|
* [Mavzulashtirish](output-theming.md) |
||||||
|
|
||||||
|
|
||||||
|
Xavfsizlik |
||||||
|
---------- |
||||||
|
|
||||||
|
* [Autentifikatsiya](security-authentication.md) |
||||||
|
* [Mualliflikka tekshiruvi](security-authorization.md) |
||||||
|
* [Parollar bilan ishlash](security-passwords.md) |
||||||
|
* **TBD** [Mualliflikka tekshiruvlar mijozlari](security-auth-clients.md) |
||||||
|
* **TBD** [Eng yaxshi amaliyotlar](security-best-practices.md) |
||||||
|
|
||||||
|
|
||||||
|
Keshlash |
||||||
|
-------- |
||||||
|
|
||||||
|
* [Sharh](caching-overview.md) |
||||||
|
* [Ma`lumotlarni keshlash](caching-data.md) |
||||||
|
* [Fragmentlasrni keshlash](caching-fragment.md) |
||||||
|
* [Sahifalarni keshlash](caching-page.md) |
||||||
|
* [HTTP ni keshlash](caching-http.md) |
||||||
|
|
||||||
|
|
||||||
|
REST veb-xizmatlari |
||||||
|
------------------- |
||||||
|
|
||||||
|
* [Tezkor boshlash](rest-quick-start.md) |
||||||
|
* [Resurslar](rest-resources.md) |
||||||
|
* [Kontrollerlar](rest-controllers.md) |
||||||
|
* [Routing](rest-routing.md) |
||||||
|
* [Javoblarni formatlash](rest-response-formatting.md) |
||||||
|
* [Autentifikatsiya](rest-authentication.md) |
||||||
|
* [So`rovlarni chastotasini chegaralash](rest-rate-limiting.md) |
||||||
|
* [Talqin yaratish](rest-versioning.md) |
||||||
|
* [Xatoliklarni qayta ishlash](rest-error-handling.md) |
||||||
|
|
||||||
|
|
||||||
|
Ishlab chiquvchi uskunalari |
||||||
|
--------------------------- |
||||||
|
|
||||||
|
* [Sozlashlar paneli va sozlovchi](tool-debugger.md) |
||||||
|
* [Gii bilan kodni generatsiya qilish](tool-gii.md) |
||||||
|
* **TBD** [API qo`llanmani generatori](tool-api-doc.md) |
||||||
|
|
||||||
|
|
||||||
|
Test o`tkazish |
||||||
|
-------------- |
||||||
|
|
||||||
|
* [Sharh](test-overview.md) |
||||||
|
* **TBD** [MOdulli testlar](test-unit.md) |
||||||
|
* **TBD** [Funksional testlar](test-functional.md) |
||||||
|
* **TBD** [Qabul qiluvchi testlar](test-acceptance.md) |
||||||
|
* [Fiksturalar](test-fixtures.md) |
||||||
|
|
||||||
|
|
||||||
|
Yii kengaytmalari |
||||||
|
----------------- |
||||||
|
|
||||||
|
* [Kengaytmani yaratish](extend-creating-extensions.md) |
||||||
|
* [Freymvork kodini kengaytirish](extend-customizing-core.md) |
||||||
|
* [Tashqi kutubxonalarni qo`llash](extend-using-libs.md) |
||||||
|
* **TBD** [Tashqi tizimlarda Yii integratsiyasi](extend-embedding-in-others.md) |
||||||
|
* **TBD** [Yii 1.1 va 2.0 larni bir vaqtda ishlatish](extend-using-v1-v2.md) |
||||||
|
* [Composer ni ishlatish](extend-using-composer.md) |
||||||
|
|
||||||
|
|
||||||
|
Maxsus mavzular |
||||||
|
--------------- |
||||||
|
|
||||||
|
* [advanced ilova shabloni](tutorial-advanced-app.md) |
||||||
|
* [Ilovani noldan yaratish](tutorial-start-from-scratch.md) |
||||||
|
* [Konsol komandalari](tutorial-console.md) |
||||||
|
* [Xalqarolashtirish](tutorial-i18n.md) |
||||||
|
* [Pochta yuborish](tutorial-mailing.md) |
||||||
|
* [Ish inumdorligini oshirish](tutorial-performance-tuning.md) |
||||||
|
* **TBD** [shared xostingida ishlash](tutorial-shared-hosting.md) |
||||||
|
* [Shablonlashtiruvchilar](tutorial-template-engines.md) |
||||||
|
|
||||||
|
|
||||||
|
Vidjetlar |
||||||
|
--------- |
||||||
|
|
||||||
|
* 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 |
||||||
|
* [Bootstrap vidjetlari](bootstrap-widgets.md) |
||||||
|
* **TBD** [Jquery UI vidjetlari](jui-widgets.md) |
||||||
|
|
||||||
|
|
||||||
|
Xelperlar |
||||||
|
--------- |
||||||
|
|
||||||
|
* [Sharh](helper-overview.md) |
||||||
|
* **TBD** [ArrayHelper](helper-array.md) |
||||||
|
* **TBD** [Html](helper-html.md) |
||||||
|
* **TBD** [Url](helper-url.md) |
||||||
|
* **TBD** [Security](helper-security.md) |
||||||
|
======= |
||||||
|
Barcha huquqlar ximoyalangan. |
||||||
|
|
||||||
|
2014 © Yii Software LLC. |
||||||
|
>>>>>>> 6a3cce2e267f590c38f910d571adea6a38028329 |
@ -0,0 +1,318 @@ |
|||||||
|
Sessions and Cookies |
||||||
|
==================== |
||||||
|
|
||||||
|
Sessions and cookies allow data to be persisted across multiple user requests. In plain PHP, you may access them |
||||||
|
through the global variables `$_SESSION` and `$_COOKIE`, respectively. Yii encapsulates sessions and cookies as objects |
||||||
|
and thus allows you to access them in an object-oriented fashion with additional nice enhancements. |
||||||
|
|
||||||
|
|
||||||
|
## Sessions <a name="sessions"></a> |
||||||
|
|
||||||
|
Like [requests](runtime-requests.md) and [responses](runtime-responses.md), you can get access to sessions via |
||||||
|
the `session` [application component](structure-application-components.md) which is an instance of [[yii\web\Session]], |
||||||
|
by default. |
||||||
|
|
||||||
|
|
||||||
|
### Opening and Closing Sessions <a name="opening-closing-sessions"></a> |
||||||
|
|
||||||
|
To open and close a session, you can do the following: |
||||||
|
|
||||||
|
```php |
||||||
|
$session = Yii::$app->session; |
||||||
|
|
||||||
|
// check if a session is already open |
||||||
|
if ($session->isActive) ... |
||||||
|
|
||||||
|
// open a session |
||||||
|
$session->open(); |
||||||
|
|
||||||
|
// close a session |
||||||
|
$session->close(); |
||||||
|
|
||||||
|
// destroys all data registered to a session. |
||||||
|
$session->destroy(); |
||||||
|
``` |
||||||
|
|
||||||
|
You can call the [[yii\web\Session::open()|open()]] and [[yii\web\Session::close()|close()]] multiple times |
||||||
|
without causing errors. This is because internally the methods will first check if the session is already opened. |
||||||
|
|
||||||
|
|
||||||
|
### Accessing Session Data <a name="access-session-data"></a> |
||||||
|
|
||||||
|
To access the data stored in session, you can do the following: |
||||||
|
|
||||||
|
```php |
||||||
|
$session = Yii::$app->session; |
||||||
|
|
||||||
|
// get a session variable. The following usages are equivalent: |
||||||
|
$language = $session->get('language'); |
||||||
|
$language = $session['language']; |
||||||
|
$language = isset($_SESSION['language']) ? $_SESSION['language'] : null; |
||||||
|
|
||||||
|
// set a session variable. The following usages are equivalent: |
||||||
|
$session->set('language', 'en-US'); |
||||||
|
$session['language'] = 'en-US'; |
||||||
|
$_SESSION['language'] = 'en-US'; |
||||||
|
|
||||||
|
// remove a session variable. The following usages are equivalent: |
||||||
|
$session->remove('language'); |
||||||
|
unset($session['language']); |
||||||
|
unset($_SESSION['language']); |
||||||
|
|
||||||
|
// check if a session variable exists. The following usages are equivalent: |
||||||
|
if ($session->has('language')) ... |
||||||
|
if (isset($session['language'])) ... |
||||||
|
if (isset($_SESSION['language'])) ... |
||||||
|
|
||||||
|
// traverse all session variables. The following usages are equivalent: |
||||||
|
foreach ($session as $name => $value) ... |
||||||
|
foreach ($_SESSION as $name => $value) ... |
||||||
|
``` |
||||||
|
|
||||||
|
> Info: When you access session data through the `session` component, a session will be automatically opened |
||||||
|
if it has not been done so before. This is different from accessing session data through `$_SESSION`, which requires |
||||||
|
an explicit call of `session_start()`. |
||||||
|
|
||||||
|
When working with session data that are arrays, the `session` component has a limitation which prevents you from |
||||||
|
directly modifying an array element. For example, |
||||||
|
|
||||||
|
```php |
||||||
|
$session = Yii::$app->session; |
||||||
|
|
||||||
|
// the following code will NOT work |
||||||
|
$session['captcha']['number'] = 5; |
||||||
|
$session['captcha']['lifetime'] = 3600; |
||||||
|
|
||||||
|
// the following code works: |
||||||
|
$session['captcha'] = [ |
||||||
|
'number' => 5, |
||||||
|
'lifetime' => 3600, |
||||||
|
]; |
||||||
|
|
||||||
|
// the following code also works: |
||||||
|
echo $session['captcha']['lifetime']; |
||||||
|
``` |
||||||
|
|
||||||
|
You can use one of the following workarounds to solve this problem: |
||||||
|
|
||||||
|
```php |
||||||
|
$session = Yii::$app->session; |
||||||
|
|
||||||
|
// directly use $_SESSION (make sure Yii::$app->session->open() has been called) |
||||||
|
$_SESSION['captcha']['number'] = 5; |
||||||
|
$_SESSION['captcha']['lifetime'] = 3600; |
||||||
|
|
||||||
|
// get the whole array out first, modify it and then save it back |
||||||
|
$captcha = $session['captcha']; |
||||||
|
$captcha['number'] = 5; |
||||||
|
$captcha['lifetime'] = 3600; |
||||||
|
$session['captcha'] = $captcha; |
||||||
|
|
||||||
|
// use ArrayObject instead of array |
||||||
|
$session['captcha'] = new \ArrayObject; |
||||||
|
... |
||||||
|
$session['captcha']['number'] = 5; |
||||||
|
$session['captcha']['lifetime'] = 3600; |
||||||
|
|
||||||
|
// store array data by keys with common prefix |
||||||
|
$session['captcha.number'] = 5; |
||||||
|
$session['captcha.lifetime'] = 3600; |
||||||
|
``` |
||||||
|
|
||||||
|
For better performance and code readability, we recommend the last workaround. That is, instead of storing |
||||||
|
an array as a single session variable, you store each array element as a session variable which shares the same |
||||||
|
key prefix with other array elements. |
||||||
|
|
||||||
|
|
||||||
|
### Custom Session Storage <a name="custom-session-storage"></a> |
||||||
|
|
||||||
|
The default [[yii\web\Session]] class stores session data as files on the server. Yii also provides the following |
||||||
|
session classes implementing different session storage: |
||||||
|
|
||||||
|
* [[yii\web\DbSession]]: stores session data in a database table. |
||||||
|
* [[yii\web\CacheSession]]: stores session data in a cache with the help of a configured [cache component](caching-data.md#cache-components). |
||||||
|
* [[yii\redis\Session]]: stores session data using [redis](http://redis.io/) as the storage medium |
||||||
|
* [[yii\mongodb\Session]]: stores session data in a [MongoDB](http://www.mongodb.org/). |
||||||
|
|
||||||
|
All these session classes support the same set of API methods. As a result, you can switch to use a different |
||||||
|
session storage without the need to modify your application code that uses session. |
||||||
|
|
||||||
|
> Note: If you want to access session data via `$_SESSION` while using custom session storage, you must make |
||||||
|
sure that the session is already started by [[yii\web\Session::open()]]. This is because custom session storage |
||||||
|
handlers are registered within this method. |
||||||
|
|
||||||
|
To learn how to configure and use these component classes, please refer to their API documentation. Below is |
||||||
|
an example showing how to configure [[yii\web\DbSession]] in the application configuration to use database table |
||||||
|
as session storage: |
||||||
|
|
||||||
|
```php |
||||||
|
return [ |
||||||
|
'components' => [ |
||||||
|
'session' => [ |
||||||
|
'class' => 'yii\web\DbSession', |
||||||
|
// 'db' => 'mydb', // the application component ID of the DB connection. Defaults to 'db'. |
||||||
|
// 'sessionTable' => 'my_session', // session table name. Defaults to 'session'. |
||||||
|
], |
||||||
|
], |
||||||
|
]; |
||||||
|
``` |
||||||
|
|
||||||
|
You also need to create the following database table to store session data: |
||||||
|
|
||||||
|
```sql |
||||||
|
CREATE TABLE session |
||||||
|
( |
||||||
|
id CHAR(40) NOT NULL PRIMARY KEY, |
||||||
|
expire INTEGER, |
||||||
|
data BLOB |
||||||
|
) |
||||||
|
``` |
||||||
|
|
||||||
|
where 'BLOB' refers to the BLOB-type of your preferred DBMS. Below are the BLOB type that can be used for some popular DBMS: |
||||||
|
|
||||||
|
- MySQL: LONGBLOB |
||||||
|
- PostgreSQL: BYTEA |
||||||
|
- MSSQL: BLOB |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Flash Data <a name="flash-data"></a> |
||||||
|
|
||||||
|
Flash data is a special kind of session data which, once set in one request, will only be available during |
||||||
|
the next request and will be automatically deleted afterwards. Flash data is most commonly used to implement |
||||||
|
messages that should only be displayed to end users once, such as a confirmation message displayed after |
||||||
|
a user successfully submits a form. |
||||||
|
|
||||||
|
You can set and access flash data through the `session` application component. For example, |
||||||
|
|
||||||
|
```php |
||||||
|
$session = Yii::$app->session; |
||||||
|
|
||||||
|
// Request #1 |
||||||
|
// set a flash message named as "postDeleted" |
||||||
|
$session->setFlash('postDeleted', 'You have successfully deleted your post.'); |
||||||
|
|
||||||
|
// Request #2 |
||||||
|
// display the flash message named "postDeleted" |
||||||
|
echo $session->getFlash('postDeleted'); |
||||||
|
|
||||||
|
// Request #3 |
||||||
|
// $result will be false since the flash message was automatically deleted |
||||||
|
$result = $session->hasFlash('postDeleted'); |
||||||
|
``` |
||||||
|
|
||||||
|
Like regular session data, you can store arbitrary data as flash data. |
||||||
|
|
||||||
|
When you call [[yii\web\Session::setFlash()]], it will overwrite any existing flash data that has the same name. |
||||||
|
To append new flash data to the existing one(s) of the same name, you may call [[yii\web\Session::addFlash()]] instead. |
||||||
|
For example, |
||||||
|
|
||||||
|
```php |
||||||
|
$session = Yii::$app->session; |
||||||
|
|
||||||
|
// Request #1 |
||||||
|
// add a few flash messages under the name of "alerts" |
||||||
|
$session->addFlash('alerts', 'You have successfully deleted your post.'); |
||||||
|
$session->addFlash('alerts', 'You have successfully added a new friend.'); |
||||||
|
$session->addFlash('alerts', 'You are promoted.'); |
||||||
|
|
||||||
|
// Request #2 |
||||||
|
// $alerts is an array of the flash messages under the name of "alerts" |
||||||
|
$alerts = $session->getFlash('alerts'); |
||||||
|
``` |
||||||
|
|
||||||
|
> Note: Try not to use [[yii\web\Session::setFlash()]] together with [[yii\web\Session::addFlash()]] for flash data |
||||||
|
of the same name. This is because the latter method will automatically turn the flash data into an array so that it |
||||||
|
can append new flash data of the same name. As a result, when you call [[yii\web\Session::getFlash()]], you may |
||||||
|
find sometimes you are getting an array while sometimes you are getting a string, depending on the order of |
||||||
|
the invocation of these two methods. |
||||||
|
|
||||||
|
|
||||||
|
## Cookies <a name="cookies"></a> |
||||||
|
|
||||||
|
Yii represents each cookie as an object of [[yii\web\Cookie]]. Both [[yii\web\Request]] and [[yii\web\Response]] |
||||||
|
maintain a collection of cookies via the property named `cookies`. The cookie collection in the former represents |
||||||
|
the cookies submitted in a request, while the cookie collection in the latter represents the cookies that are to |
||||||
|
be sent to the user. |
||||||
|
|
||||||
|
|
||||||
|
### Reading Cookies <a name="reading-cookies"></a> |
||||||
|
|
||||||
|
You can get the cookies in the current request using the following code: |
||||||
|
|
||||||
|
```php |
||||||
|
// get the cookie collection (yii\web\CookieCollection) from "request" component |
||||||
|
$cookies = Yii::$app->request->cookies; |
||||||
|
|
||||||
|
// get the "language" cookie value. If the cookie does not exist, return "en" as the default value. |
||||||
|
$language = $cookies->getValue('language', 'en'); |
||||||
|
|
||||||
|
// an alternative way of getting the "language" cookie value |
||||||
|
if (($cookie = $cookies->get('language')) !== null) { |
||||||
|
$language = $cookie->value; |
||||||
|
} |
||||||
|
|
||||||
|
// you may also use $cookies like an array |
||||||
|
if (isset($cookies['language'])) { |
||||||
|
$language = $cookies['language']->value; |
||||||
|
} |
||||||
|
|
||||||
|
// check if there is a "language" cookie |
||||||
|
if ($cookies->has('language')) ... |
||||||
|
if (isset($cookies['language'])) ... |
||||||
|
``` |
||||||
|
|
||||||
|
|
||||||
|
### Sending Cookies <a name="sending-cookies"></a> |
||||||
|
|
||||||
|
You can send cookies to end users using the following code: |
||||||
|
|
||||||
|
```php |
||||||
|
// get the cookie collection (yii\web\CookieCollection) from "response" component |
||||||
|
$cookies = Yii::$app->response->cookies; |
||||||
|
|
||||||
|
// add a new cookie to the response to be sent |
||||||
|
$cookies->add(new \yii\web\Cookie([ |
||||||
|
'name' => 'language', |
||||||
|
'value' => 'zh-CN', |
||||||
|
]); |
||||||
|
|
||||||
|
// remove a cookie |
||||||
|
$cookies->remove('language'); |
||||||
|
// equivalent to the following |
||||||
|
unset($cookies['language']); |
||||||
|
``` |
||||||
|
|
||||||
|
Besides the [[yii\web\Cookie::name|name]], [[yii\web\Cookie::value|value]] properties shown in the above |
||||||
|
examples, the [[yii\web\Cookie]] class also defines other properties to fully represent all possible information |
||||||
|
of cookies, such as [[yii\web\Cookie::domain|domain]], [[yii\web\Cookie::expire|expire]]. You may configure these |
||||||
|
properties as needed to prepare a cookie and then add it to the response's cookie collection. |
||||||
|
|
||||||
|
|
||||||
|
### Cookie Validation <a name="cookie-validation"></a> |
||||||
|
|
||||||
|
When you are reading and sending cookies through the `request` and `response` components like shown in the last |
||||||
|
two subsections, you enjoy the added security of cookie validation which protects cookies from being modified |
||||||
|
on the client side. This is achieved by signing each cookie with a hash string. If a cookie is modified somehow, |
||||||
|
it will fail the validation of its associated hash and will be removed from the cookie collection in the request. |
||||||
|
|
||||||
|
Cookie validation is enabled by default. You can disable it by setting the [[yii\web\Request::enableCookieValidation]] |
||||||
|
property to be false, although we recommend you not to do so. |
||||||
|
|
||||||
|
> Note: Cookies that are directly read/sent via `$_COOKIE` and `setcookie()` will NOT be validated. |
||||||
|
|
||||||
|
When using cookie validation, you must specify a [[yii\web\Request::cookieValidationKey]] that will be used to generate |
||||||
|
the aforementioned hash strings. You can do so by configuring the `request` component in the application configuration: |
||||||
|
|
||||||
|
```php |
||||||
|
return [ |
||||||
|
'components' => [ |
||||||
|
'request' => [ |
||||||
|
'cookieValidationKey' => 'fill in a secret key here', |
||||||
|
], |
||||||
|
], |
||||||
|
]; |
||||||
|
``` |
||||||
|
|
||||||
|
> Info: [[yii\web\Request::cookieValidationKey|cookieValidationKey]] is critical to your application's security. |
||||||
|
It should only be known to people you trust. Do not store it in version control system. |
Loading…
Reference in new issue