2017-02-06 10 views
1
class Controller extends BaseController 
{ 
    use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests; 
    private $host; 
    private function __construct() 
    { 
     $environment = App::environment(); 
     if ($environment == "local"){ 
      $this->host = config('customs.localHost'); 
     } 
     else if ($environment == "prod"){ 
      $this->host = config('customs.productionHost'); 
     } 
    } 

    public function getHost() 
    { 
     return $this->host; 
    } 
} 

上記はLaravelのコントローラです。これはメインコントローラですが、私は他のコントローラクラスでこのコントローラを拡張しています。基本的には、現在の環境に応じて現在のホストを返すメソッドをこのコントローラに作成したかったのです。Laravel:なぜ私の変数がコントローラの構成機能中に設定されていないのですか?

他のコントローラからgetHost()関数を呼び出していますが、nullが返されています。

__construct()のコードは、getHost()メソッドに入れると動作します。しかし、ここで私の質問は、なぜ__construct()のコードが実行されないのですか?

public $host; 

と機能__constructの可視性:

public function __construct() 

、あなたのサブクラスの構造機能に:

parent::__construct(); 
+0

コンストラクタはパブリックであるか、クラス(たとえばシングルトンなど)によって呼び出されている必要があります。 –

+0

私はそれを公開しましたが、コードはまだ実行されていません。 – Pops

+0

このURLを見てくださいhttps://laravel.io/index.php/forum/07-01-2014-extending-basecontroller-when-constructor-has-params –

答えて

1

あなたが

を呼び出す必要がありますプロパティ$ホストの

を変更し、視認性が

0
parent::__construct(); 

サブクラスコンストラクタ内。 スーパークラスのコンストラクタはプライベートである必要がありません

+0

私は両方を試しました、コードが実行されていません。 – Pops

+0

サブクラスの作成関数で 'parent :: __ construct();'を呼び出しましたか? –

+0

はい私はparent :: __ construct()と呼ばれました。私のサブクラスの構築でそれは働いた。 – Pops

0

コントローラを拡張すると自動的に初期化されると思いました。

class WSUsersController extends Controller 
{ 
} 

getHost()メソッドを呼び出す前にコントローラを初期化しなければなりませんでした。

$controller = New Controller(); 
$result['campaignRequest'] = $controller->getHost(); 
+0

各コントローラはリクエストを行うときに初期化されます。回答を書いた人は誰でもあなたが思ったと思います(例えば 'get/getHost'と' Route :: get( 'getHost'、 'WSUsersController @ getHost'))。あなたのコードから 'getHost'を呼び出すときには、もちろん初期化する必要があります(静的メソッドでない場合) –

+0

基本的に私がルートからメソッドを呼び出すと、それが初期化されます。私のコードのメソッド(たとえ私がクラスを拡張していても)を( 'parent :: __ construct()')で初期化する必要があります。 – Pops

+0

ルート上で呼び出すとき、フレームワークはそれをインスタンス化します。あなたが考える必要があるのは、 'getHost'が本当にコントローラ内にあるはずかどうかです。たぶん、Laravelの 'ServiceProvider'が仕事をするでしょう! –

関連する問題