Redmine API を PHP で使ってみる

Share on Facebook1Share on Google+0Tweet about this on TwitterShare on LinkedIn0

お仕事でRedmineとの連携が必要になったのでRedmineのREST APIをPHPで使ってみた。

とにもかくにも初めてなもんでグーグル先生に聞いてみる。

公式?のドキュメントはWikiとして

http://www.r-labs.org/projects/r-labs/wiki/Redmine_REST_API

があるのでここで確認。

和訳も有志がしてくれてるようで感謝。

 

あと

https://github.com/speedmax/activeresource-php/downloads

でPHPのライブラリもダウンロードが可能で。

つくづくありがたい話ですなー

 

さっそくダウンロードして使ってみる。

 

ダウンロードしたファイルを解凍すると ActiveResource.php ってファイルが出てくる。

このファイルの上の方に英語やけど使い方マニュアル的なものがコメントにある。

include_once ('vendor/ActiveResource.php');

class Project extends ActiveResource {
    /**
     * 設定
     */

    var $site         = 'http://foo.com/';  // 設置ドメイン
    var $element_name = 'issue';            // プロジェクトリスト単数形

//  var $request_format = 'xml';
}

こんな感じで本体を継承して使うものらしい。

継承した上で 設定 のとこにあるみたいに、各インスタンス変数で環境に合わした設定ができると。

 

$site

はすぐ分かったけど

$element_name

分かりにくかったのがこっち

 

コメントにあるマニュアルは song ってなってるものなー

うちではプロジェクト管理に使ってるのとの連携だったので

song って言われてもさっぱり。

 

なんとか色々試してみて Redmine のチケットにアクセスした時のURL

http://foo.com/issues/[チケットID]

になってるとこの

 

http://foo.com/[[issues]]/[チケットID]

issues ってなってるとこ。

で、本体が設定を英語の複数形にしてくれるので

URLになってる issues を単数形にして設定すると。

 

これに結構はまって、プロジェクト名に設定しても取得はできるもんやから気付くのに時間が…

ちゃんと設定しないと更新出来ないので注意。

 

あとはログイン系の設定

連携したい環境はベーシック認証があるのでそっちの情報を持って行きたい。

これも継承するときに設定できるけど今回はログイン情報を引き継ぎたかったので

オブジェクトの外から設定する。

$Project = new Project();

// ベーシック認証を引き継ぐ
$Project->user          = $_SERVER['PHP_AUTH_USER'];
$Project->password      = $_SERVER['PHP_AUTH_PW'];

こんな感じでオブジェクトを生成してから

今ログインしてる人のログイン情報の環境変数を渡してやると

 

で、Redmine本体にログインするための情報やけど

これはRSS取得なんかにも使うAPI KEY を取ってきて使う。

$extra_params のインスタンスを使うと、APIにアクセスする時のURLにパラメータが設定できるようで。

これも動的に変えたいので外から設定するけど

もちろんオブジェクト内でインスタンスに設定もOK

// API Key
$Project->extra_params  = "?key={$apiKey}";

 

んで、設定がひと通り終わったらマニュアルにあるとおりに使ってみる

とりあえず一番簡単に出来そうな、チケット全部取得をしてみる

$apiResult = $Project->find('all');
var_dump ($apiResult);

これでうまいこといけば $apiResult APIから取得したチケット一覧とかが入ってくるはず。

 

いよいよ更新系をやってみる。

まずは既存のチケットの更新

とりあえずマニュアルにあるとおりに

$apiResult = $Project->find($targetId)->set($updateValues)->save();

find -> set -> save の手順で。

この1行でさくっと書ける感じが気持ちいい。

チェーンメソッドと言うらしいですな。

 

マニュアルにあるように1つずつパラメータを設定して更新もOK

 

本体のソースを見るとfindでは更新対象のチケットIDの定義も兼ねてるようで

set で更新対象のIDを指定してやれば

$apiResult = $Project->set($addValues)->save();

find を入れなくても更新された。

更新内容をまとめて配列に入れとけばソースもすっきり

$updateValues = array (
    'id' => 'ID',
    'done_ratio' => 50,
    'notes' => '更新テスト '. date ('Y-m-d H:i:s'),
);

 

で、このパラメータがまだwikiにはあんまり充実してなくて手探りで探す。

色々やったけど結局直接Redmineにアクセスして

チケット更新画面のHTMLソースを見るのが一番早かったなー

上の例では

done_ratio    チケットの進捗(%)

notes         更新のメモ

ってな具合になりますな。

 

んで更新できたら次は追加

使うメソッドは全く同じ。

$addValues = array (
    'id' => NULL,
    'subject' => '連携テスト2',
    'project_id' => $projectName,
    'description' => '説明テスト '. date ('Y-m-d H:i:s'),
    'assigned_to_id' => 21,
    'watcher_user_ids' => array_values ($userIds),
);

パラメータは追加用に結構違うけど

ここで id を NULL にしとくと追加されると。

 

で、ここで問題が発生。

チケットのウォッチャーを設定するパラメータの

watcher_user_ids に複数のユーザーを設定しようとするとうまくいかない。

本体のソースを見ると

array (key => value);

の形しか受け付けてくれない。

array (
    key => array (
        foo1,
        foo2,
    ),
);

上みたいに配列の中に配列がNGで

どう頑張っても無理っぽいから仕方なく本体を改造。

本体の326行目あたりを

// 多次元配列に対応
if (is_array ($v)) {
    foreach ($v as $v2) {
        $params .= '&' . $el . '[' . str_replace ('-', '_', $k) . '][]=' . rawurlencode ($v2);
    }
}
else {
    $params .= '&' . $el . '[' . str_replace ('-', '_', $k) . ']=' . rawurlencode ($v);
}

こんな感じに変更。

これでばっちりウォッチャーも複数設定対応完了ーっと

Share on Facebook1Share on Google+0Tweet about this on TwitterShare on LinkedIn0

あわせて読みたい

Fatal error: Uncaught Exception: 12: REST API is deprecated for versions v2.1 and higher (12) thrown in /var/www/junkpot.net/tech/html/wp-content/plugins/seo-facebook-comments/facebook/base_facebook.php on line 1273