使用 EasyExtends 时方法签名显然不匹配

Posted

技术标签:

【中文标题】使用 EasyExtends 时方法签名显然不匹配【英文标题】:Method signature apparently not matching while using EasyExtends 【发布时间】:2018-09-22 18:48:18 【问题描述】:

我正在处理一个使用 EasyExtends 来扩展 Sonata 的页面包的预先存在的项目。该项目基于 Symfony 3.3。

在这个项目中已经存在命名空间Application\Sonata\PageBundle\Admin 中的一个类,名为PageAdmin 扩展BasePageAdmin. 它包含两个函数的定义——getPageTypesconfigureFormFields

当我尝试将函数 configureTabMenu 从此类的供应商副本(它工作得很好)克隆到应用程序副本时,我收到来自应用程序的以下投诉:

警告:声明 Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Application\Sonata\PageBundle\Admin\MenuItemInterface $menu, $action, ?Application\Sonata\PageBundle\Admin\AdminInterface $childAdmin = NULL) 应该兼容 Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) 在 . (这是从 “/usr/src/app/app/config/routing.yml”)。确保有装载机 支持“sonata_admin”类型。

坦率地说,这比我容易理解的要多一点。 有没有一种简单的方法可以覆盖我的供应商文件夹中现有的 configureFormFields() 方法?

====

编辑#1:删除类型提示(这是一种不明智的长期策略,但对调试很有用)将一个警告替换为另一个警告。然后我得到这个警告文本:

警告:声明 Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu($menu, $action, $childAdmin = NULL) 应该兼容 Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) 在 . (这是从 “/usr/src/app/app/config/routing.yml”)。确保有装载机 支持“sonata_admin”类型。

====

编辑 #2:将方法签名更改为 Knp\Menu\ItemInterface $menu, $action, Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL 给了我这个:

警告:声明 Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Application\Sonata\PageBundle\Admin\Knp\Menu\ItemInterface $菜单,$动作, ?Application\Sonata\PageBundle\Admin\Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) 应该兼容 Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL) 在 . (这是从 “/usr/src/app/app/config/routing.yml”)。确保有装载机 支持“sonata_admin”类型。

【问题讨论】:

嗯,你得到了那个错误,因为参数的类类型提示使用了错误的类。我不是 symfony 用户,所以我不知道这是你写的东西,还是 3rd 方代码,或者你有什么。 感谢您的评论。删除类型提示后,我稍微编辑了问题。 subs one warning for another 是同样的问题,你不能只删除类型提示,它们必须与父级或接口的提示中的类相同。 【参考方案1】:

让本文更易读

警告:声明

Application\Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Application\Sonata\PageBundle\Admin\MenuItemInterface $menu, $action, ?Application\Sonata\PageBundle\Admin\AdminInterface $childAdmin = NULL)

应该兼容

Sonata\PageBundle\Admin\PageAdmin::configureTabMenu(Knp\Menu\ItemInterface $menu, $action, ?Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL)。

你只需要改变它,使它们是相同的类型提示。

public function configureTabMenu(Knp\Menu\ItemInterface $menu, $action, Sonata\AdminBundle\Admin\AdminInterface $childAdmin = NULL)



假设这是您编写的代码,正如我所说,我不是 Symphony 用户,但 php 是 PHP。

【讨论】:

【参考方案2】:

原来我遗漏了两个use 语句。我从我要克隆的课程中复制了这些:

use Sonata\AdminBundle\Admin\AdminInterface;
use Knp\Menu\ItemInterface as MenuItemInterface;

...一切正常。

【讨论】:

以上是关于使用 EasyExtends 时方法签名显然不匹配的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 SAS 访问 Azure blob 时收到“签名不匹配。使用的签名字符串是...”

AWS S3 - 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法

我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法

代码签名的应用程序与其 Blessed Helper 的代码签名不匹配

Fastlane 匹配不使用现有的签名证书

Python 参数类型与 C++ 签名不匹配