fetchleo / laravel-xml
将 Eloquent 模型转换为 XML,以及普通对象。
Requires
- illuminate/database: ^5.2
- illuminate/support: ^5.2
- mockery/mockery: ~0.9
- orchestra/testbench: ~3.0
Requires (Dev)
- php: >=7.0.0
- phpunit/phpunit: 4.*
This package is not auto-updated.
Last update: 2024-09-23 07:12:38 UTC
README
再也不用操作 XML 了!(希望如此。)
请注意:LaravelXML 可能存在一些问题。欢迎提交 pull request!
此包针对 Laravel 框架。未来可能会创建一个独立版本。
你是否曾经尝试将各种类型的值转换为 XML?也许你需要实现一个“导出为 XML”功能。如果是的话,你可能知道 XML 可以是一个非常 痛苦 的事情。
LaravelXML 旨在解决这个问题。可以轻松地修改转换对象的方式和时间。你甚至可以编写自己的代码来扩展它!这有多酷?
如果你在应用程序中使用 XML,LaravelXML 是你的一个不错的选择!
先决条件
要使用 LaravelXML,实际上没有具体的要求。只需确保你已经安装了 xml
PHP 扩展!你可以通过运行 php -i | grep xml
并查看是否有任何返回来检查是否已安装。如果运行该命令后没有任何显示,你需要安装 XML 扩展。
你还必须有 PHP 7.0 或更高版本。
安装
安装快速简单。你只需要运行
composer require fetchleo/laravel-xml dev-master
目前还没有稳定的版本。我打算再做一些测试工作,直到确定一切正常才会发布版本。
一旦完成,请确保在 config/app.php
中注册包的 service provider,通过添加以下行
FetchLeo\LaravelXml\XmlServiceProvider::class
实际上,你真的不需要做任何事情!当然,你可以随时修改配置,这将在下面介绍。
配置
如果你想发布 LaravelXML 配置文件,只需运行
php artisan vendor:publish --tag=laravel-xml
使用
默认情况下,LaravelXML 应该可以正常工作!无需立即设置任何奇怪的设置。除非,当然,你喜欢这样做,在这种情况下,请继续阅读。
转换值
LaravelXML 提供了一种快速将值转换为 XML 的方法。请注意,由于某些限制,某些类型的值不能单独转换。然而,它们可以包含在其他可以转换的值(如数组等)中。
以下是非自转换类型:
- 整数(或双精度浮点数/浮点数)
- 字符串
这意味着除非它们包含在可以转换的其他值(如数组等)中,否则它们不能被转换。因此,调用 Xml::convert(1)
会抛出异常。 这将被很快改变!你可以指定你自己的转换器来处理这些类型。也可能提供默认的转换器。
不管怎样,让我们继续...
要将值转换为 XML,只需调用 Xml::convert($value)
,确保导入 FetchLeo\LaravelXml\Facades\Xml
。在底层,LaravelXML 尝试为该值找到一个合适的转换器。如果没有找到合适的转换器,将抛出异常。你可以指定并创建自己的转换器;请继续阅读以了解如何操作!
自定义转换器
除了默认提供的转换器外,你还可以创建自己的转换器。
首先,您应该创建一个新的类,该类实现了FetchLeo\LaravelXml\Contracts\Converter
接口。
它看起来可能像这样
<?php namespace My\App\Namespace; use FetchLeo\LaravelXml\Contracts\Converter; use SimpleXMLElement; use FetchLeo\LaravelXml\Exceptions\CantConvertValueException; class MyCustomConverter implements Converter { /** * Convert a value to XML. * * @param Model $value * @param SimpleXMLElement $element * @return SimpleXMLElement * @throws CantConvertValueException */ public function convert($value, SimpleXMLElement $element) : SimpleXMLElement; /** * Determine if this converter can convert the given value. * * @param mixed $value * @param $type * @return bool */ public function canConvert($value, $type) : bool; }
然后,您可以在您的config/laravel-xml.php
文件中配置新的转换器。请注意:如果您没有此文件,请运行 php artisan vendor:publish --provider=FetchLeo\LaravelXml\XmlServiceProvider
。
您需要做的是进入converters
中的custom
数组。然后,您需要添加一个新的条目。键应该是像models
或objects
或arrays
或collections
或任何其他内容!注意:当前,转换器只能处理一种类型的值(除了字符串和数字外,您可以选择任何值。)这可能在将来改变。
值应该是您的新类的名称。如果您使用Laravel的IOC容器注册了别名,您可以使用该别名,如果您想的话。例如
'custom' => [
// ...
'models' => 'My\App\Namespace\MyCustomConverter'
]
除了指定适用于相同泛型类型的所有值的单个转换器之外,您还可以为某些类指定特定的转换器!所以,如果您只想让类型为My\App\Namespace\CustomThing
的值应用转换器,您可以这样做
'custom' => [
// ...
'My\App\Namespace\CustomThing' => 'My\App\Namespace\MyCustomConverter'
]
这将告诉LaravelXML:“嘿,只有当我给你这个类型的值时,才使用这个转换器!”如果LaravelXML找不到合适的自定义转换器,它会足够聪明地回退到默认转换器。
注册您的转换器
如果您想为您的转换器使用自定义名称,而无需手动在IOC容器中注册它,您可以这样做
app('laravelxml.converters.manager')->register('name-here', $converterInstance)
LaravelXML会为您做所有工作;它负责将所有内容绑定到容器中,因此您无需担心这些内容。
智能键
LaravelXML足够智能,能够动态地假设应该使用哪些键,如果没有合适的键。包含此功能的原因是XML不接受数字作为键。如果您正在处理对象的数组,您肯定会遇到数字键。LaravelXML不会因为无法使用数字键而崩溃,而是会尝试智能地确定要使用的键。这99.99%有效。(可能是100%)
假设您有一个名为projects
的键的数组(或集合)。在该数组内部,有许多看起来像这样的元素
[
'id' => 42,
'name' => 'Testing event',
'description' => '...',
'user' => [
'id' => 56,
'name' => 'John Doe',
'email' => 'doe@some-email-provider.com'
]
]
现在,这个数组没有任何顶级键(全部是)。它只是一堆数组(嵌套在数组中!)通常,如果您尝试将其转换为XML,您的浏览器会通知您存在语法错误。为什么?因为当没有设置键时,PHP会使用数字作为键。记住,数字不被接受为XML标签名!
因此,LaravelXML有一个“提供键”系统。当其中一个基础转换器检测到数组时,它会将第三个参数传递给转换函数。第三个参数的值将被该转换器用作键。如果由于某种原因没有设置,它将使用值的类型作为“回退键”。
注意:此功能默认不包含!您有责任实现它! 要了解它是如何工作的,请查看以下文件中的任何文件: src/FetchLeo/LaravelXml/Converters/ArrayConverter
,src/FetchLeo/LaravelXml/Converters/ModelConverter
,src/FetchLeo/LaravelXml/Converters/ObjectConverter
转换器列表
以下是默认提供的不同转换器以及它们可以处理的值类型。
结论
我希望LaravelXML能够满足您的项目需求!我已经花费了大量时间确保它能够正常工作。当然,如果您发现任何错误,请打开一个问题,如果您有修复方法,甚至可以创建一个pull request!
即将推出新功能!
待办事项
- 添加将非对象类型转换为XML(字符串、数字等)的部分支持这可能会通过向XML元素添加单个子元素来实现,其中键是值类型,值则是...值。
- 在配置文件中添加新设置
- 将外观绑定设置为可选。
- 公开更多私有API方法(对于其中一些方法,没有必要将其设为私有)
附言。 所有测试都通过了!