下面由laravel开发入门教程栏目给大家介绍神奇的 laravel 宏指令(macro),希望对需要的朋友有所帮助!
可曾有过想要的一项功能在 laravel 中,但它又不是真实存在的?让我来给你介绍一下 laravel 宏指令。宏指令允许你添加自定义功能到 laravel 的内部组件里去。
让我们以一个简单的 request 门面方法为例。
request::macro('introduce', function ($name) { echo 'hello ' . $name . '!';});request::introduce('caleb'); // outputs "hello caleb!"
一个更加实用的 request 宏指令是用于检测当前的 tld(顶级域:.com,.net,.org,.etc…)。
request::macro('tldis', function ($tld) { return str::is('*.' . $tld, $this->root());});request::tldis('com') // returns true for app.comrequest::tldis('dev') // returns false for app.com
你会注意到 laravel 自动绑定 $this 到 request 的上线文中,而不是在一个已经定义宏的类里。比如:
class appserviceprovider{ public function boot() { request::macro('context', function () { return get_class($this); } }...request::context(); // returns 'illuminate\http\request'// instead of 'app\appserviceprovider'
让我们看一个更高级的示例。此宏有条件地基于当前 tld 在模型上添加一个 where 语句。
builder::macro('whentldmatches', function($tld, $callback) { if (request::tldis($tld)) { call_user_func($callback->bindto($this)); } return $this;});somemodel::whentldmatches('org', function () { $this->where('id', '>', 5);})->get();// applies ->where() 在 app.org 上应用,而不在 app.com 上应用
我们应该在哪里定义它们?
服务提供者为为您的应用程序定义宏的好地方。app\providers\appserviceprovider boot() 是 i 一个很好的注入点,但是它很快就变得臃肿。
下一步是创建一个 app\providers\macrosserviceprovider 并注册在 config/app.php 里。 如果某宏与之相关,我可能会创建一个 app\providers\tldawareserviceprovider 来容纳所有与 tld 相关的宏。
哪些组件是 macroable?
宏可以再任何具有 macroable 特性的类上定义。下面是一个 macroable 的门面和类的列表
门面
● cache
● file
● lang
● request
● response
● route
● url
illuminate classes
● illuminate\cache\repository
● illuminate\console\scheduling\event
● illuminate\database\eloquent\builder
● illuminate\database\eloquent\relation
● illuminate\database\query\builder
● illuminate\filesystem\filesystem
● illuminate\foundation\testing\testresponse
● illuminate\http\redirectresponse
● illuminate\http\request
● illuminate\http\uploadedfile
● illuminate\routing\responsefactory
● illuminate\routing\router
● illuminate\routing\urlgenerator
● illuminate\support\arr
● illuminate\support\collection
● illuminate\support\str
● illuminate\translation\translator
● illuminate\validation\rule
动手
如果您发现自己在整个系统中对 laravel 组件重复执行逻辑,请考虑使用宏以实现更好的表达和重用。相信我,非常馋。
祝您好运!
更多laravel框架技术文章,请访问laravel教程!
以上就是laravel 宏指令(macro)的详细内容。