LaravelでSharePointを操作

2024/06/04
森正

こんにちは。株式会社リンクネット、ソリューション事業部の森正です。

ファイル管理システムを作るにあたり、システムからSharePointを操作する必要がありました。
SharePointを操作するするためにMicrosoftGraphApiを使用したので、使用方法についてまとめておこうと思います。

環境

$ sail artisan -V
Laravel Framework 11.0.7

$ sail php -v
PHP 8.3.4 (cli) (built: Mar 16 2024 08:40:08) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.4, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.4, Copyright (c), by Zend Technologies
    with Xdebug v3.3.1, Copyright (c) 2002-2023, by Derick Rethans

Microsoft Graphの導入・設定

※この記事では省略しますが、事前にSharePointでアプリの作成とアクセス許可の追加をしておく必要があります。
アプリの作成・アクセス許可の追加方法についてはこちらを参考にしてください。

1. Microsoft Graphをインストール

composerを使用してインストールします。

$ sail composer require microsoft/microsoft-graph

2. アプリの情報を設定

.envにSharePointで作成したアプリの情報を設定します。

.env
CLIENT_ID= // アプリケーション(クライアント)ID
CLIENT_SECRET= // クライアントシークレット
TENANT_ID= // ディレクトリ(テナント)ID
config/env.php
'microsoft' => [
    'client_id' => env('CLIENT_ID', null),
    'client_secret' => env('CLIENT_SECRET', null),
    'tenant_id' => env('TENANT_ID', null),
]

3. Graphクライアントを構成

.envのアプリ設定情報を取得し、「GraphServiceClient」と「ClientCredentialContext」 を初期化します。
ClientCredentialContext:認証に使用
GraphServiceClient:Microsoft Graphの呼び出しに使用

HogeController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Microsoft\Graph\GraphServiceClient;
use Microsoft\Kiota\Authentication\Oauth\ClientCredentialContext;

class HogeController extends Controller
{
    private $client_id = null;
    private $client_secret = null;
    private $tenant_id = null;
    private $scope = 'https://graph.microsoft.com/.default';

    private ClientCredentialContext $tokenContext;
    private GraphServiceClient $appClient;

    public function __construct()
    {
        // アプリ情報取得
        $microsoft_keys = config('env.microsoft');
        $this->client_id = $microsoft_keys['client_id'];
        $this->client_secret = $microsoft_keys['client_secret'];
        $this->tenant_id = $microsoft_keys['tenant_id'];

        // 初期化
        $this->tokenContext = new ClientCredentialContext($this->tenant_id, $this->client_id, $this->client_secret);
        $this->appClient = new GraphServiceClient($this->tokenContext, [$this->scope]);
    }
}

SharePointを操作

ここまででMicrosoftGraphAPIを使用する準備が整ったので、SharePointを操作してみます。
今回は検証用にrootディレクトリ以下に「engineer-blog」ディレクトリを用意しました。

alt サンプル画面

1. ディレクトリ内アイテムを全て取得

byDriveItemId()にrootディレクトからのパスを指定します。

$path = 'root:/engineer-blog:';
$dirs = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->children()->get()->wait();
$items = $dirs?->getValue();

取得結果をdd()で確認してみます。
※今回は取得した各アイテムの情報からファイル名だけを抜き出しています。

$dir_names = [];
foreach ($items as $item) {
    $dir_names[] = $item->getName();
}
dd($dir_names);

指定したディレクトリ(engineer-blog)内のアイテムが全て取得できました。

dd($dir_names)
array:3 [0 => "sample1.xlsx"
  1 => "sample2.xlsx"
  2 => "sample3.xlsx"
]

2. ファイルをWEB上で開く

byDriveItemId()にrootディレクトからの開きたいファイルまでのパスを指定します。

use Microsoft\Graph\Generated\Drives\Item\Items\Item\CreateLink\CreateLinkPostRequestBody as CreateLinkCreateLinkPostRequestBody;
$requestBody = new CreateLinkCreateLinkPostRequestBody();
$requestBody->setType('edit'); // 参照のみにしたい場合は'view'
$requestBody->setScope('organization');
$requestBody->setRetainInheritedPermissions(false);

$path = 'root:/engineer-blog/sample1.xlsx:';
$result = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->createLink()->post($requestBody)->wait();
$url = $result?->getLink()->getWebUrl();

return redirect()->away($url);

web上で「sample1.xlsx」ファイルが開かれました。
setType('edit') を指定している場合はここで直接編集が可能です。

alt サンプル画面

3. ファイルをダウンロード

一度ストレージ等に保存し、そこからダウンロードします。

$path = 'root:/engineer-blog/sample1.xlsx:';
$result = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->content()->get()->wait();

Storage::put("保存先", $result);
return Storage::download("保存元");

ドキュメント通りダウンロードする場合は上記の方法になりますが、
下記のようにダウンロードURLを取得することでも同様にダウンロードが可能です。

$path = 'root:/engineer-blog/sample1.xlsx:';
$result = $this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->get()->wait();
$url = $result?->getAdditionalData()['@microsoft.graph.downloadUrl'];

return redirect()->away($url);

「sample1.xlsx」ファイルがダウンロードされました。

alt サンプル画面

4. ファイルをアップロード

「sample4.xlsx」ファイルをアップロードしてみます。
※このAPIは250MB以上のファイルはアップロードできないため、250MB以上のファイルをアップロードする場合はこちらのAPIを使用する必要があります。

$path = 'root:/engineer-blog/sample4.xlsx:';
$file = \GuzzleHttp\Psr7\Utils::streamFor(fopen($request->file, 'r'));
$this->appClient->drives()->byDriveId({"ドライブID"})->items()->byDriveItemId($path)->content()->put($file)->wait();

「sample4.xlsx」ファイルがアップロードされました。

alt サンプル画面

まとめ

今回はLaravelで「Microsoft Graph API」を使用しましが、PHPであればLaravel以外でも同様に使用することができます。
他のエンドポイントについては、下記サイトを参考にしてください。
MicrosoftGraphAPIのドキュメント

前の記事