PhpStorm 2021.3 Help

创建辅助函数

Symfony 插件根据它们与 Symfony 类和函数的使用情况提供参数类型和返回类型推断。这使您可以创建自己的辅助函数来获取或返回模板服务实体翻译路由表单事件

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

受保护的函数redirectToRoute($route) { return $this->redirect($this->generateUrl($route)); }

当我们调用这个函数时,我们将获得 and 的代码完成Ctrl+Space$route以及导航到相应声明的能力Ctrl+B

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

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

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

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

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

方法参数

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

/** * 翻译路由 * * @param $route string 翻译 URL 的路由 * @param $locale string 要翻译的语言环境 */ protected function translateRoute($route, $locale) { // ... }

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

方法参考

要告诉 Symfony 插件我们的方法,在Settings/Preferences对话框 ( Ctrl+Alt+S) 中,导航到PHP | Symfony | 方法参考。然后,点击添加按钮添加新的方法参数注册。

Symfony 方法参数设置对话框

提供以下内容:

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

  • 方法:函数名称。

  • Index:我们想要完成和导航的参数的索引。

  • Provider:潜在数据的提供者。这是我们为函数参数选择要接受的 Symfony 组件的地方。

  • Contributor:(可选)如果我们的函数参数是一个数组,并且我们希望在数组键或值中完成,我们可以使用这些选项指定。

  • ContributorData:(可选)如果我们想要完成数组值,在这里我们可以输入提供完成和导航的键。

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

辅助函数中的 Symfony 方法参数完成

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

哈希

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

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

  • #Entity

  • #Service

  • #FormType

  • #Template

  • #Route

  • #Class

  • #TranslationKey

  • #TranslationDomain

  • #FormOption

  • #Interface

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

/** * 翻译路由 * * @param $route string #Route to translate URL for * @param $locale string Locale to translate */ protected function translateRoute($route, $locale) { // ... }

Symfony 插件现在将正确地索引函数并为参数提供完成和导航$route

辅助函数中的 Symfony 哈希参数完成

签名类型

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

class SomeTest extends PHPUnit_Framework_TestCase { /** * @param $service string #Service to mock * @return PHPUnit_Framework_MockObject_MockObject */ protected function getMockService($service) { // ... 从 $service 解析接口 ... $serviceInterface = '' ; 返回 $this->getMock($serviceInterface); } function testIndex() { // TODO: 我们的代码将放在这里... } }

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

辅助函数中的 Symfony 模拟完成

不幸的是,我们的模拟服务没有完成:只有 PHPUnitPHPUnit_Framework_MockObject类的完成是可用的。

辅助函数中的 Symfony 模拟完成不可用

理想情况下,在实例上调用完成$mock将产生服务的所有公共成员,在这种情况下是filesystem服务。getMockService当使用服务名称调用时mailer,我们希望它提供基于服务的公共成员的完成mailer

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

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

提供以下内容:

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

  • 方法:函数名称。

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

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

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

辅助函数中的 Symfony 模拟完成可用
最后修改时间:2021 年 3 月 8 日