php - 在没有类依赖的自定义类/子系统中使用 Laravel 4 模型

标签 php xml parsing laravel laravel-4

我正在构建一个解析器系统,它将根据请求/cronjob 解析不同的 XML/JSON 提要负载。 我使用 Laravel 4。

线程的目的是在我的上下文中使用 IoC,而不是在自定义类方法中硬编码模型名称

为具有 XML 结构的 Soccer Player 提供一个解析器示例:

<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 的附加目录这些是自定义类,它们都在同一文件夹中扩展或实现自定义抽象/接口(interface),基本上负责接收 XML/JSON 文件的路径并返回结构良好的 PHP 数组。

它们在自动加载的 composer.json 中添加为:"app/parsers"

附加文件结构截图enter image description here

一切都很好,代码/类是可测试的,不依赖于其他类,但问题来了。

查看 XML 示例,其中有如下内容: <club id="XXX" league_id="YYY" /> 这是 feed club id 和 feed league id,但我在数据库中有自己的 ID,引用了 feed ID。

就像这张截图:

enter image description here

所以逻辑说:转到数据库,检查联赛表中是否有 XML 文件提供的 feed_id 的 id。 如果是,则获取,如果不是,则创建一个新的联盟并获取 id 以备将来引用。

这需要我在我的解析器类中使用模型,现在我知道你可以使用 IoC 并将模型注入(inject) Controller ,但我不确定我是否可以对我的解析器类做同样的事情......

所以在我的解析器类中间做这样的事情:

// 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 命令类中被调用如下:

/**
* Execute the console command.
*
* @return void
*/
public function fire()
{
    $this->setParser();
    $this->setStorage();
    $this->parser->parseFile($file);
}

Laravel 命令类在我的 Controller 中被调用,例如:

$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

**您有什么建议,或者您将如何克服这个问题以避免依赖性,并在这种情况下仍然使用模型与数据库进行交互? **

P.S 请不要注意我屏幕截图上的整个解析逻辑现在都在同一个“解析”方法中,一旦我看到我希望它如何工作/看起来的完整图片,我就会把它分成几部分。

感谢任何帮助!

最佳答案

你仍然可以调用你的命名空间模型

use App\Models\League; 

class SoccerPlayerParser extends AbstractParser{
    //...

    public function parse()
    {
       //...
        $league = App\Models\League::find($data['league_id']);
       //...
    }

    //....
}

关于php - 在没有类依赖的自定义类/子系统中使用 Laravel 4 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21026782/

相关文章:

php - 将 MySQLi 查询存储在 PHP 变量中

php - 单击数组以加载配置

php - 尝试使用 PDO 在 PHP 中搜索 MySQL 数据库

sql-server - XML 数据到 SQL Server 表

java - 如何在Java中解析JSON

PHPUnit 接收系统日志消息?

java - Android默认白色背景十六进制代码

xml - 为什么 E4X 被弃用并从某些浏览器中删除?

javascript - 如何向 Parse Signup 功能添加额外属性?

javascript - RegEx 解析中间的 MIME 消息体。如何?