假设我有一个关闭:
$object->group(function() {
$object->add('example');
$object->add('example');
});
它不起作用,因为$ object没有在闭包中定义。
注意:未定义的变量:经理
所以我必须use ($object)
:
$object->group(function() use ($object) {
$object->add('example');
$object->add('example');
});
现在我想保持它像第一个一样简单,所以$ object必须注入到闭包中。
Laravel框架以Routes为例:
Route::group(['middleware' => 'auth'], function () {
Route::get('/', function () {
// Uses Auth Middleware
});
Route::get('user/profile', function () {
// Uses Auth Middleware
});
});
我相信Laravel通过 Reflection 类来做到这一点。
我怎么能实现这个目标?
答案 0 :(得分:1)
您的目标是了解如何为闭包提供参数。它是通过call_user_func_array实现的。
让我们在接受闭包的类中定义一个方法。
class MyTestClass
{
public function doWork(callable $callback)
{
return call_user_func_array($callback, [$this]);
}
}
$obj = new MyTestClass();
$obj->doWork(function(MyTestClass $obj) {
//
});
注意:没有进行测试,但我认为你所追求的是什么?
答案 1 :(得分:0)
你不必担心反思。臭名昭着的Laravel的依赖注入容器将为您处理它。
您所需要的只是告诉他在class
或interface
类型暗示时注入的内容。
// xXxServiceProvider.php
function register(){
...
this->app->bind('ObjNamespace\ObjClass', function ($app) {
return new ObjNamepsace\ObjClass();
});
}
现在,让我们说你想要一个ObjNamepsace\ObjClass
路由句柄。
Route::get('user/profile', function (ObjNamepsace\ObjClass $object) {
// $object is resolved via type hinting
});
此外,有三种绑定方法,您可以选择哪种方法适合您的用例:
bind
:每次调用时都会注入一个新实例,Laravel每次都会创建一个新的$对象。
singleton
:注入相同的实例,Laravel将在第一次调用时创建实例,并在每次调用时注入它。如果您想创建$object
一次,请使用它。
instance
:您将class
或interface
绑定到对象实例。