widop / github-hook-provider
使用 Silex 的 Github WebHook 作业
Requires
- silex/silex: 1.0.*
- symfony/config: 2.*
Requires (Dev)
- monolog/monolog: 1.*
- phpunit/phpunit: 3.7.*
- symfony/browser-kit: 2.*
Suggests
- monolog/monolog: Enables debugging
This package is not auto-updated.
Last update: 2024-09-09 10:47:02 UTC
README
该库提供了一个 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 文件。