如何使用包继承覆盖一个包的部分
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何使用包继承覆盖一个包的部分
3.4
Bundle继承自Symfony 3.4以来已弃用,并将在4.0中移除,但您可ob娱乐下载以这样做重写包的任何部分不使用包继承。
在使用第三方捆绑包时,您可能会遇到这样的情况:您希望用您自己捆绑包中的一个文件覆盖第三方捆绑包中的一个文件。ob娱乐下载Symfony为您提供了一种非常方便的方法来覆盖包中的控制器、模板和其他文件资源/
目录中。
例如,假设您已经安装了FOSUserBundle,但你想覆盖它的基础layout.html.twig
模板,以及它的一个控制器。
首先,创建一个名为UserBundle的新包,并在应用程序中启用它。然后,注册第三方FOSUserBundle作为你的bundle的“父”:
12 3 4 5 6 7 8 9 10 11 12
/ / src / UserBundle / UserBundle.php名称空间UserBundle;使用ob娱乐下载\组件\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的相同位置创建自己的文件。ob娱乐下载Symfony将完全忽略FOSUserBundle中的文件,而是使用您的文件。
路由文件和其他一些资源也是如此。
请注意
方法引用资源时,重写资源才有效@FOSUserBundle /资源/ config /路由/ security.xml
方法。你需要使用@BundleName
在引用资源时使用快捷方式,以便成功覆盖它们(模板除外,模板以不同的方式覆盖,如中所述如何从第三方包覆盖模板).
谨慎
翻译和验证文件的工作方式与上面描述的不一样。读作“如何覆盖一个包的任何部分"如果你想学习如何重写翻译并查看"如何覆盖一个包的任何部分“用于覆盖验证的技巧。