У меня есть служба с потоком данных от Контроллера. Теперь я представил этот сервис Twig, внедрив его глобально:
globals:
my_service: '@AppBundle\Service\MyService'
Как я могу запретить кому-либо, работающему на странице Twig, вызвать, например.
my_service.setData('blah')?
Поскольку я бы хотел, чтобы контроллер записывал в него данные. И я только хочу, чтобы Twig мог читать данные:
my_service.getData()






Вы можете создать другую службу, назовем ее 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 - вы можете внедрить его или предоставить только помеченным службам (как вы заметили, только контроллеры должны писать в него), в зависимости от того, что работает для вас.
Спасибо, теперь это кажется таким очевидным :)