内核代码升级

This commit is contained in:
2016-09-08 16:38:09 +08:00
parent acd3e6fa25
commit 7201db324e
19 changed files with 86 additions and 48 deletions

View File

@@ -89,7 +89,7 @@ return [
'url_route_must' => false, 'url_route_must' => false,
// 域名部署 // 域名部署
'url_domain_deploy' => false, 'url_domain_deploy' => false,
// 域名根,如.thinkphp.cn // 域名根如thinkphp.cn
'url_domain_root' => '', 'url_domain_root' => '',
// 是否自动转换URL中的控制器和操作名 // 是否自动转换URL中的控制器和操作名
'url_convert' => true, 'url_convert' => true,

View File

@@ -18,6 +18,8 @@ use think\Config;
use think\Cookie; use think\Cookie;
use think\Db; use think\Db;
use think\Debug; use think\Debug;
use think\exception\HttpException;
use think\exception\HttpResponseException;
use think\Lang; use think\Lang;
use think\Loader; use think\Loader;
use think\Log; use think\Log;
@@ -345,9 +347,10 @@ if (!function_exists('cache')) {
* @param mixed $name 缓存名称,如果为数组表示进行缓存设置 * @param mixed $name 缓存名称,如果为数组表示进行缓存设置
* @param mixed $value 缓存值 * @param mixed $value 缓存值
* @param mixed $options 缓存参数 * @param mixed $options 缓存参数
* @param string $tag 缓存标签
* @return mixed * @return mixed
*/ */
function cache($name, $value = '', $options = null) function cache($name, $value = '', $options = null, $tag = null)
{ {
if (is_array($options)) { if (is_array($options)) {
// 缓存操作的同时初始化 // 缓存操作的同时初始化
@@ -369,7 +372,11 @@ if (!function_exists('cache')) {
} else { } else {
$expire = is_numeric($options) ? $options : null; //默认快捷缓存设置过期时间 $expire = is_numeric($options) ? $options : null; //默认快捷缓存设置过期时间
} }
return Cache::set($name, $value, $expire); if (is_null($tag)) {
return Cache::set($name, $value, $expire);
} else {
return Cache::tag($tag)->set($name, $value, $expire);
}
} }
} }
} }
@@ -505,9 +512,9 @@ if (!function_exists('abort')) {
function abort($code, $message = null, $header = []) function abort($code, $message = null, $header = [])
{ {
if ($code instanceof Response) { if ($code instanceof Response) {
throw new \think\exception\HttpResponseException($code); throw new HttpResponseException($code);
} else { } else {
throw new \think\exception\HttpException($code, $message, null, $header); throw new HttpException($code, $message, null, $header);
} }
} }
} }
@@ -520,7 +527,7 @@ if (!function_exists('halt')) {
function halt($var) function halt($var)
{ {
dump($var); dump($var);
throw new \think\exception\HttpResponseException(new Response); throw new HttpResponseException(new Response);
} }
} }
@@ -529,6 +536,7 @@ if (!function_exists('token')) {
* 生成表单令牌 * 生成表单令牌
* @param string $name 令牌名称 * @param string $name 令牌名称
* @param mixed $type 令牌生成方法 * @param mixed $type 令牌生成方法
* @return string
*/ */
function token($name = '__token__', $type = 'md5') function token($name = '__token__', $type = 'md5')
{ {

View File

@@ -61,4 +61,5 @@ return [
'cache write error' => '缓存写入失败', 'cache write error' => '缓存写入失败',
'sae mc write error' => 'SAE mc 写入错误', 'sae mc write error' => 'SAE mc 写入错误',
'route name not exists' => '路由标识不存在(或参数不够)', 'route name not exists' => '路由标识不存在(或参数不够)',
'invalid request' => '非法请求',
]; ];

View File

@@ -327,7 +327,7 @@ class App
$actionName = $convert ? strtolower($actionName) : $actionName; $actionName = $convert ? strtolower($actionName) : $actionName;
// 设置当前请求的控制器、操作 // 设置当前请求的控制器、操作
$request->controller($controller)->action($actionName); $request->controller(Loader::parseName($controller, 1))->action($actionName);
// 监听module_init // 监听module_init
Hook::listen('module_init', $request); Hook::listen('module_init', $request);

View File

@@ -44,7 +44,7 @@ class Cache
$class = false !== strpos($type, '\\') ? $type : '\\think\\cache\\driver\\' . ucwords($type); $class = false !== strpos($type, '\\') ? $type : '\\think\\cache\\driver\\' . ucwords($type);
// 记录初始化信息 // 记录初始化信息
App::$debug && Log::record('[ CACHE ] INIT ' . $type . ':' . var_export($options, true), 'info'); App::$debug && Log::record('[ CACHE ] INIT ' . $type, 'info');
if (true === $name) { if (true === $name) {
return new $class($options); return new $class($options);
} else { } else {

View File

@@ -38,7 +38,7 @@ class Controller
/** /**
* 架构函数 * 架构函数
* @param Request $request Request对象 * @param Request $request Request对象
* @access public * @access public
*/ */
public function __construct(Request $request = null) public function __construct(Request $request = null)
@@ -70,8 +70,8 @@ class Controller
/** /**
* 前置操作 * 前置操作
* @access protected * @access protected
* @param string $method 前置操作方法名 * @param string $method 前置操作方法名
* @param array $options 调用参数 ['only'=>[...]] 或者['except'=>[...]] * @param array $options 调用参数 ['only'=>[...]] 或者['except'=>[...]]
*/ */
protected function beforeAction($method, $options = []) protected function beforeAction($method, $options = [])
{ {
@@ -91,18 +91,16 @@ class Controller
} }
} }
if (method_exists($this, $method)) { call_user_func([$this, $method]);
call_user_func([$this, $method]);
}
} }
/** /**
* 加载模板输出 * 加载模板输出
* @access protected * @access protected
* @param string $template 模板文件名 * @param string $template 模板文件名
* @param array $vars 模板输出变量 * @param array $vars 模板输出变量
* @param array $replace 模板替换 * @param array $replace 模板替换
* @param array $config 模板参数 * @param array $config 模板参数
* @return mixed * @return mixed
*/ */
protected function fetch($template = '', $vars = [], $replace = [], $config = []) protected function fetch($template = '', $vars = [], $replace = [], $config = [])
@@ -113,10 +111,10 @@ class Controller
/** /**
* 渲染内容输出 * 渲染内容输出
* @access protected * @access protected
* @param string $content 模板内容 * @param string $content 模板内容
* @param array $vars 模板输出变量 * @param array $vars 模板输出变量
* @param array $replace 替换内容 * @param array $replace 替换内容
* @param array $config 模板参数 * @param array $config 模板参数
* @return mixed * @return mixed
*/ */
protected function display($content = '', $vars = [], $replace = [], $config = []) protected function display($content = '', $vars = [], $replace = [], $config = [])
@@ -127,8 +125,8 @@ class Controller
/** /**
* 模板变量赋值 * 模板变量赋值
* @access protected * @access protected
* @param mixed $name 要显示的模板变量 * @param mixed $name 要显示的模板变量
* @param mixed $value 变量的值 * @param mixed $value 变量的值
* @return void * @return void
*/ */
protected function assign($name, $value = '') protected function assign($name, $value = '')

