sk/object-to-string

强化版的 __toString。

v1.0.0 2016-11-20 08:42 UTC

This package is auto-updated.

Last update: 2024-09-07 01:58:27 UTC


README

Build Status SensioLabsInsight Coverage Status

就像 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 ~ ' &lt;' ~ email ~ '&gt;'">
            <param name="email">email</param>
            <param name="name">name</param>
        </name>
        <name name="full_email_alternative" format="name ~ ' &lt;' ~ email ~ '&gt;'">
            <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 '&lt;' 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 文件。