假设以下模型结构:
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触发以下异常的...the:
BindingResolutionException in Container.php line 785:
Target [MyApp\Models\Person] is not instantiable.是的!,我知道Person不是可实例化的,但是为什么laravel现在不返回我加载的实例呢?$person = load_person_from_db($value);。
发布于 2015-02-07 20:37:29
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容器解决依赖关系。
发布于 2021-08-05 05:15:05
您可以使用app()->bind(%抽象类%,%实现%)(例如,在控制器的__construct方法中),路由器将解析您的模型
https://stackoverflow.com/questions/28386325
复制相似问题