如何拦截Symfony2中对服务方法的调用?

时间:2014-10-29 18:59:01

标签: php symfony

我想拦截对Service方法的调用并在它之前执行一些代码。

例如,有人写道:

$this->container->get('file_locator')->isAbsolutePath($path);

我想拦截对 Symfony \ Component \ Config \ FileLocator :: isAbsolutePath()的调用,并在它之前执行一些代码。

这可能吗?

由于

1 个答案:

答案 0 :(得分:0)

我不知道如何实现您正在寻找的目标,但我可以想到您应该能够使用两种方法来达到同样的效果:

然后你有两个选择:

1。覆盖服务

您可以使用自己的服务覆盖服务,该服务扩展默认服务并覆盖isAbsolutePath()方法。

使用您自己的:

覆盖默认的FileLocator课程
class MyCustomFileLocator extends FileLocator
{
    public function isAbsolutePath()
    {
        // Your awesome code here...
        return parent::isAbsolutePath();
    }
}

覆盖服务定义:

# services.yml

# Just create a new definition with the same name

services:
    file_locator:
        class: MyCustomFileLocator
        arguments: [...]

# Or alternatively, if you're overriding one of symfony/third bundle services, 
# they often provide class parameter which can be overriden

parameters:
    file_locator.class: MyCustomFileLocator

2。装饰服务(Symfony> = 2.5)

您可以使用service decoration techinque,这会产生相同的效果,但如果由于某种原因需要,您仍然可以将原始服务称为file_locator.inner