Skip to content

Commit 08e7bb6

Browse files
authored
Merge pull request #10 from maliboot/2025.1.x
2025.1.x
2 parents 2975542 + c9f1bd2 commit 08e7bb6

12 files changed

Lines changed: 166 additions & 59 deletions

File tree

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@
33
# Changelog
44
<hr>
55

6+
## [2.1.1] - 2025-05-07
7+
### Added
8+
- hyperf-debug调试时,支持从代理文件自动跳转到源文件类+行处
9+
10+
### Removed
11+
-
12+
13+
### Changed
14+
- 修改hyperf-skeleton下载源地址,默认用腾讯云镜像源下载zip骨架包,解决github下载超时问题
15+
<hr>
16+
617
## [2.1.0] - 2025-05-01
718
### Added
819
- Nothing

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ IntelliJ IDEA / PhpStorm Hyperf Plugin
88
| Changelog | [CHANGELOG](CHANGELOG.md) |
99
<!-- Plugin description -->
1010
# About
11-
This is a PHPStorm plugin that provides support for the hyperf framework/component or third-party vendor extensions dependent on hyperf components.
11+
This is a PHPStorm plugin that provides support for the hyperf framework/component or third-party vendor extensions dependent on hyperf components. Enhancements include debug features and support for Lombok.
1212

1313
# 简介
14-
这是一个对`hyperf`框架/组件、或者依赖`hyperf组件`的第三方`vendor`扩展包,提供功能支持的`PHPStorm`插件。
14+
这是一个对`hyperf`框架/组件、或者依赖`hyperf组件`的第三方`vendor`扩展包,提供功能支持的`PHPStorm`插件。包含`debug`增强、`lombok`支持等。
1515

