composer 安装
composer create-project topthink/think tp
多应用
composer require topthink/think-multi-app
隐藏index.php的.htaccess,文档缺少一个问号
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
view.php的一些配置
在
/**
* 模板配置参数
* @var array
*/
protected $config = [
'view_path' => '', // 模板路径
'view_suffix' => 'html', // 默认模板文件后缀
'view_depr' => DIRECTORY_SEPARATOR,
'cache_path' => '',
'cache_suffix' => 'php', // 默认模板缓存后缀
'tpl_deny_func_list' => 'echo,exit', // 模板引擎禁用函数
'tpl_deny_php' => false, // 默认模板引擎是否禁用PHP原生代码
'tpl_begin' => '{', // 模板引擎普通标签开始标记
'tpl_end' => '}', // 模板引擎普通标签结束标记
'strip_space' => false, // 是否去除模板文件里面的html空格与换行
'tpl_cache' => true, // 是否开启模板编译缓存,设为false则每次都会重新编译
'compile_type' => 'file', // 模板编译类型
'cache_prefix' => '', // 模板缓存前缀标识,可以动态改变
'cache_time' => 0, // 模板缓存有效期 0 为永久,(以数字为值,单位:秒)
'layout_on' => false, // 布局模板开关
'layout_name' => 'layout', // 布局模板入口文件
'layout_item' => '{__CONTENT__}', // 布局模板的内容替换标识
'taglib_begin' => '{', // 标签库标签开始标记
'taglib_end' => '}', // 标签库标签结束标记
'taglib_load' => true, // 是否使用内置标签库之外的其它标签库,默认自动检测
'taglib_build_in' => 'cx', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序
'taglib_pre_load' => '', // 需要额外加载的标签库(须指定标签库名称),多个以逗号分隔
'display_cache' => false, // 模板渲染缓存
'cache_id' => '', // 模板缓存ID
'tpl_replace_string' => [], //模板字符串替换
'tpl_var_identify' => 'array', // .语法变量识别,array|object|'', 为空时自动识别
'default_filter' => 'htmlentities', // 默认过滤方法 用于普通标签输出
];
中间件
https://www.kancloud.cn/manual/thinkphp6_0/1037493
验证器
try {
validate(Staff::class)->extend('check')->check($data);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return json(['code' => 1, 'msg' => $e -> getError()]);
}
门面,phpstrom提示和无法跳转到对应的方法,加上注释
/**
* Class Ajax
* @see \app\common\Ajax
* @package app\facade
* @mixin \app\common\Ajax
*/
url助手函数,无法返回字符串,
url(’/’)->__toString()或者url(’/’)->build()都可以生成url字符串
获取当前的操作名,request方法
$this->request->action()
json方法->getContent()获取内容
重定向不跳转,使用send
redirect(url('/'))->send();
使用Spreadsheet导出excel时候在 $writer->save(‘php://output’)后面加上exit();否则导出会需要修复
模型save();
/**
* 使用表达式设置数据
* @access public
* @param string $value 表达式
* @return Raw
*/
public function raw(string $value): Raw
{
return new Raw($value);
}
'score' => Db::raw('score+1');
异常处理返回
return Response::create(View::fetch('public/error'));
富文本显示
{$str|raw}
批量新增获取id
$model->saveAll($data)->column('id');
workman记录
照着手册即可
开启wss,使用的为Apache反向代理,先配置https, 再加入下面代码, 如果是线上127.0.0.1改为IP地址,ProxyPass 和ProxyPassReverse 为设定的反向代理的对应url,可修改
SSLProxyEngine on
ProxyRequests Off
ProxyPass /wss ws://127.0.0.1:2346
ProxyPassReverse /wss ws://127.0.0.1:2346
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLHonorCipherOrder on
js访问,要加上域名
//开启wss
let wss = new WebSocket('wss://域名/wss');
wss.onopen = function() {
};
wss.onmessage = function(e) {
};
workerman中的访问为
protected $socket = 'websocket://0.0.0.0:2346';
关于中间件,控制器引入中间件会加载request,但是在middleware.php中引入的中间件会在request加载之前;会导致做鉴权auth的时候获取不到相应的控制器和方法
将redis设置为session,手册都有,基本配置
// redis缓存
'redis' => [
// 驱动方式
'type' => 'redis',
// 服务器地址
'host' => '127.0.0.1',
'port' => '6379',
'password' => '123456',
'select' => '0',
// 全局缓存有效期(0为永久有效)
'expire' => 0,
// 缓存前缀
'prefix' => '',
'timeout' => 0,
],
多个域名绑定可以直接写上域名的完整信息
跨域,引入AllowCrossDomain中间件
AllowCrossDomain::class
配置文件的顺序会导致一些问题,当在自己的配置文件使用url方法时候,如果在route.php前面会导致route配置无效而使用默认配置
事件event有返回值时,会默认返回数组
引入模板文件需要后缀和地址
View::fetch('../view/public/page/edit.html')