symfony 4 настройка глобальных настроек с помощью сервиса для реализации в twig

#symfony #settings #symfony4

#symfony #Настройки #symfony4

Вопрос:

я настраиваю глобальные настройки, чтобы достичь этого во всех шаблонах twig. так что я также могу, например, установить страницы error.html.twig.

Я нашел описание для этого очень коротким. Глобальные переменные реализуются в twig.yaml, а для переменных из базы данных пишется сервис. смотрите мою попытку ниже 🙂 однако это пока не работает : (

я думаю, что мой сервис написан некорректно. пожалуйста, помогите 🙂

 twig:

  globals:
    setting: '@AppServiceWebsitesettings'
  

мой файл сервиса

 <?php
namespace AppService;
use AppEntitySitesetting;


class Websitesettings
{
    public function setting()
    {
        $setting = $this->getDoctrine()->getRepository(Sitesetting::class)
            ->findAll()[0];

        return $setting;
    }
}
  

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

1. завершен ли ваш класс Websitesettings, который вы публикуете здесь?

2. да? 🙂 это просто данные, которые может заполнить администратор, и я хочу, чтобы они отображались глобально

Ответ №1:

случайный класс не может просто вызывать $this->getDoctrine() внутри своих методов и ожидать получения некоторого объекта. Как бы PHP теперь, откуда это взять? Как бы проверка / отражение кода даже предполагала, как getDoctrine предполагается определить?

Вместо этого вам следует ввести EntityManagerInterface в конструктор, потому что таким образом Symfony (фреймворк) и его автоматическое подключение могут разумно определить ожидаемый параметр для вашего сервиса, а подсказка типа подскажет ему, что вводить:

 <?php
namespace AppService;
use Doctrine
use DoctrineORMEntityManagerInterface;


class Websitesettings
{
    /** @var EntityManagerInterface */
    public $em;

    public function __construct(EntityManagerInterface $em) {
        $this->em = $em;
    }

    public function setting()
    {
        $setting = $this->em->getRepository(Sitesetting::class)
            ->findAll()[0];

        return $setting;
    }
}
  

Надеюсь, это поможет.

Однако основной вопрос заключается в следующем: вы уверены, что это лучший способ сделать это? По-видимому, у вас есть целая таблица, посвященная настройкам вашего сайта, и, по-видимому, она содержит только одну строку (что довольно печально). Yaml и Symfony обладают некоторыми очень приятными функциями, с помощью которых вы могли бы предоставить определенные параметры в самой конфигурации или через переменные окружения. Но это выходит за рамки вопроса.

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

1. настройки веб-сайта — это то, что администратор может заполнить, чтобы его можно было отобразить во внешнем интерфейсе. (например, имя сайта, адрес, Google api, номера телефонов). Я имею в виду не общие настройки сайта, если вы это имеете в виду?…. Спасибо за отзыв. позвольте мне попробовать 🙂

2. Хорошо, итак, я внедрил ваш код. но я еще не там. Я не могу получить конкретные поля. code e.g. Neither the property "phone" nor one of the methods "phone()", "getphone()"/"isphone()"/"hasphone()" or "__call()" exist and have public access in class "AppServiceWebsitesettings". code` и я знаю, что вызов этого поля обычно работает, как я вижу это на indexpage по сравнению со страницей ошибки, которая загружается только прямо из base.html.twig. я называю поля в twig следующим образом ‘code'{{ setting.phone }}’код’

3. нет, setting это возвращаемое значение не вашего setting метода, а Websitesetting сервиса. итак, вам пришлось бы написать setting.setting.phone . который является: Websitesetting(=»настройка»).setting()[«телефон»]

4. аааа, я только что попробовал id. Это работает!! да 🙂 большое вам спасибо!

5. мне пришлось искать это, но я нашел кнопку «Принять» 🙂 отличный ответ!