aptoma/silex-extras

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

Silex 驱动的应用常见功能集合

2.0.7 2016-02-10 13:37 UTC

README

Build Status Coverage Status

由 Silex 驱动的应用可重用组件包。

这是一个服务集合,旨在简化 Silex 应用程序的启动,保持最佳实践的一致性,并确保我们以相似的方式完成各项工作。

包含内容

  • 日志处理器,用于为日志添加额外上下文
  • 提供 Logstash 格式的丰富日志记录的 ServiceProvider
  • Silex 应用程序中常见操作的基应用程序类
  • 错误处理器,如果 Accept: application/json 则输出 JSON 格式的内容
  • TestToolkit,用于启动 Silex 应用程序的功能测试
  • API 密钥用户认证
  • 存储接口,包括本地文件和 Level3 实现
  • Ftp 上传抽象,基本上是对原生 FTP 功能的包装
  • Level3 上传服务,用于将内容上传到 Level3
  • ConsoleLoggerServiceProvider,用于将日志记录器与控制台集成
  • CacheServiceProvider,用于 Doctrin Cache 的 Memcached 和 Redis 实现(也可以单独使用)
  • GuzzleServiceProvider,用于额外的 Guzzle 功能
  • Guzzle HttpCallInterceptorPlugin,用于使用 Guzzle 服务进行测试

Aptoma\Ftp

以面向对象的方式封装了原生 PHP FTP 函数。它旨在与 Level3 CDN 一起工作,因此具有多个上传路径的概念。

用法

$ftp = new Ftp($hostname, $username, $password, $logger);
$file = new File($pathToFile);

$destination = 'path/on/server/with/filename.txt';
// All directories needs to be created before upload
$ftp->preparePaths(array($destination));
$ftp->put($destination, $file->getRealPath());

该类还有一些用于验证上传完整性和在上传后移动文件到发布位置的额外功能。阅读源代码 :)

Aptoma\Service\Level3Service

为上传文件到 Level3 提供了一个抽象。您需要提供一个 Ftp 实例和各种路径,然后可以简单地执行: $service->upload($fileContents, $targetFileName, $relativeLocalTempDir);

上传后,文件将被重命名并放置在一个与其校验和匹配的文件夹中,以避免重复上传,并处理 Level3 对目录中文件数量(合理的)限制。返回完整的公开 URL。严格来说,这并不是 Level3 特有的,而是一种针对验证上传的两步策略。

还有一个捆绑的 Level3ServiceProvider,用于简化与 Silex 的集成。

Aptoma\Log

此文件夹提供两个类

  • ExtraContextProcessor,用于始终将预定义的额外字段集添加到日志条目中
  • RequestProcessor,用于将客户端 IP、唯一请求令牌和用户名添加到所有条目中
  • MonologGuzzleLogAdapater,用于将 Monolog 与 Guzzle 集成,以记录请求时间和错误

用法很简单

use Monolog\Logger;
use Aptoma\Log\RequestProcessor;

$app = new \Silex\Application(...);

$app['logger']->pushProcessor(new RequestProcessor($app));
$app['logger']->pushProcessor(new ExtraContextProcessor(array('service' => 'my-service', 'environment' => 'staging')));

Aptoma\Silex\Provider\ExtendedLoggerServiceProvider

这是一个服务提供程序,它自动添加上述提到的 RequestProcessor,如果您指定了 monolog.logstashfile,则还会添加 LogstashFormatter。

LogstashFormatter 还可以添加一些额外的上下文到每个记录中

$app['meta.service'] = 'drvideo-metadata-admin-gui'; // The name of the service, consult with AMP
$app['meta.customer'] = 'Aptoma'; // The name of customer for this record
$app['meta.environment'] = 'production'; // The environment of the current installation

这些额外的字段将帮助我们分类我们的合并日志基础设施(Loggly、Logstash等)中的记录,并导致巨大的成功。

Aptoma\Silex\Provider\ConsoleLoggerServiceProvider

此服务提供程序使得在控制台显示服务日志变得简单,无需将OutputInterface实例注入到服务中。这需要Symfony组件的版本~2.4。关于更改的更多信息请参阅Symfony博客

在您的控制台应用程序中,您现在可以这样做

use Symfony\Component\Console\Application;

$app = require 'app.php';
$console = new Application('My Console Application', '1.0');
// You should only register this service provider when running commands
$app->register(new \Aptoma\Silex\Provider\ConsoleLoggerServiceProvider());

$console->addCommands(
    array(
    //...
    )
);

$console->run($app['console.input'], $app['console.output']);

您仍然会在命令中使用正常的OutputInterface实例来提供命令反馈,但您现在也将从任何您服务中记录的内容中获得输出。

控制台日志记录器覆盖了默认的monolog.handler,以便设置自定义的日志文件。如果已定义,则使用monolog.console_logfile,否则将回退到monolog.logfile

此提供程序也可以作为独立包使用:https://github.com/glensc/ConsoleLoggerServiceProvider

