【发布时间】:2014-01-28 09:23:16
【问题描述】:
我正在构建一个解析器系统,它将根据请求/cronjob 解析大量不同的 XML/JSON 提要。 我使用 Laravel 4。
线程的目的是在我的上下文中使用 IoC,而不是在自定义类方法中硬编码模型名称
为 Soccer Player 提供一个解析器示例,其 XML 结构如下:
<players category="Midfielders">
<player id="777">
<name>Caio Augusto Paim do Santos</name>
<statistic>
<club name="Camaçari" id="7191" league="Baiano 2" league_id="1136" season="2013" minutes="" appearences="" lineups="" substitute_in="" substitute_out="" substitutes_on_bench="" goals="" yellowcards="" yellowred="" redcards=""/>
我在我的 /app 文件夹中创建了一个名为 /parsers 的附加目录。这些是自定义类,它们都在同一个文件夹中扩展或实现自定义抽象/接口,基本上负责接收 XML/JSON 文件的路径并返回一个结构良好的 PHP 数组。
它们在自动加载的 composer.json 中添加为:"app/parsers"
附件结构截图
一切都很好,代码/类是可测试的,不依赖于其他类,但问题就在这里。
查看 XML 示例,其中有:
<club id="XXX" league_id="YYY" />
这是提要俱乐部 ID 和提要联赛 ID,但我在数据库中有自己的 ID 引用到提要 ID。
就像这个截图:
所以逻辑说:转到数据库,检查联赛表中是否有 id 以及从 XML 文件提供的 feed_id。 如果是,获取它,如果不是,创建一个新的联赛并获取 id 以供将来参考。
这需要我在我的解析器类中使用模型,现在我知道你可以使用 IoC 并将模型注入控制器,但我不确定我是否可以对我的解析器类做同样的事情......
所以在我的解析器类中间做这样的事情:
// Try to get league and season ids from database if they already exists, if not, insert
$leagueId = DB::select('SELECT id FROM league WHERE feed_id=?', array($data['league_id']));
或
$league = new LeagueModel();
非常不正确。
现在只是为了澄清这一切的工作方式,我的解析器在 Laravel Command 类中被调用,如下所示:
/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
$this->setParser();
$this->setStorage();
$this->parser->parseFile($file);
}
Laravel Command 类在我的控制器中被调用,例如:
$stamps = $this->getStamp();
Artisan::call('command:getSoccerPlayer',array('stamps' => $stamps, 'parser_id' => Request::segment(2)));
Controller 本身是通过 URI 调用的:
/jobs/soccer_player/parse?type=soccer&directory=players
**你有什么建议或者你将如何克服这个问题来避免依赖并在这种情况下仍然使用模型与数据库进行交互? **
PS 请不要注意我的屏幕截图上的整个解析逻辑现在都在同一个方法“解析”中,一旦我看到我希望它如何工作/外观的全貌,我会将它分解成碎片。
感谢任何帮助!
【问题讨论】:
-
你避免依赖的目的是什么?您的意思是避免使用依赖注入将模型添加到您的类中吗?您是否检查过接口存储库(“存储库模式”)的使用?
-
我的目的是在解析方法中使用 IoC,而不是硬编码模型名称/查询。我只是不知道怎么做。 Laravel 的社区非常低,而且从不回答。 :(
标签: php xml parsing laravel laravel-4