目录

前言

lumen或laravel项目的开发,在使用phpstorm时都会遇到头疼的问题:IDE能自动补全Eloquent ORM查询构建器的链式查询,且必须使用query()来生成查询构建器对象。而参考官网文档直接使用Eloquent对象时,却不能自动补全。

还有经常使用到的Facade相关的静态方法 ,IDE也是无法识别到的,想要调用这些静态函数名称,就必须查文档,严重降低编码效率和影响心情。

本文中的代码适用于:php7.4.*、laravel6.*、mysql5.6的开发环境。

composer.json的3个注意事项

1、首先在composer.json中指定require第一项为php的版本号,也就是知名了当前程序运行环境中的php版本。

2、在选在包版本时,先到Packagist找到对应包,检查依赖说明,是否满足。

3、composer.lock需要加入版本管理库,才能保证开发环境与正式环境的依赖包一致。

如何使用ide-helper

Laravel ide-helper 是一个不错的代码提示及补全工具,可以为编码带来很大便利。也就是能解决Facade静态调用不能自动补全(魔术方法),也能支持通过Eloquent访问model的属性、魔术方法(比如whereId())。

  • 安装laravel-ide-helper

    composer require-dev barryvdh/laravel-ide-helper:2.8.2
    

    也可以在composer.json中require-dev新增:

    "barryvdh/laravel-ide-helper": "~2.8",
    

    然后在composer update时,会自动安装Laravel IDE Helper

    注:因为barryvdh/laravel-ide-helper - Packagist - v2.8.2的依赖项illuminate/console 在2.8.2的版本允许 ^6 || ^7 || ^8的illuminate,但2.9以上的版本要求^8,也就是至少laravel框架要求>8.*。

    其中illuminate指的就是laravel的框架版本。

  • 安装doctrine/dbal

    model注解字段(表栏位)的时候会用到。

    composer require-dev doctrine/dbal: 2.12.0
    

    composer.json:

    "doctrine/dbal": "^2.12.0",
    
  • config/app.phpproviders 数组中加入

    Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class
    

    如果你只在开发环境中安装 larave-ide-helper,那么可以在 app/Providers/AppServiceProvider.phpregister 方法中写入下面代码:

    public function register()
    {
        if ($this->app->environment() !== 'production') {
            $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
        }
        // ...
    }
    

    如果是lumen的话,可以在bootstrap中加入:

    $env = env('APP_ENV');
    if ($env !== 'production') { // 非生产环境,额外注册的服务
        $app->configure('ide-helper');
        $app->register(Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
    }
    

    注意,在项目上线时候,要将项目环境改为 production.

  • 为Facades 生成注释

    php artisan ide-helper:generate  
    

    在根目录生成 _ide_helper.php 文件。(可以在config/ide-helper.php中修改文件名称)

  • 为model生成注释

    ide可自动完成数据库表字段名称与类型定义,一次性同步所有model:

    php artisan ide-helper:models  
    

    如果数据库表有改动,需要同步更新指定model:

    php artisan ide-helper:models App\Models\Test\Master\TestAccount -R
    

    注1:-R表示reset,删除已有的phpdoc,重新生成。具体可以通过 php artisan ide-helper:models -h 查看具体使用

    注2App\Models\Test\Master\TestAccount 指定具体要更新的model,虽然help和readme文档说model名,其实是要完整具体的model类全名。

  • 生成 PhpStorm Meta file

    php artisan ide-helper:meta  
    

    在根目录生成 .phpstorm.meta.php 文件

关于mongoDB模型

如果使用jenssegers/mongodb(A MongoDB based Eloquent model and Query builder for Laravel (Moloquent))

ide-helper并不能很好的处理mongodb的模型注解,因为mongodb不是松散的nosql的db,所以ide-helper难以识别除字段与对应where、with的魔术方法,其实也不需要。

所以,可以在ide-helper:models时,忽略mongodb的model类,如下:

php artisan ide-helper:models --ignore=App\Models\MongoDB\*

或者在config/ide-helper.php配置中补充:

/*
|--------------------------------------------------------------------------
| Models to ignore
|--------------------------------------------------------------------------
|
| Define which models should be ignored.
| php artisan ide-helper:models --ignore="App\Models\Post,App\Models\User"
*/
'ignored_models' => [
    App\Models\MongoModels\Model1::class,
    App\Models\MongoModels\Model2::class,
],

是否需要ide-helper

ide-helper可以帮助我们自动生成一些代码。

由于php不是强类型,甚至php7之后,也还不算完全强类型,所以model通常没有定义model的数据结构,导致外部在访问model的数据时,也都是通过__maigc相关魔术方法实现,也导致在编码层面不方便获取field及及其类型。

如果有需要强类型定义model属性(数据库表栏位),还想使用model提供的那些wherexxx查询的魔术方法,那我们就定期使用ide-helper更新所有model的注解。

这个插件是代码侵入式的,是一个开发协助工具,不是我们正式发布需要的插件。

参考

barryvdh/laravel-ide-helper: Laravel IDE Helper - install