phpstorm 2020.3.1 配置及数据库、编辑模式、插件、调试、终端调整
插件安装
- database 数据库插件
数据库密码不能保存,选择密码设置,进入设置,点击保存
- ideaVim vim模拟插件
- thinkphp5 plugin tp5 插件
- translation 翻译插件
- chinese 汉化界面
个人配置
-
字体
setting->editor->font 将size设置为16,fallbackfont设置为dialoginput(主要防止vim文件搜索中文乱码) -
命令行设置为git
setting->tools->terminal->shell path->D:\software\Git\bin\sh.exe --login -i -
代码风格
setting->editor->code style->php->wrapping and braces->chained method calls->wrap always
同上-》数组初始器->对齐键值对 -
代码模板
-
生成代码同时生成自带注释
设置->编辑器->实时模版->php->pubf->添加下边代码,选择编辑变量,date、time默认值分别对应date()、time() -
php 解析器 (php7.0 版本的新特idea显示语法错误)
设置->语言和框架->php->php语言级别->选择对应php版本 -
自动换行
/**
* 方法名
* @param int type 类型 1
* @auth xuefeiniao
* @date $date$ $time$
*/
public function $NAME$($PARAMETERS$){
$END$
}
- Xdebug配置(用于接口联调)
我使用phpstudy_pro 如下图设置,端口对应下边的编辑器的配置
配置解释器
选择本地解释程序
idea测试,下边的调试端口号对应phpstudy_pro的端口监听中的端口号
添加xdebug.remote_enable=1到php.ini后选择项目目录,并填上url网关,点击验证,全部通过表示可以使用了
打开监听,点击debug按钮即可调试了
- api配置
tp5 命令行生成api
建立命令行文件
代码如下:
<?php
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
class MakeHttp extends Command
{
protected function configure()
{
// 指令配置
$this->setName('makehttp')
// 设置参数
->addArgument('action', null, "set action")
->addOption('params', '', 1, 'params')
->setDescription('make http');
}
protected function execute(Input $input, Output $output)
{
define('DS', DIRECTORY_SEPARATOR);
$name = trim($input->getArgument('action'));
$name = $name ?: 'action';
$nameArr = explode('/', $name);
$model = $nameArr[0];
$controller = $nameArr[1];
$action = $nameArr[2];
$basePath = 'application' . DS;
$filePath = $basePath . $model . DS . 'controller' . DS . 'v1' . DS . ucfirst($controller) . '.php';
$filecontent = file($filePath);
// 获取截取位置
foreach ($filecontent as $lineNum => $content) {
$pos = strpos($content, 'function ' . $action);
if ($pos !== false) {
$endPos = $lineNum - 1;
$startPos = 0;
$n = 0;
for ($i = $endPos; $i != $startPos; $i--) {
$n++;
if (strpos($filecontent[$i], '/**') !== false) {
$startPos = $i - 1;
}
}
$startPos += 2;
break;
}
}
if (!$filecontent) {
$output->write('class not found');die;
} elseif ($pos === false) {
$output->write('action not found');die;
}
$fileLines = array_slice($filecontent, $startPos, $endPos - $startPos);
// 获取方法名
$actionName = strip_tags(explode('*', array_shift($fileLines))[1]);
// zb框架使用
if (table_exist('admin_api_list')) {
$hash = Db::name('admin_api_list')
->where('apiName',$controller.'/'.$action)
->value('hash');
if ($hash) {
$actionName = trim($actionName,PHP_EOL).' '.$name.PHP_EOL;
$name = 'api'.'/'.'v1'.'/'.$hash;
}
}
// 返回数据 (暂时没有用上)
$return = array_pop($fileLines);
$params = '';
// 处理参数
$rule = '';
foreach ($fileLines as $key => $item) {
if (strpos($item, '@param') !== false) {
$paramArr = explode(' ', trim($item));
if ($paramArr[2] == 'int') $type = '1'; else $type = '""';
// 组装验证规则字段
$rule .= "'" . $paramArr[3] . "'" . ',';
$oneLine = '"' . $paramArr[3] . '":' . $type;
$nextKey = $key + 1;
if (isset($fileLines[$nextKey]) && strpos($fileLines[$nextKey], '@param') !== false) $oneLine .= ',' . PHP_EOL; else $oneLine .= PHP_EOL;
$params .= $oneLine;
}
if (strpos($item, '@ApiMethod') !== false) {
$method = trim(trim(explode('(', $item)[1]), ')');
}
if (strpos($item, '@ApiHeaders') !== false) {
$hearderArr = explode(' ', trim($item));
$hearderName = trim(trim($hearderArr[2], '('), ')');
parse_str(str_replace(',', '&', $hearderName), $headerArr);
}
}
if ($input->hasOption('city')) {
$city = PHP_EOL . 'From' . $input->getOption('city');
} else {
$city = '';
}
$tokenName = $headerArr['name'];
!$method && $method = 'POST';
!$tokenName && $tokenName = 'user-token';
$apiContent =
"###$actionName\n" .
$method . " {{host}}/" . $name . "\n" .
$tokenName . ":{{" . $tokenName . "}}\n" .
"Content-Type: application/json\n\n" .
'{' . PHP_EOL . $params . '}' . PHP_EOL . PHP_EOL .
"###" . PHP_EOL;
// 目标文件(接口集的路径)
$target_file_path = 'public/http/api.http';
if (stripos(file_get_contents($target_file_path), $apiContent) !== false) {
$result = 'api exist';
} else {
$res = file_put_contents($target_file_path, $apiContent, FILE_APPEND);
// 指令输出
if ($res) $result = 'create successed'; else $result = 'create fail';
}
// 检测是否创建验证器文件,没有则创建,有责添加字段及验证场景(该方法有参数才进行创建验证类)
$rule && self::makeValidate($filePath, $action, $rule);
$output->writeln($result);
}
/**
* 生成验证器文件
* @param string filepath 文件路径
* @param string action 方法
* @param string rule 验证规则
* @author xuefeiniao
* @date 2020/11/23
*/
public function makeValidate($filePath, $action, $rule)
{
$path = str_replace('controller', 'validate', str_replace('application', 'app', $filePath));
$valiPath = str_replace(DS.'v1','',explode('.', $path)[0]);
if (!class_exists($valiPath)) {
// 验证类不存在创建
system('php think make:validate ' . $valiPath);
}
$validate = new $valiPath;
// 写入字段
$ruleArr = explode(',', str_replace("'", "", trim($rule, ',')));
$filecontent = file(str_replace('controller', 'validate', $filePath));
foreach ($ruleArr as $key => $item) {
if (!$validate->hasRule($item)) {
$rules = 'require';
$ruleParam = "\t\t'" . $item . "'\t\t => '" . $rules . "'," . PHP_EOL;
foreach ($filecontent as $key => $item) {
if (stripos($item, 'protected $rule = [') !== false) {
array_splice($filecontent, $key + 1, 0, $ruleParam);
}
}
}
}
// 写入验证场景
if (!$validate->hasScene($action)) {
$scene = "\t\t'" . $action . "'\t\t => [" . trim($rule, ',') . '],' . PHP_EOL;
foreach ($filecontent as $key => $item) {
if (stripos($item, 'protected $scene = [') !== false) {
array_splice($filecontent, $key + 1, 0, $scene);
}
}
}
return file_put_contents(str_replace('controller', 'validate', $filePath), $filecontent);
}
}
公共方法中
if (!function_exists('table_exist')) {
/**
* 检查附加表是否存在
* @param string $table_name 附加表名
* @return string
* @author xuefeiniao
*/
function table_exist($table_name = '')
{
$table_name = config('database.prefix') . $table_name;
return true == Db::query("SHOW TABLES LIKE '{$table_name}'");
}
}
创建如下文件夹,及两个文件
代码如下:
api.http文件内容
### 用户密码登录 user/user_name_login
POST {{host}}/api/v1/5c78dbfd977cf
Content-Type: application/json
{
"mobile": "183368156**",
"password": "yang***"
}
> {% client.global.set("user-token", response.body.data.userinfo.user_token); %}
###
### 获取会员详细信息 user/get_user_info
POST {{host}}/api/v1/5c78c4772da97
user-token:{{user-token}}
Content-Type: application/json
{
}
###
http-client.env.json文件内容
{
"dev": {
"host": "http://127.0.0.1:8001/",
"user": "18336815605",
"password": "yang111",
"user-token": ""
},
"test_service": {
"host": "http://aacom/"
},
"office_service": {
"host": "https://app.office**.com.au"
}
}
具体使用:alt+F12,打开git bash输入命令,生成api
如:php think makehttp api/itemOrder/get_order_detail
-.ideavimrc配置
set nu
set relativenumber
" 配置立即生效
autocmd! bufwritepost _vimrc source %
" set cursorline " 突出显示当前行
syntax on " 自动语法高亮
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set smartindent
set tabstop=4
set expandtab
set scrolloff=5 " 设置光标离顶部和底部5行开始滚动
set softtabstop=4
" disable VI's compatible mode..
set nocompatible
" 设置leader映射
let mapleader=','
" i表示insert,nore非递归的,map映射
inoremap <leader>w <Esc>:w<cr>
nnoremap <leader>w :w<cr>
"set pythonthreedll=~/AppData/Local/Programs/Python/Python38/Lib
" set pythonthreedll=/c/Program\ Files/Python37/Lib
set fencs=utf-8,gbk,utf-16,utf-32,ucs-bom
" insert模式回到normal模式
"inoremap jj <Esc>'^
inoremap jj <Esc>
" 左下上右分屏间切换
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
"noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l
set pythonthreedll=python37.dll
filetype indent on " 针对不同的文件类型采用不同的缩进格式
filetype plugin on " 针对不同的文件类型加载对应的插件
filetype plugin indent on " 启用自动补全
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,gbk,default,latin1
" use chinese help
set helplang=cn
" https://blog.csdn.net/qq343240789/article/details/50819752参考地址
" 查看php手册(需要先下载手册,光标停留在函数上面,按K即可显示手册内容)
set runtimepath+=~/.vim/vim-php-manual,~/.vim/bundle/ultisnips,~/.vim/bundle/vim-snippets,~/.vim/bundle/my-snips
autocmd BufNewFile,Bufread *.module,*.inc,*.php set keywordprg="help"
set paste
" 设置复制vim文本同时到系统剪切板
set clipboard+=unnamed
set nocompatible " be iMproved, required
" filetype off " required
filetype on " required
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
- 关闭idea自动更新,取消勾选
settings–>apearance & Behavior --> System Setings --> Updates --> automaticaly check updates for stable Releases…
常用快捷键
-
其他
-
Ctr+E 打开最近编辑的文件
-
Alt+Shift+C 查看最近修改记录
-
Ctr+b/单机 快速跳转方法/函数
-
Ctr+Alt+l 代码格式化
-
Ctr+Alt+o 新窗口打开项目所在目录的父级文件
-
Ctr+z/u 撤销
-
Ctr + Tab 编辑窗口切换
-
Alt + Enter 根据光标所在位置问题,提供快速修复选择
-
Ctr+Shift+Z 取消撤销
-
Ctr+w 扩大选中范围
-
文件操作
-
关闭
-
Ctr + Tab + Delete 关闭切换到的窗口
-
Ctr + F4 关闭当前文件
-
Shift + 左键单击 可以关闭当前打开文件
-
导航栏
-
Alt+1 打开项目目录
-
Alt+2 打开收藏夹 (添加常查的笔记,账号记录)
-
Alt+3 打开database
-
Alt+7 打开类中所有方法列表
-
Alt+8 打开/关闭服务窗口
-
翻译插件
-
Ctr+Shift+o 打开翻译窗口
-
便签
-
Ctr+Shift+1,2,3 快速添加指定数值的便签
-
F11 添加便签
-
注释
-
/**+Enter 自动生成注释
-
Ctr+/ 单行注释
-
Ctr+Shift+/ 多行注释
-
折叠
-
Ctr+Shift+ + 展开所有代码
-
Ctr+Shift+ - 折叠所有代码
-
Ctr+ + 单个展开
-
Ctr+ - 单个折叠
-
Ctr+ . 自定义折叠
-
搜索
-
Shift+Shift 查找类、方法、数据表、文件名等
-
Ctr+N 类名查找
-
Ctr+Shift+Alt+N 函数名查找
-
Shift+F6 重命名函数方法名、变量名、文件名、函数名、标签名可以搜索引用的文件
-
Ctr+F 查找
-
Ctr+R 替换
-
Ctr+Shift+N 通过文件名定位,打开文件夹需要在后边添加正斜杠
-
Ctr+Shift+F 根据输入的内容查找整个项目或指定的目录内文件
-
Ctr+Shift+R 根据输入的内容替换整个项目或指定的目录内的文件
-
移动光标
-
Alt+上/下箭头 方法建快速跳转
-
Ctr+Shift+A 寻找IDE内所有的动作(网上说很重要,但是我暂时并为用到)
-
Ctr+[ 移动到花括号的开始位置
-
Ctr+] 移动到花括号的结束位置
-
Ctr+F3 跳转光标选中词的下一引用位置,shift+F3 光标选中词的上一位
-
Ctr + F12 弹出当前文件的结构层,进行筛选跳转
-
Ctr+Alt+左方向 退回上一操作的地方
-
Ctr+Alt+右方向 前进到上一操作的地方
-
command+shift+` 切换到前一个窗口
-
command+` 切换到后一个项目窗口
-
ctr+e 向后滚动一行
-
ctr+d 向后滚动半页
-
ctr+y 向前滚动一行
-
ctr+u 向前滚动半页
-
移动代码
-
Ctr+Shift+上箭头 将当前方法移动到上一方法前边
-
Ctr+shift+下箭头 将当前方法移动到下一方法后边
-
Alt+Shift + 上箭头 上下移动当前行
-
Ctr+Shift+J 自动将下一行合并到当前行末尾
-
Ctr+[ 返回上一编辑位置
-
- Ctr+] 返回下一编辑位置
-
debug
-
Ctr + F8 debug中为当前行添加/取消 断点
-
Shift + F7 智能步入
-
Alt + F8 带测试
-
Shift + F9 等效点击工具栏的debug 按钮
-
Ctr+Shift+F8 指定断点进入的条件
-
Alt+Shift+F7 下一步进入当前方法体内
-
Alt + shift+F9 弹出Debug 可选菜单
-
shift + ctrl + x 开/关浏览器debug 插件
-
查看错误
-
Shift + F2 跳转上一错误位置
-
F2 跳到下一错误或警告位置
-
Ctr+F1 显示光标所在位置的错误信息
-
api 测试
-
Shift + F10 等效点击工具栏有Run按钮
-
Ctr+F5 刷新当前api
非 常用快捷键(记录备查)
- Ctr+j 查看常用代码段
- Ctr+Shift+U 单词大小写
- Ctr + F11 设置书签
- Ctr + ,/space 基本代码补全
- Atr + F2 打开内置浏览器列表
- Atr + F1 显示当前文件可选目标
- Atr + F3 逐个往下查找相同文本,并高亮显示
- Ctr+Alt+T 对选中的代码弹出环绕弹出层环绕选项
- Ctr+Shift+F12 编辑器最大化
上文快捷键多数参考该链接
更好的快捷键链接
实时模板
注意:不生效,点击下方定义,选择模板使用的文件类
事务
Db::startTrans();
try {
Db::commit();
} catch (\Exception $e) {
$this->error = $e->getMessage();
Db::rollback();
return false;
}
当前时间 dt
$DATE$ $TIME$
创建带有注释的方法,将php模板中的pubf模板修改
/**
* 名称
* @param string bar_code 条码号 1
* @return mixed
* @author xuefeiniao
* @date dt
*/
api返回 zrt
return ApiReturn::r(1,[],'');