cakephp
CakePHP3コーディングのヒント
サーチ…
新しいコントローラの作成
namespace App\Controller;
class PostsController extends AppController {
public function initialize(){
parent::initialize();
// code that you want to run before every action
}
public function view($id) {
//Your code here
}
}
コントローラにbeforeFilter()メソッドを追加する
beforeFilter()メソッドは、他のメソッドがコントローラで実行される前に実行されます。
まず、コントローラーファイルでクラスを定義する前に、イベント名前空間を使用します。
use Cake\Event\Event;
あなたのコントローラでは、以下のようにbeforeFilter()メソッドを追加します。
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
}
または、 initialize()メソッドを使用できます。
public function initialize(){
parent::initialize();
}
ビューに変数を渡す
各変数を一度に表示するように渡す
$this->set('color', 'pink');
$this->set('color', $color);
compact()関数で複数の変数を渡して一緒に表示する
$color1 = 'pink';
$color2 = 'red';
$this->set(compact('color1', 'color2'));
$ _POSTに相当する投稿データの取得
投稿データは配列として取り出すことができます。
$post_data= $this->request->data;
特定のキーのポストデータを取得することができます。
$this->request->data['field'];
特定のキー値を取得する
$this->request->data('key_name');
ネストされた配列の特定のキー値を取得する
$this->request->data('data.subfield');
配列表記法とdata()メソッドの違いは、 data()がエラーセーフであり、キーが配列に存在しない場合はnullを返すことです
そうして
if(isset($this->request->data['field']) && $this->request->data['field']) { ...}
できるよ
if($this->request->data('field')) { ...}
CakePHP 3.4.x +
すべてのデータを取得する:
$this->request->getData();
特定のキーを取得する:
$this->request->getData('key');
getData関数で利用できるデータを設定するには、次のような処理が必要です。
$this->request = $this->request->withData('some_key_on_the_fly', 'value');
$some_key_on_the_fly = $this->request->getData('some_key_on_the_fly');
静的データを持つコントローラのモデルを更新するのに便利
コントローラに別のモデルをロードする
デフォルトでは、CakePHPは関連するモデルをコントローラにロードします。コントローラに別のモデルをロードするには、loadModel()メソッドを使用します。
$this->loadModel('Articles');
またはオンザフライでロード
$table = TableRegistry::get('Articles');
$table->find();
コントローラから別のページにリダイレクトする
アプリケーション内にリダイレクトする(特定のコントローラの別の動作)。
return $this->redirect([
'controller' => 'myController',
'action' => 'myAction'
]);
リファラーページにリダイレクトする
return $this->redirect($this->referer());
アプリケーションの外部または特定のURLにリダイレクトする
return $this->redirect("http://stackoverflow.com/users/1793428/haresh-vidja");
リダイレクトURLからのアクションへの変数の受け渡し
メソッドのパラメータとしてURLに変数を渡す
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
$id
]);
URLは次のようになります。http:// your_app_url / users / profile / {id}
profile()メソッド内のUsersController.phpファイル内
class UsersController extends Controller {
public function profile($id=null) {
$userData=$this->Users->get($id);
}
}
クエリ文字列としてURLに変数を渡す
return $this->redirect([
'controller' => 'users',
'action' => 'profile',
'?'=>['id'=>$id]
]);
URLは次のようになります。http:// your_app_url / users / profile /?id = {id}
profile()メソッド内のUsersController.phpファイル内
class UsersController extends Controller {
public function profile() {
$userData=$this->Users->get($this->request->query('id'));
}
}
アプリケーションのレイアウトの設定または変更
アプリケーション全体のデフォルトレイアウトを設定します。つまり、/src/Template/Layout/admin.ctpに作成されたレイアウトファイル
class AppsController extends Controller {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->viewBuilder()->layout('admin'); // For Version >= 3.1 or
$this->layout = 'admin'; // for version < 3.1
// your other code should be here
}
}
アプリケーションの特定のアクションのデフォルトレイアウトを設定します 。つまり、アプリケーションは/src/Template/Layout/login.ctpのログインページで異なるレイアウトになります
class UsersController extends Controller {
public function login() {
$this->viewBuilder()->layout('login'); // For Version >= 3.1 or
$this->layout = 'login'; // for version < 3.1
//your other code should be here
}
}
特定のコントローラのレイアウトを変更する。つまり、特定のコントローラのすべてのメソッドに異なるレイアウトが必要です
クラスUsersControllerはController {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->viewBuilder()->layout('user_layout'); // For Version >= 3.1 or
$this->layout = 'user_layout'; // for version < 3.1
//your other code should be here
}
}
Ajaxリクエストのレイアウトを設定する
一般的にAJAXの要求ではCSS、JSの読み込みが必要ありません。他のHTMLコードも省略します。
/ src / Template / Layoutにajax.ctpファイルを作ってください。
<?php
$this->fetch('content');
AppsController.phpで、アプリケーション全体のAJAXベースのレイアウトを設定する
クラスAppsController extends Controller {
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
if($this->request->isAjax())
{
$this->viewBuilder()->layout('ajax'); // For Version >= 3.1 or
$this->layout = 'ajax'; // for version < 3.1
}
else
{
$this->viewBuilder()->layout('admin'); // For Version >= 3.1 or
$this->layout = 'admin'; // for version < 3.1
}
// your other code should be here
}
}
CakePHPにコンポーネントをロードする
コンポーネントをロードする方法は2通りあります。
- コントローラの$ componentsプロパティを初期化またはオーバーライドする
- コントローラのinitialize()メソッドでloadComponent()メソッドを使用します。
Way-1 AppsController.phpによるコンポーネントの読み込みをオーバーライドする必要があります.1つ以上のコンポーネントを読み込みます
class UsersController extends AppController {
public $components = ['RequestHandler','Auth','Flash'];
}
Way-2特定のコントローラに対してコンポーネントを動的にロードする必要がある場合に、この方法を使用します。 1つのコンポーネントを読み込む
class UsersController extends AppController {
public function initialize() {
parent::initialize();
$this->loadComponent("RequestHandler"); // load specific component
$this->loadComponent(["RequestHandler","Auth","Flash"]); // load specific component
}
}
initilaize()メソッドとは何ですか?
initialize()はCakePHPのバージョン> 3.0で導入されました。
コード構造として、beforeFilter()メソッドと同じように見えます。 beforeFilter()とinitialize()には多くの違いがあります。
- initialize()は、コンストラクタが呼び出された後に常に呼び出されます。 beforeFilter()は、特定のコントローラにアクションメソッドが見つからない場合に呼び出されません。
- initialize()メソッドは、新しいコンポーネントやヘルパーの追加などの初期化に一般的に使用されます。しかし、beforeFilter()は一般的にいくつかのグローバルロジック部分を実行するために使用されます。
$ _GETに相当するクエリ文字列データを取得する
クエリ文字列データをArrayとして取り出すことができます。
$post_data= $this->request->query;
特定のキーのポストデータを取得することができます。
$this->request->query['field'];
特定のキー値を取得する
$this->request->query('key_name');
ネストされた配列の特定のキー値を取得する
$this->request->query('data.subfield');
表(モデル)クラスの作成
ユーザーモデルクラスを作成する方法
namespace App\Model\Table;
use Cake\ORM\Table;
class UsersTable extends Table {
public function initialize(array $config) {
$this->table('users'); //define table name
$this->displayField('username'); // unique or other special field of users table
$this->primaryKey('id'); // primary key of users table
$this->tablePrefix('prefix_'); // if prefix set tablename should be prefix_users
// your other code here
}
// your other methods here
}
CakePHPのモデルアソシエーション
CakePHPで定義できる4種類の関連(関係)があります
class PostsTable extends Table {
public function initialize(array $config) {
// table initialization code should be here
$this->belongsTo('Authors', [
'className' => 'Authors',
'foreignKey' => 'author_id',
'joinType' => 'INNER',
]);
$this->hasMany('Tags');
$this->hasOne('Categories');
$this->hasAndBelongsToMany('Topics');
}
}
上記の例では、4つのタイプの関係
投稿は Author (One to One)に属します。 postsテーブルには、 authorsテーブルのidに関連付けられた1つの外部キーauthor_idあります。
ポストには多くのタグ(1対多)があり 、 tagsテーブルには、 postsテーブルのidに関連付けられた1つの外部キーpost_idあります。
ポストには1つのタグ(多対1対1)があり 、 postsテーブルでは、 categoriesテーブルのidに関連付けられた1つの外部キーcategory_idあることを意味します。
ポストはトピック(多対多)に属し 、これはpostsとtopicsテーブルの多対多の関係topics 。多くの関係を維持するためには、三番目のテーブルを作成する必要があります、テーブル、テーブル名はposts_categoriesなければなりposts_categories 。この表のフィールドは以下のとおりです
- id(テーブルの主キー)
- post_id(
postsテーブルの外部キー) - topic_id(
topicsテーブルの外部キー)