Laravel容器服务(Macro宏,动态给类添加方法)
原创
©著作权归作者所有:来自51CTO博客作者廖圣平_的原创作品,请联系作者获取转载授权,否则将追究法律责任

在服务提供者里面有两个方法 register
和 boot
容器的运行顺序是,先注册。
注册完之后 boot 可以调用 register
的服务,在boot 就可以操作自定义的操作了,比如Macro
宏。
在Laravel 框架中,自带Macro
的服务有:
门面
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
也就是说 你可以通过 Macro
大改特改的自定义框架里面的方法,具体如何修改、新增框架里面的方法。可以看下面两个例子:
使用宏(Macro)来扩展 Laravel 的数据库请求构建器
神奇的 Laravel 宏指令(Macro)
在本文中列举 在普通运用中如何使用 Macro,并且在其他php框架也可以运用的方法。其实,很容易想到魔术方法就可以动态的添加方法并执行。
说到这边同学们也可以试着自己写一个给类添加动态方法。
Laravel的创始人用 trait类 把 Maro 封装成包独立出来了,也就是你 在 Tp 或者Yii 使用这个包,也可以使用宏。
https://packagist.org/packages/illuminate/macroable
例子
创建一个服务:
<?php
namespace App\Services;
use Illuminate\Support\Traits\Macroable;
class Eat
{
use Macroable;
public function kuaizi(){
echo '筷子';
}
//缺少饭的方法
}
实现 Eat 方法中动态添加 fan
(吃饭的饭) 方法
$this->app->singleton('eat', Eat::class);
在 boot
$eat = $this->app->make('eat');
$eat->macro('fan', function () {
echo '吃饭';
});
控制器:
<?php
namespace App\Http\Controllers;
class Eat
{
public function eat()
{
app('eat')->kuaizi();
app('eat')->fan();
}
}
如果我们没有添加fan 的方法则会报:

添加路由
/**
* 宏的运用
*/
Route::get('eat',[\App\Http\Controllers\Eat::class,'eat']);

git add .
git commit -m boot和macro的运用
git push
代码库