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

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

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

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

CakePHP

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

Q&A

解決済

2回答

4986閲覧

CakePHPの他アクションへ変数を渡す方法

tomona

総合スコア37

PHP

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

CakePHP

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

1グッド

0クリップ

投稿2018/05/28 06:29

編集2018/05/28 07:55

CakePHPのコントローラー内に二つのアクションがあります。一つ目のアクションから二つ目のアクションへリダイレクトする際に、一つ目のアクションで定義した変数を2つ目のアクションに引き継ぎたいのですがどのようにすれば実現可能でしょうか。

CakePHPのドキュメントにあった以下の記載方法を試してみましたが[Undefined variable:]となってしまい変数の定義がなされていないようです。

【環境情報】
・Windows環境にXAMPPをインストール
・CakePHP Ver3.6
・PHP 7.1.8

【CakePHPのドキュメント】
[https://book.cakephp.org/3.0/ja/controllers.html#id3]

testController.php

PHP

1return $this->redirect(['action' => 'edit', $id]);

【自分の作ったテストコード】
ユーザーが入力したメールアドレスを引き継いで登録確認メールを送信する処理です。

<?php namespace App\Controller; use App\Controller\AppController; use Cake\Mailer\Email; /** * Users Controller * * @property \App\Model\Table\UsersTable $Users * * @method \App\Model\Entity\User[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = []) */ class UsersController extends AppController { public function add() { $user = $this->Users->newEntity(); if ($this->request->is('post')) { $user = $this->Users->patchEntity($user, $this->request->getData()); if ($this->Users->save($user)) { $this->Flash->success(__('The user has been saved.')); return $this->redirect(['action' => 'sendmail',$user['email']]); } $this->Flash->error(__('The user could not be saved. Please, try again.')); } $this->set(compact('user')); } public function sendmail(){ $email = new Email('default'); try{ $email->setFrom(['support@XXXX.com' => 'サポート']) ->setTo($user['email']) ->setCc('XXXX@XXXX.com') ->setSubject('テスト') ->send(h($user['email']).'さん登録ありがとうございます。'); echo "送信に成功しました。"; }catch(Extention $e){ echo "送信に失敗しました。"; } }

宜しくお願い致します。

ahoahomarumaru👍を押しています

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

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

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

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

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

m.ts10806

2018/05/28 06:31

セッションを使えばいいのでは?と思ったのですが違うのでしょうか?
tomona

2018/05/28 06:37 編集

早速の回答ありがとうございます。まだスキル不足でそのような方法があったとは思いつかなかったのですが、セッションを使うのが一般的なのでしょうか?? ただ、CakePHPドキュメントにある値の渡し方の方法もできなかったので正しい使い方をご教示いただけますと幸いです。
m.ts10806

2018/05/28 06:37

要件によります。念のためCakePHPのバージョンも環境情報として質問に追記してください。
m.ts10806

2018/05/28 06:38

あ、3.0ですかね。リンクURLとは別にしてもらえると明示的なので助かります・・・
tomona

2018/05/28 07:56

失礼いたしました。追記させて頂きましたがいかがでしょうか。
m.ts10806

2018/05/28 08:01

受け取る側はどのように書いているのでしょうか? $idを ["id"=>$id] のようにしても渡りませんか?
退会済みユーザー

退会済みユーザー

2018/05/28 09:28

リダイレクトじゃなくフォワードを使わないのには理由が?
tomona

2018/05/29 07:03

受け取り側は単に変数をそのまま持ってきています。add()アクションからsendmail()アクションに$user['email']という変数を飛ばしたく、受け取り側のsendmail()では->setTo($user['email'])と変数名をそのまま書いております。なお、idに変えてもUndefined variable: id となってしまいました。
tomona

2018/05/29 07:05

フォワードでも良いのですが公式ドキュメントで載っていた方法がredirectだったので使っています。確かにリダイレクトはURLにメールアドレスが表れてしまい何となく嫌な感じがあります。フォワードのほうがよいですか?
guest

回答2

0

自己解決

リダイレクトでは達成できませんでした。

$this->setAction('アクション名',$変数名);

public function アクション名($変数名)

とすることで対応しました。

投稿2018/06/14 10:52

tomona

総合スコア37

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

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

0

tomonaさんの書き方だと自身(testController.php)のeditアクションを実行しちゃうと思うのですがURLはどうなってますでしょうか。

こちらのように明示的にどこのコントローラのどのアクションにリダイレクトするか記述して試してみてください。

PHP

1$this->redirect(['controller'=>'orders','action'=>'confirm',7]);

あとこのサイトも参考になると思いますのでじっくり読んでみてくださいね。

▼回答を読んで追記した内容
間違った認識をしていました。ごめんなさい。リダイレクトした際の値の受け取り方が分からないという話ですね。
ちなみにURLの方は目を通してくれましたでしょうか?

PHP

1return $this->redirect(['action' => 'sendmail',$user['email']]);

リダイレクトさせるとURLが「~/sendmail/なんとか($user['email']の値)」になります。
これを受け取るにはsendmailアクションの引数に変数を定義します。
そうするとその定義された変数のなかに$user['email']の値が入ってきますので確認してみてくださいね。

投稿2018/05/29 12:08

編集2018/06/05 06:04
chibr

総合スコア74

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

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

tomona

2018/06/02 23:54

ご回答ありがとうございます。testController.phpについては公式ドキュメントにとていたものの引用でこの書き方を参考にしましたという意味で載せております。私の作ったコードは【自分の作ったテストコード】以下の部分で同じUsersController内のアクションでadd()からsendmail()へメールアドレス情報($user['email'])を飛ばしたいという趣旨のものです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問