CompositeUrlRule.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. /**
  3. * @link http://www.yiiframework.com/
  4. * @copyright Copyright (c) 2008 Yii Software LLC
  5. * @license http://www.yiiframework.com/license/
  6. */
  7. namespace yii\web;
  8. use Yii;
  9. use yii\base\Object;
  10. /**
  11. * CompositeUrlRule is the base class for URL rule classes that consist of multiple simpler rules.
  12. *
  13. * @author Qiang Xue <qiang.xue@gmail.com>
  14. * @since 2.0
  15. */
  16. abstract class CompositeUrlRule extends Object implements UrlRuleInterface
  17. {
  18. /**
  19. * @var UrlRuleInterface[] the URL rules contained in this composite rule.
  20. * This property is set in [[init()]] by the return value of [[createRules()]].
  21. */
  22. protected $rules = [];
  23. /**
  24. * Creates the URL rules that should be contained within this composite rule.
  25. * @return UrlRuleInterface[] the URL rules
  26. */
  27. abstract protected function createRules();
  28. /**
  29. * @inheritdoc
  30. */
  31. public function init()
  32. {
  33. parent::init();
  34. $this->rules = $this->createRules();
  35. }
  36. /**
  37. * @inheritdoc
  38. */
  39. public function parseRequest($manager, $request)
  40. {
  41. foreach ($this->rules as $rule) {
  42. /* @var $rule \yii\web\UrlRule */
  43. $result = $rule->parseRequest($manager, $request);
  44. if (YII_DEBUG) {
  45. Yii::trace([
  46. 'rule' => method_exists($rule, '__toString') ? $rule->__toString() : get_class($rule),
  47. 'match' => $result !== false,
  48. 'parent' => self::className()
  49. ], __METHOD__);
  50. }
  51. if ($result !== false) {
  52. return $result;
  53. }
  54. }
  55. return false;
  56. }
  57. /**
  58. * @inheritdoc
  59. */
  60. public function createUrl($manager, $route, $params)
  61. {
  62. foreach ($this->rules as $rule) {
  63. /* @var $rule \yii\web\UrlRule */
  64. if (($url = $rule->createUrl($manager, $route, $params)) !== false) {
  65. return $url;
  66. }
  67. }
  68. return false;
  69. }
  70. }