Cakephp-quick-guide

提供:Dev Guides
移動先:案内検索

CakePHP-概要

CakePHPはオープンソースのMVCフレームワークです。 これにより、アプリケーションの開発、展開、および保守がはるかに簡単になります。 CakePHPには、最も一般的なタスクの過負荷を軽減するためのライブラリがいくつかあります。 CakePHPを使用する利点は次のとおりです。

  • オープンソース
  • MVCフレームワーク
  • テンプレートエンジン
  • キャッシング操作
  • 検索エンジンに優しいURL
  • 簡単なCRUD(作成、読み取り、更新、削除)データベースの相互作用。
  • ライブラリとヘルパー
  • 組み込みの検証
  • ローカライゼーション
  • 電子メール、Cookie、セキュリティ、セッション、およびリクエスト処理コンポーネント
  • AJAX、JavaScript、HTMLフォームなどのヘルパーを表示する

CakePHPリクエストサイクル

次の図は、リクエストライフサイクルの仕組みを説明しています-

CakePHPリクエストサイクル

典型的なCakePHPリクエストサイクルは、ユーザーがアプリケーションのページまたはリソースをリクエストすることから始まります。 高レベルでは、各リクエストは次のステップを経ます-

  • Webサーバーの書き換えルールは、リクエストをwebroot/index.phpに送信します。
  • アプリケーションのオートローダーとブートストラップファイルが実行されます。
  • 構成されている* dispatchフィルター*は、要求を処理でき、オプションで応答を生成できます。
  • ディスパッチャは、ルーティングルールに基づいて適切なコントローラーとアクションを選択します。
  • コントローラーのアクションが呼び出され、コントローラーは必要なモデルとコンポーネントと対話します。
  • コントローラーは応答の作成を View に委任して、モデルデータから結果を出力します。
  • ビューは Helpers および Cells を使用して、応答の本文とヘッダーを生成します。
  • 応答はクライアントに送り返されます。

CakePHP-インストール

CakePHPのインストールは簡単で簡単です。 コンポーザーからインストールするか、github(https://github.com/cakephp/cakephp/releases)からダウンロードできます。 CakePHPをWampServerにインストールする方法をさらに理解します。 githubからダウンロードしたら、WampServerの「CakePHP」というフォルダーにあるすべてのファイルを抽出します。 フォルダにカスタム名を付けることができますが、「CakePHP」を使用しました。

CakePHPはさまざまな操作にこれらのディレクトリを使用するため、ディレクトリ logs、tmp およびそのすべてのサブディレクトリに* writeパーミッション*があることを確認してください。

解凍したら、ブラウザで次のURLにアクセスして、正しくインストールされているかどうかを確認しましょう- http://localhost:85/CakePHP/

上記のURLを使用すると、以下に示す画面に移動できます。 これは、CakePHPが正常にインストールされたことを示しています。

CakePHPのインストール

CakePHP-フォルダー構造

次のスクリーンショットをご覧ください。 CakePHPのフォルダー構造を示しています。

CakePHPのフォルダー構造

次の表は、各フォルダの役割を説明しています-

S.No Folder Name & Description
1

bin

binフォルダーには、Cakeコンソールの実行可能ファイルが含まれています。

2

config

configフォルダーには、CakePHPが使用する(いくつかの)構成ファイルが含まれています。 データベース接続の詳細、ブートストラップ、コア構成ファイルなどをここに保存する必要があります。

3

logs

通常、ログフォルダーには、ログ構成に応じてログファイルが含まれます。

4

plugins

pluginsフォルダーは、アプリケーションが使用するプラグインが保存される場所です。

5

src

srcフォルダーは、魔法をかける場所です。アプリケーションのファイルが置かれる場所です。 CakePHPのsrcフォルダーは、ほとんどのアプリケーション開発を行う場所です。 src内のフォルダーをもう少し詳しく見てみましょう。

  • コンソールアプリケーションのコンソールコマンドとコンソールタスクが含まれます。
  • Controllerアプリケーションのコントローラーとそのコンポーネントが含まれます。
  • Locale国際化のために文字列ファイルを保存します。
  • モデルアプリケーションのテーブル、エンティティ、および動作が含まれます。
  • ビュープレゼンテーションクラスは、セル、ヘルパー、およびテンプレートファイルに配置されます。 *テンプレートプレゼンテーションファイルは、要素、エラーページ、レイアウト、ビューテンプレートファイルに配置されます。
6
  • tests*

testsフォルダーは、アプリケーションのテストケースを置く場所になります。

7

tmp

tmpフォルダーは、CakePHPが一時データを保存する場所です。 保存する実際のデータは、CakePHPの設定方法によって異なりますが、このフォルダーは通常、モデルの説明とセッション情報を保存するために使用されます。

8

vendor

ベンダーフォルダーは、CakePHPおよびその他のアプリケーションの依存関係がインストールされる場所です。 このフォルダー内のファイルを編集しないことを個人的に約束してください。 コアを変更した場合、サポートすることはできません。

9

webroot

webrootディレクトリは、アプリケーションのパブリックドキュメントルートです。 パブリックに到達可能にするすべてのファイルが含まれています。

CakePHP-設定

CakePHPにはデフォルトで1つの設定ファイルが付属しており、必要に応じて変更できます。 この目的のための専用フォルダー*「config」*が1つあります。 CakePHPにはさまざまな設定オプションがあります。

一般的な構成

次の表は、さまざまな変数の役割と、それらがCakePHPアプリケーションに与える影響を説明しています。

S.No Variable Name & Description
1

debug

CakePHPのデバッグ出力を変更します。

false =プロダクションモード。 エラーメッセージ、エラー、警告は表示されません。

true =エラーと警告が表示されます。

2

App.namespace

アプリクラスを見つけるための名前空間。

3

App.baseUrl

Apacheのmod_rewriteをCakePHPで使用する予定がない場合は、この定義のコメントを外してください。 .htaccessファイルも削除することを忘れないでください。

4

App.base

アプリが存在するベースディレクトリ。 falseの場合、これは自動検出されます。

5

App.encoding

アプリケーションが使用するエンコーディングを定義します。 このエンコードは、レイアウトで文字セットを生成し、エンティティをエンコードするために使用されます。 データベースに指定されたエンコード値と一致する必要があります。

6

App.webroot

webrootディレクトリ。

7

App.wwwRoot

webrootへのファイルパス。

8

App.fullBaseUrl

アプリケーションのルートへの完全修飾ドメイン名(プロトコルを含む)。

9

App.imageBaseUrl

webrootの下のパブリックイメージディレクトリへのWebパス。

10

App.cssBaseUrl

webrootの下のパブリックcssディレクトリへのWebパス。

11

App.jsBaseUrl

webrootの下のパブリックjsディレクトリへのWebパス。

12

App.paths

非クラスベースのリソースのパスを構成します。 *プラグイン、テンプレート、ロケール*サブキーをサポートします。これにより、プラグイン、ビューテンプレート、およびロケールファイルのパスをそれぞれ定義できます。

13

Security.salt

ハッシュで使用されるランダムな文字列。 この値は、対称暗号化を行うときにHMACソルトとしても使用されます。

14

Asset.timestamp

適切なヘルパーを使用する場合、アセットファイルURL(CSS、JavaScript、画像)の最後に特定のファイルの最終変更時刻であるタイムスタンプを追加します。 有効な値-

  • (bool)false-何もしません(デフォルト)
  • (bool)true-デバッグがtrueの場合にタイムスタンプを追加します
  • (文字列) 'force'-常にタイムスタンプを追加します

データベース構成

データベースは config/app.php ファイルで設定できます。 このファイルには、選択に応じて変更できるパラメータが提供されたデフォルトの接続が含まれています。 以下のスクリーンショットは、要件に従って変更する必要があるデフォルトのパラメーターと値を示しています。

構成

各パラメーターを詳細に理解しましょう-

S.NO Key & Description
1

className

データベースサーバーへの接続を表すクラスの完全な名前空間クラス名。 このクラスは、データベースドライバーのロード、SQLトランザクションメカニズムの提供、その他のSQLステートメントの準備を行います。

2

driver

データベースエンジンのすべての特異性を実装するために使用されるドライバーのクラス名。 これは、プラグイン構文を使用した短いクラス名、完全な名前空間の名前、または構築されたドライバーインスタンスのいずれかです。 短いクラス名の例は、Mysql、Sqlite、Postgres、およびSqlserverです。

3

persistent

データベースへの永続的な接続を使用するかどうか。

4

host

データベースサーバーのホスト名(またはIPアドレス)。

5

username

データベースのユーザー名

6

password

データベースのパスワード

7

database

データベースの名前

8

port (optional)

サーバーへの接続に使用されるTCPポートまたはUnixソケット。

9

encoding

「utf8」など、SQLステートメントをサーバーに送信するときに使用する文字セットを示します。

10

timezone

設定するサーバーのタイムゾーン。

11

schema

使用するスキーマを指定するために、PostgreSQLデータベースのセットアップで使用されます。

12

unix_socket

Unixソケットファイルを介して接続するために、それをサポートするドライバーによって使用されます。 PostgreSQLを使用していて、Unixソケットを使用する場合は、ホストキーを空白のままにします。

13

ssl_key

SSLキーファイルへのファイルパス。 (MySQLでのみサポートされます)。

14

ssl_cert

SSL証明書ファイルへのファイルパス。 (MySQLでのみサポートされます)。

15

ssl_ca

SSL認証局へのファイルパス。 (MySQLでのみサポートされます)。

16

init

接続の作成時にデータベースサーバーに送信する必要があるクエリのリスト。

17

log

クエリログを有効にするには、trueに設定します。 有効にすると、クエリはクエリログスコープでデバッグレベルでログに記録されます。

18

quoteIdentifiers

テーブル名または列名で予約語または特殊文字を使用している場合は、trueに設定します。 この設定を有効にすると、SQLの作成時に引用符で囲まれた識別子を持つクエリビルダを使用してクエリが構築されます。 パフォーマンスが低下します。

19

flags

基礎となるPDOインスタンスに渡す必要があるPDO定数の連想配列。

20

cacheMetadata

boolean true、またはメタデータを保存するキャッシュ設定を含む文字列。 メタデータキャッシングを無効にすることはお勧めできません。パフォーマンスが非常に低下する可能性があります。

CakePHP-メール設定

メールは config/app.php ファイルで設定できます。 config/app.phpでメール構成を定義する必要はありません。 メールはそれなしでも使用できます。それぞれの方法を使用して、すべての構成を個別に設定するか、構成の配列をロードします。 電子メールのデフォルトの構成は、* config()および configTransport()*を使用して作成されます。

電子メール構成トランスポート

トランスポートを配信プロファイルとは別に定義することにより、複数のプロファイルでトランスポート構成を簡単に再利用できます。 実動、開発、およびテスト用に複数の構成を指定できます。 各トランスポートには className が必要です。 有効なオプションは次のとおりです-

  • メール-PHPメール機能を使用して送信
  • SMTP -SMTPを使用して送信
  • デバッグ-メールを送信せず、結果を返すだけです

適切なファイルを src/Mailer/Transport に追加することにより、カスタムトランスポートを追加(または既存のトランスポートをオーバーライド)できます。Transportsの名前は YourTransport.php で、 'Your' はトランスポートの名前です。 以下は、電子メール構成トランスポートの例です。

'EmailTransport' => [
   'default' => [
      'className' => 'Mail',

     //The following keys are used in SMTP transports
      'host' => 'localhost',
      'port' => 25,
      'timeout' => 30,
      'username' => 'user',
      'password' => 'secret',
      'client' => null,
      'tls' => null,
      'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
   ],
],

メール配信プロファイル

配信プロファイルを使用すると、アプリケーションからの電子メールメッセージに関するさまざまなプロパティを事前に定義し、設定に名前を付けることができます。 これにより、アプリケーション全体の重複がなくなり、メンテナンスと開発が容易になります。 各プロファイルはいくつかのキーを受け入れます。 以下は、メール配信プロファイルの例です。

'Email' => [
   'default' => [
      'transport' => 'default',
      'from' => 'you@localhost',
   ],
],

CakePHP-ルーティング

ルーティングは、URLを特定のコントローラーのアクションにマップします。 このセクションでは、ルートを実装する方法、URLからコントローラーのアクションに引数を渡す方法、URLを生成する方法、特定のURLにリダイレクトする方法について説明します。 通常、ルートは config/routes.php ファイルに実装されています。 ルーティングは2つの方法で実装できます-

  • 静的メソッド
  • スコープ付きルートビルダー

以下に両方のタイプを示す例を示します。

//Using the scoped route builder.
Router::scope('/', function ($routes) {
   $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
});

//Using the static method.
Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);