View File

@@ -75,7 +75,9 @@ class Db
} }
$class = false !== strpos($options['type'], '\\') ? $options['type'] : '\\think\\db\\connector\\' . ucwords($options['type']); $class = false !== strpos($options['type'], '\\') ? $options['type'] : '\\think\\db\\connector\\' . ucwords($options['type']);
// 记录初始化信息 // 记录初始化信息
App::$debug && Log::record('[ DB ] INIT ' . $options['type'] . ':' . var_export($options, true), 'info'); if (App::$debug) {
Log::record('[ DB ] INIT ' . $options['type'], 'info');
}
if (true === $name) { if (true === $name) {
return new $class($options); return new $class($options);
} else { } else {

View File

@@ -452,13 +452,14 @@ class Loader
} }
/** /**
* 实例化数据库 * 数据库初始化 并取得数据库类实例
* @param mixed $config 数据库配置 * @param mixed $config 数据库配置
* @return object * @param bool|string $name 连接标识 true 强制重新连接
* @return \think\db\Connection
*/ */
public static function db($config = []) public static function db($config = [], $name = false)
{ {
return Db::connect($config); return Db::connect($config, $name);
} }
/** /**

View File

@@ -61,7 +61,7 @@ class Log
throw new ClassNotFoundException('class not exists:' . $class, $class); throw new ClassNotFoundException('class not exists:' . $class, $class);
} }
// 记录初始化信息 // 记录初始化信息
App::$debug && Log::record('[ LOG ] INIT ' . $type . ': ' . var_export($config, true), 'info'); App::$debug && Log::record('[ LOG ] INIT ' . $type, 'info');
} }
/** /**

View File

@@ -321,6 +321,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
switch ($type) { switch ($type) {
case 'datetime': case 'datetime':
case 'date':
$format = !empty($param) ? $param : $this->dateFormat; $format = !empty($param) ? $param : $this->dateFormat;
$value = date($format, $_SERVER['REQUEST_TIME']); $value = date($format, $_SERVER['REQUEST_TIME']);
break; break;

View File

@@ -240,7 +240,7 @@ class Request
$options['baseUrl'] = $info['path']; $options['baseUrl'] = $info['path'];
$options['pathinfo'] = '/' == $info['path'] ? '/' : ltrim($info['path'], '/'); $options['pathinfo'] = '/' == $info['path'] ? '/' : ltrim($info['path'], '/');
$options['method'] = $server['REQUEST_METHOD']; $options['method'] = $server['REQUEST_METHOD'];
$options['domain'] = $server['HTTP_HOST']; $options['domain'] = $info['scheme'] . '://' . $server['HTTP_HOST'];
$options['content'] = $content; $options['content'] = $content;
self::$instance = new self($options); self::$instance = new self($options);
return self::$instance; return self::$instance;

View File

@@ -13,6 +13,7 @@ namespace think;
use think\Config; use think\Config;
use think\Debug; use think\Debug;
use think\Env;
use think\response\Json as JsonResponse; use think\response\Json as JsonResponse;
use think\response\Jsonp as JsonpResponse; use think\response\Jsonp as JsonpResponse;
use think\response\Redirect as RedirectResponse; use think\response\Redirect as RedirectResponse;
@@ -96,7 +97,7 @@ class Response
$data = $this->getContent(); $data = $this->getContent();
// Trace调试注入 // Trace调试注入
if (Config::get('app_trace')) { if (Env::get('app_trace', Config::get('app_trace'))) {
Debug::inject($this, $data); Debug::inject($this, $data);
} }

View File

@@ -422,6 +422,8 @@ class Route
} }
$vars = self::parseVar($key); $vars = self::parseVar($key);
$item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns]; $item[] = ['rule' => $key, 'route' => $route, 'var' => $vars, 'option' => $options, 'pattern' => $patterns];
// 设置路由标识
self::$name[$route][] = [$key, $vars, self::$domain];
} }
self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern]; self::$rules['*'][$name] = ['rule' => $item, 'route' => '', 'var' => [], 'option' => $option, 'pattern' => $pattern];
} }
@@ -1170,6 +1172,9 @@ class Route
self::parseUrlParams(empty($path) ? '' : implode('/', $path)); self::parseUrlParams(empty($path) ? '' : implode('/', $path));
// 封装路由 // 封装路由
$route = [$module, $controller, $action]; $route = [$module, $controller, $action];
if (isset(self::$name[implode($depr, $route)])) {
throw new HttpException(404, 'invalid request:' . $url);
}
} }
return ['type' => 'module', 'module' => $route]; return ['type' => 'module', 'module' => $route];
} }

View File

@@ -12,6 +12,7 @@
namespace think; namespace think;
use think\Config; use think\Config;
use think\Loader;
use think\Request; use think\Request;
use think\Route; use think\Route;
@@ -157,7 +158,7 @@ class Url
$module = $module ? $module . '/' : ''; $module = $module ? $module . '/' : '';
} }
$controller = $request->controller(); $controller = Loader::parseName($request->controller());
if ('' == $url) { if ('' == $url) {
// 空字符串输出当前的 模块/控制器/操作 // 空字符串输出当前的 模块/控制器/操作
$url = $module . $controller . '/' . $request->action(); $url = $module . $controller . '/' . $request->action();

View File

@@ -546,7 +546,7 @@ class Validate
$result = is_numeric($value); $result = is_numeric($value);
break; break;
case 'integer': case 'integer':
// 是否为整 // 是否为整
$result = $this->filter($value, FILTER_VALIDATE_INT); $result = $this->filter($value, FILTER_VALIDATE_INT);
break; break;
case 'email': case 'email':

View File

@@ -403,7 +403,11 @@ class Query
$result = $pdo->fetchColumn(); $result = $pdo->fetchColumn();
if (isset($cache)) { if (isset($cache)) {
// 缓存数据 // 缓存数据
Cache::set($key, $result, $cache['expire']); if (isset($cache['tag'])) {
Cache::tag($cache['tag'])->set($key, $result, $cache['expire']);
} else {
Cache::set($key, $result, $cache['expire']);
}
} }
} else { } else {
// 清空查询条件 // 清空查询条件
@@ -468,7 +472,11 @@ class Query
} }
if (isset($cache) && isset($guid)) { if (isset($cache) && isset($guid)) {
// 缓存数据 // 缓存数据
Cache::set($guid, $result, $cache['expire']); if (isset($cache['tag'])) {
Cache::tag($cache['tag'])->set($guid, $result, $cache['expire']);
} else {
Cache::set($guid, $result, $cache['expire']);
}
} }
} else { } else {
// 清空查询条件 // 清空查询条件
@@ -999,7 +1007,8 @@ class Query
if (!$simple) { if (!$simple) {
$options = $this->getOptions(); $options = $this->getOptions();
$total = $this->count(); $total = $this->count();
$results = $this->options($options)->page($page, $listRows)->select(); $bind = $this->bind;
$results = $this->options($options)->bind($bind)->page($page, $listRows)->select();
} else { } else {
$results = $this->limit(($page - 1) * $listRows, $listRows + 1)->select(); $results = $this->limit(($page - 1) * $listRows, $listRows + 1)->select();
$total = null; $total = null;
@@ -1067,9 +1076,10 @@ class Query
* @access public * @access public
* @param mixed $key 缓存key * @param mixed $key 缓存key
* @param integer $expire 缓存有效期 * @param integer $expire 缓存有效期
* @param string $tag 缓存标签
* @return $this * @return $this
*/ */
public function cache($key = true, $expire = null) public function cache($key = true, $expire = null, $tag = null)
{ {
// 增加快捷调用方式 cache(10) 等同于 cache(true, 10) // 增加快捷调用方式 cache(10) 等同于 cache(true, 10)
if (is_numeric($key) && is_null($expire)) { if (is_numeric($key) && is_null($expire)) {
@@ -1077,7 +1087,7 @@ class Query
$key = true; $key = true;
} }
if (false !== $key) { if (false !== $key) {
$this->options['cache'] = ['key' => $key, 'expire' => $expire]; $this->options['cache'] = ['key' => $key, 'expire' => $expire, 'tag' => $tag];
} }
return $this; return $this;
} }
@@ -1363,7 +1373,7 @@ class Query
$tableName = $this->parseSqlTable($tableName); $tableName = $this->parseSqlTable($tableName);
} }
$guid = $tableName; list($guid) = explode(' ', $tableName);
if (!isset(self::$info[$guid])) { if (!isset(self::$info[$guid])) {
$info = $this->connection->getFields($tableName); $info = $this->connection->getFields($tableName);
$fields = array_keys($info); $fields = array_keys($info);
@@ -1881,7 +1891,11 @@ class Query
if (isset($cache)) { if (isset($cache)) {
// 缓存数据集 // 缓存数据集
Cache::set($key, $resultSet, $cache['expire']); if (isset($cache['tag'])) {
Cache::tag($cache['tag'])->set($key, $resultSet, $cache['expire']);
} else {
Cache::set($key, $resultSet, $cache['expire']);
}
} }
} }
@@ -1968,7 +1982,11 @@ class Query
if (isset($cache)) { if (isset($cache)) {
// 缓存数据 // 缓存数据
Cache::set($key, $result, $cache['expire']); if (isset($cache['tag'])) {
Cache::tag($cache['tag'])->set($key, $result, $cache['expire']);
} else {
Cache::set($key, $result, $cache['expire']);
}
} }
} }

