サーチ…


新しいコントローラの作成

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通りあります。

  1. コントローラの$ componentsプロパティを初期化またはオーバーライドする
  2. コントローラの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()には多くの違いがあります。

  1. initialize()は、コンストラクタが呼び出された後に常に呼び出されます。 beforeFilter()は、特定のコントローラにアクションメソッドが見つからない場合に呼び出されません。
  2. 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あることを意味します。

ポストトピック(多対多)属し 、これはpoststopicsテーブルの多対多の関係topics 。多くの関係を維持するためには、三番目のテーブルを作成する必要があります、テーブル、テーブル名はposts_categoriesなければなりposts_categories 。この表のフィールドは以下のとおりです

  1. id(テーブルの主キー)
  2. post_id( postsテーブルの外部キー)
  3. topic_id( topicsテーブルの外部キー)


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow