| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 | <?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\base\InvalidRouteException;use yii\helpers\Url;/** * 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()));        Yii::setAlias('@web', $request->getBaseUrl());        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::debug("Route requested: '$route'", __METHOD__);            $this->requestedRoute = $route;            $result = $this->runAction($route, $params);            if ($result instanceof Response) {                return $result;            }            $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();            }            return $this->getRequest()->getBaseUrl() . '/';        }        return $this->_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'],        ]);    }}
 |