Application 分析

来源:互联网 发布:日本家电淘宝 编辑:程序博客网 时间:2024/06/06 01:04

<?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace yii\web;use Yii;use yii\helpers\Url;use yii\base\InvalidRouteException;/** * Application is the base class for all web application classes. * * For more details and usage information on Application, see the [guide article on applications](guide:structure-applications). * * @property ErrorHandler $errorHandler The error handler application component. This property is read-only. * @property string $homeUrl The homepage URL. * @property Request $request The request component. This property is read-only. * @property Response $response The response component. This property is read-only. * @property Session $session The session component. This property is read-only. * @property User $user The user component. This property is read-only. * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */class Application extends \yii\base\Application{    /**     * @var string the default route of this application. Defaults to 'site'.     */    public $defaultRoute = 'site';    /**     * @var array the configuration specifying a controller action which should handle     * all user requests. This is mainly used when the application is in maintenance mode     * and needs to handle all incoming requests via a single action.     * The configuration is an array whose first element specifies the route of the action.     * The rest of the array elements (key-value pairs) specify the parameters to be bound     * to the action. For example,     *     * ```php     * [     *     'offline/notice',     *     'param1' => 'value1',     *     'param2' => 'value2',     * ]     * ```     *     * Defaults to null, meaning catch-all is not used.     */    public $catchAll;    /**     * @var Controller the currently active controller instance     */    public $controller;    /**     * @inheritdoc     * 引导程序     */    protected function bootstrap()    {        $request = $this->getRequest();//请求参数        Yii::setAlias('@webroot', dirname($request->getScriptFile())); //设置别名 webroot        Yii::setAlias('@web', $request->getBaseUrl()); //设置别名 web        //调用父类 引导程序        parent::bootstrap();    }    /**     * Handles the specified request.  处理请求     * @param Request $request the request to be handled     * @return Response the resulting response     * @throws NotFoundHttpException if the requested route is invalid     */    public function handleRequest($request)    {        if (empty($this->catchAll)) {            try {                //解析当前请求到路由和参数                list ($route, $params) = $request->resolve();            } catch (UrlNormalizerRedirectException $e) {                $url = $e->url;                if (is_array($url)) {                    if (isset($url[0])) {                        // ensure the route is absolute                        $url[0] = '/' . ltrim($url[0], '/');                    }                    $url += $request->getQueryParams();                }                //解析失败 跳转  带状态码                return $this->getResponse()->redirect(Url::to($url, $e->scheme), $e->statusCode);            }        } else {            $route = $this->catchAll[0];            $params = $this->catchAll;            unset($params[0]);        }        try {            //记录请求路由和方法到日志            Yii::trace("Route requested: '$route'", __METHOD__);            $this->requestedRoute = $route;            //根据路由执行controller的方法            $result = $this->runAction($route, $params);            if ($result instanceof Response) {                //如果是Response 的实例  就直接返回                return $result;            } else {                //如果不是Response 的实例  就获取响应                $response = $this->getResponse();                if ($result !== null) {                    $response->data = $result;                }                return $response;            }        } catch (InvalidRouteException $e) {            throw new NotFoundHttpException(Yii::t('yii', 'Page not found.'), $e->getCode(), $e);        }    }    private $_homeUrl;    /**     * @return string the homepage URL     */    public function getHomeUrl()    {        if ($this->_homeUrl === null) {            if ($this->getUrlManager()->showScriptName) {                return $this->getRequest()->getScriptUrl();            } else {                return $this->getRequest()->getBaseUrl() . '/';            }        } else {            return $this->_homeUrl;        }    }    /**     * 设置_homeUrl     * @param string $value the homepage URL     */    public function setHomeUrl($value)    {        $this->_homeUrl = $value;    }    /**     * Returns the error handler component.     * @return ErrorHandler the error handler application component.     */    public function getErrorHandler()    {        return $this->get('errorHandler');    }    /**     * Returns the request component.     * @return Request the request component.     */    public function getRequest()    {        return $this->get('request');    }    /**     * Returns the response component.     * @return Response the response component.     */    public function getResponse()    {        return $this->get('response');    }    /**     * Returns the session component.     * @return Session the session component.     */    public function getSession()    {        return $this->get('session');    }    /**     * Returns the user component.     * @return User the user component.     */    public function getUser()    {        return $this->get('user');    }    /**     * 设置核心组件     * @inheritdoc     */    public function coreComponents()    {        return array_merge(parent::coreComponents(), [            'request' => ['class' => 'yii\web\Request'],            'response' => ['class' => 'yii\web\Response'],            'session' => ['class' => 'yii\web\Session'],            'user' => ['class' => 'yii\web\User'],            'errorHandler' => ['class' => 'yii\web\ErrorHandler'],        ]);    }}

原创粉丝点击