widop/github-hook-provider

使用 Silex 的 Github WebHook 作业

1.0.0 2013-05-04 11:35 UTC

This package is not auto-updated.

Last update: 2024-09-09 10:47:02 UTC


README

Build Status

该库提供了一个 Silex 提供者,允许您在任意 Github WebHook 上执行您的作业。

安装

该库通过 Composer 分发。因此,首先 安装 它 :)

在您项目的根目录下创建一个 composer.json 文件并将以下内容放入其中

{
    "require": {
        "widop/github-hook-provider": "*"
    }
}

由于库提供可选的调试,您可以通过安装并注册内置的 Silex MonologServiceProvider 来启用它

{
    "require": {
        "widop/github-hook-provider": "*",
        "monolog/monolog": "1.*"
    }
}

然后,安装库

$ composer install

创建您的应用程序

现在,我们在本地已经准备好了一切,我们可以创建 Silex 应用程序。通常,我们遵循以下结构

├── composer.json
├── composer.lock
├── src
│   └── ...
├── vendor
│   └── ...
└── web
    └── hook.php

web/hook.php 看起来是这样的

<?php

require_once __DIR__.'/../vendor/autoload.php';

use Silex\Application;

$app = new Application();

// Optional dependencies
$app->register(new Silex\Provider\MonologServiceProvider(), array(/* ... */));

$app->run();

在这个结构中,web 目录是应用程序的 vhost 根目录,而 hook.php 脚本是前端控制器,负责管理我们的 Github WebHook。所以,如果我们创建一个以 my-domain.com 为域名的 vhost,我们可以将 http://my-domain.com/hook.php 作为 Github Webhook。

src 目录尚未存在。您可以创建它,我们将在下一步中使用它 :)

注册提供者

Silex 应用程序(目前什么也不做)已经启动 :)

现在,我们需要注册并配置 Wid'op Github Hook 提供者,这将允许我们与 Github hooks 进行交互。为此,只需更新 hook.php

<?php

require_once __DIR__.'/../vendor/autoload.php';

use Silex\Application;
use Widop\GithubHook\GithubHookProvider;

$app = new Application();
$app->register(new GithubHookProvider(), array('github_hook.trusted_ips' => array('127.0.0.1', /* ... */)));
$app->run();

当您访问在您的 Github 仓库设置中可用的 Github WebHook 配置时,您会看到一个可信任的 IP 列表,这些 IP 可以用于 Github WebHooks。提供者需要此 IP 列表以保护入口点。您显然可以提供一个空数组,但 强烈不推荐这样做!

挂载控制器

现在,Silex 应用程序及其提供者已经正确配置(但仍然什么也不做... :)

为了完成工作,我们需要挂载控制器。再次更新 hook.php

<?php

require_once __DIR__.'/../vendor/autoload.php';

use Silex\Application;
use Widop\GithubHook\GithubHookProvider;

$githubHookProvider = new GithubHookProvider();

$app = new Application();
$app->register($githubHookProvider, array('github_hook.trusted_ips' => array('127.0.0.1', /* ... */)));
$app->mount('/', $githubHookProvider);
$app->run();

完成了!设置完成。

接下来做什么?

接下来?写一些自定义代码,这些代码将在接收到有效的钩子时执行,这可能会很有趣... :)

它是如何工作的?

像 Silex 本身一样,提供者是围绕事件调度器构建的。当接收到钩子并已通过 IP 防火墙和钩子配置进行验证时,会触发 github_hook 事件,并将包含有关钩子所有信息的包装事件传播到所有监听器/订阅者。因此,我们只需要编写我们的事件监听器/订阅者。

您可以注册任意数量的监听器/订阅者,并通过优先级或事件传播来处理更复杂的使用案例...

编写钩子订阅者

我们建议您将代码放在 src 目录中

<?php
// src/Acme/MyHookSubscriber.php

namespace Acme;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Widop\GithubHook\Event\Events;
use Widop\GithubHook\Event\HookEvent;

class MyHookSubscriber implements EventSubscriberInterface
{
    public function onHook(HookEvent $event)
    {
        $hook = $event->getHook();

        // Do your stuff...
    }

    public static function getSubscribedEvents()
    {
        return array(Events::HOOK => 'onHook');
    }
}

由于我们添加了 Acme 命名空间,因此需要更新 composer.json 以自动加载新类

{
    "autoload": {
        "psr-0": {
            "Acme": "src/"
        }
    },
    // ...
}
$ composer update

注册钩子订阅者

我们的钩子订阅者已经定义,并执行我们的自定义操作。现在,我们需要在事件调度器上注册它。为此,我们有两种解决方案:直接在 hook.php 中或通过 Silex 提供器。

直接

hook.php 中注册我们的钩子订阅者

$app['dispatcher']->addSubscriber(new Acme\MyHookSubscriber());

Silex 提供器

创建我们的钩子提供器

<?php
// src/Acme/MyHookProvider.php

namespace Acme;

use Silex\Application;
use Silex\ServiceProviderInterface;

class MyHookProvider implements ServiceProviderInterface
{
    public function boot(Application $app)
    {
        $app['dispatcher']->addSubscriber(new MyHookSubscriber(/* Injects your own parameters/services */));
    }

    public function register(Application $app)
    {
        // Register your own services or simply let it empty :)
    }
}

然后,在 hook.php 中注册我们的钩子提供器

$app->register(new Acme\MyHookProvider());

贡献

我们热爱贡献者!这个库是开源的,如果你愿意贡献,请随时提出一个 PR!

许可证

Wid'op Github 钩子 Silex 提供器受 MIT 许可证的约束。有关完整的版权和许可信息,请阅读与源代码一起分发的 LICENSE 文件。