123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- <?php
- // +----------------------------------------------------------------------
- // | ThinkPHP [ WE CAN DO IT JUST THINK ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- // +----------------------------------------------------------------------
- // | Author: liu21st <liu21st@gmail.com>
- // +----------------------------------------------------------------------
- namespace think\route;
- use think\Route;
- class Resource extends RuleGroup
- {
- // 资源路由名称
- protected $resource;
- // REST路由方法定义
- protected $rest = [];
- /**
- * 架构函数
- * @access public
- * @param Route $router 路由对象
- * @param RuleGroup $parent 上级对象
- * @param string $name 资源名称
- * @param string $route 路由地址
- * @param array $option 路由参数
- * @param array $pattern 变量规则
- * @param array $rest 资源定义
- */
- public function __construct(Route $router, RuleGroup $parent = null, $name = '', $route = '', $option = [], $pattern = [], $rest = [])
- {
- $this->router = $router;
- $this->parent = $parent;
- $this->resource = $name;
- $this->route = $route;
- $this->name = strpos($name, '.') ? strstr($name, '.', true) : $name;
- $this->setFullName();
- // 资源路由默认为完整匹配
- $option['complete_match'] = true;
- $this->pattern = $pattern;
- $this->option = $option;
- $this->rest = $rest;
- if ($this->parent) {
- $this->domain = $this->parent->getDomain();
- $this->parent->addRuleItem($this);
- }
- if ($router->isTest()) {
- $this->buildResourceRule();
- }
- }
- /**
- * 生成资源路由规则
- * @access protected
- * @return void
- */
- protected function buildResourceRule()
- {
- $origin = $this->router->getGroup();
- $this->router->setGroup($this);
- $rule = $this->resource;
- $option = $this->option;
- if (strpos($rule, '.')) {
- // 注册嵌套资源路由
- $array = explode('.', $rule);
- $last = array_pop($array);
- $item = [];
- foreach ($array as $val) {
- $item[] = $val . '/<' . (isset($option['var'][$val]) ? $option['var'][$val] : $val . '_id') . '>';
- }
- $rule = implode('/', $item) . '/' . $last;
- }
- $prefix = substr($rule, strlen($this->name) + 1);
- // 注册资源路由
- foreach ($this->rest as $key => $val) {
- if ((isset($option['only']) && !in_array($key, $option['only']))
- || (isset($option['except']) && in_array($key, $option['except']))) {
- continue;
- }
- if (isset($last) && strpos($val[1], '<id>') && isset($option['var'][$last])) {
- $val[1] = str_replace('<id>', '<' . $option['var'][$last] . '>', $val[1]);
- } elseif (strpos($val[1], '<id>') && isset($option['var'][$rule])) {
- $val[1] = str_replace('<id>', '<' . $option['var'][$rule] . '>', $val[1]);
- }
- $this->addRule(trim($prefix . $val[1], '/'), $this->route . '/' . $val[2], $val[0]);
- }
- $this->router->setGroup($origin);
- }
- /**
- * rest方法定义和修改
- * @access public
- * @param string $name 方法名称
- * @param array|bool $resource 资源
- * @return $this
- */
- public function rest($name, $resource = [])
- {
- if (is_array($name)) {
- $this->rest = $resource ? $name : array_merge($this->rest, $name);
- } else {
- $this->rest[$name] = $resource;
- }
- return $this;
- }
- }
|