限制在PHP中访问setter?

时间:2018-11-22 16:34:08

标签: php symfony symfony-3.4

我有一项服务,控制器提供了一些数据。 现在,我通过全局注入将该服务提供给Twig:

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

如何阻止某人在“嫩枝”页面上打电话给例如

my_service.setData('blah')?

因为我只希望控制器将数据写入其中。 而且我只希望Twig能够读取数据:

my_service.getData()

1 个答案:

答案 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才应写入其中),无论哪种方法都对您有用。