【问题标题】:How are separate responsibilities created in symfony?symfony 中如何创建单独的职责?
【发布时间】:2017-01-26 10:28:44
【问题描述】:

这个问题有点难以解释,但我会尽力而为。

说,我正在创建一个工作添加聚合器站点。为此,我将爬过 10 个工作站点,解析 HTML 并得到所有的果汁。

现在,由于每个网站的模板、网址和它们包含的信息量都是独一无二的,所以有些东西告诉我抓取部分 应单独组织。

通常情况下,我可以将它们放在一起

class CrawlerController extends Controller {

    public function fooDotComAction(){

    }

    public function barDotNetAction(){

    }
}

你可以看到上面仍然比将我所有的爬虫逻辑转储到 DefaultController 中要好, 但即使是我的示例似乎也没有效率或模块化。

这似乎是一种不好的做法,如果 Symfony 中有某种功能,我正在徘徊 为此类问题提供了实现或指南。

【问题讨论】:

  • 在控制器中进行爬行似乎是一个糟糕的开始。您可能想要创建一个进行爬取的服务。一个好主意可能是为每个站点编写一个服务/类以进行爬网,理想情况下实现一个通用接口。实际运行这些服务会更适合从命令行,因此您可能需要考虑为此编写命令。
  • @Gerry 是的,这听起来像我想要的。现在的问题是找出服务是什么,如何创建并将其集成到应用程序中
  • 服务基本上是一个普通的 PHP 类,例如FooDotComCrawler。编写完成后,您可以在 DIC 中注册它以在您的控制器和命令中使用,请参阅symfony.com/doc/current/service_container.html
  • 这主要是基于意见的问题,因此不太适合 SO。不过,还是不要想太多。根据你目前的能力进行开发,阅读设计模式和 SOLID 原则,查看其他实现,模式会一点一点地为你出现。但是,无论您最终选择何种设计,无论您的经验水平如何,在一段时间内都会显得过时。 现在拥有功能性的东西比完美永远不会更好。

标签: php oop design-patterns symfony


【解决方案1】:

您的问题过于宽泛,但您已经找到适合您需求的设计模式然后实施它。您需要创建 php 类并将它们声明为服务。

Symfony 提倡面向服务架构的理念,并拥有强大的关注点分离解决方案:The Dependency Injection Component。简而言之,该组件提供了implementation of the Service Container:一个用于配置、绑定和创建单独服务对象的工具。

您的业务代码将包含在域服务中,您的控制器将仅组织输入和输出并调用域服务

【讨论】:

  • 但是这个答案是多种多样的,你有什么技术解决方案吗?我会阅读手册,但一个例子很有帮助
  • @mvrht,对于一个非常开放的问题,你不能指望一个非常具体的答案。
  • @Gerry 是的,我知道这让我很困惑
  • @mvrh 不抱歉,但你可以在 github 上查看一些项目?
【解决方案2】:

查看https://codereviewvideos.com/blog/symfony-compiler-pass-tutorial/

以及 2 个链接的视频和说明。 (1, 2)

它将向您展示如何以干净的方式分离每个“爬虫”,使用标记的服务和编译器通道,我认为这是一种干净的方式。

【讨论】:

  • 视频已不存在
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2011-11-16
  • 1970-01-01
相关资源
最近更新 更多