Расширение моего собственного контроллера в Symfony

#php #symfony #controller

#php #symfony #контроллер

Вопрос:

Я создаю веб-приложение, которое имеет некоторые общие функции. Итак, я решил, что самый простой способ сделать это — создать базовый контроллер и просто расширить его. Итак, в базовом контроллере у меня есть (аналогично):

 namespace AppBundleController;

use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;

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

А затем в контроллере по умолчанию:

 namespace AppBundleController;

use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;

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

А затем для контроллера администратора:
пространство имен AppBundle Controller;

 use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;

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

Однако я получаю ошибки типа «Ошибка компиляции: уровень доступа к AppBundle Controller AdminController ::dosomething() должен быть защищен (как в классе AppBundle Controller BaseController) или слабее», не только при загрузке функции контроллера администратора, но и по умолчанию. Когда я останавливаю admin controller, расширяющий базовый контроллер, эта ошибка исчезает (кажется, работает по умолчанию, но не admin).

Я предполагаю, что где-то я должен сообщить Symfony, что контроллер администратора безопасен или что-то в этом роде?

Комментарии:

1. Пожалуйста, добавьте код для AdminController . В настоящее время это просто DefaultController снова. Но, кроме того, сообщение об ошибке совершенно ясно. Кажется, у вас есть dosomething AdminController as private .

2. Расширение класса контроллера Symfony — это простой способ избавиться от большого количества шаблонного кода, любой вызываемый объект может в основном обрабатывать запрос. Пожалуйста, не расширяйте контроллер, а определите сервис с doSomething помощью общедоступного метода и вызовите его из контроллера.

3. В итоге я пропустил какой-то код в AdminController (было поздно, я устал). Проблема решена.

Ответ №1:

Это не имеет ничего общего с Symfony, это PHP.

Очевидно, вы пытаетесь переопределить dosomething метод в вашем контроллере администратора и пытаетесь сделать этот метод закрытым.

Это не разрешено. Это может быть либо protected или public .

Это принцип ООП. Потому что, если у вас будет класс SubAdminController , его экземпляр будет также экземпляром обоих AdminController и BaseController . И PHP обязательно должен знать, доступен ли метод dosomething из родительского класса SubAdminController .

Комментарии:

1. Я не переопределяю его, он определен в BaseController, а затем используется как в DefaultController, так и в AdminController. Только 1 из этих контроллеров будет вызываться при любой загрузке страницы (поскольку это 2 разных раздела сайта), поэтому он не объявляется дважды. Кроме того, dosomething объявлен защищенным (и я попытался объявить его общедоступным с аналогичными результатами), так что это не должно быть проблемой.

2. Извините, но я думаю, вы просто что-то пропустили. Проверьте это дважды. Может быть, попробуйте очистить кеш. Сообщение об ошибке совершенно ясно — проблема заключается в переопределении dosomething inside AdminController

3. Да, я увидел, что пропустил некоторый код в AdminController, который повторно объявил его. Удалил его, и теперь все работает нормально. Пытался разобраться, как отредактировать мой комментарий, но по какой-то причине stack overflow не позволяет мне редактировать или удалять его! Ваш ответ был правильным, и я поддерживаю его.

4. Я рад, что вы это поняли