2015-02-07 13 views
1

假设以下模型arquitecture:路线模型绑定目标抽象类

namespace MyApp\Models; 

abstract class Person{ 

    abstract function getName(); 
} 

然后,我实现它的应用:

namespace MyApp\Models; 

class Employ extends Person{ 

    public function getName(){ 
     return "Employ"; 
    } 
} 

同为用户:

namespace MyApp\Models; 

class Employ extends User{ 

    public function getName(){ 
     return "User"; 
    } 
} 

这里有趣...我使用我自己的解析逻辑int路由绑定上述模型。

Route::bind('person', function($value) 
{ 
    // this method returns an instace of Employ OR User 
    $person = load_person_from_db($value); 
    return $person; 
}); 

Route::get('test/{person}', function(MyApp\Models\Person $person){ 
    return $person->getName(); 
}); 

问题?当我访问网址...

http://example.com/test/1 

...以下异常触发:

BindingResolutionException in Container.php line 785: 
Target [MyApp\Models\Person] is not instantiable. 

呀!我知道,Person不是实例化,但为什么laravel没有返回的情况下加载由我在这一点? $person = load_person_from_db($value);

+1

如果从路由回调中删除类型提示('MyApp \ Models \ Person'),它能正常工作吗? – lukasgeiter 2015-02-07 19:49:44

+0

大声笑...是的,那个炒锅! – manix 2015-02-07 19:52:53

+0

Laravel 5试图尽可能地做依赖注入,这就是为什么你需要省略它;) – cgross 2015-02-07 20:16:56

回答

1

Laravel试图解决注入到路由闭包中的依赖关系。解决的办法是简单地去掉类型提示:

Route::get('test/{person}', function(MyApp\Models\Person $person){ 
    return $person->getName(); 
}); 

有趣的是,Laravel并检查参数已经被一个模型绑定解决。然而问题在于,它是通过比较类:

Illuminate\Routing\RouteDependencyResolverTrait

protected function alreadyInParameters($class, array $parameters) 
{ 
    return ! is_null(array_first($parameters, function($key, $value) use ($class) 
    { 
     return is_object($value) && get_class($value) === $class; 
    })); 
} 

,是因为你的类型,提示说Person但你的模型绑定的回报别的东西,Laravel试图通过IoC容器来解决的依赖。