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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

2回答

7087閲覧

Call to a member function setUser() on booleanの対応方法がわからない

Tatsuo_Iriyama

総合スコア50

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

0クリップ

投稿2018/09/26 23:26

編集2018/09/26 23:30

##わからない事

タイトルにもあるようにCall to a member function setUser() on booleanというエラーが発生しています。

新規登録機能を作成してまして、入力内容をDBに格納し、そのままログイン状態にする、という流れを作成しています。

開発環境は、

  • PHP 7.1.21
  • Cake 3.1.14

にです。

現状のコードが下記になります。

UsersController

1class UsersController extends AppController 2{ 3 public function initialize() 4 { 5 } 6 7 public function index() 8 { 9 $user = $this->Users->newEntity(); 10 $this->set(compact('user')); 11 12 if ($this->request->is('post')) { 13 // POSTされたらバリデーションを実施 14 // Entity作成 15 $validateUser = $this->Users->newEntity($this->request->data, [ 16 'validate' => 'register' 17 ]); 18 19 if ($validateUser->errors()) { 20 // バリデーションに引っかかった場合 21 $this->Flash->error('入力内容に不備があります'); 22 $this->set('user', $validateUser); 23 return $this->render($this->request->action, 'default'); 24 } 25 26 // 入力内容をセッションに格納 27 $this->request->session()->write('registerUser', $validateUser); 28 29 // 確認画面へ 30 return $this->redirect('/Users/confirm'); 31 } 32 33 if ($this->request->session()->check('registerUser')) { 34 // セッションに値が存在する場合は読み込む 35 $user = $this->request->session()->read('registerUser'); 36 } 37 38 // セッションに格納 39 $this->request->session()->write('registerUser', $user); 40 41 // GETされた時は入力画面へ 42 $this->render($this->request->action, 'default'); 43 return; 44 } 45 46 public function confirm() 47 { 48 // 入力内容をセッションから取得 49 $user = $this->request->session()->read('registerUser'); 50 51 if (!$user) { 52 // セッションから情報を取得できなかった場合 53 throw new BadRequestException('セッションの情報を取得できませんでした'); 54 return; 55 } 56 57 $this->set(compact('user')); 58 $this->render($this->request->action, 'default'); 59 } 60 61 public function save() 62 { 63 // 入力内容をセッションから取得 64 $user = $this->request->session()->consume('registerUser'); 65 66 if (!$user) { 67 // セッションから情報を取得できなかった場合 68 throw new BadRequestException('セッションの情報を取得できませんでした'); 69 return; 70 } 71 72 $user->password_hash = $user['password']; 73 74 if (!$this->Users->save($user)) { 75 // DBに格納できなかった場合 76 return $this->Flash->error('入力内容を保存できませんでした'); 77 } 78 79 // 登録内容でそのままログイン 80 $this->Auth->setUser($user->toArray()); 81 $this->redirect('/Users/complete'); 82 } 83 84 public function complete() 85 { 86 // ログインユーザー情報の取得 87 $authUser = $this->Auth->user(); 88 89 if (empty($authUser)) { 90 // ログインユーザーの取得ができなかった場合 91 throw new BadRequestException('登録情報の取得ができませんでした'); 92 return; 93 } 94 95 $this->render($this->request->action, 'default'); 96 } 97}

現在のエラーは、saveメソッドにある$this->Auth->setUser($user->toArray());で怒られています。
何で怒られているのか、はわかっているのですが、結局どう対応したらいいのか、という方法がわかりません。

対応策を教えて頂けると嬉しいです。
またコード上でこうした方が良い、という意見ありましたら同時に受け付けていますので、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

自己解決

UsersControllerのinitializeメソッドに$this->Auth->allow();を追加する事で解消されました。@popobotさんからのご指摘により解決に至りました。ありがとうございます。

投稿2018/09/27 13:56

Tatsuo_Iriyama

総合スコア50

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

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

0

さらっとしか見ていませんが、こちらの方法は既に確認されているでしょうか?
CakePHPのAuth認証について

リンク先の事象と同じでparent::initialize();を実施できていないのではないかと思います。
もしかしたら解決するかもしれませんので、まずは試してみてはいかがでしょうか

投稿2018/09/27 00:19

mikan_s4n

総合スコア377

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

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

Tatsuo_Iriyama

2018/09/27 00:49 編集

parent::initialize();をすると、新規登録ページに遷移しようとした時、ログイン画面にリダイレクトされるという挙動が発生してまして、ログインユーザーでなくても、新規登録ページには遷移したいという考えから、UsersController内でparent::initialize();をしていません。parent::initialize();をしても対象のページには、ログインユーザーでなくてもリダイレクトする事なく、遷移できる方法がありましたら教えて頂きたいです。
mikan_s4n

2018/09/27 01:33

CakePHPに詳しいとは言えないのでなんとも言えないのですが、AppControllerのinitializeはどうなっているかによるのではないかなぁと。コンポーネントを読み込ませるloadCompornent('Auth')あたりで調べてみると何かわかるのかもしれません。あまりお力になれず申し訳ないです。
popobot

2018/09/27 03:28 編集

> 新規登録ページに遷移しようとした時、ログイン画面にリダイレクトされるという挙動が発生 非ログインユーザに公開する設定に新規登録ページを追加してあげればいいと思いますよ https://book.cakephp.org/3.0/ja/controllers/components/authentication.html#id28 すべてのアクションを公開していいのであれば、UsersControllerのparent::initialize()下あたりに$this->Auth->allow();を追加する感じだと思います。
Tatsuo_Iriyama

2018/09/27 13:55

返答遅くなり申し訳ありません。@popobotさんのおっしゃる通り$this->Auth->allow();でいけました!存在は把握してましたが、使い方がわかっていなかった為、今回の件で理解する事が出来ました。同時に二つの問題を解決して下さり、感謝致します!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問