Aptoma\Silex\Application

这是一个可以扩展的基础应用程序。它将添加一个错误json格式化器,注册ServiceControllerServiceProviderUrlGeneratorServiceProvider,自动记录脚本的执行时间(直到响应已发送),还公开了registerTwigregisterLogger,您可以使用一行代码来设置这些。

此类应包含我们始终使用的功能,这意味着它不是“很好用”的功能集合。

Aptoma\JsonErrorHandler

此类简单地将异常格式化为JsonResponse,前提是客户端已发送Accept: application/json头。它将由上面提到的基类Application自动加载,或者您可以手动注册。

$jsonErrorHandler = new Aptoma\JsonErrorHandler($app);
$app->error(array($jsonErrorHandler, 'handle'));

Aptoma\TestToolkit

这包括一个您可以使用来引导测试的BaseWebTestCase,以及一个相关的TestClient,其中包含对postJson($url, $data)putJson($url, $data)的快捷方式。

要使用它,您需要让您的测试扩展它,并且可能还需要添加到您的引导文件的路径。

class MyObjectTest extends TestToolkit\BaseWebTestCase
{
    public function setUp()
    {
        $this->pathToAppBootstrap = __DIR__.'/../../app/app.php';
        parent::setUp();
    }
}

Aptoma\Security

API密钥用户身份验证组件。

它只需要一个用户提供者和一个编码器来编码API密钥。它通常像这样在您的应用程序中使用

$app->register(
    new Aptoma\Silex\Provider\ApiKeyServiceProvider(),
    array(
        'api_key.user_provider' => new App\Specific\UserProvider(),
        'api_key.encoder' => new App\Specific\Encoder()
    )
);

然后可以将其附加到您选择的任何防火墙上

$app->register(
    new Silex\Provider\SecurityServiceProvider(),
    array(
        'security.firewalls' => array(
            // ...
            'secured' => array(
                'pattern' => '^.*$',
                'api_key' => true
                // more settings...
            )
        )
    )
);

CacheServiceProvider

cache.memcachedcache.predis注册服务,以及一个通用的cache,可以配置为返回这些中的任何一个(默认为Memcached)。

$app->register(new Aptoma\Silex\Provider\MemcachedServicerProvider());
$app->register(new Aptoma\Silex\Provider\CacheServicerProvider());

$app['cache']->save('mykey', 'myvalue');

下面是Memcached的配置选项。

MemcachedServiceProvider

将Memcached注册为服务,并处理前缀和持久连接。它返回一个\Memcached实例。

$app['memcached.identifier'] = 'my_app';
$app['memcached.prefix'] = 'ma_';
$app['memcached.servers'] = array(
        array('host' => '127.0.0.1', 'port' => 11211),
    );

$app->register(new Aptoma\Silex\Provider\MemcachedServicerProvider());

$app['memcached']->set('mykey', 'myvalue');

PredisServiceProvider

将Predis注册为服务。它返回一个\Predis\Client实例。

$app['redis.host'] = '127.0.0.1';
$app['redis.port'] = 6379;
$app['redis.prefix'] = 'prefix::';
$app['redis.database'] = 0;

$app->register(new Aptoma\Silex\Provider\PredisClientServicerProvider());

$app['predis.client']->set('mykey', 'myvalue');

GuzzleServiceProvider

扩展基本GuzzleServiceProvider以允许注册全局插件,并添加了一些插件

  • 每个请求的通用日志记录
  • 请求总数的日志记录
  • 将请求令牌头添加到出站请求中
  • 基于HTTP的缓存插件

要配置使用哪种缓存存储,请定义$app['guzzle.default_cache'],它应该是一个字符串,引用要使用的缓存服务,例如'cache.memcached'。

$app->register(new GuzzleServiceProvider(), array('guzzle.services' => array()));
$app->finish(array($app['guzzle.request_logger_plugin'], 'writeLog'));

$app['guzzle.plugins'] = $app->share(
    function () use ($app) {
        return array(
            $app['guzzle.log_plugin'],
            $app['guzzle.request_logger_plugin'],
            $app['guzzle.request_token_plugin'],
            $app['guzzle.cache_plugin'],
        );
    }
);

Guzzle HttpCallInterceptorPlugin

这是一个Guzzle插件,用于单元测试以确保没有调用任何外部服务。在你的测试设置中,可以这样做

$this->app['guzzle.plugins'] = $this->app->share(
    $this->app->extend(
        'guzzle.plugins',
        function (array $plugins, $app) {
            $plugins[] = new HttpCallInterceptorPlugin($app['logger']);

            return $plugins;
        }
    )
);

// Intercept errors and fail tests, if you don't do this, you'll most often get
// a rather cryptic error message
$this->app->error(
    function (HttpCallToBackendException $e) use ($testCase) {
        $testCase->fail($e->getMessage());
    },
    10
);

$this->app->error(
    function (BatchTransferException $e) use ($testCase) {
        $testCase->fail($e->getMessage());
    },
    10
);