public function testFill() { $model = new Model('', $this->getConfig()); $data = ['username' => '', 'nickname' => 'nickname', 'phone' => ' 123456', 'hobby' => ['1', '2'], 'cityid' => '1', 'a' => 'a', 'b' => 'b']; $auto = ['user' => ['__option__' => ['value_fill' => 'username,password,phone', 'exists_fill' => 'nickname'], 'username' => ['strtolower', 'callback'], 'password' => ['md5', 'callback'], 'nickname' => [[&$this, 'fillName'], 'callback', 'cn_'], 'phone' => function ($value, $data) { return trim($value); }, 'hobby' => ['', 'serialize'], 'cityid' => ['1', 'ignore'], 'address' => ['address'], 'integral' => 0, ['reg_time', 'time', 'callback'], ['login_time', function ($value, $data) { return $data['reg_time']; }], 'ab' => ['a,b', 'serialize']]]; \think\Config::set('auto', $auto); $result = $model->auto('user')->create($data); $data['nickname'] = 'cn_nickname'; $data['phone'] = '123456'; $data['hobby'] = serialize($data['hobby']); $data['address'] = 'address'; $data['integral'] = 0; $data['reg_time'] = time(); $data['login_time'] = $data['reg_time']; $data['ab'] = serialize(['a' => 'a', 'b' => 'b']); unset($data['cityid'], $data['a'], $data['b']); $this->assertEquals($data, $result); // 测试带.和*的键名 $data = ['name' => ['a' => 'a', 'b' => 'b'], 'goods' => [0 => [0 => ['item' => 'item', 'price' => ''], 1 => ['item' => 'item2', 'price' => '']]]]; $test = ['name.*' => 'name', 'goods.*.*.price' => 100]; $result = $model->auto($test)->create($data); $data['name']['a'] = $data['name']['b'] = 'name'; $data['goods'][0][0]['price'] = 100; $data['goods'][0][1]['price'] = 100; $this->assertEquals($data, $result); }
function C($name = '', $value = null, $range = '') { if (is_null($value) && is_string($name)) { return \think\Config::get($name, $range); } else { return \think\Config::set($name, $value, $range); } }
protected function set_theme($name) { $tmp = Config::get('template'); if ($name) { $tmp['view_path'] = realpath(APP_PATH . '../public/themes/' . $name) . DS; } else { $tmp['view_path'] = ""; } Config::set('template', $tmp); }
public function testConfig() { App::run(Config::get()); Config::parse('isTrue=1', 'test'); Config::range('test'); $this->assertTrue(Config::has('isTrue')); $this->assertEquals(1, Config::get('isTrue')); Config::set('isTrue', false); $this->assertEquals(0, Config::get('isTrue')); Config::reset(); }
public function testConfig() { App::run(); $this->assertTrue(Config::has('url_route_on')); $this->assertEquals(1, Config::get('url_route_on')); Config::set('url_route_on', false); $this->assertEquals(0, Config::get('url_route_on')); Config::range('test'); $this->assertFalse(Config::has('url_route_on')); Config::reset(); }
/** * 架构函数 * 遍历合并Config * * @return void */ public function __construct() { if (!empty($this->options)) { foreach ($this->options as $name => $val) { // 参数已设置 则覆盖行为参数 if (Config::get($name) !== null) { $this->options[$name] = C($name); } else { Config::set($name, $val); } } array_change_key_case($this->options); } }
public function testDetect() { Config::set('lang_list', ['zh-cn', 'zh-tw']); Lang::set('hello', '欢迎', 'zh-cn'); Lang::set('hello', '歡迎', 'zh-tw'); Config::set('lang_detect_var', 'lang'); Config::set('lang_cookie_var', 'think_cookie'); $_GET['lang'] = 'zh-tw'; Lang::detect(); $this->assertEquals('歡迎', Lang::get('hello')); $_GET['lang'] = 'zh-cn'; Lang::detect(); $this->assertEquals('欢迎', Lang::get('hello')); }
public function testRun() { Config::set('root_namespace', ['/path/']); App::run(); $expectOutputString = '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p><span style="font-size:22px;">[ V5.0 版本由 <a href="http://www.qiniu.com" target="qiniu">七牛云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>'; $this->expectOutputString($expectOutputString); $rc = new ReflectionClass('\\think\\Loader'); $ns = $rc->getProperty('namespace'); $ns->setAccessible(true); $this->assertEquals(true, in_array('/path/', $ns->getValue())); $this->assertEquals(true, function_exists('L')); $this->assertEquals(true, function_exists('C')); $this->assertEquals(true, function_exists('I')); $this->assertEquals(Config::get('default_timezone'), date_default_timezone_get()); }
public function testRun() { Config::set('root_namespace', ['/path/']); App::run(); $expectOutputString = '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px }</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP5</b>!</p></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>'; $this->expectOutputString($expectOutputString); $rc = new ReflectionClass('\\think\\Loader'); $ns = $rc->getProperty('namespace'); $ns->setAccessible(true); $this->assertEquals(true, in_array('/path/', $ns->getValue())); $this->assertEquals(true, function_exists('L')); $this->assertEquals(true, function_exists('C')); $this->assertEquals(true, function_exists('I')); $this->assertEquals(Config::get('default_timezone'), date_default_timezone_get()); }
/** * 加载系统扩展配置 */ public static function load() { $config = \think\Cache::get('db_config_cache_data'); if (!$config) { // 在这里先判断一下数据库是否已经正确安装 $Db = \think\Loader::db(); $Query = $Db->query("SHOW TABLES LIKE '" . \think\Config::get('database.prefix') . "config'"); if (empty($Query)) { self::install(); } $data = \think\Db::name('Config')->where('status', 1)->field('type,name,value')->select(); $config = []; if ($data && is_array($data)) { foreach ($data as $value) { $config[$value['name']] = self::parse($value['type'], $value['value']); } } \think\Cache::set('db_config_cache_data', $config); } \think\Config::set($config); }
/** * 重写C方法,改为引用Config方法 * * @param string $name */ function C($name = null, $value = null) { // 无参数时获取所有 if (empty($name)) { return Config::getAll(); } // 字符串,为空则获取 if (is_string($name) && is_null($value)) { return Config::get($name); } // 字符串,不为空则单个设置 if (is_string($name) && !is_null($value)) { return Config::set($name, $value); } // 数组设置 if (is_array($name)) { return Config::setAll($name); } // 避免非法参数 Debug::throw_exception('C funtion error!'); }
public function testFill() { $data = ['username' => '', 'nickname' => 'nickname', 'phone' => ' 123456', 'hobby' => ['1', '2'], 'cityid' => '1', 'a' => 'a', 'b' => 'b']; $auto = ['user' => ['__option__' => ['value_fill' => ['username', 'password', 'phone'], 'exists_fill' => 'nickname'], 'username' => ['strtolower', 'callback'], 'password' => ['md5', 'callback'], 'nickname' => [[&$this, 'fillName'], 'callback', 'cn_'], 'phone' => function ($value, $data) { echo $value; return trim($value); }, 'ab' => ['a,b', 'serialize'], 'cityid' => ['1', 'ignore'], 'address' => ['address'], 'integral' => 0, ['reg_time', 'time', 'callback'], ['login_time', function ($value, $data) { return $data['reg_time']; }]]]; Config::set('auto', $auto); $result = Validate::fill($data, 'user'); $data['nickname'] = 'cn_nickname'; $data['phone'] = '123456'; $data['ab'] = serialize(['a' => 'a', 'b' => 'b']); $data['address'] = 'address'; $data['integral'] = 0; $data['reg_time'] = time(); $data['login_time'] = $data['reg_time']; unset($data['cityid'], $data['a'], $data['b']); $this->assertEquals($data, $result); }
public function testVar() { Config::set('app_multi_module', true); $request = new Request(); $request->route(['name' => 'thinkphp', 'id' => 6]); $request->get(['id' => 10]); $request->post(['id' => 8]); $request->put(['id' => 7]); $request->request(['test' => 'value']); $this->assertEquals(['name' => 'thinkphp', 'id' => 6], $request->route()); //$this->assertEquals(['id' => 10], $request->get()); $this->assertEquals('thinkphp', $request->route('name')); $this->assertEquals('default', $request->route('test', 'default')); $this->assertEquals(10, $request->get('id')); $this->assertEquals(0, $request->get('ids', 0)); $this->assertEquals(8, $request->post('id')); $this->assertEquals(7, $request->put('id')); $this->assertEquals('value', $request->request('test')); $this->assertEquals('thinkphp', $request->param('name')); $this->assertEquals(6, $request->param('id')); $this->assertFalse($request->has('user_id')); $this->assertTrue($request->has('test', 'request')); $this->assertEquals(['id' => 6], $request->only('id')); $this->assertEquals(['name' => 'thinkphp', 'lang' => 'zh-cn'], $request->except('id')); $this->assertEquals('THINKPHP', $request->param('name', '', 'strtoupper')); }
public function testBuildAnchor() { Route::get('blog/:id', 'index/blog'); Config::set('url_html_suffix', 'shtml'); $this->assertEquals('/blog/10.shtml#detail', Url::build('/blog/10#detail')); }
defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀 defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀 // 环境常量 define('IS_CLI', PHP_SAPI == 'cli' ? true : false); define('IS_WIN', strpos(PHP_OS, 'WIN') !== false); // 载入Loader类 require CORE_PATH . 'Loader.php'; // 加载环境变量配置文件 if (is_file(ROOT_PATH . '.env')) { $env = parse_ini_file(ROOT_PATH . '.env', true); foreach ($env as $key => $val) { $name = ENV_PREFIX . strtoupper($key); if (is_array($val)) { foreach ($val as $k => $v) { $item = $name . '_' . strtoupper($k); putenv("{$item}={$v}"); } } else { putenv("{$name}={$val}"); } } } // 注册自动加载 \think\Loader::register(); // 注册错误和异常处理机制 \think\Error::register(); // 加载惯例配置文件 \think\Config::set(include THINK_PATH . 'convention' . EXT);
protected function setUp() { Config::set('app_multi_module', true); }
public function testSave() { $config = $this->getConfig(); $order_model = new Model('order', $config); $data = ['id' => '1', 'total' => '180.50', 'status' => 1, 'create_time' => time(), 'about' => '']; \think\Config::set('db_fields_strict', false); $info = $order_model->where(['id' => 1])->map('amount', 'total')->find(); $flag = $user_id = $order_model->map(['total' => 'amount'])->filter('trim')->save($data); $this->assertSame(1, $flag); \think\Config::set('db_fields_strict', true); $data = ['status' => 1]; $flag = $order_model->where(['id' => 2])->setField($data); $this->assertSame(1, $flag); $flag = $order_model->where(['amount' => ['lt', 200]])->setField('freight_fee', 15); $this->assertSame(1, $flag); $map = ['amount' => ['gt', 300], 'freight_fee' => ['gt', 0]]; $flag = $order_model->where($map)->setDec('freight_fee', 5, 30); $this->assertTrue($flag); $flag = $order_model->where($map)->setInc('freight_fee', 5, 30); $this->assertTrue($flag); $flag = $order_model->where($map)->setDec('freight_fee', 5); $this->assertSame(1, $flag); $flag = $order_model->where($map)->setInc('freight_fee', 5); $this->assertSame(1, $flag); $ru_model = new Model('role_user', $config); $data = ['user_id' => 1, 'role_id' => 1, 'remark' => 'remark']; $info = $ru_model->where(['user_id' => 1])->find(); $flag = $ru_model->data($data)->save(); $this->assertSame(1, $flag); }
/** * 获取和设置配置参数 * @param string|array $name 参数名 * @param mixed $value 参数值 * @param string $range 作用域 * @return mixed */ function config($name = '', $value = null, $range = '') { if (is_null($value) && is_string($name)) { return 0 === strpos($name, '?') ? Config::has(substr($name, 1), $range) : Config::get($name, $range); } else { return Config::set($name, $value, $range); } }
public function testSet() { $range = '_test_'; $reflectedClass = new ReflectionClass('\\think\\Config'); $reflectedPropertyConfig = $reflectedClass->getProperty('config'); $reflectedPropertyConfig->setAccessible(true); $reflectedPropertyConfig->setValue([]); // if (is_string($name)): // without dot syntax $name = 'name'; $value = 'value'; Config::set($name, $value, $range); $config = $reflectedPropertyConfig->getValue(); $this->assertEquals($value, $config[$range][$name]); // with dot syntax $name = 'one.two'; $value = 'dot value'; Config::set($name, $value, $range); $config = $reflectedPropertyConfig->getValue(); $this->assertEquals($value, $config[$range]['one']['two']); // if (is_array($name)): // see testLoad() // ... // test getting all configurations...? // return self::$config[$range]; ?? $value = ['all' => 'configuration']; $reflectedPropertyConfig->setValue([$range => $value]); $this->assertEquals($value, Config::set(null, null, $range)); $this->assertNotEquals(null, Config::set(null, null, $range)); }
/** * 应用程序初始化 * @access public * @return void */ public static function init() { // 设置系统时区 date_default_timezone_set(Config::get('DEFAULT_TIMEZONE')); // 定义当前请求的系统常量 define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']); define('IS_GET', REQUEST_METHOD == 'GET' ? true : false); define('IS_POST', REQUEST_METHOD == 'POST' ? true : false); define('IS_PUT', REQUEST_METHOD == 'PUT' ? true : false); define('IS_DELETE', REQUEST_METHOD == 'DELETE' ? true : false); define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' || !empty($_POST[Config::get('VAR_AJAX_SUBMIT')]) || !empty($_GET[Config::get('VAR_AJAX_SUBMIT')]) ? true : false); // URL调度结束标签 Tag::listen('url_dispatch'); // TODO: 删除页面压缩功能,改为使用Smarty进行页面压缩管理 // 页面压缩输出支持 // if(Config::get('OUTPUT_ENCODE')) { // $zlib = ini_get('zlib.output_compression'); // if(empty($zlib)) { // ob_start('ob_gzhandler'); // } // } // 系统变量安全过滤 if (Config::get('VAR_FILTERS')) { $filters = explode(',', Config::get('VAR_FILTERS')); foreach ($filters as $filter) { // 全局参数过滤 array_walk_recursive($_POST, $filter); array_walk_recursive($_GET, $filter); } } // 配置主题目录 define('THEME_PATH', GROUP_PATH . 'Tpl/'); // 缓存路径 Config::set('CACHE_PATH', CACHE_PATH . GROUP_NAME . '/'); // 动态配置 TMPL_EXCEPTION_FILE,改为绝对地址 Config::set('TMPL_EXCEPTION_FILE', realpath(Config::get('TMPL_EXCEPTION_FILE'))); }
/** * 初始化模块 * @access private * @return void */ private static function initModule($path, &$config) { // 加载初始化文件 if (is_file($path . 'init' . EXT)) { include $path . 'init' . EXT; } else { // 检测配置文件 if (is_file($path . 'config' . EXT)) { $config = Config::set(include $path . 'config' . EXT); } // 检测额外配置 if ($config['extra_config_list']) { foreach ($config['extra_config_list'] as $conf) { if (is_file($path . $conf . EXT)) { $config = Config::set(include $path . $conf . EXT); } } } // 加载应用状态配置文件 if ($config['app_status'] && is_file($path . $config['app_status'] . EXT)) { $config = Config::set(include $path . $config['app_status'] . EXT); } // 加载别名文件 if (is_file($path . 'alias' . EXT)) { Loader::addMap(include $path . 'alias' . EXT); } // 加载公共文件 if (is_file($path . 'common' . EXT)) { include $path . 'common' . EXT; } // 加载行为扩展文件 if (is_file($path . 'tags' . EXT)) { Hook::import(include $path . 'tags' . EXT); } } }
/** * @covers think\Response::error * @todo Implement testError(). */ public function testError() { // round 1 $msg = 1001; $data = "data"; Config::set('default_return_type', "json"); $result = Response::error($msg, $data); $this->assertEquals($msg, $result["code"]); $this->assertEquals($data, $result["data"]); $this->assertEquals('javascript:history.back(-1);', $result["url"]); $this->assertEquals("json", Response::type()); $this->assertEquals(3, $result["wait"]); // round 2 $msg = "the msg"; $url = "www.thinkphptesterror.com"; $result = Response::error($msg, $data, $url); $this->assertEquals($msg, $result["msg"]); $this->assertEquals($url, $result["url"]); // round 3 异常在travis-ci中未能重现 // $this->setExpectedException('\think\Exception'); // FIXME 静态方法mock // $oMockView = $this->getMockBuilder('\think\View')->setMethods(array( // 'fetch' // ))->getMock(); // $oMockView->expects($this->any())->method('fetch')->will($this->returnValue('content')); // Config::set('default_return_type', "html"); // $result = Response::error($msg, $data, $url); // FIXME 静态方法mock // $this->assertEquals('content', $result); }
public function testRoot() { Config::set('url_domain_deploy', false); Config::set('url_common_param', false); Url::root('/index.php'); Route::get('blog/:id', 'index/blog/read'); Config::set('url_html_suffix', 'shtml'); $this->assertEquals('/index.php/blog/10/name/thinkphp.shtml', Url::build('index/blog/read?id=10&name=thinkphp')); }
/** * Tears down the fixture, for example, closes a network connection. * This method is called after a test is executed. */ protected function tearDown() { Config::set('default_ajax_return', $this->default_ajax_return); Config::set('default_return_type', $this->default_return_type); }
/** * 默认跳转操作 支持错误导向和正确跳转 * 调用模板显示 默认为public目录下面的success页面 * 提示页面为可配置 支持模板标签 * @access private * @param string $message 提示信息 * @param Boolean $status 状态 * @param string $jumpUrl 页面跳转地址 * @param mixed $ajax 是否为Ajax方式 当数字时指定跳转时间 * @return void */ private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false) { if (true === $ajax || IS_AJAX) { // AJAX提交 $data = is_array($ajax) ? $ajax : []; $data['info'] = $message; $data['status'] = $status; $data['url'] = $jumpUrl; $this->ajaxReturn($data); } // 模板变量 $data = []; if (is_int($ajax)) { $data['waitSecond'] = $ajax; } if (!empty($jumpUrl)) { $data['jumpUrl'] = $jumpUrl; } // 提示标题 $data['msgTitle'] = $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_'); $data['status'] = $status; // 状态 //保证输出不受静态缓存影响 Config::set('html_cache_on', false); if ($status) { //发送成功信息 $data['message'] = $message; // 提示信息 // 成功操作后默认停留1秒 $data['waitSecond'] = '1'; // 默认操作成功自动返回操作前页面 if (!$jumpUrl) { $data["jumpUrl"] = $_SERVER["HTTP_REFERER"]; } return $this->display(Config::get('success_tmpl'), $data); } else { $data['error'] = $message; // 提示信息 //发生错误时候默认停留3秒 $data['waitSecond'] = '3'; // 默认发生错误的话自动返回上页 if (!$jumpUrl) { $data['jumpUrl'] = 'javascript:history.back(-1);'; } return $this->display(Config::get('error_tmpl'), $data); } }