通过继承方式装饰symfony 服务教程(1) langziyang Symfony博客 289 views 在symfony中,秉承一切皆服务的原则,开发了相当多的第三方bundle。有时候我们想要override第三方bundle中的服务有很多方法。今天我们来介绍一下装饰服务:decorator service 我们先在src\Services目录下建立一个新服务:OriginalService.php ``` <?phpnamespace App\Services; class OriginalService { public function doSomething() { return 'Original service is doing something.'; } } ``` 然后在控制器下调用该服务的doSomething方法: ``` <?phpnamespace App\Controller; use App\Services\OriginalService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class IndexController extends AbstractController { #[Route('/', name: 'app_index')] public function index(OriginalService $service): Response { dd($service->doSomething()); } } ``` 访问路由得会得到输出:Original service is doing something. 这是最简单的一个调用服务方法,接下来我们考虑一下:如果这个OriginalService来自第三方bundle,我们要覆写doSomething方法,是不是只需要继承它就可以了呢。 接下来我们新建一个DecorationService.php ``` <?phpnamespace App\Services; class DecorationService extends OriginalService { public function doSomething() { return 'this is from decoration service'; } } ``` 修改控制器index方法为: ``` #[Route('/', name: 'app_index')]public function index(DecorationService $service): Response { dd($service->doSomething()); } ``` 访问后可以得到输出:this is from decoration service。是不是觉得完成了?但是其它第三方注入OriginalService的地方我们每一个都去修改?所以这还没有实现装饰服务,我们把index方法还原。然后修改DecorationService.php文件。 ``` <?phpnamespace App\Services; use Symfony\Component\DependencyInjection\Attribute\AsDecorator; #[AsDecorator(decorates: OriginalService::class)]class DecorationService extends OriginalService { public function doSomething() { return 'this is from decoration service'; } } ``` 我们可以看到在类中添加了属性#[AsDecorator()],该属性是在symfony6.1引入的。然后我们刷新页面,是不是可以看到依然输出了"this is from decoration service"?而控制器方法中还是注入的OriginalService而不是DecorationService。说明装饰服务已完成了。就是这么简单。 帮助PHPZlc项目! 与任何开源项目一样, 贡献代码 或 文档 是最常见的帮助方式, 但我们也有广泛的 赞助机会。 2 赞赏 加入技术群 评论 去登录