2017-02-18 47 views
1

可以说我有一个封闭:传递变量来关闭

$object->group(function() { 
    $object->add('example'); 
    $object->add('example'); 
}); 

因为$对象未在封闭定义它不会工作。

注意:未定义的变量:经理

所以我不得不use ($object)

$object->group(function() use ($object) { 
    $object->add('example'); 
    $object->add('example'); 
}); 

现在我想保持它作为简单的第一个这样莫名其妙$对象必须被注入进入关闭。

的Laravel框架这是否符合路由例如:

Route::group(['middleware' => 'auth'], function() { 
    Route::get('/', function() { 
     // Uses Auth Middleware 
    }); 

    Route::get('user/profile', function() { 
     // Uses Auth Middleware 
    }); 
}); 

我相信Laravel这是否与反思类。

我怎么能做到这一点?

+0

我发现'function()use($ object)'绝对没有错。另一种方法没有什么更清洁的。绝对zilch。 –

+0

我只是想知道Laravel是如何做到这一点的。 –

+0

Laravel使用'static'。你正在使用对象。 –

回答

0

你的目标是知道如何提供一个参数给闭包。这是通过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) { 
    // 
}); 

注意:没有测试,但我认为这就是你之后?

+0

在这种情况下,你仍然需要设置参数,对吧?我想像Laravel那样做。所以不知何故依赖被注入到闭包中。也许它的内容被克隆并附加到?我没有任何线索。 –

+0

我发现了一个非常丑陋的做法,所以我决定坚持使用参数。你可以做的是获得方法的内容,就像这样:http://stackoverflow.com/questions/7026690/reconstruct-get-code-of-php-function。然后使用'create_function'来创建一个函数,它接受一个参数然后注入依赖关系。 –

+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绑定到对象实例。

+0

laravel路线是我想达到的一个例子。这个项目不是在Laravel –

+0

为什么Laravels服务容器“臭名昭着” –

+0

据我所知,依赖注入的使用在跨框架没有太大差别。同样的原则适用于任何地方 – motia