123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- <?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\InvalidConfigException;
- /**
- * GroupUrlRule represents a collection of URL rules sharing the same prefix in their patterns and routes.
- *
- * GroupUrlRule is best used by a module which often uses module ID as the prefix for the URL rules.
- * For example, the following code creates a rule for the `admin` module:
- *
- * ```php
- * new GroupUrlRule([
- * 'prefix' => 'admin',
- * 'rules' => [
- * 'login' => 'user/login',
- * 'logout' => 'user/logout',
- * 'dashboard' => 'default/dashboard',
- * ],
- * ]);
- *
- * // the above rule is equivalent to the following three rules:
- *
- * [
- * 'admin/login' => 'admin/user/login',
- * 'admin/logout' => 'admin/user/logout',
- * 'admin/dashboard' => 'admin/default/dashboard',
- * ]
- * ```
- *
- * The above example assumes the prefix for patterns and routes are the same. They can be made different
- * by configuring [[prefix]] and [[routePrefix]] separately.
- *
- * Using a GroupUrlRule is more efficient than directly declaring the individual rules it contains.
- * This is because GroupUrlRule can quickly determine if it should process a URL parsing or creation request
- * by simply checking if the prefix matches.
- *
- * @author Qiang Xue <qiang.xue@gmail.com>
- * @since 2.0
- */
- class GroupUrlRule extends CompositeUrlRule
- {
- /**
- * @var array the rules contained within this composite rule. Please refer to [[UrlManager::rules]]
- * for the format of this property.
- * @see prefix
- * @see routePrefix
- */
- public $rules = [];
- /**
- * @var string the prefix for the pattern part of every rule declared in [[rules]].
- * The prefix and the pattern will be separated with a slash.
- */
- public $prefix;
- /**
- * @var string the prefix for the route part of every rule declared in [[rules]].
- * The prefix and the route will be separated with a slash.
- * If this property is not set, it will take the value of [[prefix]].
- */
- public $routePrefix;
- /**
- * @var array the default configuration of URL rules. Individual rule configurations
- * specified via [[rules]] will take precedence when the same property of the rule is configured.
- */
- public $ruleConfig = ['class' => 'yii\web\UrlRule'];
- /**
- * {@inheritdoc}
- */
- public function init()
- {
- $this->prefix = trim($this->prefix, '/');
- $this->routePrefix = $this->routePrefix === null ? $this->prefix : trim($this->routePrefix, '/');
- parent::init();
- }
- /**
- * {@inheritdoc}
- */
- protected function createRules()
- {
- $rules = [];
- foreach ($this->rules as $key => $rule) {
- if (!is_array($rule)) {
- $verbs = 'GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS';
- $verb = null;
- if (preg_match("/^((?:(?:$verbs),)*(?:$verbs))\\s+(.*)$/", $key, $matches)) {
- $verb = explode(',', $matches[1]);
- $key = $matches[2];
- }
- $rule = [
- 'pattern' => ltrim($this->prefix . '/' . $key, '/'),
- 'route' => ltrim($this->routePrefix . '/' . $rule, '/'),
- 'verb' => $verb
- ];
- } elseif (isset($rule['pattern'], $rule['route'])) {
- $rule['pattern'] = ltrim($this->prefix . '/' . $rule['pattern'], '/');
- $rule['route'] = ltrim($this->routePrefix . '/' . $rule['route'], '/');
- }
- $rule = Yii::createObject(array_merge($this->ruleConfig, $rule));
- if (!$rule instanceof UrlRuleInterface) {
- throw new InvalidConfigException('URL rule class must implement UrlRuleInterface.');
- }
- $rules[] = $rule;
- }
- return $rules;
- }
- /**
- * {@inheritdoc}
- */
- public function parseRequest($manager, $request)
- {
- $pathInfo = $request->getPathInfo();
- if ($this->prefix === '' || strpos($pathInfo . '/', $this->prefix . '/') === 0) {
- return parent::parseRequest($manager, $request);
- }
- return false;
- }
- /**
- * {@inheritdoc}
- */
- public function createUrl($manager, $route, $params)
- {
- if ($this->routePrefix === '' || strpos($route, $this->routePrefix . '/') === 0) {
- return parent::createUrl($manager, $route, $params);
- }
- $this->createStatus = UrlRule::CREATE_STATUS_ROUTE_MISMATCH;
- return false;
- }
- }
|