Вхідні скрипти
==============

Вхідні скрипти це перша ланка в процесі початкового завантаження додатку. Додаток (веб додаток або консольний додаток)
має єдиний вхідний скрипт. Кінцеві користувачі роблять запити до вхідного скрипта, який створює об’єкти додатка та
перенаправляє запит до них.

Вхідні скрипти для веб додатків повинні бути збережені в директоріях, доступних із веб, таким чином, вони можуть бути
доступними кінцевим користувачам. Зазвичай вони називаються `index.php`, але також можут використовуватись і інші
імена, які можуть бути розпізнані веб-серверами.

Вхідні скрипти для консольних додатків зазвичай розміщенні у [кореневій директорії](structure-applications.md)
додатку і мають назву `yii` (з суфіксом `.php`). Вони повинні мати права на виконання, щоб користувачі мали змогу
запускати консольні додатки через команду `./yii <маршрут> [аргументи] [опції]`.

Вхідні скрипти в основному виконують наступну роботу:

* Оголошують глобальні константи;
* Реєструють автозавантажувач класів [Composer](http://getcomposer.org/doc/01-basic-usage.md#autoloading);
* Підключають файл класу [[Yii]];
* Завантажують конфігурацію додатка;
* Створюють і конфігурують об’єкт [додатка](structure-applications.md);
* Викликають метод [[yii\base\Application::run()]] додатка для обробки вхідного запиту.


## Веб додатки <a name="web-applications"></a>

Нижче наведений код вхідного скрипта для [базового шаблону додатка](start-installation.md).

```php
<?php

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

// реєстрація автозавантажувача класів Composer
require(__DIR__ . '/../vendor/autoload.php');

// підключення файла класу Yii
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

// завантаження конфігурації додатка
$config = require(__DIR__ . '/../config/web.php');

// створення, конфігурація та виконання додатка
(new yii\web\Application($config))->run();
```


## Консольні додатки <a name="console-applications"></a>

Нижче наведений аналогічний код вхідного скрипта консольного додатка:

```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);

// fcgi не має констант STDIN та STDOUT за замовчуванням
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));

// реєстрація автозавантажувача класів Composer
require(__DIR__ . '/vendor/autoload.php');

// підключення файла класу Yii
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');

// завантаження конфігурації додатка
$config = require(__DIR__ . '/config/console.php');

$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);
```


## Оголошення констант <a name="defining-constants"></a>

Вхідні скрипти є найкращим місцем для оголошення глобальних констант. Yii підтримує наступні три константи:

* `YII_DEBUG`: вказує чи працює додаткок у режимі відлагодження ("debug mode"), перебуваючи у якому,
  додаток буде збирати більше інформації у логи та покаже більш детальний стек викликів при отриманні виключення.
  З цієї причини, режим відлагодження повинен бути використаний тільки в процесі розробки. 
  За замовчуванням значення `YII_DEBUG` дорівнює `false`.
* `YII_ENV`: вказує в якому середовищі працює додаток. Дана тема детально розглянута у розділі 
  [Конфігурації](concept-configurations.md#environment-constants). За замовчуванням значення `YII_ENV` дорівнює
  `'prod'`, яке означає, що додаток працює у робочому ("production") режимі.
* `YII_ENABLE_ERROR_HANDLER`: вказує чи потрібно увімкнути наявний у Yii обробник помилок.
  За замовчуванням значення даної константи дорівнює `true`.

При визначенні константи, ми зазвичай використовуєм наступний код:

```php
defined('YII_DEBUG') or define('YII_DEBUG', true);
```

який рівнозначний коду, наведеному нижче:

```php
if (!defined('YII_DEBUG')) {
    define('YII_DEBUG', true);
}
```

Перший варіант є більш коротким і зрозумілим.

Константи мають бути визначені якомога раніше, на самому початку вхідного скрипта, щоб вони могли вплинути на решту
PHP файлів, які будуть підключатись.
