Yii - 入口脚本



入口脚本负责启动请求处理周期。它们只是用户可以访问的 PHP 脚本。

下图显示了应用程序的结构:

Entry Scripts Structure

Web 应用程序(以及控制台应用程序)只有一个入口脚本。最终用户向入口脚本发出请求。然后,入口脚本实例化应用程序实例并将请求转发给它们。

控制台应用程序的入口脚本通常存储在项目基路径下,并命名为 **yii.php**。Web 应用程序的入口脚本必须存储在 Web 可访问的目录下。它通常被称为 **index.php**。

入口脚本执行以下操作:

  • 定义常量。
  • 注册 Composer 自动加载器。
  • 包含 Yii 文件。
  • 加载配置。
  • 创建和配置应用程序实例。
  • 处理传入的请求。

以下是 **基本应用程序** 模板的入口脚本:

<?php
   //defining global constants
   defined('YII_DEBUG') or define('YII_DEBUG', true);
   defined('YII_ENV') or define('YII_ENV', 'dev');
 
   //register composer autoloader
   require(__DIR__ . '/../vendor/autoload.php');
   //include yii files
   require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
  
   //load application config
   $config = require(__DIR__ . '/../config/web.php');
  
   //create, config, and process reques
   (new yii\web\Application($config))->run();
?>

以下是 **控制台** 应用程序的入口脚本:

#!/usr/bin/env php
<?php
   /** 
   * Yii console bootstrap file. 
   * @link https://yiiframework.cn/ 
   * @copyright Copyright (c) 2008 Yii Software LLC 
   * @license https://yiiframework.cn/license/ 
   */
   //defining global constants
   defined('YII_DEBUG') or define('YII_DEBUG', true);
  
   //register composer autoloader
   require(__DIR__ . '/vendor/autoload.php');
   require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
  
   //load config
   $config = require(__DIR__ . '/config/console.php');
  
   //apply config the application instance 
   $application = new yii\console\Application($config);  

   //process request
   $exitCode = $application->run();
   exit($exitCode);
?>

定义全局常量的最佳位置是入口脚本。Yii 支持三个常量:

  • **YII_DEBUG** - 定义是否处于调试模式。如果设置为 true,我们将看到更多日志数据和详细的错误调用堆栈。

  • **YII_ENV** - 定义环境模式。默认值为 prod。可用值为 prod、dev 和 test。它们用于配置文件中定义不同的数据库连接(本地和远程)或其他值。

  • **YII_ENABLE_ERROR_HANDLER** - 指定是否启用默认的 Yii 错误处理程序。

要定义全局常量,使用以下代码:

//defining global constants 
defined('YII_DEBUG') or define('YII_DEBUG', true); 
which is equivalent to: 
if(!defined('YII_DEBUG')) { 
   define('YII_DEBUG', true); 
} 

**注意** - 为了在包含其他 PHP 文件时生效,全局常量应该在入口脚本的开头定义。

广告