phpstrom 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()
/**
* 方法名
* @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);
}
}
创建如下文件夹,及两个文件 代码如下: 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
- 关闭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+ - 单个折叠 -
搜索 -
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+右方向 前进到上一操作的地方 -
移动代码 -
Ctr+Shift+上箭头 将当前方法移动到上一方法前边 -
Ctr+shift+下箭头 将当前方法移动到下一方法后边 -
Alt+Shift + 上箭头 上下移动当前行 -
Ctr+Shift+J 自动将下一行合并到当前行末尾 -
debug -
Ctr + F8 debug中为当前行添加/取消 断点 -
Shift + F7 智能步入 -
Alt + F8 带测试 -
Shift + F9 等效点击工具栏的debug 按钮 -
Ctr+Shift+F8 指定断点进入的条件 -
Alt+Shift+F7 下一步进入当前方法体内 -
Alt + shift+F9 弹出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 编辑器最大化
上文快捷键多数参考该链接 更好的快捷键链接
|