使用 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.
它包含两个函数的定义——getPageTypes
和configureFormFields
。
当我尝试将函数 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 秘密访问密钥和签名方法