phpstorm 配置及数据库、编辑模式、插件、调试、命令行调整

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,[],'');

在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值