将变量传递给闭包

时间:2017-02-18 09:51:58

标签: php laravel php-7

假设我有一个关闭:

$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 类来做到这一点。

我怎么能实现这个目标?

2 个答案:

答案 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的依赖注入容器将为您处理它。 您所需要的只是告诉他在classinterface类型暗示时注入的内容。

// 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:您将classinterface绑定到对象实例。