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

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

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

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1804閲覧

コントローラをインジェクションできない

tixure55

総合スコア400

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

1グッド

0クリップ

投稿2015/12/05 11:18

コンストラクタに他のコントローラをインジェクションしたいのですが、うまくいきません。下記ソースです。

php

1class HellosController extends AppController 2{ 3 4 protected $name = Hello; 5 protected $id; 6 protected $list; 7 protected $fbrl; 8 9 10 public function __construct(FacadeBookResearchLogicController $fbrl = null){ 11 12 $this->fbrl = $fbrl ? $fbrl : new FacadeBookResearchLogicController(); 13 } 14 15 public function index($id){ 16 $this->id = $id; 17 18 $this->list = $this->fbrl->customerSearch($this->id,0); 19 } 20} 21

上記ソースを実行すると、

Error: Call to a member function init() on null

File: /var/www/html/cake/lib/Cake/Controller/Controller.php
Line: 643

となってしまいます。原因が分かる方教えていただけないでしょうか。

ikuwow👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

この記述だと、親クラスのコンストラクタをオーバーライドしてしまうため、親クラスでの初期化処理が実行されなくなるのが原因だと思います。
以下のように、親クラスのコンストラクタを呼び出す処理を追加してはいかがでしょうか?

PHP

1 public function __construct(FacadeBookResearchLogicController $fbrl = null){ 2 3 $this->fbrl = $fbrl ? $fbrl : new FacadeBookResearchLogicController(); 4 parent::__construct(); // この処理を追加 5 }

前提を覆すようで申し訳ないですが、そもそもコンストラクタでFacadeBookResearchLogicControllerを作成している特別な理由がありますか?
もし、コントローラから別のコントローラのactionを呼びたいのであれば、以下のような解決策もあると思います。

PHP

1<?php 2App::uses('FacadeBookResearchLogicController', 'Controller'); 3 4class HellosController extends AppController 5{ 6 7 public $name = Hellos; 8 public $id; 9 public $list; 10 public $fbrl; 11 12 public function index($id){ 13 $fbrl = new FacadeBookResearchLogicController(); 14 $this->list = $fbrl->customerSearch($this->id,0); 15 } 16}

追記:
controllerの__constructは、$requestと$responseのパラメータが必要で、これはHellosControllerの__constructが呼び出される際にdispatcherから渡されるので、そのまま親クラスまで引き渡す必要があるようです。
以下のようなコードではいかがでしょうか?

PHP

1 public function __construct($request = null, $response = null){ 2 $this->fbrl = new FacadeBookResearchLogicController(); 3 parent::__construct($request, $response); 4 }

投稿2015/12/07 01:55

編集2015/12/08 09:33
KatsumiTanaka

総合スコア924

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

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

tixure55

2015/12/07 14:04 編集

回答ありがとうございます、parent::__construct();を追記しましたが、Method customerSearch does not exist Error: An Internal Error Has Occurred.となってしまいます。 AppControllerを継承していないコントローラでかつ注入するクラスがコントローラでない場合は実装できたのですが、CakePHPでは無理なんですかね・・ タイプヒンティングの問題かなと思って、 public function __construct(){ $this->fbrl = $fbrl ? $fbrl : new FacadeBookResearchLogicController(); parent::__construct(); // この処理を追加 } も試したのですが、Error: Call to a member function body() on null File: /var/www/html/cake/lib/Cake/Controller/Controller.php Line: 960となってしまいます。
KatsumiTanaka

2015/12/08 09:33 編集

なるほど、そうですか・・・ コンストラクタ内で別のコントローラのインスタンスを作成するという前提を覆すようで申し訳ないのですが、別のコントローラのactionを呼び出したいのであれば、追記したように利用する関数内でインスタンスを作成する方法もあります。 インスタンス内での処理についての、対応案も追記しました
tixure55

2015/12/08 11:44

public function __construct($request = null, $response = null){ $this->fbrl = new FacadeBookResearchLogicController(); parent::__construct($request,$response); } とすることで、エラーが消えました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問