【问题标题】:Extending my own controller in Symfony在 Symfony 中扩展我自己的控制器
【发布时间】:2020-07-08 06:01:57
【问题描述】:

我正在创建一个具有一些常用功能的 webapp。所以我认为最简单的方法是制作一个基本控制器并扩展它。所以在我的基本控制器中(类似于):

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class BaseController extends Controller
{
    protected function dosomething($data)
    {
        return $data;
    }
}

然后在默认控制器中:

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends BaseController
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        $data = "OK";
        $thedata = $this->dosomething($data);
    }
}

然后对于管理控制器: 命名空间 AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class AdminController extends BaseController
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction()
    {
        $data = "OK";
        $thedata = $this->dosomething($data);
    }
}

但是,我收到类似“编译错误:AppBundle\Controller\AdminController::dosomething() 的访问级别必须受到保护(如在 AppBundle\Controller\BaseController 类中)或更弱的错误”,而不仅仅是在我加载管理控制器功能,但也是默认的。当我停止扩展基本控制器的管理控制器时,此错误会出现(似乎在默认情况下有效,但不适用于管理员)。

我猜我必须在某个地方让 Symfony 知道管理控制器是安全的还是什么?

【问题讨论】:

  • 请添加AdminController的代码。目前它只是DefaultController。但除此之外,错误信息非常清楚。看来你在AdminController 上有dosomething 作为private
  • 扩展 Symfony 的控制器类只是摆脱大量样板代码的一种简单方法,任何可调用对象基本上都可以处理请求。请不要扩展控制器,而是将doSomething 的服务定义为公共方法并从控制器调用。
  • 它最终成为我错过的 AdminController 中的一些代码(已经很晚了,我很累)。问题解决了。

标签: php symfony controller


【解决方案1】:

它与 Symfony 无关,它是 PHP。

显然,您正在尝试在管理控制器中重新定义 dosomething 方法,并尝试将此方法设为私有。

这是不允许的。可能是protectedpublic

这是面向对象的原则。因为如果你有一个类SubAdminController,那么它的实例也是AdminControllerBaseController 的实例。 PHP 必须明确知道父类中的方法dosomething 是否可以从SubAdminController 访问。

【讨论】:

  • 我没有重新定义它,它是在 BaseController 中定义的,然后在 DefaultController 和 AdminController 中使用。这些控制器中只有 1 个会在任何页面加载时被调用(因为它们是站点的 2 个不同部分),因此它不会被声明两次。此外,dsomething 被声明为受保护(我已经尝试将其声明为 public,结果相似)所以这不应该是一个问题。
  • 对不起,我想你只是漏掉了一些东西。检查它两次。也许,尝试清除缓存。错误消息很清楚 - 问题在于重新定义 dosomethingAdminController
  • 是的,我看到我错过了 AdminController 中重新声明它的一些代码。删除它,现在一切正常。试图弄清楚如何编辑我的评论,但由于某种原因堆栈溢出不会让我编辑或删除它!你的回答是正确的,我赞成。
  • 我很高兴你明白了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
相关资源
最近更新 更多