web-dev-qa-db-ja.com

名前空間がない場合にlaravel 5.6でgoogle-api-php-clientを使用する方法

これが繰り返しである場合は申し訳ありませんが、私が見つけたいくつかの近い質問は私のために働いていません。私はLaravelの初心者です。 laravel 5.6フレームワークでgithubライブラリ https://github.com/google/google-api-php-client を使用しようとしています。

次のコマンドを実行してAPIをインストールしました。

composerにはgoogle/apiclient:^ 2.0が必要です

私のcomposer.jsonは、次のものが含まれているため、正しく見えます。

"require": {
    "php": "^7.1.3",
    "fideloper/proxy": "^4.0",
    "google/apiclient": "^2.2",
    "laravel/framework": "5.6.*",
    "laravel/tinker": "^1.0"
},

composerアップデートを実行しました。ベンダーのフォルダにGoogleフォルダが表示されます。

このためのgithubreadmeは、オートローダーインクルードを追加するように指示します。しかし、私の理解では、これはLaravelのやり方ではありません。 Google_Clientクラスに名前空間がないことがわかったため、app.phpファイルに適切に追加する方法がわかりません。または、コントローラー内で使用したい。コントローラ内に新しいGoogle_Clientを作成しようとすると、見つからないと表示されます。それを「使用」しようとすると、名前空間が存在しない場合にどのパスを指定すればよいかわかりません。

以下のコメントのいくつかにさらに情報を追加するための編集:

'composer require google/apiclient:^ 2.0を実行します

出力:

vagrant@Homestead:~/code/sageAnalytics$ composer require google/apiclient:^2.0 ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 10 installs, 0 updates, 0 removals
  - Installing psr/http-message (1.0.1): Loading from cache
  - Installing guzzlehttp/psr7 (1.4.2): Loading from cache
  - Installing guzzlehttp/promises (v1.3.1): Loading from cache
  - Installing guzzlehttp/guzzle (6.3.2): Loading from cache
  - Installing phpseclib/phpseclib (2.0.10): Loading from cache
  - Installing firebase/php-jwt (v5.0.0): Loading from cache
  - Installing google/apiclient-services (v0.53): Loading from cache
  - Installing psr/cache (1.0.1): Loading from cache
  - Installing google/auth (v1.2.1): Loading from cache
  - Installing google/apiclient (v2.2.1): Loading from cache phpseclib/phpseclib suggests installing ext-libsodium (SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.) phpseclib/phpseclib suggests installing ext-mcrypt (Install the Mcrypt extension in order to speed up a few other cryptographic operations.) phpseclib/phpseclib suggests installing ext-gmp (Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.) google/apiclient suggests installing cache/filesystem-adapter (For caching certs and tokens (using Google_Client::setCache)) Writing lock file Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover Discovered Package: fideloper/proxy Discovered Package: laravel/scout Discovered Package: laravel/tinker Discovered Package: nunomaduro/collision Package manifest generated successfully.

それはそれが発見したパッケージの1つではありません-私はそれがあるべきだと思っています。私のcomposer.jsonファイルは次のようになります:

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
    "php": "^7.1.3",
    "fideloper/proxy": "^4.0",
    "google/apiclient": "^2.0",
    "laravel/framework": "5.6.*",
    "laravel/tinker": "^1.0"
},
"require-dev": {
    "filp/whoops": "^2.0",
    "fzaninotto/faker": "^1.4",
    "mockery/mockery": "^1.0",
    "nunomaduro/collision": "^2.0",
    "phpunit/phpunit": "^7.0"
},
"autoload": {
    "classmap": [
        "database/seeds",
        "database/factories"
    ],
    "psr-4": {
        "App\\": "app/"
    }
},
"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/"
    }
},
"extra": {
    "laravel": {
        "dont-discover": [
        ]
    }
},
"scripts": {
    "post-root-package-install": [
        "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
    ],
    "post-create-project-cmd": [
        "@php artisan key:generate"
    ],
    "post-autoload-dump": [
        "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
        "@php artisan package:discover"
    ]
},
"config": {
    "preferred-install": "dist",
    "sort-packages": true,
    "optimize-autoloader": true
},
"minimum-stability": "dev",
"prefer-stable": true

}

プログラムを実行して新しいGoogle_Clientを呼び出すと、次のように表示されます。

enter image description here

そのため、オートローダーによって検出されるようにするために何かが足りません。
コマンド「composerdumpautoload」を実行すると、次のようになります。

vagrant@Homestead:~/code/sageAnalytics$ composer dumpautoload

最適化された自動ロードファイルの生成

Illuminate\Foundation\ComposerScripts :: postAutoloadDump @php artisan package:discover Discovered Package:fideloper/proxy Discovered Package:laravel/scout Discovered Package:laravel/tinker Discovered Package:nunomaduro/collisionパッケージマニフェストが正常に生成されました。

したがって、パッケージgoogle/apiclientについても言及されていません。どうすればそれを見つけることができますか?

回答は、@ Razorによる最初の可能な回答の上部のコメントに投稿されました。私はcomposer.jsonのautoloadをいじることによって、おそらく何らかの方法でプロジェクトを台無しにしました。ベンダーフォルダを完全に削除して、composer install。すべてが機能するようになりました。

クラスがどの名前空間にもない場合は、\のように、先頭に$foo = new \Google_Client;を付けることで、名前空間内から参照できます。

一方、useステートメントで指定する文字列は、それ自体が「パス」ではなく、単に「完全修飾クラス名」、つまり、名前空間が前面に含まれているクラス名です。したがって、名前空間のないクラスの場合、それは単なる名前use Google_Client;です。

11
IMSoP

ファイルcomposer.jsonを確認してください

存在しない場合は、クラスマップ配列に「vendor/google/apiclient/src/Google」を追加します。

"autoload": {
        "classmap": [
            "vendor/google/apiclient/src/Google"
        ]
}

composer dump-autoloadを実行します

useまたはrequire_onceステートメントは必要ありません。

composer.jsonのautoload配列により、すべてのファイルが準備されます。

1
tushar zore

Laravelで作業しているので、サービス内にgoogleapiクラスを登録するためにおそらく少し余分な手作業が必要です。私はこれを見つけました https://github.com/pulkitjalan/google-apiclient これは、特にlaravelを対象として管理するgoogleapiパッケージのインストールについてもう少し詳しく知るのに役立つかもしれません。