両方のメソッドは、 ArticlesController のインデックスメソッドを実行します。 2つの方法のうち、*スコープ付きルートビルダー*はパフォーマンスを向上させます。

ルートを接続する

  • Router :: connect()*メソッドはルートを接続するために使用されます。 以下は、メソッドの構文です-
static Cake\Routing\Router::connect($route, $defaults =[], $options =[])
  • Router :: connect()*メソッドには3つの引数があります-
  • 最初の引数は、照合するURLテンプレート用です。
  • 2番目の引数には、ルート要素のデフォルト値が含まれています。
  • 3番目の引数には、通常正規表現ルールを含むルートのオプションが含まれます。

ルートの基本的な形式は次のとおりです-

$routes->connect(
   'URL template',
   ['default' => 'defaultValue'],
   ['option' => 'matchingRegex']
);

以下に示すように、config/routes.phpファイルを変更します。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/', ['controller' => 'Tests', 'action' => 'index']);
      $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/TestsController.php* に *TestsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/TestsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class TestsController extends AppController{
      public function index(){
      }
   }
?>
*src/Template* の下に *Tests* フォルダーを作成し、そのフォルダーの下に *index.ctp* という* Viewファイル*を作成します。 そのファイルに次のコードをコピーします。
*src/Template/Tests/index.ctp*
This is CakePHP tutorial and this is an example of connecting routes.

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/*

上記のURLは次の出力を生成します。

ルーティング

渡された引数

渡される引数は、URLで渡される引数です。 これらの引数はコントローラーのアクションに渡すことができます。 これらの渡された引数は、3つの方法でコントローラーに渡されます。

アクションメソッドの引数として

次の例は、コントローラーのアクションに引数を渡す方法を示しています。

次のURLにアクセスしてください- http://localhost:85/CakePHP/tests/value1/value2

これは、次のルートラインと一致します。

$routes->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action' =>
   'index'],['pass' => ['arg1', 'arg2']]);

ここでは、URLのvalue1がarg1に割り当てられ、value2がarg2に割り当てられます。

数値インデックス配列として

引数がコントローラーのアクションに渡されると、次のステートメントで引数を取得できます。

$args = $this->request->params[‘pass’]

コントローラのアクションに渡される引数は、 $ args 変数に保存されます。

ルーティング配列の使用

引数はまた、次のステートメントによってアクションに渡すことができます-

$routes->connect('/', ['controller' => 'Tests', 'action' => 'index',5,6]);

上記のステートメントは、2つの引数5と6を* TestControllerのindex()*メソッドに渡します。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('tests/:arg1/:arg2', ['controller' => 'Tests', 'action'=>
         'index'],['pass' =>['arg1', 'arg2']]);

      $routes->connect('/pages/*', ['controller' => 'Pages', 'action' => 'display']);
      $routes->fallbacks('DashedRoute');
   });

   Plugin::routes();
*src/Controller/TestsController.php* に *TestsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/TestsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class TestsController extends AppController{
      public function index($arg1,$arg2){
         $this->set('argument1',$arg1);
         $this->set('argument2',$arg2);
      }
   }
?>
*src/Template* に *Tests* フォルダーを作成し、そのフォルダーの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Tests/index.ctp*
This is CakePHP tutorial and this is an example of Passed arguments.<br/>
Argument-1: <?=$argument1?><br/>
Argument-2: <?=$argument2?><br/>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/tests/Virat/Kunal*

実行すると、上記のURLは次の出力を生成します。

CakePHPルーティング

CakePHP-URLの生成

これはCakePHPのクールな機能です。 生成されたURLを使用すると、コード全体を変更することなく、アプリケーションのURLの構造を簡単に変更できます。

url( string|array|null $url null , boolean $full false )

上記の関数は2つの引数を取ります-

  • 最初の引数は、次のいずれかを指定する配列です- 'controller'、 'action'、 'plugin' 。 さらに、ルーティングされた要素またはクエリ文字列パラメーターを提供できます。 文字列の場合、有効なURL文字列の名前を指定できます。
  • trueの場合、完全なベースURLが結果の先頭に追加されます。 デフォルトはfalseです。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes){
      $routes->connect('/generate',['controller'=>'Generates','action'=>'index']);
   });

   Plugin::routes();
*src/Controller/GeneratesController.php* に *GeneratesController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/GeneratesController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class GeneratesController extends AppController{
      public function index(){
      }
   }
?>
*src/Template* で生成するフォルダーを作成し、そのフォルダーの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Generates/index.ctp*
This is CakePHP tutorial and this is an example of Generating URLs.

次のURLにアクセスして、上記の例を実行します-

*http://localhost:85/CakePHP/generate*

上記のURLは次の出力を生成します-

URLの生成

CakePHP-リダイレクトルーティング

リダイレクトルーティングは、このURLが移動されたことをクライアントアプリケーションに通知する場合に役立ちます。 URLは、次の関数を使用してリダイレクトできます。

static Cake\Routing\Router::redirect($route, $url, $options =[])

上記の関数には3つの引数があります-

  • ルートのテンプレートを説明する文字列。
  • リダイレクト先のURL。
  • ルートの名前付き要素を、その要素が一致する必要がある正規表現に一致させる配列。

以下に示すように、 config/routes.php ファイルを変更します。 ここでは、以前に作成されたコントローラーを使用しました。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/generate2', ['controller' => 'Tests', 'action' => 'index']);
      $routes->redirect('/generate1','http://finddevguides.com/');
      $routes->connect('/generate_url',['controller'=>'Generates','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

次のURLにアクセスして、上記の例を実行します。

  • URL 1 — http://localhost:85/CakePHP/generate_url
  • URL 2 — http://localhost:85/CakePHP/generate1
  • URL 3 — http://localhost:85/CakePHP/generate2

URL 1の出力

ルーティングの生成

URL 2の出力

[[1]]

URL 3の出力

ルーティングの生成

CakePHP-コントローラー

名前が示すように、コントローラーがアプリケーションを制御します。 モデルとビューの間の橋のように機能します。 コントローラーは要求データを処理し、正しいモデルが呼び出され、正しい応答またはビューがレンダリングされるようにします。 コントローラのクラスのメソッドは*アクション*と呼ばれます。 各コントローラーは命名規則に従います。 コントローラークラス名は複数形、キャメルケース、コントローラー- PostsController で終わります。

AppController

*AppConttroller* クラスは、すべてのアプリケーションのコントローラーの親クラスです。 このクラスは、CakePHPの *Controller* クラスを拡張します。 AppControllerは *src/Controller/AppController.php* で定義されています。 ファイルには次のコードが含まれています。
<?php
   namespace App\Controller;
   use Cake\Controller\Controller;
   use Cake\Event\Event;

   class AppController extends Controller{
      public function initialize(){
         parent::initialize();
         $this->loadComponent('RequestHandler');
         $this->loadComponent('Flash');
      }
      public function beforeRender(Event $event){
         if (!array_key_exists('_serialize', $this->viewVars) &&
            in_array($this->response->type(), ['application/json', application/xml'])) {
            $this->set('_serialize', true);
         }
      }
   }
*AppController* を使用して、アプリケーションのすべてのコントローラーで使用されるコンポーネントをロードできます。 AppControllerで作成された属性とメソッドは、それを拡張するすべてのコントローラーで使用できます。 * initialize()*メソッドは、コンポーネントをロードするためにコントローラーのコンストラクターの最後に呼び出されます。

コントローラの動作

コントローラクラスのメソッドは、アクションと呼ばれます。 アクションは、リクエストを行うブラウザ/ユーザーに適切な応答を送信する責任があります。 ビューは、アクションの名前、つまりコントローラーのメソッドの名前によってレンダリングされます。

class RecipesController extends AppController{
   public function view($id){
     //Action logic goes here.
   }
   public function share($customerId, $recipeId){
     //Action logic goes here.
   }
   public function search($query){
     //Action logic goes here.
   }
}

上記の例でわかるように、 RecipesController には3つのアクション(* View、Share、、 *Search )があります。

リダイレクト

ユーザーを同じコントローラーの別のアクションにリダイレクトするには、setAction()メソッドを使用できます。 以下は、setAction()メソッドの構文です-

構文

Cake\Controller\Controller::setAction($action, $args...)

次のコードは、ユーザーを同じコントローラーのインデックスアクションにリダイレクトします。

$this->setAction('index');

次の例は、上記の方法の使用法を示しています。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/redirectcontroller',['
         controller'=>'Redirects','action'=>'action1']);

      $routes->connect('/redirectcontroller2',['
         controller'=>'Redirects','action'=>'action2']);

      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

src/Controller/RedirectsController.phpに RedirectsController.php ファイルを作成します。 次のコードをコントローラーファイルにコピーします。

*src/Controller/RedirectsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class RedirectsController extends AppController{
      public function action1(){
      }
      public function action2(){
         echo "redirecting from action2";
         $this->setAction('action1');
      }
   }
?>
*src/Template* に *Redirects* ディレクトリを作成し、そのディレクトリの下に *action* *。ctp *という* *View* *ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Redirects/action1.ctp*
This is an example of how to redirect within controller.

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/redirect-controller*

出力

実行すると、次の出力が表示されます。

リダイレクト

次に、次のURLにアクセスします- http://localhost:85/CakePHP/redirect-controller2

上記のURLは、次の出力を提供します。

Action2のリダイレクト

モデルの読み込み

CakePHPでは、* loadModel()*メソッドを使用してモデルをロードできます。 以下は、loadModel()メソッドの構文です。

構文

Cake\Controller\Controller::loadModel(string $modelClass, string $type)

上記の関数には2つの引数があります-

  • 最初の引数はモデルクラスの名前です。
  • 2番目の引数は、ロードするリポジトリのタイプです。

コントローラーにArticlesモデルをロードする場合、コントローラーのアクションに次の行を記述することでロードできます。

$this->loadModel('Articles');

CakePHP-ビュー

MVCの文字「V」はビュー用です。 ビューは、リクエストに基づいてユーザーに出力を送信します。 View Classes は、開発プロセスを高速化する強力な方法です。

テンプレートを表示

CakePHPのView Templatesファイルには、デフォルトの拡張子。 ctp (CakePHP Template)があります。 これらのテンプレートはコントローラーからデータを取得し、出力をレンダリングしてユーザーに適切に表示できるようにします。 テンプレートでは、変数、さまざまな制御構造を使用できます。

テンプレートファイルは、 src/Template/ の、ファイルを使用するコントローラーにちなんで名付けられたディレクトリに保存され、対応するアクションにちなんで名付けられます。 たとえば、Productsコントローラーの*“ view()” アクションの *View ファイルは、通常src/Template/Products/view.ctpにあります。

要するに、コントローラー(ProductsController)の名前はフォルダー(Products)の名前と同じですが、コントローラーという言葉がなく、コントローラーのアクション/メソッド(view())の名前(ProductsController)は同じ名前ですビューファイル(view.ctp)。

変数を表示する

ビュー変数は、コントローラーから値を取得する変数です。 ビューテンプレートでは、必要な数の変数を使用できます。 * set()メソッドを使用して、ビューの変数に値を渡すことができます。 これらの設定変数は、ビューとアクションがレンダリングするレイアウトの両方で使用できます。 以下は set()*メソッドの構文です。

構文

Cake\View\View::set(string $var, mixed $value)

このメソッドは、*変数の名前*と*値*の2つの引数を取ります。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('template',['controller'=>'Products','action'=>'view']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/ProductsController.php* に *ProductsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/ProductsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class ProductsController extends AppController{
      public function view(){
         $this->set('Product_Name','XYZ');
      }
   }
?>
*src/Template* にディレクトリProductsを作成し、そのフォルダーの下に* view.ctp。*という *View* ファイルを作成します。そのファイルに次のコードをコピーします。
*src/Template/Products/view.ctp*
Value of variable is: <?php echo $Product_Name; ?>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/template*

出力

上記のURLは次の出力を生成します。

products

CakePHP-ビューの拡張

多くの場合、Webページを作成している間、ページの特定の部分を他のページに繰り返したいと思います。 CakePHPには、ビューを別のビューに拡張できる機能があります。このため、コードを再度繰り返す必要はありません。 * extend()メソッドは、 *View ファイルのビューを拡張するために使用されます。 このメソッドは1つの引数、つまり、パス付きのビューファイルの名前を取ります。 ビューファイルの名前を提供するときに拡張子.ctpを使用しないでください。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('extend',['controller'=>'Extends','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/ExtendsController.php* に *ExtendsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/ExtendsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class ExtendsController extends AppController{
      public function index(){
      }
   }
?>
*src/Template* に *Extends* ディレクトリを作成し、そのフォルダーの下に *header.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Extends/header.ctp*
<div align = "center"><h1>Common Header</h1></div>

<?= $this->fetch('content') ?>

Extendsディレクトリの下に index.ctp という別の View を作成します。 そのファイルに次のコードをコピーします。 ここで、上記のビュー header.ctp を拡張しています。

*src/Template/Extends/index.ctp*
<?php $this->extend('header'); ?>
This is an example of extending view.

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/extend*

出力

実行すると、次の出力が表示されます。

共通ヘッダー

CakePHP-ビュー要素

Webページの特定の部分は、複数のWebページで異なる場所に繰り返されます。 CakePHPは、これらの繰り返し部分を再利用するのに役立ちます。 これらの再利用可能な部分は、*要素-ヘルプボックス、追加メニュー*などと呼ばれます。 要素は基本的に*ミニビュー*です。 要素に変数を渡すこともできます。

Cake\View\View::element(string $elementPath, array $data, array $options =[])

上記の関数には3つの引数があります-

  • 最初の引数は、 /src/Template/Element/ フォルダー内のテンプレートファイルの名前です。
  • 2番目の引数は、レンダリングされたビューで使用可能にするデータの配列です。
  • 3番目の引数は、オプションの配列用です。 e.g. キャッシュ。

3つの引数のうち、最初の引数は必須ですが、残りはオプションです。

*helloworld.ctp* という名前の *src/Template/Element* ディレクトリに要素ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Element/helloworld.ctp*
<p>Hello World</p>
*src/Template* に *Elems* フォルダーを作成し、そのディレクトリーの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Elems/index.ctp*
Element Example: <?php echo $this→element('helloworld'); ?>

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/elementexample',['controller'=>'Elems','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/ElemsController.php* に *ElemsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/ElemsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class ElemsController extends AppController{
      public function index(){
      }
   }
?>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/element-example*

出力

実行すると、上記のURLは次の出力を提供します。

ビュー要素

CakePHP-イベントを見る

View Eventsで使用できるコールバック/イベントがいくつかあります。 これらのイベントは、何かが起こる前または何かが起こった後にいくつかのタスクを実行するのに役立ちます。 以下は、CakePHPで使用できるコールバックのリストです。

S.No Event Function & Description
1

Helper::beforeRender(Event $event, $viewFile)

  • beforeRender* メソッドは、コントローラーのbeforeRenderメソッドの後、コントローラーが *view* および *layout* をレンダリングする前に呼び出されます。 これは、引数としてレンダリングされるファイルを受け取ります。
2

Helper::beforeRenderFile(Event $event, $viewFile)

このメソッドは、各ビューファイルがレンダリングされる前に呼び出されます。 これには、 elements、views、parent views 、および layouts が含まれます。

3

Helper::afterRenderFile(Event $event, $viewFile, $content)

このメソッドは、各Viewファイルがレンダリングされた後に呼び出されます。 これには、 elements、viewsparent views および layouts が含まれます。 コールバックは、変更して $ content を返し、レンダリングされたコンテンツがブラウザーに表示される方法を変更できます。

4

Helper::afterRender(Event $event, $viewFile)

このメソッドは、ビューがレンダリングされた後、レイアウトのレンダリングが開始される前に呼び出されます。

5

Helper::beforeLayout(Event $event, $layoutFile)

このメソッドは、レイアウトのレンダリングが開始される前に呼び出されます。 これは、レイアウトファイル名を引数として受け取ります。

6

Helper::afterLayout(Event $event, $layoutFile)

このメソッドは、レイアウトのレンダリングが完了した後に呼び出されます。 これは、レイアウトファイル名を引数として受け取ります。

CakePHP-データベースでの作業

CakePHPでデータベースを操作するのはとても簡単です。 この章では、CRUD(作成、読み取り、更新、削除)操作について理解します。 先に進む前に、データベースに次のユーザーのテーブルを作成する必要があります。

CREATE TABLE `users` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `username` varchar(50) NOT NULL,
   `password` varchar(255) NOT NULL,
   PRIMARY KEY (`id`)
)
ENGINE = InnoDB AUTO_INCREMENT = 7 DEFAULT CHARSET = latin1

さらに、 config/app.php ファイルでデータベースを構成する必要もあります。

レコードを挿入する

データベースにレコードを挿入するには、最初に TableRegistry クラスを使用してテーブルを取得する必要があります。 * get()*メソッドを使用して、レジストリからインスタンスをフェッチできます。 * get()*メソッドは、データベーステーブルの名前を引数として受け取ります。

この新しいインスタンスは、新しいエンティティを作成するために使用されます。 新しいエンティティのインスタンスで必要な値を設定します。 データベースに新しいレコードを挿入する TableRegistry クラスのインスタンスで* save()*メソッドを呼び出す必要があります。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/users/add', ['controller' => 'Users', 'action' => 'add']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*srcs/Controller/UsersController.php* に *UsersController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/controller/UsersController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   use Cake\Auth\DefaultPasswordHasher;

   class UsersController extends AppController{
      public function add(){
         if($this->request->is('post')){
            $username = $this->request->data('username');
            $hashPswdObj = new DefaultPasswordHasher;
            $password = $hashPswdObj->hash($this->request->data('password'));
            $users_table = TableRegistry::get('users');
            $users = $users_table->newEntity();
            $users->username = $username;
            $users->password = $password;

            if($users_table->save($users))
            echo "User is added.";
         }
      }
   }
?>

src/Template にディレクトリ Usersを作成し、そのディレクトリの下に add.ctp という名前のビューファイルを作成します。 そのファイルに次のコードをコピーします。

*src/Template/Users/add.ctp*
<?php
   echo $this->Form->create("Users",array('url'=>'/users/add'));
   echo $this->Form->input('username');
   echo $this->Form->input('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/users/add*

出力

実行すると、次の出力が表示されます。

ユーザー追加

CakePHP-レコードを見る

データベースのレコードを表示するには、最初に TableRegistry クラスを使用してテーブルを取得する必要があります。 * get()メソッドを使用して、レジストリからインスタンスをフェッチできます。 * get()*メソッドは、データベーステーブルの名前を引数として受け取ります。 現在、この新しいインスタンスは、 find()*メソッドを使用してデータベースからレコードを検索するために使用されます。 このメソッドは、要求されたテーブルからすべてのレコードを返します。

次のコードに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/users', ['controller' => 'Users', 'action' => 'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*srcs/Controller/UsersController.php* に *UsersController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/controller/UsersController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class UsersController extends AppController{
      public function index(){
         $users = TableRegistry::get('users');
         $query = $users->find();
         $this->set('results',$query);
      }
   }
?>
*src/Template* にディレクトリ *Users* を作成し、すでに作成されている場合は無視し、そのディレクトリの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Users/index.ctp*
<a href = "add">Add User</a>
<table>
   <tr>
      <td>ID</td>
      <td>Username</td>
      <td>Password</td>
      <td>Edit</td>
      <td>Delete</td>
   </tr>

   <?php
      foreach ($results as $row):
         echo "<tr><td>".$row->id."</td>";
         echo "<td>".$row->username."</td>";
         echo "<td>".$row->password."</td>";
         echo "<td><a href = '".$this->Url->build
         (["controller" => "Users","action"=>"edit",$row->id])."'>Edit</a></td>";

         echo "<td><a href = '".$this->Url->build
         (["controller" => "Users","action"=> "delete",$row->id])."'>Delete</a></td></tr>";
      endforeach;
   ?>
</table>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/users*

出力

実行すると、上記のURLは次の出力を提供します。

レコードの表示

CakePHP-レコードを更新する

データベースのレコードを更新するには、まず TableRegistry クラスを使用してテーブルを取得する必要があります。 * get()*メソッドを使用して、レジストリからインスタンスをフェッチできます。 * get()*メソッドは、データベーステーブルの名前を引数として受け取ります。 現在、この新しいインスタンスは、更新する特定のレコードを取得するために使用されます。

この新しいインスタンスで* get()メソッドを呼び出し、主キーを渡して、別のインスタンスに保存されるレコードを見つけます。 このインスタンスを使用して、更新する新しい値を設定し、最後に *TableRegistry クラスのインスタンスで* save()*メソッドを呼び出してレコードを更新します。

次のコードに示すように、config/routes.phpファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/users/edit', ['controller' => 'Users', 'action' => 'edit']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*srcs/Controller/UsersController.php* に *UsersController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/controller/UsersController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class UsersController extends AppController{
      public function index(){
         $users = TableRegistry::get('users');
         $query = $users->find();
         $this->set('results',$query);
      }
      public function edit($id){
         if($this->request->is('post')){
            $username = $this->request->data('username');
            $password = $this->request->data('password');
            $users_table = TableRegistry::get('users');
            $users = $users_table->get($id);
            $users->username = $username;
            $users->password = $password;

            if($users_table->save($users))
            echo "User is udpated";
            $this->setAction('index');
         } else {
            $users_table = TableRegistry::get('users')->find();
            $users = $users_table->where(['id'=>$id])->first();
            $this->set('username',$users->username);
            $this->set('password',$users->password);
            $this->set('id',$id);
         }
      }
   }
?>
*src/Template* に *Users* ディレクトリを作成し、既に作成されている場合は無視し、そのディレクトリの下に *index.ctp* というビューを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Users/index.ctp*
<a href = "add">Add User</a>
<table>
   <tr>
      <td>ID</td>
      <td>Username</td>
      <td>Password</td>
      <td>Edit</td>
      <td>Delete</td>
   </tr>

   <?php
      foreach ($results as $row):
         echo "<tr><td>".$row->id."</td>";
         echo "<td>".$row->username."</td>";
         echo "<td>".$row->password."</td>";
         echo "<td><a href = '".$this->Url->build
            (["controller" => "Users","action" => "edit",$row->id]).
            "'>Edit</a></td>";
         echo "<td><a href = '".$this->Url->build
            (["controller" => "Users","action" => "delete",$row->id]).
            "'>Delete</a></td></tr>";
      endforeach;
   ?>
</table>
*edit.ctp* と呼ばれる *Users* ディレクトリの下に別の *View* ファイルを作成し、その中に次のコードをコピーします。
*src/Template/Users/edit.ctp*
<?php
   echo $this->Form->create("Users",array('url'=>'/users/edit/'.$id));
   echo $this->Form->input('username',['value'=>$username]);
   echo $this->Form->input('password',['value'=>$password]);
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

次のURLにアクセスして上記の例を実行し、 Edit link をクリックしてレコードを編集します。

*http://localhost:85/CakePHP/users*

出力

上記のURLにアクセスし、 Edit link をクリックすると、レコードを編集できる次の出力が表示されます。

レコードの更新

CakePHP-レコードを削除する

データベースのレコードを削除するには、最初に TableRegistry クラスを使用してテーブルを取得する必要があります。 * get()*メソッドを使用して、レジストリからインスタンスをフェッチできます。 * get()*メソッドは、データベーステーブルの名前を引数として受け取ります。 現在、この新しいインスタンスは、削除する特定のレコードを取得するために使用されます。

この新しいインスタンスで* get()メソッドを呼び出し、主キーを渡して、別のインスタンスに保存されるレコードを見つけます。 TableRegistryクラスのインスタンスを使用して *delete メソッドを呼び出し、データベースからレコードを削除します。

次のコードに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/users/delete', ['controller' => 'Users', 'action' => 'delete']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*srcs/Controller/UsersController.php* に *UsersController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/controller/UsersController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;

   class UsersController extends AppController{
      public function index(){
         $users = TableRegistry::get('users');
         $query = $users->find();
         $this->set('results',$query);
      }
      public function delete($id){
         $users_table = TableRegistry::get('users');
         $users = $users_table->get($id);
         $users_table->delete($users);
         echo "User deleted successfully.";
         $this->setAction('index');
      }
   }
?>
*delete.ctp* と呼ばれる *Users* ディレクトリの下に空の *View* ファイルを作成するだけです。
*src/Template/Users/delete.ctp*
*src/Template* にディレクトリ *Users* を作成し、すでに作成されている場合は無視し、そのディレクトリの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Users/index.ctp*
<a href = "add">Add User</a>
<table>
   <tr>
      <td>ID</td>
      <td>Username</td>
      <td>Password</td>
      <td>Edit</td>
      <td>Delete</td>
   </tr>

   <?php
      foreach ($results as $row):
         echo "<tr><td>".$row->id."</td>";
         echo "<td>".$row->username."</td>";
         echo "<td>".$row->password."</td>";
         echo "<td><a href='".$this->Url->build
         (["controller" => "Users","action" => "edit",$row->id])."'>Edit</a></td>";

         echo "<td><a href='".$this->Url->build
         (["controller" => "Users","action" -> "delete",$row->id])."'>Delete</a></td></tr>";
      endforeach;
   ?>
</table>

次のURLにアクセスして上記の例を実行し、[削除]リンクをクリックしてレコードを削除します。

*http://localhost:85/CakePHP/users*

出力

上記のURLにアクセスし、[削除]リンクをクリックすると、レコードを削除できる次の出力が表示されます。

レコードの削除

CakePHP-サービス

認証

認証は、正しいユーザーを識別するプロセスです。 CakePHPは3種類の認証をサポートしています。

  • FormAuthenticate -フォームのPOSTデータに基づいてユーザーを認証できます。 通常、これはユーザーが情報を入力するログインフォームです。 これはデフォルトの認証方法です。
  • BasicAuthenticate -基本HTTP認証を使用してユーザーを認証できます。
  • DigestAuthenticate -Digest HTTP認証を使用してユーザーを認証できます。

FormAuthenticationの例

次のコードに示すように、config/routes.phpファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/auth',['controller'=>'Authexs','action'=>'index']);
      $routes->connect('/login',['controller'=>'Authexs','action'=>'login']);
      $routes->connect('/logout',['controller'=>'Authexs','action'=>'logout']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

次のプログラムに示すように、AppController.phpファイルのコードを変更します。

*src/Controller/AppController.php*
<?php
   namespace App\Controller;
   use Cake\Controller\Controller;
   use Cake\Event\Event;
   use Cake\Controller\Component\AuthComponent;

   class AppController extends Controller{
      public function initialize(){
         parent::initialize();

         $this->loadComponent('RequestHandler');
         $this->loadComponent('Flash');
         $this->loadComponent('Auth', [
            'authenticate' => [
               'Form' => [
                  'fields' => ['username' => 'username', 'password' => 'password']
               ]
            ],
            'loginAction' => ['controller' => 'Authexs', 'action' => 'login'],
            'loginRedirect' => ['controller' => 'Authexs', 'action' => 'index'],
            'logoutRedirect' => ['controller' => 'Authexs', 'action' => 'login']
         ]);

         $this->Auth->config('authenticate', [
            AuthComponent::ALL => ['userModel' => 'users'], 'Form']);
      }

      public function beforeRender(Event $event){
         if (!array_key_exists('_serialize', $this=>viewVars) &&
         in_array($this->response=>type(), ['application/json', 'application/xml'])) {
            $this->set('_serialize', true);
         }
      }
   }
*src/Controller/AuthexsController.php* に *AuthexsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/AuthexsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\ORM\TableRegistry;
   use Cake\Datasource\ConnectionManager;
   use Cake\Event\Event;
   use Cake\Auth\DefaultPasswordHasher;

   class AuthexsController extends AppController{
      var $components = array('Auth');
      public function index(){
      }
      public function login(){
         if($this->request->is('post')){
            $user = $this->Auth->identify();

            if($user){
               $this->Auth->setUser($user);
               return $this->redirect($this->Auth->redirectUrl());
            } else
            $this->Flash->error('Your username or password is incorrect.');
         }
      }
      public function logout(){
         return $this->redirect($this->Auth->logout());
      }
   }
?>
*src/Template* に *Authexs* ディレクトリを作成し、そのディレクトリの下に *login.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Authexs/login.ctp*
<?php
   echo $this->Form->create();
   echo $this->Form->input('username');
   echo $this->Form->input('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>
*logout.ctp* という別の *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Authexs/logout.ctp*
You are successfully loggedout.
*index.ctp* という別の *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Authexs/index.ctp*
You are successfully logged in.
<?php echo
   $this->Html->link('logout',["controller" => "Authexs","action" => "logout"]);
?>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/auth*

出力

認証が実装されているため、上記のURLにアクセスしようとすると、以下に示すようにログインページにリダイレクトされます。

サービス認証

正しい資格情報を入力すると、ログインし、次のように画面にリダイレクトされます。

サービス認証

*logout* リンクをクリックすると、再びログイン画面にリダイレクトされます。

CakePHP-エラーと例外処理

システムの障害は、システムの円滑な実行のために効果的に処理される必要があります。 CakePHPには、発生したエラーを出力して記録するデフォルトのエラートラップが付属しています。 この同じエラーハンドラを使用して、*例外*をキャッチします。 デバッグがtrueの場合、エラーハンドラーはエラーを表示し、debugがfalseの場合、エラーをログに記録します。 CakePHPには多数の例外クラスがあり、組み込みの例外処理により、キャッチされなかった例外をキャプチャし、有用なページをレンダリングします。

エラーと例外の構成

エラーと例外はファイル config \ app.php で設定できます。 エラー処理は、アプリケーションのエラー処理を調整できるいくつかのオプションを受け入れます-

Option Data Type Description
errorLevel int The level of errors you are interested in capturing. Use the built-in php error constants, and bitmasks to select the level of error you are interested in.
trace bool Include stack traces for errors in log files. Stack traces will be included in the log after each error. This is helpful for finding where/when errors are being raised.
exceptionRenderer string The class responsible for rendering uncaught exceptions. If you choose a custom *class, you should place the file for that class in src/Error*. This class needs to implement a *render() *method.
log bool When true, exceptions + their stack traces will be logged to* Cake\Log\Log*.
skipLog array An array of exception classnames that should not be logged. This is useful to remove NotFoundExceptions or other common, but uninteresting logs messages.
extraFatalErrorMemory int Set to the number of megabytes to increase the memory limit by when a fatal error is encountered. This allows breathing room to complete logging or error handling.

次のコードに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/exception/:arg1/:arg2',[
         'controller'=>'Exps','action'=>'index'],['pass' => ['arg1', 'arg2']]);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/ExpsController.php* に *ExpsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/ExpsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Core\Exception\Exception;

   class ExpsController extends AppController{
      public function index($arg1,$arg2){
         try{
            $this->set('argument1',$arg1);
            $this->set('argument2',$arg2);

            if(($arg1 < 1 || $arg1 > 10) || ($arg2 < 1 || $arg2 > 10))
            throw new Exception("One of the number is out of range[1-10].");
         }catch(\Exception $ex){
            echo $ex->getMessage();
         }
      }
   }
?>
*src/Template* に *Exps* ディレクトリを作成し、そのディレクトリの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Exps/index.ctp*
This is CakePHP tutorial and this is an example of Passed arguments.
Argument-1: <?=$argument1?>
Argument-2: <?=$argument2?>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/exception/5/0*

出力

実行すると、次の出力が表示されます。

例外

CakePHP-ロギング

CakePHPへのログインは非常に簡単なタスクです。 1つの関数を使用するだけです。 エラー、例外、ユーザーアクティビティ、 *cronjob などのバックグラウンドプロセスのユーザーが実行したアクションを記録できます。 CakePHPでのデータのロギングは簡単です-* log()関数は、ほとんどすべてのCakePHPクラスの共通の祖先である *LogTrait によって提供されます。

ロギング構成

ログファイル config/app.php を構成できます。 ファイルにはログセクションがあり、次のスクリーンショットに示すように、ログオプションを設定できます。

ロギング設定

デフォルトでは、 error および debug がすでに設定されている2つのログレベルが表示されます。 それぞれが異なるレベルのメッセージを処理します。

CakePHPは、以下に示すようにさまざまなログレベルをサポートしています-

  • 緊急-システムは使用できません
  • アラート-すぐに対処する必要があります
  • クリティカル-クリティカルな状態
  • エラー-エラー状態
  • 警告-警告条件
  • 注意-正常だが重要な状態
  • 情報-情報メッセージ
  • デバッグ-デバッグレベルのメッセージ

ログファイルへの書き込み

ログファイルに書き込む方法は2つあります。

最初の方法は、静的* write()メソッドを使用することです。 以下は、静的 write()*メソッドの構文です。

Syntax write( integer
string $level , mixed $message , string array $context[] )
Parameters

The severity level of the message being written. The value must be an integer or string matching a known level.

ログに記録するメッセージの内容。

メッセージのロギングに使用される追加データ。 特別な `+ scope `キーを渡して、使用するログエンジンをさらにフィルタリングするために使用できます。 文字列または数値インデックス配列が渡された場合、それは ` scope +`キーとして扱われます。 ロギングスコープの詳細については、Cake \ Log \ Log
config()を参照してください。
Returns boolean
Description Writes the given message and type to all of the configured log adapters. Configured adapters are passed both the $level and $message variables. $level is one of the following strings/values.
2つ目は、* LogTrait Calling log()を使用するすべてで使用可能な log()ショートカット*関数を使用することです。** Log
write()**-

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('logex',['controller'=>'Logexs','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/LogexController.php* に *LogexController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/LogexController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Log\Log;

   class LogexsController extends AppController{
      public function index(){
        /*The first way to write to log file.*/
         Log::write('debug',"Something didn't work.");

        /*The second way to write to log file.*/
         $this->log("Something didn't work.",'debug');
      }
   }
?>

src/Template Logexsディレクトリを作成し、そのディレクトリの下に index.ctp という View ファイルを作成します。 そのファイルに次のコードをコピーします。

*src/Template/Logexs/index.ctp*
Something is written in log file. Check log file logs\debug.log

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/logex*

出力

実行すると、次の出力が表示されます。

Logexs

CakePHP-フォーム処理

CakePHPは、HTMLフォームを簡単かつ安全に処理するためのさまざまな組み込みタグを提供します。 他の多くのPHPフレームワークと同様に、HTMLの主要な要素もCakePHPを使用して生成されます。 以下は、HTML要素を生成するために使用されるさまざまな関数です。

次の関数は、選択オプションを生成するために使用されます。

Syntax selectOptions( array _$elements array(), array $parents array(), boolean $showParents null, array $attributes array() )
Parameters
  • フォーマットする要素
  • OPTGROUPの親
  • 親を表示するかどうか
  • HTML属性
Returns array
Description Returns an array of formatted OPTION/OPTGROUP elements

次の関数は* HTML select要素を生成するために使用されます*。

Syntax select( string $fieldName, array $options array(), array $attributes array() )
Parameters

Name attribute of the SELECT

SELECT要素で使用されるOPTION要素の配列(「値」⇒「テキスト」のペアとして)

