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

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

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

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

Q&A

解決済

3回答

6163閲覧

cakephp2でオートロードしようとすると、AppControllerがないと怒られる

vowd1

総合スコア53

CakePHP

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

1グッド

1クリップ

投稿2016/07/27 23:54

編集2016/07/28 22:40

composer.jsonに下記のとおり、記述して、名前空間を定義したのですが、

Error: Class 'Controllers\AppController' not found

とのエラーがでます。
require_onceで書いてたときは、でなかったのですが。なんとかrequire_onceを使わずに、autoload.phpを使ってロードしたいのですが、
composer.jsonにどのように書くべきですか。

コントローラの抜粋

php

1<?php↲ 2 namespace Controllers;34 use App\Controller\AppController;5 6 class TestController extends AppController7 {8

以下composer.jsonの抜粋

composer.json

1"autoload": {↲ 2 "psr-4": {↲ 3 "Controllers\\" : "app/Controller/"_>.↲ 4 }↲ 5 ,

●7月29日加筆
FacadeAuthLogicControllerがないと怒られる
↓エラーの出ているソース

php

1 <?php 2 3 session_start(); 4 class LoginsController extends AppController 5 { 6 /** ビュー未使用 */ 7 public $autoRender = true; 8 public $list; // 本情報 9 public $value; // 本情報 10 public $auth_info; // 本情報 11 12 public function index(){ 13 $this->render('/login/login'); 14 15 16 } 17 public function auth(){ 18 $this->render('/login/login'); 19 20 $esc_username = htmlspecialchars($this->data['login']['username'],ENT_QUOTES,"UTF-8"); 21 $esc_password = htmlspecialchars($this->data['login']['password'],ENT_QUOTES,"UTF-8"); 22 23 if($esc_username !='' && $esc_password && isset($esc_username) && isset($esc_password)){ 24 25 //認証テーブルにアクセス 26 $auth_search = new FacadeAuthLogicController();
Nash-BETA👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

CakePHP 2 の場合、名前空間は使用しませんので、アプリ用の composer の設定は不要で、

php

1namespace Controllers; 2 3use App\Controller\AppController;

を削除してください。

投稿2016/07/28 02:57

okinaka3

総合スコア304

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

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

vowd1

2016/07/28 22:45

回答ありがとうございます。 bootstrap.phpにautoload.phpを読む記述をして、namespaceとuseの箇所をコメントアウトしたところ、エラーは消えたのですが、今度は別のコントローラが読めなくなってしまいました。具体的には上記加筆のとおりです。 namespaceとuseなしで、別のコントローラを読むにはどうしたらいいでしょうか。
okinaka3

2016/07/31 17:06

クラスを呼ぶ前に App::uses() を利用すれば良いのですが、 別のコントローラを読むこと自体、フレームワークで想定されていない利用方法です。 フレームワークの作法から外れると、いろいろ無理なことになります。 CakePHP で共通のロジックを利用する場合、コントローラに依存するロジックは、 Component にまとめることになります。
guest

0

ご質問のエラーはAppControllerが別のnamespaceだからです。
もしかしてやりたいことはコンポーネントのことでしょうか。

とりあえず、autoloadを使う方法を下記に記載します。
CakePHP2.8.5での例です。


まずは下記の3つのファイルを設定します。

PHP

1// app/composer.json 2// 下記を追加し、composer updateする 3"autoload": { 4 "psr-4": { 5 "Controllers\\" : "Controller/" 6 } 7},

PHP

1// app/Controller/Mytest.php 2// 自作クラス 3<?php 4namespace Controllers; 5class Mytest { 6 public function okok() { 7 return "okok"; 8 } 9}

(bootstrap.phpについては応用インストールを参考にしました。)

PHP

1// app/Config/bootstrap.php 2// 下記の3行を追加 3require APP.'Vendor'.DS.'autoload.php'; 4spl_autoload_unregister(array('App', 'load')); 5spl_autoload_register(array('App', 'load'), true, true);

上記の3つのファイルを設定したら、Mytestクラスが使えるようになります。
例えば下記のように実行します。

PHP

1// app/Controller/HogesController.php 2use Controllers\Mytest; 3 4…… 5 6public function index() { 7 $test = new Mytest(); 8 debug($test->okok()); // 'okok'と出力 9}

投稿2016/07/28 05:28

coba-coba

総合スコア1409

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

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

vowd1

2016/07/28 22:35

回答ありがとうございます。bootstrap.phpにおっしゃるとおり、コードを追加し、動かしたところ、該当コントローラではエラーが消えたのですが、その画面から遷移したfunctionで呼んでいるコントローラが見つからないというエラーがでてしまいました。 コードは上記加筆のとおりです。 FacadeAuthLogicControllerがないエラーはどのようにすれば消えるでしょうか。
coba-coba

2016/07/28 23:11

まずはLoginsControllerに use Controllers\FacadeAuthLogic; を加えてください。 これは上記の私のコメントでは HogesController.php の use Controllers\Mytest; に対応しています。 ----------- それと、FacadeAuthLogic.phpをapp/Controller/ディレクトリに用意して、 namespace Controllers; と class FacadeAuthLogic { …… } を書いてください。 これは上記の私のコメントではMytest.phpの namespace Controllers; と class Mytest { …… } にそれぞれ対応しています。
okinaka3

2016/07/31 16:39

いろいろ突っ込みどころはありますが、まずは基本に忠実に従って、 応用は十分に理解してからにしたほうが良いです。 CakePHP 2 の場合は、独自のクラスローダーを実装しているため、 そちらを利用しましょう。 App::uses() で参照するクラスを呼び出せるようになります。 composer は、CakePHP フレームワークの外のライブラリを利用する場合に とどめておくべきだと思います。 名前空間も今回は利用を避けることをお勧めします。
coba-coba

2016/07/31 17:27

私も突っ込みどころ満載だと思います。 それとおっしゃる通りApp::uses()なら簡単ですし、そうすべきだと思います。 何がしたいのか分からないので、とりあえずはautoloadのpsr-4で呼び出したいのかと思い上記のように書きました。 しかしokinaka3さんのご指摘の通りだと思います。 コメントありがとうございます。
vowd1

2016/08/07 08:15

お二人とも回答ありがとうございます。回答遅くなってすみませんでした。okinaka3さんのいうとおりにApp::usesをつかうことで、Controllerのロードすることができました。 Cakephpの作法に従わずに書いたことと、Component、composerの使い方がよくわかってなかったように思います。もう少し学習を進めようと思います。ありがとうございました。
guest

0

php

1require __DIR__.'/../vendor/autoload.php';

vendor/ ディレクトリへの相対パスははご自身の環境にあわせてください。

この記述がないとオートローダーが機能しません。

投稿2016/07/28 00:24

編集2016/07/28 00:28
asahina_dev

総合スコア610

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

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

vowd1

2016/07/28 22:47

回答ありがとうございます。おっしゃるとおり書いたところエラーはきえたのですが、namespaceとuseを使わずに他のコントローラをrequireする方法がわからなくなってしまいました。なにかご助言いただけないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問