grnhse / greenhouse-tools-php
一个包含与Greenhouse职位板和API交互服务的PHP包。
Requires
- php: >=7.3
- guzzlehttp/guzzle: >=7.4.5
Requires (Dev)
- php: >=7.3
- phpunit/phpunit: *
- dev-master
- v2.2.0
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.0
- v1.3.4
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- 1.2.1
- v1.2
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.1
- 1.0.0
- v0.0.1
- dev-GREEN-36842_upgrade_guzzle
- dev-GREEN-29582_new_api_url
- dev-GREEN-25883_inclusion_urls
- dev-upgrade_guzzle
- dev-update_circle
- dev-circleci-project-setup
- dev-fix_hiring_team_endpoints
- dev-GREEN-25568-allow-demographic-educations-and-employments-question-answers
- dev-poc-fix-submitting-nested-params
- dev-fix_uploaded_file_bug
- dev-add_paging_links
- dev-required_multiselect_bug
- dev-update_test_suite_for_new_endpoints
- dev-new_harvest_methods
- dev-solano
- dev-add_harvest_tools
- dev-code-review
This package is not auto-updated.
Last update: 2024-09-18 08:13:57 UTC
README
此工具包由Greenhouse提供,供使用PHP的客户使用。提供了三个工具。
- 职位板服务:用于在模板或视图文件中嵌入iframe。
- 职位API服务:用于从Greenhouse职位板API获取数据。
- 申请服务:用于向Greenhouse发送申请。
- Harvest服务:用于与Harvest API交互。
需求
- PHP版本
- V1需要5.6或更高版本。
- V2需要7.3或更高版本。
- Composer。您应该使用Composer来管理此包。
由于PHP 5和Guzzle 6的EOL,此包已升级到需要PHP 7.3。我们将不再支持V1。从现在起,新功能将仅添加到2.0分支。您应尽快更新到2.0。
安装
此包可在Packagist上找到。通过Composer安装。将以下内容添加到您的需求中
"grnhse/greenhouse-tools-php": "~2.0"
2.2新增功能
- 从Guzzle 7.1到7.5的微小版本升级。
- 增加了对v1以上Greenhouse端点版本的支持。
2.1新增功能
为了支持Greenhouse的新Inclusion URL,我们取消了某些URL中包含$id的要求。以前,像getActivityFeedForUser()
这样的URL会抛出一个需要id的Greenhouse异常。现在,该方法将转换为user/activity_feed
并返回404 Not Found响应。我们这样做是为了支持Greenhouse的新Inclusion URL。在上一版本中,getQuestionsSetsForDemographics()
,(在此处找到)会抛出一个“需要id”的异常,而不是正确路由到demographics/question_sets
。
2.0新增功能
为了支持Guzzle的最新版本,放弃了PHP 5.6、7.0、7.1和7.2的支持。
Greenhouse服务
Greenhouse服务是一个父级服务,返回其他Greenhouse服务。通过使用此服务,您可以访问所有其他服务。Greenhouse服务接受一个数组,该数组可选地包含您的职位板URL令牌(在Greenhouse中找到此处)和您的职位板API凭据(在Greenhouse中找到此处)。创建一个Greenhouse服务对象,如下所示
<?php
use \Greenhouse\GreenhouseToolsPhp\GreenhouseService;
$greenhouseService = new GreenhouseService([
'apiKey' => '<your_api_key>',
'boardToken' => '<your_board_token>'
]);
?>
使用此服务,您可以轻松访问其他Greenhouse服务,并且它将根据需要使用板令牌和客户端令牌。
职位板服务
此服务生成适当的HTML标签,用于与Greenhouse iframe集成。使用此服务生成指向Greenhouse托管职位板的链接或适当的标签。通过调用以下内容访问职位板服务
<?php
$jobBoardService = $greenhouseService->getJobBoardService();
// Link to a Greenhouse hosted job board
$jobBoardService->linkToGreenhouseJobBoard();
// Link to a Greenhouse hosted job application
$jobBoardService->linkToGreenhouseJobApplication(12345, 'Apply to this job!', 'source_token');
// Embed a Greenhouse iframe in your page
$jobBoardService->embedGreenhouseJobBoard();
?>
职位API服务
使用此服务从我们的职位板API获取公共职位板信息。此服务无需API密钥。此服务用于与Greenhouse职位板API的GET端点交互。这些方法可以在这里找到。通过以下方式访问此服务:
$jobApiService = $greenhouseService->getJobApiService();
此服务中的方法名称与端点相关,因此要使用GET Offices端点,您会调用
$jobApiService->getOffices();
要获取特定的办公室
$jobApiService->getOffice($officeId);
在任何情况下使用的唯一附加参数是Jobs端点的"content"和"questions"参数。这些参数在getJobs和getJob方法中通过布尔参数管理,默认值为false
。要获取包含内容的所有职位,您会调用
$jobApiService->getJobs(true);
而要获取包含问题的职位,您会调用
$jobApiService->getJob($jobId, true);
应用程序服务
使用此服务将申请发布到Greenhouse。使用此服务需要职位板API密钥,可以在Greenhouse中生成。以下是对此服务的示例用法:
<?php
$appService = $greenhouseService->getApplicationApiService();
$postParams = array(
'id' => 82354,
'first_name' => 'Johnny',
'last_name' => 'Test',
'email' => 'jt@example.com',
'resume' => new \CURLFile('path/to/file.pdf', 'application/pdf', 'resume.pdf'),
'question_12345' => 'The answer you seek',
'question_123456' => array(12345, 23456, 34567)
);
$appService->postApplication($postParams);
?>
提交多选答案
应用程序将根据您的API密钥生成授权头,并将应用程序作为多部分表单发布。此参数数组遵循PHP约定,除了多选提交(提交具有相同名称的参数)的情况。虽然PHP文档希望用户像这样提交多个值:
'question_123456[0]' => 23456,
'question_123456[1]' => 12345,
'question_123456[2]' => 34567,
Greenhouse需要您这样做
'question_123456' => array(23456,12345,34567),
这可以防止由于Libcurl不使用数组索引命名约定而引起的问题。
Harvest服务
使用此服务与Greenhouse中的Harvest API交互。Harvest API文档可在此处找到。此服务旨在简化与Harvest API的交互。要创建Harvest服务对象,您必须提供有效的Harvest API密钥。请注意,这些与职位板API密钥不同。
<?php
$harvestService = $greenhouseService->getHarvestService();
?>
通过Harvest服务,您可以与Greenhouse Harvest文档中概述的任何Harvest方法交互。Harvest URL大多符合以下五种格式之一
https://harvest.greenhouse.io/v1/<object>
:这是Greenhouse中GET方法的常见URL格式。对于此格式的端点,方法将类似于$harvestService->getObject()
。示例包括$harvestService->getJobs()
或$harvestService->getCandidates()
https://harvest.greenhouse.io/v1/<object>/<object_id>
:这将获取具有给定ID的对象。预期只会返回或操作一个对象。ID始终由一个具有键名id
的参数数组提供。例如:$harvestService->getCandidate($parameters);
https://harvest.greenhouse.io/v1/<object>/<object_id>/<sub_object>
:此格式的URL通常意味着您想要获取具有对象ID的对象的所有子对象。示例包括$harvestService->getJobStagesForJob(array('id' => 123))
和$harvestService->getOffersForApplication(array('id' => 123))
https://harvest.greenhouse.io/v1/<object>/<object_id>/<sub_object>/<sub_object_id>
:此格式的URL通常意味着您正在对单个子对象执行操作。一个示例是$harvestService->deleteTagsForCandidate(array('id' => 123, 'second_id' => 234))
https://harvest.greenhouse.io/v1/<object>/<opbject_id>/<sub_object>/<qualifier>
:此格式的URL通常意味着您正在尝试对一类子对象的有限范围进行操作。一个示例是$harvestService->deletePermissionForJobForUser(array('id' => 123));
,这将从用户那里删除对职位的指定权限。
某些方法调用和URL不适用于此格式,但方法名称尽可能接近该格式。这些包括
getActivityFeedForCandidate
:获取候选人的活动流获取候选人的活动流postNoteForCandidate
:向候选人添加备注向候选人添加备注putAnonymizeCandidate
:匿名化候选人某些字段匿名化候选人某些字段getCurrentOfferForApplication
:获取候选人的当前报价获取候选人的当前报价postAdvanceApplication
:将申请推进到下一阶段将申请推进到下一阶段postMoveApplication
:将申请移动到任何阶段将申请移动到任何阶段postTransferApplicationToJob
:将申请移动到新工作将申请移动到新工作postRejectApplication
:拒绝申请拒绝申请postUnrejectApplication
:取消拒绝申请取消拒绝申请postMergeCandidates
:合并重复候选人合并重复候选人getCandidateTags
:获取所有候选人标签获取所有候选人标签postCandidateTags
:创建新的候选人标签创建新的候选人标签getTagsForCandidate
:获取应用于单个候选人的所有标签获取应用于单个候选人的所有标签getCustomFields
:获取所有自定义字段获取所有自定义字段:注意,此方法中的id参数将包含您要检索的自定义字段类型。例如,`$harvestService->getCustomFields(array('id' => 'job'))`将返回组织中的所有工作自定义字段。留空此参数将返回所有自定义字段。getTrackingLinks
:返回特定跟踪链接返回特定跟踪链接:注意,对于此链接,token将通过'id'参数提供。例如,`$harvestService->getTrackingLink(array('id' => '<token>'))`patchEnableUser
:启用禁用用户访问Greenhouse启用禁用用户访问GreenhousepatchDisableUser
:禁用用户访问Greenhouse禁用用户访问GreenhousegetQuestionSetsForDemographics
:列出所有人口统计问题集列出所有人口统计问题集getQuestionSetsForDemographics(['id' => 12345])
:获取id为12345的人口统计问题集获取id为12345的人口统计问题集getQuestionsForDemographics
:列出所有人口统计问题列出所有人口统计问题getQuestionsForDemographics(['id' => 12345])
:列出id为12345的人口统计问题列出id为12345的人口统计问题getQuestionsForQuestionSetsForDemographics(['id' => 12345])
:获取id为12345的问题集中的所有人口统计问题获取id为12345的问题集中的所有人口统计问题getAnswerOptionsForDemographics
:列出所有人口统计答案选项列出所有人口统计答案选项getAnswerOptionsForDemographics(['id' => 12345])
: 列出ID为12345的人口统计答案选项。getAnswerOptionsForQuestionsForDemographics(['id' => 12345])
: 获取ID为12345的人口统计问题所有答案选项。getAnswersForDemographics
: 列出所有人口统计答案。getAnswersForDemographics(['id' => 12345])
: 列出ID为12345的人口统计答案。getDemographicAnswersForApplications(['id' => 12345])
: 列出ID为12345的申请的人口统计答案。
您应使用参数数组提供任何harvest方法所需的URL参数和头信息。对于任何需要JSON主体的项目,这也会在参数数组中提供。
例如: 移动一个申请
$parameters = array(
'id' => $applicationId,
'headers' => array('On-Behalf-Of' => $auditUserId),
'body' => '{"from_stage_id": 123, "to_stage_id": 234}'
);
$harvestService->moveApplication($parameters);
请注意,您不需要在headers数组中提供授权头信息。如果提供的API密钥有效,它将自动附加到headers数组中。
参数数组也用于提供任何分页和过滤选项,这些选项通常作为GET查询字符串提供。不在id、headers或body键中的任何内容都将假定是URL参数。
例如: 获取一页申请
$parameters = array(
'per_page' => 100,
'page' => 2
);
$harvestService->getApplications($parameters);
// Will call https://harvest.greenhouse.io/v1/applications?per_page=100&page=2
如果以任何方式提供了ID键,则它将优先。
关于分页的说明: 如Harvest文档中所述,Greenhouse根据端点支持两种分页方法。下一页包含在Link头中返回。下一页链接可在Harvest服务中访问
$harvestService->nextLink();
此方法返回的链接将提供此端点的下一页对象。根据端点支持的分页方法,返回的链接将类似于以下之一
https://harvest.greenhouse.io/v1/<object>?page=2&per_page=100
https://harvest.greenhouse.io/v1/<object>/?since_id=161963
如果nextLink()方法返回空值,则表示已到达最后一页。
Greenhouse在Harvest中包含几个用于POST新对象的POST方法。需要注意的是,Harvest中候选人和应用程序的创建与上述应用程序服务不同。通过Harvest接收文档只能通过二进制内容或包含包含文档的URL来实现。因此,Harvest服务使用Guzzle中的body参数而不是包含POST参数。
$candidate = array(
'first_name' => 'John',
'last_name' => 'Doe',
'phone_numbers' => array(
array('value' => '310-555-2345', 'type' => 'other')
),
'email_addresses' => array(
array('value' => 'john.doe@example.com', 'type' => 'personal')
),
'applications' => array(
array(
'job_id' => 146855,
'attachments' => array(
array(
'filename' => 'resume.pdf',
'type' => 'resume',
'url' => 'http://example.com/resume.pdf',
'content_type' => 'application/pdf'
)
)
)
)
);
$parameters = array(
'headers' => array('On-Behalf-Of' => 12345),
'body' => json_encode($candidate)
)
$harvest->postCandidate($parameters);
所有使用POST的Greenhouse Harvest方法都将遵循此约定。简而言之,JSON主体应根据Greenhouse提供的文档在body参数中发送。
关于自定义字段的说明: getCustomFields
和getCustomField
与Harvest服务的其他部分不同。getCustomFields
接受一个文本id以限制响应仅包含特定对象集的自定义字段。例如,您可以使用id => 'job'
来返回只有工作的自定义字段。而getCustomField
则接受一个正常的数字id以检索单个自定义字段。
关于未来发展的说明: Harvest包利用PHP的魔术__call
方法。这是为了处理Greenhouse的Harvest API超过此包。新的端点URL应该自动工作。如果Greenhouse添加了GET https://harvest.greenhouse.io/v1/widgets
端点,调用$harvestService->getWidgets()
应该由此包支持。
例: 删除应用程序
Greenhouse现在还支持通过API服务使用DELETE方法,这需要删除对象及其所属用户的id。
// DELETE an application
$parameters = array(
'id' => $applicationId,
'headers' => array('On-Behalf-Of' => $auditUserId)
);
$harvestService->deleteApplication($parameters);
所有通过Harvest进行的Greenhouse删除事件都将遵循此约定。
异常
Greenhouse服务库引发的全部异常都继承自GreenhouseException
。捕获此异常可以捕获此库抛出的任何内容。