使用依赖注入的多个接口实现的最佳方法

时间:2014-05-15 16:27:17

标签: php laravel laravel-4

我已经看到了一些类似的问题,但我还没有找到一个很好的解决方案,从界面一直到控制器。

我的问题:

我有几种不同类型的应用程序需要重新启动,每种应用程序都有自己的逻辑来重启应用程序(SSH,API调用等)。我已经设置了一个接口,因为虽然逻辑不同,但它们都需要一些类似的功能。我还创建了3个类,每个应用程序实现该接口。我遇到问题的地方是了解保持逻辑尽可能从控制器中抽象出来的最佳方法。

有些问题:

我是否还要创建一个Abstract类? 这应该是一个处理所有类型并选择正确类型的控制器吗? 我只是将不同的类注入控制器?

代码:

RestartInterface.php

<?php  namespace Application\Service\Restart;

   interface RestartInterface {

       public function start();

       public function stop();

       public function restart();
   }

实施课程的示例:

<?php namespace Application\Service\Restart\AppOne;

   use Application\Service\Restart\RestartInterface;

    class AppOneRestart implements RestartInterface {

       public function start() {

       }

       public function stop() {

       }

       public function restart() {

       } 

   }

我如何使用服务提供商尽可能保持模块化? 在这种情况下最好的做法是什么,我希望能够使用许多或尽可能少的重启实现。

谢谢!

1 个答案:

答案 0 :(得分:1)

抽象类是一种创建基类的方法,你不需要你的开发人员直接实例化,因为通常,它仍然缺少代码,比如,方法没有完全实现。因此,您创建一个抽象,实现具体重启类的常用方法

abstract class Restart {

   public function restart() {

   } 

}

然后逐个实现扩展抽象并创建缺少方法的类:

class AppOneRestart extends Restart implements RestartInterface {

   public function start() {

   }

   public function stop() {

   }

}

选项1

如果您的整个应用程序可以使用它的单个实现,并且您只需要能够从一个应用程序交换到另一个应用程序,因为您的业务以某种方式发生了变化,一个简单的绑定就可以解决这个问题:

App::bind('RestartInterface', 'AppOneRestart');

选项2

如果在请求期间您可能需要一个或另一个,您可能需要实现工厂模式:http://en.wikipedia.org/wiki/Factory_method_pattern,因此您将工厂注入控制器:

class RestartApiController extends Controller {

    public function __construct(RestartFactory $factory)
    {
        $this->restart = $factory->make('api');
    }

}