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

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

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

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

CakePHP

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

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

解決済

1回答

7931閲覧

[cakephp3]Controller内でフォルダを階層に分けてルーティングを変更したところ、AppControllerに書いた認証ができなくなった

gano

総合スコア39

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

CakePHP

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

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

1グッド

2クリップ

投稿2017/06/28 04:10

###前提・実現したいこと
CakePHP3で簡単な会員制システムを作っています。

Controllerが増えて来たため、表題の通り、Controllerをフォルダ分けして、ルーティングを変更しました。
その際、階層に分けたルーティングは正常に動いているようでしたが、AppControllerに書いたログイン認証が動かなくなりました。

###現状の整理

以下のことを行いました。

Controller/ ├ DevicesController ├ WalletsController ├ UsersController └ AppController ※拡張子は省略しております。

の状態のものを

Controller/ ├ Accounts/ ├ ├ DeviceController ├ └ WalletsController ├ UsersController └ AppController

に変更し、

routes.phpに以下を記述しています。

$routes->connect('/accounts/devices/',['controller' => 'devices','action'=>'index', 'prefix' => 'accounts']);

DevicesController.phpには、
以下のコードを追記しています。

namespace App\Controller\Accounts; use App\Controller\AppController; class DevicesController extends AppController{ public function index(){ } }

Templateは用意済みで、省略いたします。

###問題とエラー

これまでの状態で、
http://cake_root_url/accounts/device/
にアクセスをすると、以下のようなエラーが発生します。

Error: A route matching "array('controller' => 'Users', 'action' => 'login', 'prefix' => 'accounts' ...)" could not be found

まだ明確に書いていませんでしたが、
システムが会員制であるためDevicesControllerが継承している
AppControllerに、ログイン認証の記述を書いています。

ログイン認証は Usersコントローラのloginメソッドで行っております。
route.phpには、以下の形で'home'に設定しています。

$routes->connect('/',['controller' => 'Users', 'action' => 'login','home']);

/Controller/accounts/devicesControllerにアクセスをしたら、
UsersControllerのloginメソッドを探しにいっているようで、not foundになります。

念のため、AppControllerの認証部分を以下に記載しますが、

DeviceControllerのnamespaceが 「App\Controller\Accounts」であるのに対して、
AppControllerのnamespaceが「App\Controller」でずれていることが原因かと考えています。

namespace App\Controller; use Cake\Controller\Controller; class AppController extends Controller{ public function initialize(){ parent::initialize(); $this->loadComponent('Auth',[ 'athorize' => ['Controller'], 'authenticate' => [ /* ログイン入力項目に関する処理 */ ], 'loginRedirect' => [ 'controller' => 'Users', 'action' => 'mypage' ], 'logoutRedirect' => [ 'controller' => 'Users', 'action' => 'logout' ], ] } }

Controllers/の中に階層を作った状態で、
AppControllerのログイン認証を正常に動かすには、
どのように修正すればよろしいでしょうか?

大変恐縮ですが、分かる方どなたか
アドバイスのほどよろしくお願いいたします。

pronronro👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

AppController::initializeが、継承されたAccounts\DevicesControllerのコンテキストで実行されるため、AuthComponentに渡したUsersのルートもaccountsのプレフィックスで解釈されてしまい、エラーとなります。

php

1 $this->loadComponent('Auth',[ 2 'authorize' => ['Controller'], 3 'authenticate' => [ 4 /* ログイン入力項目に関する処理 */ 5 ], 6 'loginRedirect' => [ 7 'controller' => 'Users', 8 'action' => 'mypage', 9 'prefix' => false // 追加 10 ], 11 'logoutRedirect' => [ 12 'controller' => 'Users', 13 'action' => 'logout', 14 'prefix' => false // 追加 15 ], 16 ]); 17

投稿2017/06/28 04:54

maisumakun

総合スコア145184

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

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

gano

2017/06/28 23:19 編集

ご回答ありがとうございました。 頂いた情報をもとに、 'loginAction' => [ 'controller' => 'Users', 'action' => 'login',prefix => 'accounts'] を追記したところ意図通り動きました。 とても助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問