LaravelのコントローラーにプロパティはOK?

このQ&Aのポイント
  • Laravelのコントローラーにインスタンス変数がある実装について、問題はないでしょうか?
  • Javaでの経験からすると、コントローラーはSingletonであることが多いです。
  • 実行環境はPHP7.2とLaravel5.6です。
回答を見る
  • ベストアンサー

LaravelのコントローラーにプロパティはOK?

お世話になっております。 保守開発でPHPの案件に参画したのですが、既存のソースコードを見たところ、 コントローラーの実装で以下のようなものがありました。 class HogeController extends Controller { private $hoge = null; public function index(Request $request_) { $this->hoge = new stdClass; .... } public function next(Request $request_) { $foo = $this->hoge->foo; .... } .... コントローラーにインスタンス変数(プロパティ)があって、 それに対していろいろと処理をしているのですが、 この実装は問題ないでしょうか? JavaでWebのMVCを開発してきた経験からすると、コントローラーは Singleton である場合が多いのではないかと思うのです。 当案件での実行環境等は、PHP7.2, Laravel5.6 です。 よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • Proof4
  • ベストアンサー率78% (151/192)
回答No.1

あるメソッド・関数内で完結する処理だけで用いられる場合などで、期待された動作をしているなら必ずしも間違いではありません。 ただ、基本的にこういう処理の方法はLaravelであっても一般的ではないと思います。 実装の問題はなくても上手くはないといったところでしょうか。

feddler
質問者

お礼

ご回答ありがとうございます。 そうなんですよね。なんとか止めさせたいと思うのですが、説得できるだけの材料が揃わない状態です。 Javaですと、そのインスタンスがシングルトンかどうかは簡単に確認出来ます。コンテナが1つである場合が多いので。 PHPだとプロセス毎に実行系があったり、あるいはサーバーの種類によって違ったりもするでしょうか、、なかなかシングルトンになるのかどうか、あるいはスレッドセーフだったりするのかどうか、イメージが湧きません。 こうだから、こういう実装はダメですよ…と言いたいところです。

関連するQ&A

  • laravelでのログ制御

    laravel1で開発をしております。 Log::info等でログ出力をしているのですが、特定のパラメーターだけ出力したくないです。 ミドルウェアやその他laravelの機能で制御する方法はないでしょうか。 例えば、 class SampleController extends Controller { public function sample(Request $request){ Log::info($request); return 'somevalue'; } } $requestの中にpassword:hogeがあった場合に、Log::info($request)でそれを出力しないようにしたいです。

    • ベストアンサー
    • PHP
  • 「Laravel」上で自作コントローラが動かない

    続けての質問、申し訳ありません。 さくらレンタルサーバーにて「Laravel」を試しています。 「Laravel」を単純にサーバーにアップロードし、「http://○○.sakura.ne.jp/laravel/public/」にアクセスすると、Laravelのトップページにアクセスできるところまで確認しました。 次のステップとして、簡単なコントローラを作成してアクセスしたのですが、エラーになってしまいます。 -- 1.application/controllers に 以下の内容で「hello.php」を作成し、アップしました。 <?php class Hello_Controller extends Base_Controller{ public function action_index(){ echo "Hello World!"; } } 2.application 直下に存在する「routes.php」に以下の内容を追加し、アップしました。 Route::controller(array('hello','index')); -- これで、通常であれば「Hello World!」と画面に表示されるはずなのですが・・・ 添付画像のように404エラーが発生します。 通常、404エラーが表示される場合、Laravelのフレームワークにのっとった?エラー画面が表示されると思うのですが、IEのエラーになります。 また、同時に別サーバーのロリポップでも確認してまして、こちらは正常に「Hello World!」と表示されます。 ちなみに、さくらサーバーにて、routes.phpに直接 Route::get('/',function(){   echo 'Hello World!'; }); と書き込んだ場合は、問題なく表示されることを確認しております。 いったい何が悪いのかが検討もつきません。。 何度も申し訳ありませんが、ご教授、お願い致します。

    • ベストアンサー
    • PHP
  • laravel、ログの共通化について

    laravelで開発をしてみています。 大まかな流れとしては、request→controller→serviceクラスのような構成にしています。 serviceクラスの各メソッドが呼び出された際に、そのメソッドの開始・終了のログを出したいです。 出し方としては、メソッド毎にLog::inifo()等の記載をすれば良いと思っていますがその記載が無くても自動で出力できるような仕組みはないでしょうか。 middlewear,serviceproviderあたりでできそうな気がしているのですが、、、 ご教示いただけますと幸いです。

    • ベストアンサー
    • PHP
  • 配列を返す関数

    Perlではこのようにして複数の値を返して変数に一度に代入することができますが、 ($foo,$bar) = &hoge(); print "$foo,$bar\n"; sub hoge { return ('foo','bar'); } PHPでも同様のことはできますか? それとも以下のように分けて書くしかないですか? <?php $a = hoge(); $foo = $a[0]; $bar = $a[1]; print "$foo,$bar\n"; function hoge() { return array('foo','bar'); } ?>

    • ベストアンサー
    • PHP
  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();

  • protectedなのにアクセスできないのは何故 その2

    PHP初心者というより、 これはプログラム初心者と言うべきでしょうか。 もう1度同じ内容の質問をします。 それだけ物凄く困っています。 どうか手助けをお願い致します。 まず、ソースコードを見て下さい。 <?php //スーパークラスfooの定義 class foo { //xはprotected protected $x = 10; //yはprivate private $y = 10; } //サブクラスhogeの定義 class hoge extends foo { public function getX(){ return $this->x; } public function getY() { return $this->y; } } $o = new hoge(); echo "x = ".$o->getX()."(メソッド経由)\n"; echo "y = ".$o->getY()."(メソッド経由)\n"; echo "y = ".$o->y."(直接参照)\n"; echo "x= ".$o->x."(直接参照)\n"; var_dump($o); ?> これだと echo "x= ".$o->x."(直接参照)\n"; の部分がエラーになるんですよね。 $oはhogeクラスでfooクラスのサブクラスですよね。 なので、 echo "x= ".$o->x."(直接参照)\n"; これが何故エラーになるのか分かりません。 ここで確認ですが、$oはhogeのインスタンスではあるが、fooのサブクラスhogeとは別物である。 この解釈でいいんでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP
  • イベントリスナーで読み込んだ後に、DOMで文字を表

    イベントリスナーで読み込んだ後に、DOMで文字を表示させたい。 DOMを使って、文字を表示させるならイベントリスナーで読み込み必要があると思いました。 そこで、下記のように書いて試してみました。 function hoge(){ this.view = function(){ window.addEventListener( 'load',this.foo, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); すると、「undefined」と表示されます。 どうすればいいのでしょうか。よろしくお願いします。

  • php からlaravelで作り直した場合

    a hrefの書き方がわかりません。 index.phpからa hrefでlast.phpに 先月遷移をさせるソースは下記で動きます。 それをindex.blade.phpからlast.blade.phpに遷移させる ことができません。 一応、web.phpとcontrollerを次のように準備しました。 controllerはDBと繋げているので登録してあるデータを取ってきて last.blade.phpに渡すようにしています。 (index.php)動きます <?php $ym = date("Ym"); $lastmonth = date("Ym",strtotime($ym."01"." -1 month ")); $nextmonth = date("Ym",strtotime($ym."01"." +1 month ")); $tm = date("n",strtotime($ym));//月 $ty = date("Y",strtotime($ym));//年 echo '<a href="last.blade.php?ym='.$lastmonth.'"><< 先月</a>'; echo'<head>'.$ty."年".$tm."月".'</head>'; $this_month_days = date("t",strtotime($ym."01"));//当月の日数を取得 ?> (last.php) 最初の部分だけ記載 $ym = (isset($_GET["ym"]))? $_GET["ym"] : date("Ym"); 以下からlaravelで作り直しを試みた記載 (index.blade.php)動かないindex.phpのa hrefの部分のみ下記の通り変更 syntax error, unexpected 'user' (T_STRING), expecting ';' or ','エラーが出る。 echo '<a href="{{route('user.local',['ym'=>'$lastmonth'])}}"><< 先月</a>'; (web.php)last部分だけ抜粋 userフォルダの下にlast.blade.php,index.blade.phpがある Route::get('/last', [KintaiController::class,'last']) ->middleware('auth:users') ->name('last'); (controller)KintaiControlerという名前でcontrollerを作ってある一部抜粋   public function last($lastmonth) { // $e_all = Melon::select('price_a','price_b','price_c','price_d')->paginate(3); $e_all = Kintai::all(); return view('user.last',compact('e_all')); } よろしくお願いします。

    • 締切済み
    • PHP
  • PHPでトラックバック機能 HTTPリクエスト

    現在、PHPにてブログシステムを作成中です。 ブログの特徴であるトラックバック機能について いろいろと調べてみたのですが、あまり理解できませんでした。 http://lowlife.jp/yasusii/stories/8.html#description こちらなどで、しくみ自体はなんとなく理解できたのですが、実装の面で、実際にどういうコーディングをすればいいのかがわかりません。 HTTPリクエストでPOSTする、 らしいのですが、 上記サイトでいうと POST http://www.hoge.hoge/mt-tb.cgi/5 Content-Type: application/x-www-form-urlencoded title=Foo+Bar&url=http://www.tbtest.com/&excerpt=My+Excerpt&blog_name=Foo というものだと思うのですが、これをどこに挿入すればいいのかがわかりません。 header() にいれたり、一番最初に記述したり、 いろいろ試してみたのですが、なぜかPHPファイルをダウンロードしようとして失敗しました、というエラーがでたりします。 根本的に間違ってるのかもしれませんが、 どうかご教示いただけたらと思います。 開発環境: WIN XP PRO Apache 2.0.54 PHP 5.0.4

    • ベストアンサー
    • PHP
  • PHPにおいての関数ポインタ(リファレンス)の実装の仕方

    こんにちわ, 今PHP4.3.4を使用してWebを作成しています。 C言語で言う関数ポインタを実装したいのですが,どうすればいいのでしょうか。 たとえば, function hoge(){ return 5; } function hoge2(){ return 4; } function hoge3(){ return 3; } と宣言して function main($a, $b)[ return ($a + $b); } としたときに, main(hoge(), hoge2()); をしたときに9 main(hoge()2, hoge3()); をしたときに7 とするようにmainの関数をつくりたいのですが,どうすればいいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP