我正在创建一个具有一些常用功能的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知道管理员控制器是安全的还是什么?
答案 0 :(得分:4)
它与Symfony无关,它是PHP。
显然,您正在尝试重新定义管理控制器中的dosomething
方法,并尝试将此方法设为私有。
不允许这样做。它可以是protected
或public
。
OOP的原则。因为如果你有一个类SubAdminController
,那么它的实例也将是AdminController
和BaseController
的实例。 PHP必须知道来自父类的方法dosomething
是否可以从SubAdminController
访问。