在CodeIgniter应用程序中实现服务层的正确方法

时间:2016-11-06 17:21:15

标签: php codeigniter oop service-layer

以下是在CodeIgniter应用程序中实现服务层的两种方法。

第一种方法 enter image description here

1.send request to the controller 
2.calling service layer methods from controller
3.return processed result data set(D1) from service layer to controller 
4.then according to that data set controller demand data from model
5.model return data set(D2) to the controller
6.then controller send second data set(D2) to view.

第二种方法

enter image description here

1.send request to the controller
2.calling service layer methods from controller
3.service layer demand data from model
4.model send requested data set(d1) to the service layer
5.after some processing return generated data(d2) to controller from service layer
6.then controller send data set(d2) to view. 

在CodeIgniter中实现服务层的正确方法是什么?除了这两种方法,还有其他好办法吗?

如果你能在Code中提供一个例子那就很棒

4 个答案:

答案 0 :(得分:10)

  

请注意,这不一定是正确的方法,但我要解释一个类似的框架通常会如何做,然后你可以了解其他方法并决定最好的方法为你的用例。因此,我不希望这个答案是正确的答案,但我希望它至少能够提供一些关于事情如何完成的知识,然后才会真正知道他们正在谈论的内容是什么时候出现的。那些人 - 请随时编辑/关注这个答案:D)。最后,这也与CodeIgniter无关,而与一般的框架无关。您的问题不仅应与框架无关,还应与语言无关。

所以我在这里提出一个意见,那就是所有现代框架,特别是在PHP中,不做MVC 。为什么这很重要?因为我们都需要说同一种语言,并且' mvc'在PHP中不存在。这是事实。接受,然后我们可以继续推进框架使用的概念的混合;和CodeIgnitor是一个特别好的MVC'私生子;从此以后被称为" mvc"用引号。

好的一面是,像Symfony这样的框架提供了一个初步的自以为是的架构,至少在整个应用程序中包含某种形式的一致性,它是这样的:

  1. 标准HTTP请求进入并命中前端控制器,通常为app.phpapp_dev.php,具体取决于您是否处于开发或生产阶段;一个涉及需要在每个更改上运行的大量缓存,另一个不包含 - 这对于开发来说是完美的。

  2. 路由器将当前网址与控制器类和“操作”匹配。 (方法)在该类中。

  3. 框架的依赖注入部分确定了从控制器到模型层和返回所需的所有对象,并在需要时实例化或准备实例化它们。

  4. 控制器使用任何必需的依赖项进行实例化,并执行相关方法。这通常是您开始开发并将代码挂钩的地方。到框架。

  5. 这是您决定架构的地方,但是,从开发人员的角度和业务角度来看,最重要的是(为了降低未来维护成本)一致性

  6. 我个人更喜欢确保我的代码与框架分离。我将从请求中获取的标量传递到应用程序层服务,该服务使用模型层中的对象(通过DI传入)来使用域对象。这里的要点是域对象不是直接传递给控制器​​,它们是通过应用层介质代理的,所以理论上你可以替换围绕它的整个框架,你需要做的就是将这些标量传递到这一层在它们到达模型层之前它们仍然可以工作(想想CLI调用,不再需要控制器)。

  7. 应用程序级服务使用任何必需的RepositoriesServices等(并将这些标量传递给它们,记住分离?),它们执行业务逻辑,(通常这些是您的设计模式在日常工作中发挥作用),然后将该数据返回到应用程序级服务。

  8. 然后服务将数据返回给控制器并猜测是什么?这是框架往往搞砸的地方!因为没有" View"在今天的框架中。只有一个模板,您将该数据传递给模板并将其传递给bam。因此,在您的图表中,绝对没有视图的概念,因为这不是事情的完成方式。说实话,我仍然使用模板,因为它们是最快速的做事方式,但是在现代框架将它们放在一起并实际开始使用视图之前,我们运气不好,当面对一些事实(如Laravel)将自己称为" mvc"时,我们必须坚持不懈。构架。

  9.   

    注意,Fabien Potencier明确指出Symfony不是MVC框架 - 至少他知道他在那里谈论什么。同样,这是纯粹主义者,重要的是我们在计算中都说相同的,事实上正确的语言。

    所以,因为你非常喜欢图表,所以有些人可以用今天的框架来做这些...

    architecture 这适用于对每个Review都有CriteriaReview概念的应用程序。而且,甚至不让我开始使用Symfony表单,他们与他们并不是任何架构的重要部分相关联。

    您需要多少层?我们已经拥有" MVC",在DDD中我们有"应用","域"和"基础设施"分离,所以先让两个人一起工作,然后这个"服务层"?你真的需要另一层,还是足够上面?需要考虑的事情......

    Extra architecture

    请注意,您不会因为这种分离而无法使用框架/ http请求来启动应用程序

    查看"服务"在上图中?它们与控制器分离,因此您可以从任何地方抛出标量,应用程序仍然可以正常工作。 我认为这会为您提供所需的分离。以正确的方式做事,学习如何去做,然后学习如何控制自己,并在涉及业务及其需求时务实地做到这一点很棒,但框架需要排序他们的东西 - 你肯定不会用CodeIgniter编写可爱的代码;)

答案 1 :(得分:0)

依赖注入和适配器模式将是一个很好的起点。 CodeIgniter支持既不开箱即用,所以你需要编写一个包装器或者一个钩子。

您的视图只能支持xml | html,因为json需要预先渲染到.json文件然后作为输出返回,但这需要通过代码完成,在这种情况下返回对象更容易并在前端改变。 PHP是一种与(xml | html)

一起使用的嵌入式语言

注入服务模型时效果最佳(依赖注入) 进入控制器/模型,并列为该控制器/模型的属性。

然后将服务绑定到接口

例如facebook / twitter 它们都有请求和响应功能,但都遵循类似的模式,但有不同的端点。

interface SocialMediaAdapter{
  public request(url);
  public response();
}
public class FaceBookProvider implements SocialMediaAdapter
{
     public request(url){

     }
     public response(){

     }

}

public class TwitterProvider implements SocialMediaAdapter
    {
         public request(url){

         }
         public response(){

         }
    }
public class SocialMediaServiceProvider{

    protected $provider = null;

    public function constructor(SocialMediaAdapter $provider){
       $this->provider = $provider;
    }

    public function fetch($url){
       return $this->provider->request($url);
    }
}

此处需要依赖注入

new MyController( new SocialMediaServiceProvider ( new FacebookService ) )

答案 2 :(得分:-1)

恕我直言,这里没有对错:

选项#1 - 如果要在多个控制器/操作中重用服务层 并根据第一个有意义的请求从不同模型中提供数据。

选项2# - 但是,如果您的数据模型更复杂,则第一个选项可能会出现问题。如果根据第一个呼叫的数据需要对模型进行第二次呼叫怎么办?使用此业务逻辑的控制器违背了服务层的整个目的。在这种情况下,最好选择第二个。

我认为第二个是更常见的一个。

答案 3 :(得分:-2)

你应该使用第一个。因为在MVC Web应用程序中,控制器用于将业务逻辑与视图分离,所以它类似于网关。您需要使用控制器开始处理您的信息,您应该从控制器中调用模型或服务层或任何您需要的信息。最后你应该从这里将数据返回给任何其他来源。您的视图或服务层不应直接访问模型。