Laravel容器服务(Macro宏,动态给类添加方法)_php

在服务提供者里面有两个方法 ​​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 的方法则会报:

Laravel容器服务(Macro宏,动态给类添加方法)_Laravel_02

添加路由

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

Laravel容器服务(Macro宏,动态给类添加方法)_php_03

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

​代码库​