select要素のHTML属性。

Returns Formatted SELECT element
Description Returns a formatted SELECT element

次の関数は、HTMLページでボタンを生成するために使用されます*。

Syntax Button (string $title, array $options array() )
Parameters
  • ボタンのキャプション。 自動的にHTMLエンコードされません。 *オプションとHTML属性の配列。
Returns HTML button tag.
Description Creates a* <button> tag. The type attribute defaults to type="submit*". You can change it to a different value by using $options['type'].

以下の関数は、HTMLページでチェックボックスを生成するために使用されます*。

Syntax Checkbox (string $fieldName, array $options array() )
Parameters
  • この「Modelname.fieldname」のようなフィールドの名前
  • HTML属性の配列。 可能なオプションは、value、checked、hiddenField、disabled、defaultです。
Returns An HTML text input element.
Description Creates a checkbox input widget.

次の関数は、HTMLページでフォームを作成するために使用されます。

Syntax create( mixed $model null, array $options array() )
Parameters
  • フォームが定義されているモデル名。 プラグインモデルのプラグイン名を含める必要があります。 e.g. ContactManager.Contact。 配列が渡され、$ options引数が空の場合、配列はオプションとして使用されます。 falseの場合、モデルは使用されません。
  • html属性とオプションの配列。 可能なオプションは、type、action、url、default、onsubmit、inputDefaults、encodingです。
