1. Go to this page and download the library: Download foorg/moose library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use moose\Mapper;
use moose\metadata\AnnotationMetadataProvider;
use Doctrine\Common\Annotations\AnnotationReader;
use function moose\default_coercers;
$reader = new AnnotationReader();
$mapper = new Mapper(new AnnotationMetadataProvider($reader), default_coercers());
$result = $mapper->map(Message::class, $json);
use moose\annotation\Field;
use moose\annotation\exception\InvalidTypeException;
use function moose\type;
/**
* @Annotation
* @Target({"PROPERTY", "ANNOTATION"})
*/
class CommaArrayField extends Field
{
public $T;
public $separator;
public function __construct(array $options)
{
if (isset($options["value"])) {
$options["T"] = $options["value"]; // "value" is always the unnamed first argument of an annotation, if any
}
if ( ! isset($options["T"]) || ! $options["T"] instanceof Field) {
throw new InvalidTypeException(self::class, "T", Field::class, type($options["T"]));
}
if ( ! isset($options["separator"])) {
throw new InvalidTypeException(self::class, "separator", "string", "null");
}
parent::__construct($options);
}
public function getArgs()
{
return [$this->T, $this->separator]; // this will be placed in $metadata->args
}
public function getTypeName(): string
{
return "comma_array";
}
}
use moose\coercer\TypeCoercer;
use moose\Context;
use moose\ConversionResult;
use moose\error\TypeError;
use moose\metadata\TypeMetadata;
use function moose\type;
class CommaArrayCoercer implements TypeCoercer
{
public function coerce($value, TypeMetadata $metadata, Context $ctx): ConversionResult
{
if ( ! \is_string($value)) {
return ConversionResult::error(new TypeError("string", type($value)));
}
if (\strlen($value) === 0) {
return ConversionResult::value([]);
}
$value = explode($metadata->args[1], $value);
$errors = [];
$type = $metadata->args[0]; /** @var TypeMetadata $type */
$mapped = [];
foreach ($value as $idx => $v) {
$result = $ctx->coerce($v, $type);
if ($result->getErrors()) {
$errors[] = $result->errorsAtIdx($idx);
// if some of our values couldn't be coerced completely, we can't say that this array
// is correct so we bail out and return only errors
if ($result->getValue() === null) {
return ConversionResult::errors(array_merge(...$errors));
}
}
$mapped[] = $result->getValue();
}
$errors = $errors ? array_merge(...$errors) : [];
return ConversionResult::errors($errors, $mapped);
}
}
$coercers = default_coercers() + [
// "comma_array" = CommaArrayField::getTypeName()
"comma_array" => new CommaArrayField()
];
$mapper = new Mapper(new AnnotationMetadataProvider($reader), $coercers);