程序入口


入口文件位于项目的htdocs目录下, CP的入口文件也是项目编码中很重要的一部分, 在这里可以根据项目需求处理各种事件

├─admin
│  └─static
│      ├─css
│      ├─images
│      ├─js
│      └─lib
├─api
└─web
    └─static
        ├─images
        └─lib

htdocs下的文件夹对app目录下的文件夹名称. 一个app对应一个入口. app之间的资源文件也是独立的. >css, js, images等都是独立的, 存放在static文件夹下, 入口文件指的是目录下面的index.php文件

引入启动文件

首先引入启动文件

require __DIR__ . '/../../crossboot.php';

在启动文件中我们定义了项目的绝对路径, 并引入了框架.

指定要启动的app

指定要加载的app名称, 并自动解析uri

Cross\Core\Delegate::loadApp('web')->run()

此时通过浏览器访问htdocs/web/, 就可以看到默认输出了.

错误处理

CP中并没有开发模式和生产模式的开关, 开发模式下如果有异常发生会自动捕获, 并输出简洁的trace信息给开发者, 便于调试, 这时的入口文件一般如下

require __DIR__ . '/../../crossboot.php';
Cross\Core\Delegate::loadApp('web')->run();

在生产环境下, 需要在程序入口自己捕获异常.

require __DIR__ . '/../../crossboot.php';
$web = Cross\Core\Delegate::loadApp('web');

try {
    $web->run();
} catch (Exception $e) {
    $web->get('error', array('exception' => $e));
}

当有异常发生时, 捕获异常, 调用错误处理控制器, 并把捕获的异常信息当参数传递给错误处理控制器. 下例是一个简单的错误处理控制器:

namespace app\web\controllers;	

use Cross\Core\Helper;
use Cross\Core\Loader;

class Error extends Web
{
    /**
     * @return mixed
     */
    function index()
    {
        $exception = $this->params['exception'];

        $log['msg'] = $exception->getMessage();
        $log['trace'] = explode("\n", $exception->getTraceAsString());
        $log['u'] = $this->u;
        $log['date'] = date('H:i:s', TIME);
        $log['client_ip'] = Helper::getIp();

        $exception_log_file = Loader::getFilePath('::cache/exception/'.date('Y-m/d').'.txt');
        Helper::mkfile($exception_log_file);
        error_log(print_r($log, true), 3, $exception_log_file);
        $this->display($this->data);
    }
}

这里保存了异常消息, trace, 还会保存用户信息, 日期, 和客户端IP, 按日期保存在一个文本文件中. 这个控制器和项目中的其他普通控制器并没有差别, 你可以在这里调用Module, 把异常数据存在数据库中, 还可以数据库中返回一些你推荐数据展示给用户.

>"错误页面"不再只是一个页面, 也可以多姿多彩