Returns A formatted opening FORM tag.
Description Returns an HTML FORM element.

次の関数は、HTMLページでファイルのアップロード機能を提供するために使用されます。

Syntax file(string $fieldName, array $options array() )
Parameters
  • 「Modelname.fieldname」という形式のフィールドの名前
  • HTML属性の配列。
Returns A generated file input.
Description Creates file input widget.

次の関数は、HTMLページに hidden element を作成するために使用されます。

Syntax hidden( string $fieldName, array $options array() )
Parameters
  • 「Modelname.fieldname」の形式のフィールドの名前
  • HTML属性の配列。
Returns A generated hidden input
Description Creates a hidden input field

次の関数は、HTMLページで* input要素*を生成するために使用されます。

Syntax Input (string $fieldName, array $options array() )
Parameters
  • これは「Modelname.fieldname」でなければなりません
  • 入力の各タイプは異なるオプションを取ります
Returns Completed form widget
Description Generates a form input element complete with label and wrapper div

次の関数は、HTMLページで*ラジオボタン*を生成するために使用されます。

Syntax Radio (string $fieldName, array $options array(), array $attributesarray() )
Parameters
  • この「Modelname.fieldname」のようなフィールドの名前
  • ラジオボタンオプションの配列。
  • HTML属性の配列、および上記の特別な属性。
