Ограничить доступ к сеттеру в PHP?

У меня есть служба с потоком данных от Контроллера. Теперь я представил этот сервис Twig, внедрив его глобально:

globals:
    my_service: '@AppBundle\Service\MyService'

Как я могу запретить кому-либо, работающему на странице Twig, вызвать, например.

my_service.setData('blah')?

Поскольку я бы хотел, чтобы контроллер записывал в него данные. И я только хочу, чтобы Twig мог читать данные:

my_service.getData()
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать другую службу, назовем ее MyDataProvider и сделать ее доступной только для чтения. Псевдокод:

AppBundle\DataProvider\MyDataProvider:
  $myService: '@AppBundle\Service\MyService'

globals:
    my_data_provider: '@AppBundle\DataProvider\MyDataProvider'

И затем проксируйте только геттеры из MyService в MyDataProvider:

class MyDataProvider {
    private $myService;     

    public function __construct(MyService $myService) {
        $this->myService = $myService;
    }

    // proxy allowed methods, use __get(), or anything else you like
    public function getWhatever() {
        return $this->myService->getWhatever();
    }

    // deny, throw exception, or don't implement at all
    public function setWhatever() {
        throw AccessDeniedException
    }
}

Что касается предоставления все других классов с MyService - вы можете внедрить его или предоставить только помеченным службам (как вы заметили, только контроллеры должны писать в него), в зависимости от того, что работает для вас.

Спасибо, теперь это кажется таким очевидным :)

GrumpyHat 22.11.2018 18:40

Другие вопросы по теме