ellipse/resolvers-composite

此包已被废弃且不再维护。未建议替代包。

ellipse框架的复合解析器组件

dev-master / 1.0.x-dev 2017-07-27 13:56 UTC

This package is not auto-updated.

Last update: 2017-08-01 12:39:50 UTC


README

此包提供了一种 组合中间件解析器

它允许将多个解析器组合为一个解析器,与 ellipse中间件分发器 一起使用。

要求 php >= 7.1

安装 composer require ellipse/resolvers-composite

运行测试 ./vendor/bin/peridot tests

组合两个解析器

此包提供了一个 Ellipse\Resolvers\CompositeResolver 类,它是 Ellipse\Contracts\Resolver\ResolverInterface 接口的一个实现,接受两个 ResolverInterface 实例作为参数。生成的组合解析器将首先尝试将值解析为中间件,如果第一个失败,将尝试第二个。这允许组合任意数量的解析器。

<?php

use Ellipse\Resolvers\CompositeResolver;
use App\Resolvers\SomeResolver;
use App\Resolvers\SomeOtherResolver;
use App\Resolvers\YetSomeOtherResolver;

$resolver1 = new SomeResolver;
$resolver2 = new SomeOtherResolver;

$resolver = new CompositeResolver($resolver1, $resolver2);

// This dispatcher will use SomeResolver and SomeOtherResolver to resolve values as middleware.
$dispatcher = new Dispatcher(['element'], $resolver);

// Composite resolvers can be combined as well.
$resolver = new CompositeResolver($resolver, new YetSomeOtherResolver);

// This dispatcher will use SomeResolver, SomeOtherResolver and AgainSomeOtherResolver to resolve elements
// as middleware.
$dispatcher = new Dispatcher(['element'], $resolver);

如果您想创建一个提供解析器的包,并自动将您的解析器与容器已提供的解析器组合,您可以编写一个 interop服务提供者,定义一个组合解析器,并将您的解析器作为第二个参数。这是ellipse解析器使用的方法。

<?php

namespace My\Package;

use Interop\Container\ServiceProvider;

use Ellipse\Contracts\Resolver\ResolverInterface;

use Ellipse\Resolvers\CompositeResolver;

class MyPackageServiceProvider implements ServiceProvider
{
    public function getServices()
    {
        return [
            MyResolver::class => function ($container) {

                // Construct an instance of MyResolver and returns it.

            },

            ResolverInterface::class => function ($container, $previous = null) {

                $resolver = $container->get(MyResolver::class);

                return ! is_null($previous)
                    ? new CompositeResolver($previous(), $resolver)
                    : $resolver;

            },
        ];
    }
}