Returns Completed radio widget set
Description Creates a set of radio widgets. Will create a legend and fieldset by default. Use $options to control this.

次の関数は、HTMLページで submit ボタンを生成するために使用されます。

Syntax Submit (string $caption null, array $options array() )
Parameters
  • ボタンに表示されるラベル、または文字列に://または拡張子.jpg、.jpe、.jpeg、.gif、.pngが含まれる場合、拡張子が存在する場合は画像を使用し、かつ最初の文字が/の場合、画像はwebrootに関連します、または最初の文字が/でない場合、画像はwebroot/imgに相対的です。
  • オプションの配列。 可能なオプションは、div、before、after、typeなどです。
Returns An HTML submit button
Description Creates a submit button element. This method will generate <input/> elements that can be used to submit, and reset forms by using $options. Image submits can be created by supplying an image path for $caption.

次の関数は、HTMLページでtextarea要素を生成するために使用されます*。

Syntax Textarea (string $fieldName, array $options array() )
Parameters
  • 「Modelname.fieldname」という形式のフィールドの名前
  • HTML属性の配列、エスケープなどの特別なオプション
Returns A generated HTML text input element
Description Creates a textarea widget

次のコードに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('register',['controller'=>'Registrations','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/RegistrationController.php* に *RegistrationController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/RegistrationController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class RegistrationsController extends AppController{
      public function index(){
         $country = array('India','United State of America','United Kingdom');
         $this->set('country',$country);
         $gender = array('Male','Female');
         $this->set('gender',$gender);
      }
   }
?>
*src/Template* にディレクトリ *Registrations* を作成し、そのディレクトリの下に *index.ctp* という名前のViewファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Registrations/index.ctp*
<?php
   echo $this->Form->create("Registrations",array('url'=>'/register'));
   echo $this->Form->input('username');
   echo $this->Form->input('password');
   echo $this->Form->input('password');
   echo '<label for="country">Country</label>';
   echo $this->Form->select('country',$country);
   echo '<label for="gender">Gender</label>';
   echo $this->Form->radio('gender',$gender);
   echo '<label for="address">Address</label>';
   echo $this->Form->textarea('address');
   echo $this->Form->file('profilepic');
   echo '<div>'.$this->Form->checkbox('terms').
      '<label for="country">Terms &Conditions</label></div>';
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

次のURLにアクセスして上記の例を実行します- http://localhost:85/CakePHP/register

出力

実行すると、次の出力が表示されます。

フォーム処理

CakePHP-国際化

他の多くのフレームワークと同様に、CakePHPも国際化をサポートしています。 単一の言語から複数の言語に移行するには、次の手順に従う必要があります。

ステップ1 *-別のロケールディレクトリ *src \ Locale を作成します。

  • ステップ2 *-ディレクトリsrc \ Localeの下に各言語のサブディレクトリを作成します。 サブディレクトリの名前は、言語の2文字のISOコードまたはen_US、fr_FRなどの完全なロケール名にすることができます。

ステップ3 *-各言語サブディレクトリの下に個別の *default.po ファイルを作成します。 このファイルには、次のプログラムに示すように、 msgid および msgstr の形式のエントリが含まれています。

msgid "msg"
msgstr "CakePHP Internationalization example."

ここで、 msgid はViewテンプレートファイルで使用されるキーであり、 msgstr は翻訳を保存する値です。

ステップ4 *-Viewテンプレートファイルでは、ロケールの設定値に基づいて翻訳される上記の *msgid を以下に示すように使用できます。

<?php echo __('msg'); ?>

デフォルトのロケールは、次の行で config/bootstrap.php ファイルで設定できます。

'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US')

実行時にローカルを変更するには、次の行を使用できます。

use Cake\I18n\I18n;
I18n::locale('de_DE');

