编辑器与 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->redis
、 Yii::$app->mongodb
、 Yii::$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->identity
, app\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