Я создаю веб-приложение, которое имеет некоторые общие функции. Поэтому я решил, что самый простой способ сделать это — создать базовый контроллер и просто расширить его. Итак, в базовом контроллере у меня есть (аналогично):
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, что контроллер администратора безопасен или что-то?
Это не имеет ничего общего с Symfony, это PHP.
Очевидно, вы пытаетесь переопределить dosomething
метод в вашем Admin Controller, и пытается сделать этот метод частным.
Это не разрешено. Это может быть либо protected
или же public
,
Это принцип ООП. Потому что если у вас будет класс SubAdminController
, то экземпляр этого будет также экземпляром обоих AdminController
а также BaseController
, И PHP обязательно должен знать, если метод dosomething
из родительского класса доступен из SubAdminController
,
Других решений пока нет …