sk / object-to-string
强化版的 __toString。
v1.0.0
2016-11-20 08:42 UTC
Requires
- php: >=5.5.9
- jms/metadata: ~1.3
- symfony/expression-language: ~2.2 || ~3.0
- symfony/property-access: ~2.2 || ~3.0
Requires (Dev)
- doctrine/annotations: ~1.0
- doctrine/cache: ~1.0
- friendsofphp/php-cs-fixer: ^1.11
- phpunit/phpunit: ~4.8 | ~5.0
- satooshi/php-coveralls: dev-master
- symfony/yaml: ~2.0 | ~3.0
- twig/twig: ~1.12
This package is auto-updated.
Last update: 2024-09-07 01:58:27 UTC
README
就像 php 的 __toString() 方法,但拥有 symfony 表达式语言 的力量。
安装
下载库
打开命令行,进入您的项目目录,并执行以下命令以下载此捆绑包的最新稳定版本
$ composer require sk/object-to-string "dev-master"
此命令要求您全局安装 Composer,请参阅 Composer 文档中的 安装章节。
用法
在您可以使用此库的功能之前,您必须初始化它。根据您的需求,激活您想要的驱动程序。以下是一个包含所有可用驱动程序的全示例
<?php use SK\ObjectToString\Metadata\Driver\AnnotationDriver; use SK\ObjectToString\Metadata\Driver\XmlDriver; use SK\ObjectToString\Metadata\Driver\YamlDriver; use SK\ObjectToString\Metadata\Driver\PhpDriver; use SK\ObjectToString\ObjectToString; use Doctrine\Common\Annotations\AnnotationReader; use Metadata\Driver\FileLocator; use Metadata\Driver\DriverChain; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; $fileLocator = new FileLocator(array('' => realpath('/path/to/config'))); $driverChain = new DriverChain([ new AnnotationDriver(new AnnotationReader()), new XmlDriver($fileLocator), new YamlDriver($fileLocator), new PhpDriver($fileLocator), ]); $metadataFactory =new \Metadata\MetadataFactory($driverChain); $expressionLanguage = new ExpressionLanguage(); $objectToString = new ObjectToString($metadataFactory, $expressionLanguage);
但您也可以只激活一个驱动程序。例如,仅激活注释驱动程序
<?php use SK\ObjectToString\Metadata\Driver\AnnotationDriver; use SK\ObjectToString\ObjectToString; use Doctrine\Common\Annotations\AnnotationReader; use Symfony\Component\ExpressionLanguage\ExpressionLanguage; $metadataFactory =new \Metadata\MetadataFactory(new AnnotationDriver(new AnnotationReader())); $expressionLanguage = new ExpressionLanguage(); $objectToString = new ObjectToString($metadataFactory, $expressionLanguage);
表达式语言
此库使用 symfony/expression-language 作为字符串生成器。因此,您可以使用其所有功能,如缓存、扩展等。
作为额外的好处,对象本身始终可用作 '_this'。
所以,您不用写
/**
* [...]
* @ObjectToString(name="name", format="name", params={"name": "name"})
*[...]
*/
您总是可以用以下内容替换它
/**
* [...]
* @ObjectToString(name="name", format="_this.getName()")
* [...]
*/
配置格式
此库提供了所有常用配置格式,包括注释、XML、Yaml 和 Php。您可以选择使用哪种格式。只需添加驱动程序并开始编写配置。
注释
<?php namespace Acme\Model; use SK\ObjectToString\Annotation\ObjectToString; /** * Class Email * * @ObjectToString(name="name", format="name", params={"name": "name"}) * @ObjectToString(name="email", format="email", params={"email": "email"}) * @ObjectToString(name="email_alternative", format="email", params={"email": "emailAlternative"}) * @ObjectToString(name="full_email", format="name ~ ' <' ~ email ~ '>'", params={"email": "email", "name": "name"}) * @ObjectToString(name="full_email_alternative", format="name ~ ' <' ~ email ~ '>'", params={"email": "emailAlternative", "name": "name"}) * @ObjectToString(name="full_email_validated", format="_this.getName() ~ (_this.isValidated() ? ' (validated)') ~' <' ~ _this.getEmail() ~ '>'") */ class Email { /** * @var string */ private $email; /** * @var string */ private $emailAlternative; /** * @var string */ private $name; /** * @var bool */ private $validated = false; /** * Email constructor. * * @param string $email * @param string $emailAlternative * @param string $name */ public function __construct($name = null, $email = null, $emailAlternative = null) { $this->email = $email; $this->emailAlternative = $emailAlternative; $this->name = $name; } /** * @return string */ public function getEmail() { return $this->email; } /** * @param string $email * * @return Email */ public function setEmail($email) { $this->email = $email; return $this; } /** * @return string */ public function getEmailAlternative() { return $this->emailAlternative; } /** * @param string $emailAlternative * * @return Email */ public function setEmailAlternative($emailAlternative) { $this->emailAlternative = $emailAlternative; return $this; } /** * @return string */ public function getName() { return $this->name; } /** * @param string $name * * @return Email */ public function setName($name) { $this->name = $name; return $this; } /** * @param bool $validated * * @return Email */ public function setValidated($validated) { $this->validated = $validated; return $this; } }
Php
<?php // file: /path/to/config/Acme.Model.Email.php $metadata = new \SK\ObjectToString\Metadata\ClassMetadata( \Acme\Model\Email::class ); $metadata->addToString('name', 'name', array('name' => 'name')); $metadata->addToString('email', 'email', array('email' => 'email')); $metadata->addToString('email_alternative', 'email', array('email' => 'emailAlternative')); $metadata->addToString('full_email', 'name ~ \' <\' ~ email ~ \'>\'', array('email' => 'email', 'name' => 'name')); $metadata->addToString( 'full_email_alternative', 'name ~ \' <\' ~ email ~ \'>\'', array('email' => 'emailAlternative', 'name' => 'name') ); return $metadata;
YAML
# file: /path/to/config/Acme.Model.Email.yml \Acme\Model\Email: name: format: "name" params: name: "name" email: format: "email" params: email: "email" email_alternative: format: "email" params: email: "emailAlternative" full_email: format: "name ~ ' <' ~ email ~ '>'" params: name: "name" email: "email" full_email_alternative: format: "name ~ ' <' ~ email ~ '>'" params: name: "name" email: "emailAlternative"
XML
<?xml version="1.0" encoding="UTF-8" ?> <object-to-string> <class name="\Acme\Model\Email"> <name name="name" format="name"> <param name="name">name</param> </name> <name name="email" format="email"> <param name="email">email</param> </name> <name name="email_alternative" format="email"> <param name="email">emailAlternative</param> </name> <name name="full_email" format="name ~ ' <' ~ email ~ '>'"> <param name="email">email</param> <param name="name">name</param> </name> <name name="full_email_alternative" format="name ~ ' <' ~ email ~ '>'"> <param name="email">emailAlternative</param> <param name="name">name</param> </name> </class> </object-to-string>
A note to xml:
As you can see in this example, you have to escape some characters. Here the characters '<' and '>' are replaced with '<' and 'gt;'.
So if you get a xml error like 'Extra content at the end of the document', make sure your xml is valid.
For more information take a look at:
- [XML escape characters - on stackoverflow.com](http://stackoverflow.com/a/1091953/3972213)
- [Character Data and Markup - on www.w3.org](https://www.w3.org/TR/xml/#syntax)
示例用法
初始化并定义名称后,您现在可以开始使用了
<?php $email = new \Acme\Model\Email('John Doe', 'john.doe@example.com', 'jd@example.com'); echo $objectToString->generate('name', $email) . "\n"; echo $objectToString->generate('email', $email) . "\n"; echo $objectToString->generate('email_alternative', $email) . "\n"; echo $objectToString->generate('full_email', $email) . "\n"; echo $objectToString->generate('full_email_alternative', $email) . "\n"; echo $objectToString->generate('full_email_validated', $email) . "\n"; $email->setValidated(true); echo $objectToString->generate('full_email_validated', $email) . "\n";
输出
John Doe
john.doe@example.com
jd@example.com
John Doe <john.doe@example.com>
John Doe <jd@example.com>
John Doe <john.doe@example.com>
John Doe (validated) <john.doe@example.com>
问题和功能请求
问题和功能请求在 github 上处理。如果您发现了一个错误,您随时可以打开一个问题。也可以自由地创建一个带有修复的 pull request。功能请求也是如此。
许可
此库受 MIT 许可协议保护。请参阅库中的完整许可协议 LICENSE 文件。