PhpStorm 2025.2 Help

创建辅助函数

Symfony Support 插件根据 Symfony 类和函数的使用情况推断参数类型和返回类型。 这使您可以创建自己的辅助函数,这些函数可以接收或返回 模板服务实体翻译路由表单事件

例如,让我们创建一个可以在控制器中使用的 redirectToRoute 函数。 此函数将结合 Controller 类的 redirectgenerateUrl 函数,以便您可以轻松地将用户重定向到我们应用程序中的已知路由。 代码如下所示:

protected function redirectToRoute($route) { return $this->redirect($this->generateUrl($route)); }

当我们调用此函数时,我们将获得 Ctrl+Space 的代码补全,以及 $route 和 的代码补全,还可以导航到相应的声明 Ctrl+B

在辅助函数中完成 Symfony 路由名称

返回的 $response 实例的代码补全和导航也可用。

在辅助函数中完成 Symfony 响应名称

这两者之所以有效,是因为 Symfony Support 插件通过分析已知函数的调用和返回类型来推断 $route 的类型。 这种类型分析适用于大多数 Symfony 组件(模板、服务、实体、翻译、路由、表单或事件),但在某些情况下,它无法按原样工作。

每当我们自己创建或从第三方库中使用的辅助函数的补全和导航似乎不起作用时,Symfony Support 插件提供了解决方案:它通过 方法参数签名类型 项目设置提供对其某些内部功能的访问。

方法参数

请考虑以下函数,它不使用任何 Symfony 特定的函数:

/** * Translate route * * @param $route string Route to translate the URL for * @param $locale string Locale to translate into */ protected function translateRoute($route, $locale) { // ... }

在这种情况下,Symfony Support 插件将无法确定 $route 字符串参数应包含路由名称并为其提供补全和导航。 我们可以通过使用以下任何技术来解决此问题:

方法引用

要告诉 Symfony Support 插件关于我们的方法,请在 设置 对话框(Ctrl+Alt+S )中,导航到 PHP | Symfony | 方法引用。 然后,单击 "添加"按钮 以添加新的方法参数注册。

Symfony MethodParameterSetting 对话框

提供以下内容:

  • CallTo :包含函数的类的 FQN(带有前导 \)。

  • 方法 :函数名称。

  • Index :我们希望为其提供补全和导航的参数索引。

  • 提供程序 :潜在数据的提供者。 这是我们选择希望函数参数接受的 Symfony 组件的地方。

  • 贡献者 :(可选)如果我们的函数参数是一个数组,并且我们希望在数组键或值中进行补全,我们可以使用这些选项来指定。

  • ContributorData :(可选)如果我们希望数组值补全,可以在此处输入要为其提供补全和导航的键。

一旦我们应用更改,我们的辅助函数参数的完整补全和导航支持将可用。 由于这是一个项目级别的设置,您可以 与您的团队共享

虽然这种技术功能强大,但在大多数情况下,使用 带有哈希的提示可能更容易使用,并且不需要与团队成员共享您的项目设置。

哈希

与其在设置中配置方法参数,我们可以使用提示,类似于我们使用 PHPDoc为 PhpStorm 提供类型提示的方式。

通过在函数的 PHPDoc 块中添加以下任何内容,我们可以指定给定参数将接受的数据类型:

  • #Entity

  • #Service

  • #FormType

  • #Template

  • #Route

  • #Class

  • #TranslationKey

  • #TranslationDomain

  • #FormOption

  • #Interface

带有添加提示的示例函数如下所示。 请注意 $route 参数描述中的 #Route

/** * Translate route * * @param $route string #Route to translate the URL for * @param $locale string Locale to translate into */ protected function translateRoute($route, $locale) { // ... }

Symfony Support 插件现在将正确索引该函数,并为 $route 参数提供补全和导航。

签名类型

请考虑一个测试类,我们将在 testIndex 函数中编写一个测试。 该类带有一个辅助函数,可以模拟注册到我们 Symfony Web 应用程序的服务。

use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; class SomeTest extends TestCase { /** * @param $service string #Service to mock * @return MockObject */ protected function getMockService($service) { // ... resolve interface from $service ... $serviceInterface = ''; return $this->getMock($serviceInterface); } function testIndex() { // TODO: our code will go here... } }

由于我们已将 #Service 类型提示添加到 $service 参数的 getMockService 函数中,因此现在调用它时可以获得补全和导航。

在辅助函数中完成 Symfony 模拟

遗憾的是,我们无法为模拟的服务获得补全:只有 PHPUnit 的 PHPUnit_Framework_MockObject 类的补全可用。

在辅助函数中无法完成 Symfony 模拟

理想情况下,在 $mock 实例上调用补全将会列出所有公共成员,在这种情况下,是 filesystem 服务的公共成员。 当使用 getMockServicemailer 服务名称调用时,我们期望它基于 mailer 服务的公共成员提供补全。

为实现此目的,请在 设置 对话框(Ctrl+Alt+S )中,导航到 PHP | Symfony | 类型提供器。 然后,选择 启用自定义签名类型 复选框并单击 "添加"按钮 以添加有关 getMockService 函数的信息。

创建 Symfony 辅助函数自定义签名

提供以下内容:

  • CallTo :包含函数的类的 FQN(带有前导 \)。

  • 方法 :函数名称。

  • Index :确定返回类型的参数索引。

  • 提供程序 :潜在数据的提供者。 这是我们选择函数返回的 Symfony 组件类型的地方。

一旦我们应用更改,我们的 $mock 变量的代码补全将可用。

在辅助函数中可以完成 Symfony 模拟
最后修改日期: 2025年 9月 26日