1616
[功能介绍传送门](https://github.com/maliboot/idea-hyperf-plugin/blob/master/README.md)
1717
<!-- Plugin description end -->

TODO.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### TODO
2+
3+
#### 新增功能
4+
* 日志(stdout、file)中对代理类+行支持一键跳转到源文件类+行处
5+
6+
#### 优化功能
7+
* 项目创建向导,根据不同的镜像源来下载骨架,避免github下载超时问题,如`https://mirrors.cloud.tencent.com/composer/p2/hyperf/hyperf-skeleton.json`

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
pluginGroup = io.maliboot.devkit
22
pluginName = Hyperf Booster
33
# x/y/z->2025/1/x
4-
pluginVersion = 2.1.0
4+
pluginVersion = 2.1.1
55
pluginRepositoryUrl = https://github.com/maliboot/idea-hyperf-plugin
66

77
pluginSinceBuild = 251.23774.466
8-
pluginUntilBuild = 251.25410.64
8+
pluginUntilBuild = 251.*
99

1010
platformType = PS
1111
platformVersion = 2025.1.0.1

src/main/java/io/maliboot/devkit/idea/hyperf/skeleton/php/ProjectForm.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.uiDesigner.core.GridLayoutManager;
1313
import com.intellij.uiDesigner.core.Spacer;
1414
import com.intellij.util.ui.JBDimension;
15+
import kotlin.Unit;
1516
import org.jetbrains.annotations.NotNull;
1617
import org.jetbrains.annotations.Nullable;
1718

@@ -60,7 +61,7 @@ public LinkedHashMap<JLabel, JComponent> getLabeledComponents() {
6061

6162
private void init() {
6263
this.serverUrlLink.setText("hyperf.io");
63-
this.serverUrlLink.setName("https://github.com/hyperf/hyperf-skeleton/archive/refs/tags");
64+
this.serverUrlLink.setName("https://mirrors.cloud.tencent.com/repository/composer/hyperf/hyperf-skeleton/v3.1.2/hyperf-hyperf-skeleton-v3.1.2.zip");
6465

6566
// 设置服务器地址
6667
InplaceButton serverUrlSettingBtn = new InplaceButton(
@@ -127,14 +128,20 @@ private void createUIComponents() {
127128
phpVersionList.add("8.1");
128129
phpVersionList.add("8.2");
129130
phpVersionList.add("8.3");
130-
this.phpVersionSegComp = (new SegmentedBtnComp()).create(phpVersionList);
131+
this.phpVersionSegComp = (new SegmentedBtnComp()).create(phpVersionList, null);
131132
this.phpVersionJPanel = this.phpVersionSegComp.getDialogPanel();
132133

133134
// 框架版本
134135
ArrayList<String> frameworkVersionList = new ArrayList<>();
135-
frameworkVersionList.add("v3.0.2");
136136
frameworkVersionList.add("v3.1.2");
137-
this.versionSegComp = (new SegmentedBtnComp()).create(frameworkVersionList);
137+
frameworkVersionList.add("v3.0.2");
138+
this.versionSegComp = (new SegmentedBtnComp()).create(frameworkVersionList, (oldVal, newVal) -> {
139+
String serverLink = this.serverUrlLink.getName();
140+
if (serverLink.contains(oldVal) && serverLink.startsWith("https://mirrors.cloud.tencent.com")) {
141+
this.serverUrlLink.setName(serverLink.replace(oldVal, newVal));
142+
}
143+
return Unit.INSTANCE;
144+
});
138145
this.versionJPanel = this.versionSegComp.getDialogPanel();
139146

140147

@@ -143,7 +150,7 @@ private void createUIComponents() {
143150
keywordList.add("skeleton");
144151
keywordList.add("swoole");
145152
keywordList.add("hyperf");
146-
this.keywordsSegComp = (new SegmentedBtnComp()).create(keywordList);
153+
this.keywordsSegComp = (new SegmentedBtnComp()).create(keywordList, null);
147154
this.keywordsJPanel = this.keywordsSegComp.getDialogPanel();
148155

149156
// 镜像源

src/main/java/io/maliboot/devkit/idea/hyperf/skeleton/php/ProjectGenerator.java

Lines changed: 48 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,13 @@ public Icon getIcon() {
6565
@Override
6666
public void generateProject(@NotNull Project project, @NotNull VirtualFile baseDir, ProjectPeer.@NotNull MyProjectSettings settings, @NotNull Module module) {
6767
String url = Strings.trimEnd(settings.getServerUrl(), "/");
68-
boolean isGitRepo = Strings.startsWith(url, 0, "https://git");
69-
if (isGitRepo) {
70-
url = url + "/" + settings.getVersion() + ".zip";
71-
} else {
72-
url = url + getQryParams(settings);
68+
boolean isGitRepo = url.startsWith("https://git") || url.startsWith("https://mirrors");
69+
if (!url.endsWith(".zip")) {
70+
if (isGitRepo) {
71+
url = url + "/" + settings.getVersion() + ".zip";
72+
} else {
73+
url = url + getQryParams(settings);
74+
}
7375
}
7476

7577
String fileName = URLUtil.encodeURIComponent(DigestUtils.md5Hex(url) + ".zip");
@@ -83,50 +85,50 @@ public void generateProject(@NotNull Project project, @NotNull VirtualFile baseD
8385
String unzipTitle = taskTitle + "骨架Zip解压";
8486
try {
8587
ZipUtil.unzipWithProgressSynchronously(project, unzipTitle, zipArchiveFile, VfsUtilCore.virtualToIoFile(baseDir), null, true);
86-
baseDir.refresh(false, true);
8788
// json文件改写
8889
if (isGitRepo) {
89-
ComposerUtils composerUtils = new ComposerUtils(project);
90-
composerUtils.setConfig(Map.of(
91-
"name", settings.getPkgName() + "/" + settings.getVendorName(),
92-
"description", settings.getDesc()
93-
), false);
94-
// require
95-
ArrayList<Map<String, String>> requireData = new ArrayList<>();
96-
requireData.add(Map.of("php", ">=" + settings.getPhpVersion()));
97-
settings.getRequireDependencies().forEach(dependency -> {
98-
String myVer = dependency.getVersion();
99-
if (myVer.contains("default")) {
100-
myVer = "*";
101-
}
102-
requireData.add(Map.of(dependency.getName(), myVer));
103-
});
104-
composerUtils.setConfig("require", requireData, false);
105-
// require-dev
106-
ArrayList<Map<String, String>> requireDevData = new ArrayList<>();
107-
settings.getRequireDevDependencies().forEach(dependency -> {
108-
String myVer = dependency.getVersion();
109-
if (myVer.contains("default")) {
110-
myVer = "*";
111-
}
112-
requireDevData.add(Map.of(dependency.getName(), myVer));
113-
});
114-
composerUtils.setConfig("require-dev", requireDevData, false);
115-
// repositories
116-
ArrayList<Map<String, String>> repositoriesData = new ArrayList<>();
117-
repositoriesData.add(Map.of(
118-
"type", "composer",
119-
"url", settings.getPackagistUrl()
120-
));
121-
ArrayList<ArrayList<Map<String, String>>> repositoriesOuterData = new ArrayList<>();
122-
repositoriesOuterData.add(repositoriesData);
123-
composerUtils.setConfigByArrayJson("repositories", repositoriesOuterData, false);
124-
125-
// composer install
126-
composerUtils.setText(() -> {
90+
BackgroundTask.INSTANCE.run(project, "整理配置", (indicator) -> {
91+
ComposerUtils composerUtils = new ComposerUtils(project);
92+
composerUtils.setConfig(Map.of(
93+
"name", settings.getPkgName() + "/" + settings.getVendorName(),
94+
"description", settings.getDesc()
95+
), false);
96+
// require
97+
ArrayList<Map<String, String>> requireData = new ArrayList<>();
98+
requireData.add(Map.of("php", ">=" + settings.getPhpVersion()));
99+
settings.getRequireDependencies().forEach(dependency -> {
100+
String myVer = dependency.getVersion();
101+
if (myVer.contains("default")) {
102+
myVer = "*";
103+
}
104+
requireData.add(Map.of(dependency.getName(), myVer));
105+
});
106+
composerUtils.setConfig("require", requireData, false);
107+
// require-dev
108+
ArrayList<Map<String, String>> requireDevData = new ArrayList<>();
109+
settings.getRequireDevDependencies().forEach(dependency -> {
110+
String myVer = dependency.getVersion();
111+
if (myVer.contains("default")) {
112+
myVer = "*";
113+
}
114+
requireDevData.add(Map.of(dependency.getName(), myVer));
115+
});
116+
composerUtils.setConfig("require-dev", requireDevData, false);
117+
// repositories
118+
ArrayList<Map<String, String>> repositoriesData = new ArrayList<>();
119+
repositoriesData.add(Map.of(
120+
"type", "composer",
121+
"url", settings.getPackagistUrl()
122+
));
123+
ArrayList<ArrayList<Map<String, String>>> repositoriesOuterData = new ArrayList<>();
124+
repositoriesOuterData.add(repositoriesData);
125+
composerUtils.setConfigByArrayJson("repositories", repositoriesOuterData, true);
126+
return Unit.INSTANCE;
127+
},
128+
() -> {
127129
new ComposerCommandInstall(project, taskTitle, "--no-interaction --prefer-dist").execute();
128-
com.jetbrains.php.composer.ComposerUtils.refreshVendorDir(composerUtils.getConfigFile());
129-
});
130+
return Unit.INSTANCE;
131+
}, null, false);
130132
}
131133
} catch (GeneratorException e) {
132134
BackgroundTask.INSTANCE.showErrorNotification(project, unzipTitle, String.format("框架脚手架安装错误:%s,解压失败:%s", e.getMessage(), zipArchiveFile.getAbsolutePath()));

src/main/java/io/maliboot/devkit/idea/hyperf/skeleton/php/SegmentedBtnComp.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class SegmentedBtnComp : JPanel() {
1818
private val selectedEnv: GraphProperty<String> = propertyGraph.lazyProperty { "todo" }
1919

2020

21-
fun create(items: ArrayList<String>): SegmentedBtnComp {
21+
fun create(items: ArrayList<String>, call: ((String, String) -> Unit)?): SegmentedBtnComp {
2222
// 过滤空或空白字符串
2323
val validItems = items.filter { it.isNotBlank() }
2424
if (validItems.isEmpty()) {
@@ -39,6 +39,7 @@ class SegmentedBtnComp : JPanel() {
3939

4040
// 监听选中项变化
4141
selectedEnv.afterChange { newValue ->
42+
call?.invoke(selectedItem, newValue)
4243
selectedItem = newValue
4344
}
4445

src/main/kotlin/io/maliboot/devkit/idea/common/extend/VirtualFileExt.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ fun VirtualFile.getLineNumber(offset: Int): Int {
1717
return FileDocumentManager.getInstance().getDocument(this)?.getLineNumber(offset) ?: 0
1818
}
1919

20+
fun VirtualFile.isProxyFile(): Boolean {
21+
return this.path.endsWith(hyperfProxyFileSuffix)
22+
}
23+
2024
fun VirtualFile.getHyperfProxyFile(project: Project): VirtualFile? {
2125
val psiFile = this.findPsiFile(project)
2226
if (psiFile !is PhpFile) {

src/main/kotlin/io/maliboot/devkit/idea/hyperf/debug/HyperfBreakpointListener.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.intellij.openapi.project.Project
55
import com.intellij.xdebugger.XDebuggerManager
66
import com.intellij.xdebugger.breakpoints.XBreakpointListener
77
import com.intellij.xdebugger.breakpoints.XLineBreakpoint
8+
import io.maliboot.devkit.idea.common.extend.hyperfProxyFileSuffix
89
import io.maliboot.devkit.idea.hyperf.HyperfProxyFileUtil
910

1011
class HyperfBreakpointListener(private val project: Project) : XBreakpointListener<XLineBreakpoint<*>> {
@@ -36,7 +37,7 @@ class HyperfBreakpointListener(private val project: Project) : XBreakpointListen
3637
return
3738
}
3839

39-
val targetFileXPosition = if (file.contains(".proxy.php")) {
40+
val targetFileXPosition = if (file.contains(hyperfProxyFileSuffix)) {
4041
HyperfProxyFileUtil.guessOriginXSourcePosition(breakpoint.sourcePosition!!, project) ?: return
4142
} else {
4243
HyperfProxyFileUtil.guessProxyXSourcePosition(breakpoint.sourcePosition!!, project) ?: return

src/main/kotlin/io/maliboot/devkit/idea/hyperf/debug/HyperfStartupActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package io.maliboot.devkit.idea.hyperf.debug
22

33
import com.intellij.openapi.project.Project
44
import com.intellij.openapi.startup.StartupActivity
5+
import com.intellij.xdebugger.XDebuggerManager
56
import com.intellij.xdebugger.breakpoints.XBreakpointListener
67

78
class HyperfStartupActivity : StartupActivity.DumbAware {
89
override fun runActivity(project: Project) {
9-
// 订阅调试会话启动事件
10+
// 订阅调试会话事件
11+
project.messageBus.connect().subscribe(XDebuggerManager.TOPIC, HyperfXDebuggerManagerListener())
1012
// 断点动态映射
1113
project.messageBus.connect().subscribe(XBreakpointListener.TOPIC, HyperfBreakpointListener(project))
1214
}

0 commit comments

Comments
 (0)