質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

1917閲覧

Laravelでコンストラクタで定義した変数が関数で使えない。

higehige

総合スコア12

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2020/03/25 14:03

現在、Laravelで、GoogleAnalyticsのReportingAPIを組み込むことを試みています。

AnalyticsControllerというコントローラーを独立して作って、各関数で共通なAPIを呼び出す記述をコンストラクタに入れたいのですが、コンストラクタに入れると変数が関数に渡せず、、関数の中に書くと動きます。

具体的には、

php

1class AnalyticsController extends Controller 2{ 3 4 public function __construct(Request $request) 5 { 6 //ログイン認証 7 $this->middleware('auth'); 8 } 9 10 11 public function get_report(Request $request) { 12 // Load the Google API PHP Client Library. 13 require_once __DIR__ . '/../../../vendor/autoload.php'; 14 // Use the developers console and download your service account 15 // credentials in JSON format. Place them in this directory or 16 // change the key file location if necessary. 17 $KEY_FILE_LOCATION = __DIR__ . '/../../../service-account-credentials.json'; 18 19 // Create and configure a new client object. 20 $client = new Google_Client(); 21 $client->setApplicationName("Hello Analytics Reporting"); 22 $client->setAuthConfig($KEY_FILE_LOCATION); 23 $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']); 24 $analytics = new Google_Service_AnalyticsReporting($client); 25 26 // Replace with your view ID, for example XXXX. 27 //固定の場合はコメントアウトを外す 28 $VIEW_ID = "79320181"; 29 30 // Create the DateRange object. 31 $dateRange = new Google_Service_AnalyticsReporting_DateRange(); 32 $dateRange->setStartDate("7daysAgo"); 33 $dateRange->setEndDate("today"); 34 35 // Create the Metrics object. 36 $sessions = new Google_Service_AnalyticsReporting_Metric(); 37 $sessions->setExpression("ga:sessions"); 38 $sessions->setAlias("sessions"); 39 40 // Create the ReportRequest object. 41 $request = new Google_Service_AnalyticsReporting_ReportRequest(); 42 $request->setViewId($VIEW_ID); 43 $request->setDateRanges($dateRange); 44 $request->setMetrics(array($sessions)); 45 46 $body = new Google_Service_AnalyticsReporting_GetReportsRequest(); 47 $body->setReportRequests( array( $request) ); 48 $data = $analytics->reports->batchGet( $body ); 49 return view('api_result',[ 50 'outputs'=>json_encode($data) 51 ]); 52 } 53 } 54 55}

だと動くのですが、

php

1class AnalyticsController extends Controller 2{ 3 4 public function __construct(Request $request) 5 { 6 //ログイン認証 7 $this->middleware('auth'); 8 9 // Load the Google API PHP Client Library. 10 require_once __DIR__ . '/../../../vendor/autoload.php'; 11 // Use the developers console and download your service account 12 // credentials in JSON format. Place them in this directory or 13 // change the key file location if necessary. 14 $KEY_FILE_LOCATION = __DIR__ . '/../../../service-account-credentials.json'; 15 16 // Create and configure a new client object. 17 $client = new Google_Client(); 18 $client->setApplicationName("Hello Analytics Reporting"); 19 $client->setAuthConfig($KEY_FILE_LOCATION); 20 $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']); 21 $analytics = new Google_Service_AnalyticsReporting($client); 22 } 23 24 25 public function get_report(Request $request) { 26 27 // Replace with your view ID, for example XXXX. 28 $VIEW_ID = "79320181"; 29 30 // Create the DateRange object. 31 $dateRange = new Google_Service_AnalyticsReporting_DateRange(); 32 $dateRange->setStartDate("7daysAgo"); 33 $dateRange->setEndDate("today"); 34 35 // Create the Metrics object. 36 $sessions = new Google_Service_AnalyticsReporting_Metric(); 37 $sessions->setExpression("ga:sessions"); 38 $sessions->setAlias("sessions"); 39 40 // Create the ReportRequest object. 41 $request = new Google_Service_AnalyticsReporting_ReportRequest(); 42 $request->setViewId($VIEW_ID); 43 $request->setDateRanges($dateRange); 44 $request->setMetrics(array($sessions)); 45 46 $body = new Google_Service_AnalyticsReporting_GetReportsRequest(); 47 $body->setReportRequests( array( $request) ); 48 $data = $analytics->reports->batchGet( $body ); 49 return view('api_result',[ 50 'outputs'=>json_encode($data) 51 ]); 52 } 53 } 54 55}

だと動きません。

いろいろなサンプルを見ると、コンストラクタで定義をした変数を、下の関数で使えるような例をたくさん見るのですが。。

アドバイスいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/25 15:04

いつもの。Laravelの前にPHPの基礎の学習が必要。
guest

回答1

0

ベストアンサー

関数のなかで定義したらローカルスコープの変数になります。(変数のスコープとは)
やりたいことの全体像次第ですが、通常はプロパティに定義します。
クラスの基礎から確認してください。

既に指摘がありますが、PHPに限らず、フレームワークを利用するには基盤となる言語の基礎はしっかりおさえておかないと有効には使えないどころか、本当に初歩でつまずきます。

ことLaravelは「Web職人のためのフレームワーク」とうたわれている通り、PHPだけでなくWeb自体も求められる知識技術が高めである印象です。
せめてPHP本体の問題かLaravel特有の問題か切り分けられるくらいになっておかないと厳しいと思います。

投稿2020/03/25 22:00

編集2020/03/26 07:49
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2020/03/26 03:37

vendorを手動でロードしているのも謎いですね・・・
m.ts10806

2020/03/26 03:52

そうですね。Laravel使ってなかったとしても読む場所そこじゃないでしょって。
higehige

2020/03/26 07:40

ご丁寧にありがとうございます! ご指摘の通り初学者で、色々触ってみている段階ですが、確かにphp自体の勉強が全然ですね。。 「vendorを手動でロードしているのも謎い」 この内容がさっぱりわからないレベルです。。 記述自体は、APIのサンプルコードそのままでしたが、実際に組み込むとなると違うのでしょうね。。 https://developers.google.com/analytics/devguides/reporting/core/v4/quickstart/service-php?hl=ja
m.ts10806

2020/03/26 07:47

Laravelをcomposerで導入されたのでしたら別途読み込ませる必要はないはずですよ。 あと私のコメントが何を指してるかサンプルコードにあらわれてますが、そのサンプルコードでも関数内ではvendor読み込ませてません。
m.ts10806

2020/03/26 07:48

低評価されたかた、指摘事項あるのでしたらコメントください。
higehige

2020/03/26 07:57

ご丁寧にありがとうございます!! require_once __DIR__ . '/../../../vendor/autoload.php'; は、消しても動作しました。。 autoloadなので、自動で読み込まれているんですね。。(本当に初歩の初歩段階で申し訳ありません) サンプルコードないも、自分で読み直してみます。
m.ts10806

2020/03/26 08:09

>autoloadなので、自動で読み込まれているんですね。。 いえ。正確には「Laravel本体が既に読み込んでいる」です。public/index.php参照。 ※requireなので他でrequireしてもエラーでてないということになります そもそもLaravel自体もパッケージ管理されてるので、本体で読み込ませることで他のパッケージもcomposerからインストールするだけで別途読み込ませる必要なく使えると言うことになります。 「autoload.php」という名前がつけられているだけで、その名前があれば自動的に読み込まれるような仕組みはPHPにはありません。 「オートロード」はあくまで「導入パッケージが自動で読み込まれる仕組み」となります。そのautoload.php自体はどこかで(できれば共通の場所で)読み込ませる必要があります。 おそらくここは、クラスの基礎もそうですし、オートローダーの概念含めて結構応用的な観点での学習も必要です。 自身で簡単なフレームワークを組んでみるくらいの事前学習は必要に思います。
higehige

2020/03/26 08:27

こんな未熟者に、ご丁寧にありがとうございます。。。 フレームワークに触れるのは早過ぎそうですね。。 ちなみに、今一度最初に立ち返ってクラスを学びましたが、仮数の外の変数を読み取るには、 $this->KEY_FILE_LOCATION と書けばいいだけでしたね。。 基礎はさらっと触れてフレームワークに触れてしまいましたが、基礎は何周も叩き込む必要がありそうです。。
m.ts10806

2020/03/26 08:42

>基礎は何周も叩き込む必要がありそうです。。 基本は「公式ドキュメントを活用できるようになる」ことだと思います。 あとはそのドキュメントのサンプルコードを参考に自分で組んでみて失敗して調べて、を繰り返す。 ドキュメントが活用して エラーをしっかり読んで デバッグをする この3つがしっかりできれば大抵のことはなんとかなります。言語自体の馴れや習慣は必要になりますが、裏返すと何か問題が起きても質問することなく自ら解決できるということにもなります。
higehige

2020/03/31 10:09

ご丁寧にありがとうございました。 その後基礎練を数日続け、ご質問した内容がいかに馬鹿らしかったかを痛感しました。。 ご指摘頂いた通り、公式ドキュメントをしっかり活用して、面倒くさがらずにエラーを読んで、質問することなく自ら解決する、の連続ですね。。 m.ts10806さんのおかげで、一歩を踏み出せた気がします!! 本当にありがとうございました!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問