我有一个服务,其中包含由控制器提供的一些数据。现在,我通过在全球范围内注入,将该服务暴露给了Twig
globals:
my_service: '@AppBundleServiceMyService'
我如何阻止在Twig页面上工作的人拨打例如
my_service.setData('blah')?
因为我只希望控制器将数据写入其中。我只希望Twig能够读取数据:
my_service.getData()
您可以创建另一个服务,让我们称之为MyDataProvider,并将其设为只读。伪码:
AppBundleDataProviderMyDataProvider:
$myService: '@AppBundleServiceMyService'
globals:
my_data_provider: '@AppBundleDataProviderMyDataProvider'
然后,只在MyDataProvider:中代理来自MyService的getter
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提供所有其他类,你可以注入它,或者只提供给标记的服务(正如你所注意到的,只有控制器应该写入它(,以适合你的为准。