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

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

ただいまの
回答率

90.51%

  • CakePHP

    2518questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,139

vowd1

score 45

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

Error: Class 'Controllers\AppController' not found    

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

コントローラの抜粋

<?phpnamespace Controllers;↲
   ↲
   use App\Controller\AppController;↲

  class TestController extends AppController{↲


以下composer.jsonの抜粋

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

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

<?php

   session_start();
   class LoginsController extends AppController
   {
          /** ビュー未使用 */
          public $autoRender = true;
          public $list;  // 本情報
          public $value;  // 本情報
          public $auth_info;  // 本情報

          public function index(){
                  $this->render('/login/login');


          }
          public function auth(){
                  $this->render('/login/login');

  $esc_username = htmlspecialchars($this->data['login']['username'],ENT_QUOTES,"UTF-8");
  $esc_password = htmlspecialchars($this->data['login']['password'],ENT_QUOTES,"UTF-8");

                  if($esc_username !='' && $esc_password && isset($esc_username) && isset($esc_password)){

                          //認証テーブルにアクセス
                          $auth_search = new FacadeAuthLogicController();
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

namespace Controllers;

use App\Controller\AppController;

を削除してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/29 07:45

    回答ありがとうございます。

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

    namespaceとuseなしで、別のコントローラを読むにはどうしたらいいでしょうか。

    キャンセル

  • 2016/08/01 02:06

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

    CakePHP で共通のロジックを利用する場合、コントローラに依存するロジックは、
    Component にまとめることになります。

    キャンセル

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/29 07:47

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

    キャンセル

0

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

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


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

// app/composer.json
// 下記を追加し、composer updateする
"autoload": {
    "psr-4": {
    "Controllers\\" : "Controller/"
    }
},
// app/Controller/Mytest.php
// 自作クラス
<?php
namespace Controllers;
class Mytest {
    public function okok() {
        return "okok";
    }
}

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

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

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

// app/Controller/HogesController.php
use Controllers\Mytest;

……

public function index() {
    $test = new Mytest();
    debug($test->okok()); // 'okok'と出力
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/29 07:35

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

    コードは上記加筆のとおりです。
    FacadeAuthLogicControllerがないエラーはどのようにすれば消えるでしょうか。

    キャンセル

  • 2016/07/29 08:11

    まずはLoginsControllerに
    use Controllers\FacadeAuthLogic;
    を加えてください。

    これは上記の私のコメントでは
    HogesController.php

    use Controllers\Mytest;
    に対応しています。

    -----------

    それと、FacadeAuthLogic.phpをapp/Controller/ディレクトリに用意して、
    namespace Controllers;

    class FacadeAuthLogic {
    ……
    }
    を書いてください。

    これは上記の私のコメントではMytest.phpの
    namespace Controllers;

    class Mytest {
    ……
    }
    にそれぞれ対応しています。

    キャンセル

  • 2016/08/01 01:39

    いろいろ突っ込みどころはありますが、まずは基本に忠実に従って、
    応用は十分に理解してからにしたほうが良いです。

    CakePHP 2 の場合は、独自のクラスローダーを実装しているため、
    そちらを利用しましょう。
    App::uses() で参照するクラスを呼び出せるようになります。

    composer は、CakePHP フレームワークの外のライブラリを利用する場合に
    とどめておくべきだと思います。

    名前空間も今回は利用を避けることをお勧めします。

    キャンセル

  • 2016/08/01 02:27

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

    しかしokinaka3さんのご指摘の通りだと思います。
    コメントありがとうございます。

    キャンセル

  • 2016/08/07 17:15

    お二人とも回答ありがとうございます。回答遅くなってすみませんでした。okinaka3さんのいうとおりにApp::usesをつかうことで、Controllerのロードすることができました。

    Cakephpの作法に従わずに書いたことと、Component、composerの使い方がよくわかってなかったように思います。もう少し学習を進めようと思います。ありがとうございました。

    キャンセル

同じタグがついた質問を見る

  • CakePHP

    2518questions

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