在 PHP 中限制对 setter 的访问?

Restrict access to setter in PHP?

我有一项服务,由控制器提供一些数据。 现在,我通过全局注入将该服务暴露给 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'

然后,只在 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 - 你可以注入它,或者只提供给标记的服务(正如你所注意到的,只有控制器应该写入它),以适合您的方式为准。