无法解决的依赖解决
Unresolvable dependency resolving
我的 routes.php 项目中有以下代码。
class Foo {
public function __construct($name) {
}
}
$app->get('/', function () {
return "Ola, mundo! :)";
});
$app->group(['middleware' => 'authAPI', 'prefix' => 'api'], function () use ($app) {
$app->post('v1/payment/create', function(Foo $api){
dd($api);
});
});
当我尝试访问我的 /api/v1/payment/create 时出现错误:
Unresolvable dependency resolving [Parameter #0 [ <required> $name ]] in class Foo
显然我没有将任何值传递给 $name。我的问题是如何去做,最简单和正确的方法。
您需要向 IOC 容器添加绑定。
https://laravel.com/docs/5.2/container#binding
在Lumen中,$app
是容器的一个实例,所以可以在同一个文件中进行如下绑定:
class Foo
{
public function __construct($name)
{
}
}
$app->bind(Foo::class, function($app){
return new Foo('David');
});
$app->get('/', function () {
return "Ola, mundo! :)";
});
$app->group(['middleware' => 'authAPI', 'prefix' => 'api'], function () use ($app) {
$app->post('v1/payment/create', function(Foo $api){
dd($api);
});
});
可能您想在服务提供商中执行此操作,但由于您的示例代码有一个 class 定义的内联,我认为这是描述解决方案的最简单方法
编辑以解决 $name
参数变化很大的情况,有几种处理方法。
放弃 IOC,只在路由闭包中创建 Foo 实例:
$app->get('blah', function(){
$foo = new Foo('blahblah');
});
$app->get('splarg', function(){
$foo = new Foo('blobblob');
});
改变 Foo
并添加一个 setName
方法:
class Foo
{
private $name;
public function setName($name)
{
$this->name = $name;
}
}
$app->get('blah', function(Foo $foo){
$foo->setName('blahblah');
});
$app->get('splarg', function(Foo $foo){
$foo->setName('blobblob');
});
创建一个 FooFactory
并注入:
Class FooFactory
{
public function createFoo($name)
{
return new Foo($name);
}
}
$app->get('blah', function(FooFactory $factory){
$foo = $factory->createFoo('blahblah');
});
$app->get('splarg', function(FooFactory $factory){
$foo = $factory->createFoo('blobblob');
});
我的 routes.php 项目中有以下代码。
class Foo {
public function __construct($name) {
}
}
$app->get('/', function () {
return "Ola, mundo! :)";
});
$app->group(['middleware' => 'authAPI', 'prefix' => 'api'], function () use ($app) {
$app->post('v1/payment/create', function(Foo $api){
dd($api);
});
});
当我尝试访问我的 /api/v1/payment/create 时出现错误:
Unresolvable dependency resolving [Parameter #0 [ <required> $name ]] in class Foo
显然我没有将任何值传递给 $name。我的问题是如何去做,最简单和正确的方法。
您需要向 IOC 容器添加绑定。 https://laravel.com/docs/5.2/container#binding
在Lumen中,$app
是容器的一个实例,所以可以在同一个文件中进行如下绑定:
class Foo
{
public function __construct($name)
{
}
}
$app->bind(Foo::class, function($app){
return new Foo('David');
});
$app->get('/', function () {
return "Ola, mundo! :)";
});
$app->group(['middleware' => 'authAPI', 'prefix' => 'api'], function () use ($app) {
$app->post('v1/payment/create', function(Foo $api){
dd($api);
});
});
可能您想在服务提供商中执行此操作,但由于您的示例代码有一个 class 定义的内联,我认为这是描述解决方案的最简单方法
编辑以解决 $name
参数变化很大的情况,有几种处理方法。
放弃 IOC,只在路由闭包中创建 Foo 实例:
$app->get('blah', function(){
$foo = new Foo('blahblah');
});
$app->get('splarg', function(){
$foo = new Foo('blobblob');
});
改变 Foo
并添加一个 setName
方法:
class Foo
{
private $name;
public function setName($name)
{
$this->name = $name;
}
}
$app->get('blah', function(Foo $foo){
$foo->setName('blahblah');
});
$app->get('splarg', function(Foo $foo){
$foo->setName('blobblob');
});
创建一个 FooFactory
并注入:
Class FooFactory
{
public function createFoo($name)
{
return new Foo($name);
}
}
$app->get('blah', function(FooFactory $factory){
$foo = $factory->createFoo('blahblah');
});
$app->get('splarg', function(FooFactory $factory){
$foo = $factory->createFoo('blobblob');
});