我有一项服务,控制器提供了一些数据。 现在,我通过全局注入将该服务提供给Twig:
globals:
my_service: '@AppBundle\Service\MyService'
如何阻止某人在“嫩枝”页面上打电话给例如
my_service.setData('blah')?
因为我只希望控制器将数据写入其中。 而且我只希望Twig能够读取数据:
my_service.getData()
答案 0 :(得分:3)
您可以提供另一个服务,我们将其称为MyDataProvider,并将其设置为只读。伪代码:
AppBundle\DataProvider\MyDataProvider:
$myService: '@AppBundle\Service\MyService'
globals:
my_data_provider: '@AppBundle\DataProvider\MyDataProvider'
然后,仅在MyDataProvider中代理来自MyService的吸气剂:
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的方法-您可以注入它,或仅提供给标记的服务(如您所指出的,只有Controller才应写入其中),无论哪种方法都对您有用。