View File

@@ -107,7 +107,7 @@ class Relation
$result = $this->belongsToManyQuery($relation, $this->middle, $foreignKey, $localKey, $condition)->select(); $result = $this->belongsToManyQuery($relation, $this->middle, $foreignKey, $localKey, $condition)->select();
foreach ($result as $set) { foreach ($result as $set) {
$pivot = []; $pivot = [];
foreach ($set->toArray() as $key => $val) { foreach ($set->getData() as $key => $val) {
if (strpos($key, '__')) { if (strpos($key, '__')) {
list($name, $attr) = explode('__', $key, 2); list($name, $attr) = explode('__', $key, 2);
if ('pivot' == $name) { if ('pivot' == $name) {
@@ -308,7 +308,7 @@ class Relation
protected function match($model, $relation, &$result) protected function match($model, $relation, &$result)
{ {
// 重新组装模型数据 // 重新组装模型数据
foreach ($result->toArray() as $key => $val) { foreach ($result->getData() as $key => $val) {
if (strpos($key, '__')) { if (strpos($key, '__')) {
list($name, $attr) = explode('__', $key, 2); list($name, $attr) = explode('__', $key, 2);
if ($name == $relation) { if ($name == $relation) {
@@ -369,7 +369,7 @@ class Relation
$data = []; $data = [];
foreach ($list as $set) { foreach ($list as $set) {
$pivot = []; $pivot = [];
foreach ($set->toArray() as $key => $val) { foreach ($set->getData() as $key => $val) {
if (strpos($key, '__')) { if (strpos($key, '__')) {
list($name, $attr) = explode('__', $key, 2); list($name, $attr) = explode('__', $key, 2);
if ('pivot' == $name) { if ('pivot' == $name) {

View File

@@ -13,6 +13,7 @@ namespace think\view\driver;
use think\App; use think\App;
use think\exception\TemplateNotFoundException; use think\exception\TemplateNotFoundException;
use think\Loader;
use think\Log; use think\Log;
use think\Request; use think\Request;
@@ -117,7 +118,7 @@ class Php
// 分析模板文件规则 // 分析模板文件规则
$request = Request::instance(); $request = Request::instance();
$controller = $request->controller(); $controller = Loader::parseName($request->controller());
if ($controller && 0 !== strpos($template, '/')) { if ($controller && 0 !== strpos($template, '/')) {
$depr = $this->config['view_depr']; $depr = $this->config['view_depr'];
$template = str_replace(['/', ':'], $depr, $template); $template = str_replace(['/', ':'], $depr, $template);

View File

@@ -13,6 +13,7 @@ namespace think\view\driver;
use think\App; use think\App;
use think\exception\TemplateNotFoundException; use think\exception\TemplateNotFoundException;
use think\Loader;
use think\Log; use think\Log;
use think\Request; use think\Request;
use think\Template; use think\Template;
@@ -114,7 +115,7 @@ class Think
// 分析模板文件规则 // 分析模板文件规则
$request = Request::instance(); $request = Request::instance();
$controller = $request->controller(); $controller = Loader::parseName($request->controller());
if ($controller && 0 !== strpos($template, '/')) { if ($controller && 0 !== strpos($template, '/')) {
$depr = $this->config['view_depr']; $depr = $this->config['view_depr'];
$template = str_replace(['/', ':'], $depr, $template); $template = str_replace(['/', ':'], $depr, $template);