因此,在试图在Laravel 4中实现IoC,DI等时,我已经碰壁了。要么我误解了某些事情,要么做了一些可怕的错误,不确定是哪个......
所以我有一个Person类(“业务类”,而不是模型或库):
namespace Entities;
use Interfaces\Person as PersonInterface;
class Person implements PersonInterface {...}
一家工厂:
use Interfaces\Person;
...
App::singleton('user', function($app) {
...
$user_object = new Person();
...
});
并在别名数组中:
'Interfaces\Person' => 'Entities\Person'
问题是不起作用,因为Person类无法实现其接口,因为接口绑定回Person类:
Entities\Person cannot implement Entities\Person - it is not an interface
我似乎陷入了使用IoC和应用程序中的接口阻止类实际实例化的问题。
不知道它是否相关,而是
App::bind('Interfaces\Person','Entities\Person');
routes.php文件中的似乎没有做任何事情(但把它放在别名数组中)。当然我在这里做错了。有什么想法吗?
答案 0 :(得分:2)
也许我可以帮忙。要将接口绑定到IoC,您需要具有接口和接口的实现。看起来你的步骤是正确的。您还想创建一个服务提供者。有关详细信息,请访问:http://laravel.com/docs/ioc#service-providers
从routes.php文件中删除任何绑定。服务提供程序绑定路由,config / app.php在IoC中注册它,如下文所述。
您的服务提供商可能如下所示:
文件名:ServiceProviders / PersonServiceProvider.php
<?php namespace ServiceProviders;
use Illuminate\Support\ServiceProvider;
use Entities\Person;
class PersonServiceProvider extends ServiceProvider {
/**
* Register the binding.
*
* @return void
*/
public function register()
{
$this->app->bind('Interfaces\Person', function()
{
return new Person();
});
}
}
创建服务提供程序后,请在config / app.php文件中注册,如下所示:
'ServiceProviders \ PersonServiceProvider',
不要使用别名。这用于注册外墙的别名,如果我正确理解你的问题,这不是你在这里尝试做的。
最后,为了遵循普遍接受的Laravel命名约定,我建议命名接口文件“PersonInterface.php”及其接口“interface PersonInterface”。类似地,实现文件可能被称为“EloquentPerson.php”,而“EloquentPerson类扩展为PersonInterface”。这假设您正在使用Eloquent。它与您拥有的类似,但我认为类和接口名称可以通过这些小调整使其更具可读性。