编辑器与 IDE

未匹配的标注

编辑器和集成开发环境

首选IDE: phpstorm

作者推荐使用

IDE 自定义组件代码自动完成

现在使用 IDE 进行开发是非常常见的,因为它提供了舒适的环境。它可以检测错别字和错误,建议代码改进,当然还提供代码自动完成功能。对于 Yii 2.0 来说,它开箱即用的效果非常好,但对于自定义的应用程序组件却不是这样,例如 Yii::$app->mycomponent->something

官方处理

从 Yii 2.0.44 版本开始,官方在应用模板中对这个问题做了处理,在 config 目录下,新增了一个 __autocomplete.php 文件,对于基础模板,它位于项目根目录 config 下面,对于高级应用模板,它位于 common/config 目录下。对于新安装模板的用户,可以找到这个文件,轻松解决问题,我们只需要配置 @property 这些而已。示例如下:

/**
 * 这个类只存在于 IDE (PHPStorm/Netbeans/…) 的自动完成。
 * 此文件从未包含在任何地方。
 * 调整此文件以匹配应用程序配置中配置的类,从而为自定义组件启用 IDE 自动完成功能。
 * 例如:一个 phpdoc 属性可以在 `__Application` 类中添加为 `@property \vendor\package\Rollbar|__Rollbar $ Rollbar`,并在这个文件中添加一个类
 * ```php
 * // @property of \vendor\package\Rollbar goes here
 * class __Rollbar {
 * }
 * ```
 */
class Yii {
    /**
     * @var \yii\web\Application|\yii\console\Application|__Application
     */
    public static $app;
}

/**
 * @property yii\rbac\DbManager $authManager
 * @property \yii\web\User|__WebUser $user
 *
 * @property \yii\redis\Connection $redis 官方 yii2-redis 扩展的 redis 组件
 * @property \yii\mongodb\Connection $mongodb 官方 yii2-mongodb 扩展 的 mongodb 组件
 * @property \yii\queue\Queue $queue 官方 yii2-queue 扩展的 queue 组件
 * @property \yii\elasticsearch\Connection $elasticsearch 官方 yii2-elasticsearch 扩展的 elasticsearch 组件
 * @property \yii\sphinx\Connection $sphinx 官方 yii2-sphinx 扩展的 sphinx 组件
 *
 */
class __Application {
}

/**
 * @property app\models\User $identity
 */
class __WebUser {
}

注意:对于已经安装了旧版的应用模板的用户,虽然没有官方提供的 config/__autocomplete.php 这个文件,但是您可以参考以下步骤,自行创建这个类似的文件。

使用自定义 Yii 类

给 IDE 一些提示的最好方法是使用你自己的 Yii 文件,它在运行代码时实际上并不使用。这个文件可以命名为 Yii.php,且它的内容可以如下:

<?php
/**
 * Yii bootstrap file.
 * Used for enhanced IDE code autocompletion.
 */
class Yii extends \yii\BaseYii
{
    /**
     * @var BaseApplication|WebApplication|ConsoleApplication the application instance
     */
    public static $app;
}

/**
 * Class BaseApplication
 * Used for properties that are identical for both WebApplication and ConsoleApplication
 *
 * @property \app\components\RbacManager $authManager 此应用的身份验证管理器,如果没有配置过,将返回 Null ,这个属性是只读的, 扩展组件
 * @property \app\components\Mailer $mailer 邮件程序组件. 这个属性是只读的, 扩展组件
 *
 * @property \yii\redis\Connection $redis 官方 yii2-redis 扩展的 redis 组件
 * @property \yii\mongodb\Connection $mongodb 官方 yii2-mongodb 扩展 的 mongodb 组件
 * @property \yii\queue\Queue $queue 官方 yii2-queue 扩展的 queue 组件
 */
abstract class BaseApplication extends yii\base\Application
{
}

/**
 * Class WebApplication
 * Include only Web application related components here
 *
 * @property \app\components\User $user The user component. This property is read-only. Extended component.
 * @property \app\components\MyResponse $response The response component. This property is read-only. Extended component.
 * @property \app\components\ErrorHandler $errorHandler The error handler application component. This property is read-only. Extended component.
 */
class WebApplication extends yii\web\Application
{
}

/**
 * Class ConsoleApplication
 * Include only Console application related components here
 *
 * @property \app\components\ConsoleUser $user The user component. This property is read-only. Extended component.
 */
class ConsoleApplication extends yii\console\Application
{
}

在上面的 BaseApplication, WebApplication, ConsoleApplication 的 PHPDoc 中,将被 IDE 用于自动完成那些通过 @property 描述的自定义组件。例如: Yii::$app->redisYii::$app->mongodbYii::$app->queue 等等。

注意:To avoid “Multiple Implementations” PHPStorm warning and make autocomplete faster exclude or “Mark as Plain Text” vendor/yiisoft/yii2/Yii.php file.

就是这样,现在 Yii::$app->user 将会是我们的 \app\components\User 组件来代替之前系统默认的。这同样适用于所有其他 @property 声明的组件。

自定义 Yii 类自动生成

您可以使用应用程序配置中的组件定义来自动生成自定义 Yii 类。
查看 bazilio91/yii2-stubs-generator 扩展.

用户自定义组件

为了获得针对用户身份的自动完成,即 Yii::$app->user->identityapp\components\User 类应该如下所示:

<?php

namespace app\components;

use Yii;

/**
 * @inheritdoc
 *
 * @property \app\models\User|\yii\web\IdentityInterface|null $identity The identity object associated with the currently logged-in user. null is returned if the user is not logged in (not authenticated).
 */
class User extends \yii\web\User
{
}

因此,Yii 的配置文件中针对组件,可能看起来是这样的:

return [
    ...
    'components' => [
        /**
         * User
         */
        'user' => [
            'class' => 'app\components\User',
            'identityClass' => 'app\models\User',
        ],
        /**
         * Custom Component
         */
        'response' => [
            'class' => 'app\components\MyResponse',
        ],
    ],
];

💖喜欢本文档的,欢迎点赞、收藏、留言或转发,谢谢支持!
作者邮箱:zhuzixian520@126.com,github地址:github.com/zhuzixian520

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
zhuzixian520
讨论数量: 0
发起讨论 只看当前版本


暂无话题~