IoC和接口绑定捕获22

时间:2013-10-16 20:34:12

标签: php interface dependency-injection inversion-of-control laravel-4

因此,在试图在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文件中的

似乎没有做任何事情(但把它放在别名数组中)。当然我在这里做错了。有什么想法吗?

1 个答案:

答案 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。它与您拥有的类似,但我认为类和接口名称可以通过这些小调整使其更具可读性。