次のプログラムに示すように、config/routes.phpファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('locale',['controller'=>'Localizations','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/LocalizationsController.php* に *LocalizationsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/LocalizationsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\I18n\I18n;

   class LocalizationsController extends AppController{
      public function index(){
         if($this->request->is('post')){
            $locale = $this->request->data('locale');
            I18n::locale($locale);
         }
      }
   }
?>
*src \ Locale* に *Locale* ディレクトリを作成します。 Localeディレクトリの下に *en_US、fr_FR、de_DE* という3つのディレクトリを作成します。 *default.po* という名前の各ディレクトリの下にファイルを作成します。 それぞれのファイルに次のコードをコピーします。
*src/Locale/en_US/default.po*
msgid "msg"
msgstr "CakePHP Internationalization example."
*src/Locale/fr_FR/default.po*
msgid "msg"
msgstr "Exemple CakePHP internationalisation."
*src/Locale/de_DE/default.po*
msgid "msg"
msgstr "CakePHP Internationalisierung Beispiel."
*src/Template* に *Localizations* ディレクトリを作成し、そのディレクトリの下に *index.ctp* という名前のViewファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Localizations/index.ctp*
<?php
   echo $this->Form->create("Localizations",array('url'=>'/locale'));
   echo $this->Form->radio("locale",[
      ['value'=>'en_US','text'=>'English'],
      ['value'=>'de_DE','text'=>'German'],
      ['value'=>'fr_FR','text'=>'French'],
   ]);
   echo $this->Form->button('Change Language');
   echo $this->Form->end();
?>
<?php echo __('msg'); ?>

次のURLにアクセスして、上記の例を実行します。

*http://localhost:85/CakePHP/locale*

出力

実行すると、次の出力が表示されます。

ローカライズ

Eメール

CakePHPは、Eメール関連の機能を管理するEmailクラスを提供します。 コントローラーで電子メール機能を使用するには、まず次の行を記述してEmailクラスをロードする必要があります。

use Cake\Mailer\Email;

Emailクラスは、以下で説明するさまざまな便利なメソッドを提供します。

Syntax From (string
array null $email null, string
null $name null ) Parameters
  • メール付きの文字列
  • Name
Returns
array $this
Description It specifies from which email address; the email will be sent
Syntax To (string
array null $email null, string
null $name null) Parameters
  • メール付きの文字列
  • Name
Returns
array $this
Description It specifies to whom the email will be sent
Syntax Send (string
array null $content null)
Parameters
  • メッセージを含む文字列またはメッセージを含む配列。
Returns array
Description Send an email using the specified content, template and layout
Syntax Subject (string
null $subject null) Parameters
  • 件名文字列
Returns
array $this
Description Get/Set Subject.
Syntax Attachments (string
array null $attachments null)
Parameters
  • ファイル名を含む文字列またはファイル名を含む配列
Returns array
$this Description
Syntax Bcc (string
array null $email null, string
null $name null) Parameters
  • メール付きの文字列
  • Name
Returns
array $this
Description Bcc
Syntax cc( string
array null $email null, string
null $name null ) Parameters
  • メール付きの文字列
  • Name
Returns
array $this
Description Cc

次のプログラムに示すように、config/routes.phpファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/email',['controller'=>'Emails','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/EmailsController.php* に *EmailsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/EmailsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Mailer\Email;

   class EmailsController extends AppController{
      public function index(){
         $email = new Email('default');
         $email->to('[email protected]')->subject('About')->send('My message');
      }
   }
?>
*src/Template* にディレクトリEmailsを作成し、そのディレクトリの下に* index.ctp。*というViewファイルを作成します。そのファイルに次のコードをコピーします。
*src/Template/Emails/index.ctp*
Email Sent.

メールを送信する前に、設定する必要があります。 下のスクリーンショットでは、デフォルトとGmailの2つのトランスポートがあることがわかります。 Gmailトランスポートを使用しました。 「GMAIL USERNAME」をGmailユーザー名に、「APP PASSWORD」をアプリケーションパスワードに置き換える必要があります。 メールを送信するには、Gmailで2段階認証プロセスを有効にし、新しいAPPパスワードを作成する必要があります。

*config/app.php*

Gmailユーザー名

次のURLにアクセスして、上記の例を実行します。 http://localhost:85/CakePHP/email

出力

実行すると、次の出力が表示されます。

メール

CakePHP-セッション管理

セッションを使用すると、リクエスト全体で一意のユーザーを管理し、特定のユーザーのデータを保存できます。 セッションデータは、リクエストオブジェクトにアクセスできる場所であればどこからでもアクセスできます。つまり、セッションは、コントローラー、ビュー、ヘルパー、セル、コンポーネントからアクセスできます。

セッションオブジェクトへのアクセス

セッションオブジェクトは、次のコードを実行して作成できます。

$session = $this->request->session();

セッションデータの書き込み

セッションで何かを書くには、 write()session メソッドを使用できます。

Session::write($key, $value)

上記のメソッドは、値が格納される valuekey の2つの引数を取ります。

$session->write('name', 'Virat Gandhi');

セッションデータの読み取り

セッションから保存されたデータを取得するには、 read()session メソッドを使用できます。

Session::read($key)

上記の関数は、セッションデータの書き込み時に使用された*値のキー*である引数を1つだけ取ります。 正しいキーが提供されると、関数はその値を返します。

$session->read('name');

特定のデータがセッションに存在するかどうかを確認する場合は、 check()session メソッドを使用できます。

Session::check($key)

上記の関数は引数としてキーのみを取ります。

if ($session->check('name')) {
  //name exists and is not null.
}

セッションデータを削除する

セッションからデータを削除するには、 delete()session メソッドを使用してデータを削除します。

Session::delete($key)

上記の関数は、セッションから削除される値のキーのみを取ります。

$session->delete('name');

セッションからデータを読み取って削除する場合は、 consume()session メソッドを使用できます。

static Session::consume($key)

上記の関数は引数としてキーのみを取ります。

$session->consume('name');

セッションの破棄

ユーザーがサイトからログアウトしたときにユーザーセッションを破棄し、* destroy()*メソッドを使用してセッションを破棄する必要があります。

Session::destroy()

$session->destroy();

セッションを破棄すると、サーバーからすべてのセッションデータが削除されますが、セッションCookieは削除されません。

セッションを更新する

ユーザーセッションを更新したい状況では、 renew()session メソッドを使用できます。

Session::renew()

$session->renew();

完全なセッション

Make changes in the config/routes.php file as shown in the following program.
*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/sessionobject',
         ['controller'=>'Sessions','action'=>'index']);
      $routes->connect('/sessionread',
         ['controller'=>'Sessions','action'=>'retrieve_session_data']);
      $routes->connect('/sessionwrite',
         ['controller'=>'Sessions','action'=>'write_session_data']);
      $routes->connect('/sessioncheck',
         ['controller'=>'Sessions','action'=>'check_session_data']);
      $routes->connect('/sessiondelete',
         ['controller'=>'Sessions','action'=>'delete_session_data']);
      $routes->connect('/sessiondestroy',
         ['controller'=>'Sessions','action'=>'destroy_session_data']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/SessionsController.php* に *SessionsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/SessionsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class SessionsController extends AppController{
      public function retrieveSessionData(){
        //create session object
         $session = $this->request->session();

        //read data from session
         $name = $session->read('name');
         $this->set('name',$name);
      }
      public function writeSessionData(){
        //create session object
         $session = $this->request->session();

        //write data in session
         $session->write('name','Virat Gandhi');
      }
      public function checkSessionData(){
        //create session object
         $session = $this->request->session();

        //check session data
         $name = $session->check('name');
         $address = $session->check('address');
         $this->set('name',$name);
         $this->set('address',$address);
      }
      public function deleteSessionData(){
        //create session object
         $session = $this->request->session();

        //delete session data
         $session->delete('name');
      }
      public function destroySessionData(){
        //create session object
         $session = $this->request->session();

        //destroy session
         $session->destroy();
      }
   }
?>
*srcs/Template* に *Sessions* ディレクトリを作成し、そのディレクトリの下に *write_session_data.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Sessions/write_session_data.ctp*
The data has been written in session.

同じ Sessions ディレクトリの下に retrieve_session_data.ctp という別の View ファイルを作成し、そのファイルに次のコードをコピーします。

*src/Template/Sessions/retrieve_session_data.ctp*
Here is the data from session.
Name: <?=$name;?>

同じSessionsディレクトリの下に check_session_data.ctp という別の View ファイルを作成し、そのファイルに次のコードをコピーします。

*src/Template/Sessions/check_session_data.ctp*
<?php if($name): ?>
name exists in the session.

<?php else: ?>
name doesn't exist in the database

<?php endif;?>
<?php if($address): ?>
address exists in the session.

<?php else: ?>
address doesn't exist in the database

<?php endif;?>

同じセッションディレクトリに delete_session_data.ctp という別のfilbe View を作成し、そのファイルに次のコードをコピーします。

*src/Template/Sessions/delete_session_data.ctp*
Data deleted from session.

同じSessionsディレクトリに destroy_session_data.ctp という別の View ファイルを作成し、そのファイルに次のコードをコピーします。

*src/Template/Sessions/destroy_session_data.ctp*
Session Destroyed.

出力

次のURLにアクセスして、上記の例を実行します。 このURLは、セッションでデータを書き込むのに役立ちます。

*http://localhost:85/CakePHP/session-write*

セッション

次のURLにアクセスして、セッションデータを読み取ります*- http://localhost:85/CakePHP/session-read

CakePHPセッション

次のURLにアクセスして、セッションデータを確認します*- http://localhost:85/CakePHP/sessioncheck

セッション

次のURLにアクセスして*セッションデータを削除します*- http://localhost:85/CakePHP/sessiondelete

セッションの削除

次のURLにアクセスして、セッションデータを破棄します*- http://localhost:85/CakePHP/sessiondestroy

セッションが破棄されました

CakePHP-クッキー管理

CakePHPでのCookieの処理は簡単で安全です。 Cookieの管理に使用されるCookieComponentクラスがあります。 このクラスは、Cookieを操作するためのいくつかのメソッドを提供します。

クッキーを書く

  • write()*メソッドは、Cookieの書き込みに使用されます。 以下は、write()メソッドの構文です。
Cake\Controller\Component\CookieComponent::write(mixed $key, mixed $value = null)

write()メソッドは、* Cookie変数の名前($ key) Cookie変数の値($ value)*の2つの引数を取ります。

$this->Cookie->write('name', 'Virat');

名前と値のペアの配列を渡して、複数のCookieを書き込むことができます。

クッキーを読む

  • read()*メソッドは、Cookieの読み取りに使用されます。 read()メソッドの構文は次のとおりです。
Cake\Controller\Component\CookieComponent::read(mixed $key = null)

read()メソッドは、1つの引数、Cookie変数の名前($ key)を取ります。

echo $this->Cookie->read('name');

クッキーを確認

  • check()メソッドは、キー/パスが存在し、null以外の値を持っているかどうかを確認するために使用されます。 以下は check()*メソッドの構文です。
Cake\Controller\Component\CookieComponent::check($key)

echo $this->Cookie->check(‘name’);

クッキーを削除

Cookieを削除するには、* delete()*メソッドを使用します。 delete()メソッドの構文は次のとおりです。

Cake\Controller\Component\CookieComponent::delete(mixed $key)

delete()メソッドは、削除するCookie変数($ key)の名前という1つの引数を取ります。

例1

$this->Cookie->delete('name');

例2

次のプログラムに示すように、config/routes.phpファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('cookie/write',['controller'=>'Cookies','action'=>'write_cookie']);
      $routes->connect('cookie/read',['controller'=>'Cookies','action'=>'read_cookie']);
      $routes->connect('cookie/check',['controller'=>'Cookies','action'=>'check_cookie']);
      $routes->connect('cookie/delete',['controller'=>'Cookies','action'=>'delete_cookie']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/CookiesController.php* に *CookiesController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/Cookies/CookiesController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Controller\Component\CookieComponent;

   class CookiesController extends AppController{
      public $components = array('Cookie');

      public function writeCookie(){
         $this->Cookie->write('name', 'Virat');
      }
      public function readCookie(){
         $cookie_val = $this->Cookie->read('name');
         $this->set('cookie_val',$cookie_val);
      }
      public function checkCookie(){
         $isPresent = $this->Cookie->check('name');
         $this->set('isPresent',$isPresent);
      }
      public function deleteCookie(){
         $this->Cookie->delete('name');
      }
   }
?>
*src/Template* に *Cookies* ディレクトリを作成し、そのディレクトリの下に *write_cookie.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Cookie/write_cookie.ctp*
The cookie has been written.

同じCookiesディレクトリの下に read_cookie.ctp という別のViewファイルを作成し、そのファイルに次のコードをコピーします。

*src/Template/Cookie/read_cookie.ctp*
The value of the cookie is: <?php echo $cookie_val; ?>

同じCookiesディレクトリの下に check_cookie.ctp という別のViewファイルを作成し、そのファイルに次のコードをコピーします。

*src/Template/Cookie/check_cookie.ctp*
<?php
   if($isPresent):
?>
The cookie is present.

<?php
   else:
?>
The cookie isn't present.

<?php
   endif;
?>

同じCookiesディレクトリの下に delete_cookie.ctp という別のViewファイルを作成し、そのファイルに次のコードをコピーします。

*src/Template/Cookie/delete_cookie.ctp*
The cookie has been deleted.

出力

次のURLにアクセスして、上記の例を実行します- http://localhost:85/CakePHP/cookie/write

これにより、* Cookieにデータを書き込むことができます。*

Cookies

次のURLにアクセスして、Cookieデータを読み取ります- http://localhost:85/CakePHP/cookie/read

CakePHP Cookies

次のURLにアクセスして* Cookieデータを確認します*- http://localhost:85/CakePHP/cookie/check

CakePHP Cookies

次のURLにアクセスして* Cookieデータを削除します*- http://localhost:85/CakePHP/cookie/delete

Cookies Deleted

CakePHP-セキュリティ

セキュリティは、Webアプリケーションを構築する際のもう1つの重要な機能です。 Webサイトのユーザーに、データが保護されていることを保証します。 CakePHPは、アプリケーションを保護するためのいくつかのツールを提供します。

暗号化と復号化

CakePHPのセキュリティライブラリは、データを暗号化および復号化できるメソッドを提供します。 以下は、同じ目的で使用される2つの方法です。

static Cake\Utility\Security::encrypt($text, $key, $hmacSalt = null)
static Cake\Utility\Security::decrypt($cipher, $key, $hmacSalt = null)

暗号化メソッドは、データを暗号化するための引数としてテキストとキーを受け取り、戻り値はHMACチェックサム付きの暗号化された値になります。

データをハッシュするにはhash()メソッドが使用されます。 hash()メソッドの構文は次のとおりです。

構文

static Cake\Utility\Security::hash($string, $type = NULL, $salt = false)

CSRF

CSRFは Cross Site Request Forgery の略です。 CSRFコンポーネントを有効にすると、攻撃に対する保護が得られます。 CSRFは、Webアプリケーションの一般的な脆弱性です。 これにより、攻撃者は以前のリクエストをキャプチャしてリプレイし、場合によっては他のドメインのイメージタグまたはリソースを使用してデータリクエストを送信できます。 CSRFは、以下に示すように、 CsrfComponent をコンポーネント配列に追加するだけで有効にできます。

public function initialize(){
   parent::initialize();
   $this->loadComponent('Csrf');
}

CsrfComponentは FormHelper とシームレスに統合します。 FormHelperでフォームを作成するたびに、CSRFトークンを含む非表示フィールドが挿入されます。

これは推奨されませんが、特定の要求でCsrfComponentを無効にすることができます。 そのためには、* beforeFilter()メソッド*の間にコントローラーのイベントディスパッチャーを使用します。

public function beforeFilter(Event $event){
   $this->eventManager()->off($this->Csrf);
}

セキュリティコンポーネント

セキュリティコンポーネントは、アプリケーションにより厳​​しいセキュリティを適用します。 次のようなさまざまなタスクのメソッドを提供します-

  • アプリケーションが受け入れるHTTPメソッドの制限-副作用を実行する前に、使用されているHTTPメソッドを常に確認する必要があります。 HTTPメソッドを確認するか、* Cake \ Network \ Request :: allowMethod()*を使用して、正しいHTTPメソッドが使用されていることを確認してください。
  • フォーム改ざん保護-デフォルトでは、SecurityComponentはユーザーが特定の方法でフォームを改ざんすることを防ぎます。 SecurityComponentは、次のことを防ぎます-
  • 不明なフィールドはフォームに追加できません。
  • フォームからフィールドを削除することはできません。
  • 非表示の入力の値は変更できません。
  • * SSLを使用する必要があります*-SSLで保護する必要があるすべてのアクション。
  • コントローラ間通信の制限-このコントローラにリクエストを送信できるコントローラを制限できます。 また、このコントローラーのアクションにリクエストを送信できるアクションを制限することもできます。

次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('login',['controller'=>'Logins','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/LoginsController.php* に *LoginsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/LoginsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;

   class LoginsController extends AppController{
      public function initialize(){
         parent::initialize();
         $this->loadComponent('Security');
      }
      public function index(){
      }
   }
?>
*src/Template* にLoginsディレクトリを作成し、そのディレクトリの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Logins/index.ctp*
<?php
   echo $this->Form->create("Logins",array('url'=>'/login'));
   echo $this->Form->input('username');
   echo $this->Form->input('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

次のURLにアクセスして、上記の例を実行します-* http://localhost:85/CakePHP/login *

出力

実行すると、次の出力が表示されます。

Loggins

CakePHP-検証

多くの場合、Webサイトの作成中に、データをさらに処理する前に特定のことを検証する必要があります。 CakePHPは、簡単にデータを検証できるバリデーターを構築するための検証パッケージを提供します。

検証方法

CakePHPは、検証クラスでさまざまな検証メソッドを提供します。 最も人気のあるもののいくつかを以下に示します。

Syntax Add (string $field, array
string $name, array Cake\Validation\ValidationRule $rule [] )
Parameters
  • ルールが追加されるフィールドの名前。
  • 単一のルールまたは複数のルール配列のエイリアス。
  • 追加するルール
Returns $this
Description Adds a new rule to a field’s rule set. If second argument is an array, then rules list for the field will be replaced with second argument and third argument will be ignored.
Syntax allowEmpty (string $field, boolean
string callable $when true, string
null $message null) Parameters
  • フィールドの名前。
  • フィールドをいつ空にすることができるかを示します。 有効な値は true(常に)、 'create'、 'update' です。 callableが渡された場合、フィールドはコールバックがtrueを返す場合にのみ空のままになります。
  • フィールドがそうでない場合に表示するメッセージ。
Returns
$this Description
Syntax alphanumeric (string $field, string
null $message null, string callable
null $when null) Parameters
  • ルールを適用するフィールド。
  • ルールが失敗したときのエラーメッセージ。
  • 「作成」または「更新」、または検証ルールを適用する必要があるときにtrueを返す呼び出し可能オブジェクトのいずれか。
Returns
$this Description
Syntax creditCard (string $field, string $type 'all', string
null $message null, string callable
null $when null) Parameters
  • ルールを適用するフィールド。
  • 許可するカードのタイプ。 デフォルトは「all」です。 また、たとえば['mastercard'、 'visa'、 'amex']など、受け入れられたカードタイプの配列を指定することもできます。
  • ルールが失敗したときのエラーメッセージ。
  • 「作成」または「更新」、または検証ルールを適用する必要があるときにtrueを返す呼び出し可能オブジェクトのいずれか。
Returns
$this Description
Syntax Email (string $field, boolean $checkMX false, string
null $message null, string callable
null $when null) Parameters
  • ルールを適用するフィールド。
  • MXレコードを確認するかどうか。
  • ルールが失敗したときのエラーメッセージ。
  • 「作成」または「更新」、または検証ルールを適用する必要があるときにtrueを返す呼び出し可能オブジェクトのいずれか。
Returns
$this Description
Syntax maxLength (string $field, integer $max, string
null $message null, string callable
null $when null) Parameters
  • ルールを適用するフィールド。
  • 許可される最大長。
  • ルールが失敗したときのエラーメッセージ。
  • 'create' または 'update' 、または検証ルールを適用する必要があるときにtrueを返す callable のいずれか。
Returns
$this Description
Syntax minLength (string $field, integer $min, string
null $message null, string callable
null $when null) Parameters
  • ルールを適用するフィールド。
  • 許可される最大長。
  • ルールが失敗したときのエラーメッセージ。
  • 'create' または 'update' 、または検証ルールを適用する必要があるときにtrueを返す callable のいずれか。
Returns
$this Description
Syntax notBlank (string $field, string
null $message null, string callable
null $when null) Parameters
  • ルールを適用するフィールド。
  • ルールが失敗したときのエラーメッセージ。
  • 'create' または 'update' 、または検証ルールを適用する必要があるときにtrueを返す callable のいずれか。
Returns
$this Description

CakePHP-バリデーターの作成

バリデーターを作成するには、コントローラーに次の2行を追加します。

use Cake\Validation\Validator;
$validator = new Validator();

データの検証

バリデーターを作成したら、バリデーターオブジェクトを使用してデータを検証できます。 次のコードは、ログインWebページのデータを検証する方法を説明しています。

$validator->notEmpty('username', 'We need username.')->add('username',
   'validFormat', ['rule' => 'email','message' => 'E-mail must be valid']);

$validator->notEmpty('password', 'We need password.');
$errors = $validator->errors($this->request->data());

$ validatorオブジェクトを使用して、最初に* notEmpty()メソッドを呼び出しました。このメソッドは、ユーザー名が空であってはなりません。 その後、 add()*メソッドをチェーンして、適切な電子メール形式の検証をもう1つ追加しました。

その後、notEmpty()メソッドを使用してパスワードフィールドの検証を追加し、パスワードフィールドが空であってはならないことを確認します。

次のプログラムに示すように、config/routes.phpファイルを変更します。

*config/routes.php*
<?php
   use Cake\Core\Plugin;
   use Cake\Routing\RouteBuilder;
   use Cake\Routing\Router;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('validation',['controller'=>'Valids','action'=>'index']);
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();
*src/Controller/ValidsController.php* に *ValidsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/ValidsController.php*
<?php
   namespace App\Controller;
   use App\Controller\AppController;
   use Cake\Validation\Validator;

   class ValidsController extends AppController{
      public function index(){
         $validator = new Validator();
         $validator->notEmpty('username', 'We need username.')
            ->add('username', 'validFormat', ['rule' => 'email','message'
            => 'E-mail must be valid']);

         $validator->notEmpty('password', 'We need password.');
         $errors = $validator->errors($this->request->data());
         $this->set('errors',$errors);
      }
   }
?>
*src/Template* に *Valids* ディレクトリを作成し、そのディレクトリの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Valids/index.ctp*
<?php
   if($errors){
      foreach($errors as $error)
      foreach($error as $msg)

      echo '<font color = "red">'.$msg.'</font&gtl';
   } else {
      echo "No errors.";
   }

   echo $this->Form->create("Logins",array('url'=>'/validation'));
   echo $this->Form->input('username');
   echo $this->Form->input('password');
   echo $this->Form->button('Submit');
   echo $this->Form->end();
?>

次のURLにアクセスして、上記の例を実行します-* http://localhost:85/CakePHP/validation *

出力

何も入力せずに送信ボタンをクリックします。 次の出力が表示されます。

検証