#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
asprivate
.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
insideAdminController
3. Да, я увидел, что пропустил некоторый код в AdminController, который повторно объявил его. Удалил его, и теперь все работает нормально. Пытался разобраться, как отредактировать мой комментарий, но по какой-то причине stack overflow не позволяет мне редактировать или удалять его! Ваш ответ был правильным, и я поддерживаю его.
4. Я рад, что вы это поняли