限制访问PHP中的setter



我有一个服务,其中包含由控制器提供的一些数据。现在,我通过在全球范围内注入,将该服务暴露给了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提供所有其他类,你可以注入它,或者只提供给标记的服务(正如你所注意到的,只有控制器应该写入它(,以适合你的为准。

最新更新