在Symfony中扩展我自己的控制器


Extending my own controller in Symfony

我正在创建一个具有一些常见功能的web应用程序。我认为最简单的方法是做一个基本控制器然后扩展它。在基本控制器中,我有(类似于):

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);
    }
}

然后对于Admin Controller:名称空间AppBundle '控制器;

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)或更弱",不仅仅是当我加载管理控制器功能,但默认也是如此。当我停止admin控制器扩展base控制器时,这个错误出现了(似乎在默认情况下工作,但不是admin)。

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

这与Symfony无关,这是PHP。

显然,你试图在你的管理控制器中重新定义dosomething方法,并试图使这个方法私有。

这是不允许的。可以是protectedpublic

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