如何使用包继承覆盖一个包的部分
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.8,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
如何使用包继承覆盖一个包的部分
在使用第三方捆绑包时,您可能会遇到这样的情况:您希望用您自己捆绑包中的一个文件覆盖第三方捆绑包中的一个文件。欧宝娱乐app下载地址Symfony为您提供了一种非常方便的方法来覆盖包中的控制器、模板和其他文件资源/
目录中。
例如,假设您已经安装了FOSUserBundle,但你想覆盖它的基础layout.html.twig
模板,以及它的一个控制器。
首先,创建一个名为UserBundle的新包,并在应用程序中启用它。然后,注册第三方FOSUserBundle作为你的bundle的“父”:
12 3 4 5 6 7 8 9 10 11 12
/ / src / UserBundle / UserBundle.php名称空间UserBundle;使用欧宝娱乐app下载地址\组件\HttpKernel\包\包;类UserBundle扩展包{公共函数getParent(){返回“FOSUserBundle”;}}
通过这个简单的更改,您现在只需创建一个同名文件,就可以覆盖FOSUserBundle的几个部分。
请注意
尽管有方法名,但bundle之间没有父/子关系,它只是一种扩展和覆盖现有bundle的方法。
压倒一切的控制器
类中添加一些功能获取registerAction ()
的RegistrationController
它存在于FOSUserBundle中。要做到这一点,只需创建自己的RegistrationController.php
文件,覆盖bundle的原始方法,并改变它的功能:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src / UserBundle /控制器/ RegistrationController.php名称空间UserBundle\控制器;使用”丛书\UserBundle\控制器\RegistrationController作为BaseController;类RegistrationController扩展BaseController{公共函数获取registerAction(){$响应=父::获取registerAction ();/ /……做定制的东西返回$响应;}}
提示
根据需要改变行为的严重程度,您可能会调用父:获取registerAction ()
或者完全用你自己的逻辑取代它的逻辑。
请注意
只有当bundle引用使用标准的控制器时,以这种方式重写控制器才有效FOSUserBundle:登记:登记
路由和模板中的语法。这是最好的做法。
重写资源:模板,路由等
大多数资源也可以被覆盖,只需在与父包相同的位置创建一个文件即可。
例如,需要覆盖FOSUserBundle是很常见的layout.html.twig
模板,以便它使用应用程序的基本布局。因为文件存在于资源/视图/ layout.html.twig
在FOSUserBundle中,你可以在UserBundle的相同位置创建自己的文件。欧宝娱乐app下载地址Symfony将完全忽略FOSUserBundle中的文件,而是使用您的文件。
路由文件和其他一些资源也是如此。
请注意
方法引用资源时,重写资源才有效@FOSUserBundle /资源/ config /路由/ security.xml
方法。你需要使用@BundleName
在引用资源时使用快捷方式,以便成功覆盖它们(模板除外,模板以不同的方式覆盖,如中所述如何从第三方包覆盖模板).
谨慎
翻译和验证文件的工作方式与上面描述的不一样。读作“如何覆盖一个包的任何部分"如果你想学习如何重写翻译并查看"如何覆盖一个包的任何部分“用于覆盖验证的技巧。