0

所以在试图实现的IoC,DI,等在Laravel 4,我碰了壁。无论是我误解的东西或做一些可怕的错误,不知道哪个...国际奥委会和接口绑定挂钩22

所以我有一个类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和接口赶上22日被抓实际实例化。

不知道,如果是相关的,但把

App::bind('Interfaces\Person','Entities\Person'); 

在routes.php文件的文件似乎并没有做任何事情(但是把它的别名数组中一样)。当然,我在这里做错了事。有任何想法吗?

回答

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”及其接口“界面PersonInterface。”同样,实现文件可能被称为“EloquentPerson.php”和“类EloquentPerson扩展PersonInterface”。这假设你正在使用雄辩。它与你所拥有的相似,但我认为类和接口名称可以通过这些小小的调整使它更具可读性。

+0

服务商!这就是我所错过的。现在一切正常。非常感谢。好的接口命名建议;我有太多名为“Person.php”的文件,并将该名称空间别名为“PersonInterface”... – Osan