(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{746:function(s,t,a){"use strict";a.r(t);var n=a(84),e=Object(n.a)({},(function(){var s=this,t=s._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("h1",{attrs:{id:"依赖注入"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#依赖注入"}},[s._v("#")]),s._v(" 依赖注入")]),s._v(" "),t("p",[s._v("依赖注入这个名词并没有你想象的那么复杂,实际上它就是把一个类的依赖通过构造函数或者 setter\n方法注入到类中。这样做的好处是,你可以在不修改类的情况下,通过修改容器定义来改变依赖的值。")]),s._v(" "),t("p",[s._v("下方是一个简单的例子,它展示了如何使用依赖注入来获取框架提供的依赖:")]),s._v(" "),t("div",{staticClass:"language-php line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-php"}},[t("code",[t("span",{pre:!0,attrs:{class:"token php language-php"}},[t("span",{pre:!0,attrs:{class:"token delimiter important"}},[s._v("")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("reply")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$event")]),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("->")]),t("span",{pre:!0,attrs:{class:"token function"}},[s._v("getMessage")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br"),t("span",{staticClass:"line-number"},[s._v("12")]),t("br")])]),t("p",[s._v("在上面的例子中,"),t("code",[s._v("BotContext")]),s._v(" 类是一个依赖,它通过依赖注入注入到 "),t("code",[s._v("sayHello")]),s._v(" 方法中。")]),s._v(" "),t("p",[s._v("另一方面,你也可以利用依赖注入来注入你自己的依赖:")]),s._v(" "),t("div",{staticClass:"language-php line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-php"}},[t("code",[t("span",{pre:!0,attrs:{class:"token php language-php"}},[t("span",{pre:!0,attrs:{class:"token delimiter important"}},[s._v("")]),t("span",{pre:!0,attrs:{class:"token property"}},[s._v("userRepository")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$userRepository")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("p",[s._v("在上面的例子中,"),t("code",[s._v("UserRepositoryInterface")]),s._v(" 是一个接口,它的实现类是通过构造函数注入到 "),t("code",[s._v("SampleModule")]),s._v(" 类中的。")]),s._v(" "),t("p",[t("code",[s._v("UserRepositoryInterface")]),s._v("\n定义了从数据库中获取用户信息的方法。对于调用者来说,它并不关心具体的实现类是什么,只需要知道它实现了 "),t("code",[s._v("UserRepositoryInterface")]),s._v("\n接口即可。")]),s._v(" "),t("p",[s._v("因此,我们可以轻易地切换 "),t("code",[s._v("UserRepositoryInterface")]),s._v(" 的实现类,而不需要修改 "),t("code",[s._v("SampleModule")]),s._v("\n类。此外,当需要为该类编写测试时,我们也可以很轻松地模拟或是创建一个伪实现来操作。")]),s._v(" "),t("h2",{attrs:{id:"零配置依赖注入"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#零配置依赖注入"}},[s._v("#")]),s._v(" 零配置依赖注入")]),s._v(" "),t("p",[s._v("如果一个类没有依赖项或只依赖于已经在容器中定义的类,那么你可以不用做任何配置就可以使用依赖注入解析它。")]),s._v(" "),t("p",[s._v("例如:")]),s._v(" "),t("div",{staticClass:"language-php line-numbers-mode"},[t("pre",{pre:!0,attrs:{class:"language-php"}},[t("code",[t("span",{pre:!0,attrs:{class:"token php language-php"}},[t("span",{pre:!0,attrs:{class:"token delimiter important"}},[s._v("")]),t("span",{pre:!0,attrs:{class:"token property"}},[s._v("testService")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),s._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$testService")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v("\n")])])]),s._v(" "),t("div",{staticClass:"line-numbers-wrapper"},[t("span",{staticClass:"line-number"},[s._v("1")]),t("br"),t("span",{staticClass:"line-number"},[s._v("2")]),t("br"),t("span",{staticClass:"line-number"},[s._v("3")]),t("br"),t("span",{staticClass:"line-number"},[s._v("4")]),t("br"),t("span",{staticClass:"line-number"},[s._v("5")]),t("br"),t("span",{staticClass:"line-number"},[s._v("6")]),t("br"),t("span",{staticClass:"line-number"},[s._v("7")]),t("br"),t("span",{staticClass:"line-number"},[s._v("8")]),t("br"),t("span",{staticClass:"line-number"},[s._v("9")]),t("br"),t("span",{staticClass:"line-number"},[s._v("10")]),t("br"),t("span",{staticClass:"line-number"},[s._v("11")]),t("br")])]),t("h2",{attrs:{id:"何时使用依赖注入"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#何时使用依赖注入"}},[s._v("#")]),s._v(" 何时使用依赖注入")]),s._v(" "),t("p",[s._v("我们尽力在框架的大部分地方都支持使用依赖注入,例如命令、路由、中间件等。你可以在这些地方使用依赖注入来获取依赖。")])])}),[],!1,null,null,null);t.default=e.exports}}]);