Phalcon-quick-guide
ファルコン-概要
Phalconは、熱狂的な開発者グループによって開発された、PHPの最近のフレームワークの1つとして導入されました。 Phalconは疎結合フレームワークです。つまり、アプリケーションのニーズに基づいて、オブジェクトをグルーコンポーネントのように扱うことができます。
Phalconは、PHPの他のフレームワーク(従来型または既存)と比較していくつかのユニークな機能を提供します。 以下は、Phalconの最も顕著な特徴の一部です-
- フルスタックのオープンソースフレームワークです。
- ユーザーは、いくつかのコンポーネントを利用するために必要なコードの量がかなり少なくなります。
- 必要に応じて、独立したフレームワークを作成するために使用できます。 たとえば、PhalconのCacheコンポーネントだけが必要な場合は、純粋なPHPまたはフレームワークを使用して記述された任意のアプリケーションで使用できます。
- Model-View-Controller (MVC)および Object-Relational Modeling (ORM)の知識を持っている開発者にとって、Phalconでの作業は簡単です。
パフォーマンス
Phalconのパフォーマンスは、PHPの他の従来のフレームワークと区別する機能です。 PhalconにはPHPとCの両方の組み合わせがあります。これらはそれぞれスタンドアロンモジュールとして使用できます。 すべての要求のコンパイルは、Phalconでより高速に考慮され、すべてがすぐに使用できるようになります。
C言語
PhalconはCと互換性があり、コンパイル速度が向上します。 また、CはPhalconと組み合わせて、作成されたモデルとの一貫性を提供するオブジェクトリレーショナルマッピング(ORM)を提供します。 Phalconで作成されたすべてのモデルは、リレーショナルデータベースのテーブルに関連付けられています。 PhalconのORMは、純粋にCで実装されています。
開発者ツール
開発者ツールは、Webアプリケーションの開発に使用されます。 これらのツールは、すべての機能(C –作成、R –読み取り、U –更新、D –削除)の組み合わせでscaffoldアプリケーションを生成するのに役立ちます。 開発者ツールには、Phalconで実装されるサードパーティライブラリの拡張サポートも含まれています。
オブジェクトリレーショナルマッピング
Phalconは幅広いデータベースをサポートしています。 リレーショナルデータベースへのアクセスに限定されません。 Phalconフレームワークのキャップに羽を追加するような、リレーショナルデータベースと非リレーショナルデータベースの両方をサポートします。
Phalcon Vsその他のフレームワーク
次の表は、PhalconがYiiやLaravelなどの他の一般的なフレームワークとどのように異なるかを示しています。
Yii | Laravel | Phalcon | |
---|---|---|---|
Type of Projects | Yii helps in creating large scale projects like forums, portals, CMS, RESTful web services, etc. | Laravel is used for building web applications. It is known for exquisite and sophisticated syntax. | Phalcon is used to design variety of projects. |
Database Support | Yii supports all relational and non-relational databases. | Laravel supports all relational databases. | Phalcon gives equal support to relational and non-relational databases. |
Language | Yii framework is purely written in PHP. | Laravel is written in PHP and follows MVC pattern. | Phalcon includes both PHP and C. |
Scalability | Yii is quite scalable for small and medium projects. | Scalability is high for Laravel with all kinds of projects. | Good for medium projects. |
Performance | Comparatively low. | High but less in comparison with Phalcon. | High Performance. |
ファルコン-環境設定
前提条件-このフレームワークには、WAMP/LAMP/MAMPまたはXAMPPスタックが必要です。
以下は、WindowsでのPhalconフレームワークのインストールプロセスの手順です。
ステップ1 *-Phalconのインストールは *dll ファイルに完全に依存しています。 DLL(ダイナミックリンクライブラリ)は、Phalconに必要なパッケージとプラグインを作成します。
次のリンクは、dllファイルのダウンロードに使用されます-https://phalconphp.com/en/download
ステップ2 *-必要なdllファイルをダウンロードします。 システムの適切な構成を確認し、必要なdllファイルをダウンロードします。 ファイルをダウンロードした後、 *phalcon-php.dll を xampp フォルダーの /php/ext に抽出します。
ステップ3 *- php.iniファイル*のパスを編集して、他の .dll ファイルと同様の方法で構成します。
ステップ4 *-パスを編集したら、 *xampp/wamp スタックを再起動します。 dll ファイルが適切に設定されると、ダッシュボードに明確に表示されます。
- ステップ5 *-パッケージをダウンロードした後、システムプロパティでパス変数を設定します。
ステップ6 *- *dll ファイルとPhalconツールは、プロジェクト/Webアプリケーションの作成に役立ちます。 ユーザーは、Phalconフレームワークが正常にインストールされたかどうかをコマンドプロンプトで確認できます。 次のスクリーンショットに示すように、出力が表示されます。
- ステップ7 *-この必要な出力を受け取ったら、次のコマンドを使用してプロジェクトを作成します-
phalcon create-project <project-name>
次の出力が表示されます。
ステップ8 *-Webアプリケーションが正常に作成されました。 次のURLをクリックします- *http://localhost/demo1
次のスクリーンショットに示すように、出力が表示されます。 Phalcon PHPのウェルカムページです。
ファルコン-アプリケーション構造
この章では、Phalconのアプリケーション構造について説明します。 以下は、Phalconプロジェクトの完全なディレクトリ構造です。
*code base* と見なされ、Webサーバーで公開されているルートフォルダーが1つあります。 * webディレクトリ*とも呼ばれます。 Webルートディレクトリ以外のその他のフォルダーは、WebサーバーおよびPhalconプロジェクトの到達範囲外と見なされます。
プロジェクトが作成されると、ディレクトリ構造は wamp/xampp フォルダーに次のように表示されます。 前の章で作成したプロジェクトを検討してください。
以下は、プロジェクトのフォルダーとサブフォルダーです。
App
このフォルダーは、すべての重要なスクリプトファイルとフォルダーで構成されています。 完全なWebアプリケーションは、「app」フォルダーに基づいて設計されています。 構成ファイルは、アプリケーションをスムーズに実行するために必要な構成を支援するのに役立ちます。
以下は、指定されたPhalcon Webアプリケーションのappフォルダーの詳細ビューです。
構成、コントローラー、ライブラリー、移行、モデル、ビューで構成されます。
設定
PhalconのWebアプリケーションに必要なすべての構成は、このフォルダーに含まれています。 データベース接続、追加されるサードパーティライブラリ、および含まれるサービスに関連する情報が含まれます。
コントローラー
すべてのコントローラーはこのフォルダーに含まれています。 これらは、リクエストの処理とレスポンスの生成に使用されます。
としょうかん
Webアプリケーション用のサードパーティライブラリ(既存のPhalconフレームワークを除く)。
移行
このサブフォルダーは、データ移行に関連するすべてのファイルで構成され、他のフレームワークでも使用できます。
モデル
モデルには、データベースと対話するために必要なすべてのロジックが含まれています。 実際にデータ表現に使用されます。
ビュー
Webアプリケーションに関連するすべてのビューを構成します。 これらのビューは、コントローラーの助けを借りてエンドユーザーに表示されます。
キャッシュ
このディレクトリには、キャッシュに関連するデータが含まれており、パフォーマンスの向上に役立ちます。
パブリック
これには、CSS、JavaScript、アップロードするファイル、および一部のメタデータで構成される資産管理目的のすべてのフォルダーが含まれます。
.htaccessファイル
Apache Webサーバーソフトウェアで実行されているWebサーバーは、構成ファイルとして .htaccess を使用します。 ディレクトリに配置すると、サーバーが起動するとすぐに必要な構成がすべてロードされます。
たとえば、*。htaccess *ファイルを使用して特定のIPアドレスでのみ利用できるようにWebサイトを構成することができます。
ファルコン-機能
- Model View Controller(MVC)*は、Webベースのアプリケーションを開発するためのソフトウェア設計および構造パターンです。 このソフトウェアアーキテクチャは、情報の表現とユーザーとの対話を分離します。
MVCモデルは、3つの論理層を持つWebアプリケーションを定義します。
モデル
モデルは、知識を表すオブジェクトです。 モデルとそのパーツの間には1対1の関係が必要です。 データベース接続およびCRUD操作の実行に使用されるすべてのロジックが含まれています。
View
ビューは、モデルの視覚的表現です。 ビューはモデルまたはそのパーツと対話し、モデルからプレゼンテーションに必要なデータを取得します。 これは、要求を送信し、適切な応答を受信することにより実現されます。 ビューには、エンドユーザーに表示されるすべてのデータが含まれます。
コントローラ
コントローラーは、ユーザーとシステム(モデルとビュー)の間の媒介として機能します。 ビューを介してユーザーにリクエストを受け入れ、モデルに送信します。 モデルはそれを操作し、応答をコントローラーに送信します。コントローラーは、ビューを通じてエンドユーザーへの出力として表示されます。
コントローラーはそのようなユーザー出力を受け取り、適切なメッセージに変換します。 これらのメッセージは、適切な応答として表示するためにビューによって使用されます。
Phalconのワークフロー
Phalconのワークフローは次のとおりです-
- ユーザーはユーザーインターフェイス(ビュー)と対話し、何らかのメソッド/イベントの助けを借りて対話が維持されます。
- これらのメソッドとイベントはコントローラーによって処理されます。
- コントローラーは、ユーザーのアクションを更新してモデルにアクセスします。
- Viewはモデルを使用して適切な出力を生成します。
- ビューはモデルからデータを取得します。 モデルにはビューとの直接の相互作用はありません。
- ユーザーインターフェイスは、ユーザーインタラクションをさらに待機します。これは、要求と応答の新しいサイクルから始まります。
Phalconには、Model、View、およびControllerのディレクトリが含まれています。 次のスクリーンショットは、より良いシナリオを示しています。
すべてのビジネスロジックはコントローラで記述され、モデルは各テーブルに関するすべてのファイルを含むデータベースと対話します。
注-
- Phalcon Webアプリケーションで作成されたすべてのコントローラーは、 Phalcon \ Mvc \ Controller を拡張します。
- データベーステーブルに関連付けられたすべてのモデルは、 \ Phalcon \ Mvc \ Model を拡張します。
ファルコン-設定
Webアプリケーションの設定フォルダには、次のファイルが含まれています-
- config.php
- loader.php
- services.php
config.php
これには、ディレクトリパスごとのデータベース接続とルーティングの構成が含まれます。
<?php
/*
*Modified: preppend directory path of current file,
because of this file own different ENV under between Apache and command line.
* NOTE: please remove this comment.
*/
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?:
realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config([
'database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'test',
'charset' => 'utf8',
],
'application' => [
'appDir' => APP_PATH . '/',
'controllersDir' => APP_PATH . '/controllers/',
'modelsDir' => APP_PATH . '/models/',
'migrationsDir' => APP_PATH . '/migrations/',
'viewsDir' => APP_PATH . '/views/',
'pluginsDir' => APP_PATH . '/plugins/',
'libraryDir' => APP_PATH . '/library/',
'cacheDir' => BASE_PATH . '/cache/',
'baseUri' => '/demo1/',
]
]);
loader.php
- \ Phalcon \ Loader()*の既存のクラスを拡張します。 ローダークラスは、Webアプリケーションを必要とするディレクトリを登録します。
<?php
$loader = new \Phalcon\Loader();
/* *
* We're a registering a set of directories taken from the configuration file
*/
$loader->registerDirs( [
$config->application->controllersDir,
$config->application->modelsDir
]
)->register();
services.php
このファイルは、Webプロジェクトのサービスを実装するすべての機能を関連付けます。 Phalcon \ Di インターフェイスを実装します。 また、サービスをロードすることにより、サービスの依存性注入も実装します。
基本的に、configフォルダー内のservices.phpファイルは、すべてのサービスのコンテナーとして機能します。 このインターフェイスは、データベース接続、Cookieの設定、新しいセッションの作成、NoSQLデータベースとの接続など、すべてのサービスの初期化に役立ちます。
<?php
use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Php as PhpEngine;
use Phalcon\Mvc\Url as UrlResolver;
use Phalcon\Mvc\View\Engine\Volt as VoltEngine;
use Phalcon\Mvc\Model\Metadata\Memory as MetaDataAdapter;
use Phalcon\Session\Adapter\Files as SessionAdapter;
use Phalcon\Flash\Direct as Flash;
/* *
* Shared configuration service
*/
$di->setShared('config', function () {
return include APP_PATH . "/config/config.php";
});
/* *
* The URL component is used to generate all kind of urls in the application
*/
$di->setShared('url', function () {
$config = $this->getConfig();
$url = new UrlResolver();
$url->setBaseUri($config->application->baseUri);
return $url;
});
/* *
* Setting up the view component
*/
$di->setShared('view', function () {
$config = $this->getConfig();
$view = new View();
$view->setDI($this);
$view->setViewsDir($config->application->viewsDir);
$view->registerEngines([
'.volt' => function ($view) {
$config = $this->getConfig();
$volt = new VoltEngine($view, $this);
$volt->setOptions([
'compiledPath' => $config->application->cacheDir,
'compiledSeparator' => '_'
]);
return $volt;
},
'.phtml' => PhpEngine::class
]);
return $view;
});
/* *
* Database connection is created based in the parameters defined in the configuration
file
*/
$di->setShared('db', function () {
$config = $this->getConfig();
$class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
$connection = new $class([
'host' => $config->database->host,
'username' => $config->database->username,
'password' => $config->database->password,
'dbname' => $config->database->dbname,
'charset' => $config->database->charset
]);
return $connection;
});
ファルコン-コントローラー
MVCフレームワークでは、「C」はコントローラーを表し、Webアプリケーションのスイッチボードを指します。 コントローラーによって実行されるアクションは、パラメーターをビューに渡して、それに応じてユーザー入力を表示および応答できるようにします。
たとえば、ユーザー名、メールアドレス、パスワードなどのユーザーの詳細を含むサインアップフォームから登録し、[送信]ボタンをクリックすると、ユーザーによって挿入または投稿されたデータがコントローラーを介して送信されます。関連するアクションまたは機能。
コントローラーの機能
*controller* はビューからの入力を受け入れ、関連するモデルと対話します。
- モデルにコマンドを送信することにより、モデルの状態を更新するのに役立ちます。 また、関連するビューにコマンドを送信することもできます。これにより、モデルの状態に応じてビューの表示を変更できます。
- コントローラーは、モデルとビューの間の仲介役として機能します。
PhalconでのMVCのワークフロー
次の図は、PhalconでのMVCのワークフローを示しています
Phalconでコントローラーを作成する手順
- ステップ1 *-コマンドプロンプトを使用してプロジェクトパスにリダイレクトします。 次のスクリーンショットを参照してください。
上記のスクリーンショットで言及されているように、「デモ」はPhalcon PHPフレームワークに関連するプロジェクトです。
- ステップ2 *-次のコマンドを使用して、関連するコントローラーを作成します。
phalcon controller <controller-name>
上記のコマンドが正常に実行されたときの出力を次に示します。
注意-コントローラのクラス名には、「controller」という接尾辞が必要です。 これは、Phalconで守られている適切な命名規則を意味します。
デフォルトでは、アプリケーションがPhalcon PHPフレームワークで作成されると、「IndexController」という名前のコントローラーが含まれます。 このコントローラーは、アクションをトリガーするためにデフォルトで呼び出されます。
このコントローラーは、 \ Phalcon \ Mvc \ Controller を拡張する他のコントローラーとは異なり、コントローラーベースによって拡張されます。
コード-
<?php
class IndexController extends ControllerBase {
public function indexAction() {
echo "This is my first web application in Phalcon";
}
}
出力-
ファルコン-モデル
MVCアーキテクチャのモデルには、アプリケーションのロジックが含まれます。 モデルは、データベースとのコア相互作用です。 ユーザーのリクエストに応じて、レコードの更新、削除、挿入、取得を管理できる必要があります。
Phalcon PHPフレームワークでのモデルの相互作用を理解するには、次の手順に従う必要があります。
- ステップ1 *-データベースの作成。
*LAMP、WAMP、XAMPP* ソフトウェアスタックの場合、 *phpmyadmin* データベースツールを使用してデータベースを作成するのは非常に簡単です。
以下は、データベースを作成するためのSQLクエリです。
create database <database-name>
ステップ2 *- *phpmyadmin セクションで、[データベース]タブをクリックし、データベース名を指定して、次のスクリーンショットに示すように[作成]ボタンをクリックします。
- ステップ3 *-データベースが正常に作成されたら、Phalconフレームワークでモデルを作成するための関連付けに役立つテーブルを作成します。
次のクエリを使用して、「users」という名前の新しいテーブルを作成します。
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(25),
`emailid` varchar(50),
`contactNumber` number
PRIMARY KEY (`id`)
)
ENGINE = InnoDB DEFAULT CHARSET = utf8;
テーブルが作成されると、その構造は次のスクリーンショットに示すようになります。
- ステップ4 *-上記のステップで作成した「ユーザー」テーブルに関連付けられたモデルを作成するには、コマンドプロンプトインスタンスを開きます。 適切なプロジェクトパスにリダイレクトすることが重要です。 その前に、次のスクリーンショットに示すように、データベース構成が正しく設定されているかどうかを確認することが重要です。
- ステップ5 *-次のコマンドを使用して、Phalconフレームワークでモデルを作成します。
phalcon model <model-name>
上記のコマンドの実行時の出力は次のとおりです。
これは、モデルが正常に作成されたことを意味します。
- ステップ6 *-正常に作成されたモデルはモデルフォルダーに存在します。 次のパスを使用して、モデルが作成された場所を表示します。
C:\xampp\htdocs\demo1\app\models
以下は、 Users.php の完全なコードです。
<?php
class Users extends \Phalcon\Mvc\Model {
/* *
*
*@var integer
* @Primary
*@Identity
* @Column(type = "integer", length = 11, nullable = false)
*/
public $id;
/**
*
*@var string
* @Column(type = "string", length = 25, nullable = true)
*/
public $name;
/**
*
*@var string
* @Column(type = "string", length = 50, nullable = true)
*/
public $emailid;
/**
*
*@var integer
* @Column(type = "integer", length = 11, nullable = true)
*/
public $contactNumber;
/**
*Returns table name mapped in the model.
*
*@return string
*/
public function getSource() {
return 'users';
}
/**
*Allows to query a set of records that match the specified conditions
*
*@param mixed $parameters
* @return Users[]
*/
public static function find($parameters = null) {
return parent::find($parameters);
}
/**
*Allows to query the first record that match the specified conditions
*
*@param mixed $parameters
* @return Users
*/
public static function findFirst($parameters = null) {
return parent::findFirst($parameters);
}
}
- ステップ7 *-コントローラーはモデルとビューと対話して、必要な出力を取得します。 モデルと同様に、次のコマンドターミナルを使用してコントローラーを作成します。
Phalcon controller <controller-name>
上記のコマンドが正常に実行されると、次の出力が表示されます。
以下は UserController.php のコードです。
<?php
class UsersController extends \Phalcon\Mvc\Controller {
public function indexAction() {
echo "Users Controller has been called";
}
}
次のURLにアクセスすると、出力が表示されます- http://localhost/demo1/users
ファルコン-ビュー
ビューは、エンドユーザーに提示される情報です。 ビューは、適切な応答が表示されるWebページと見なすことができます。 応答は、モデルと対話するコントローラーを介して受信されます。
特にPhalconでは、ビューはVoltコード、PHP、およびHTMLで構成されています。 ボルトモードに入るには、一連の特別な区切り文字を使用できます。 \ {%… %} は、forループなどのステートメントの実行または値の割り当てに使用され、 \ {\ {… }} は、式の結果をテンプレートに出力します。
Phalconのビューは基本的に2つのタイプに分類されます-
- Volt
- phtml
Volt
以下は、前の章でプロジェクト demo1 用に作成した出力のスクリーンショットです。
この出力は、ファイル views/index/index.volt を使用して実現されます。
Voltファイルの機能
- これはC言語で書かれたテンプレートであり、他の言語に比べてかなり高速です。
- 高度に統合されたコンポーネントセットが含まれており、Phalconで非常に有益です。
- また、スタンドアロンコンポーネントとしても使用できます。
- Voltは純粋なPHPコードにコンパイルされます。
以下は、すべてのプロジェクトでデフォルトでロードされる index.volt のコードです。
<!--<div class = "page-header">
<h1>Congratulations!</h1>
</div>-->
<p>This is my first web application in Phalcon </p>
<!--<p>You're now flying with Phalcon. Great things are about to happen!</p>
<p>This page is located at <code>views/index/index.volt</code></p>-->
階層的なレンダリング
Phalconのビューは階層レンダリングをサポートし、 Phalcon \ Mvc \ View がデフォルトのレンダリングコンポーネントとして使用されます。 このコンポーネントは、テンプレート言語としてCを使用するボルトファイルと比較して、テンプレートエンジンとしてPHPを使用します。
これらのビューには .phtml 拡張子が必要です。 指定されたプロジェクトのビューのデフォルトディレクトリは、次の3つのファイルで構成されています-
- アクションビュー-このビューは、特定のアクションを実行するために呼び出されます。 「show」アクションが実行されると呼び出されます。
- コントローラーレイアウト-このビューはレイアウトフォルダー内にあります。 たとえば、 C:\ xampp \ htdocs \ demo \ app \ views \ layouts 。 適切なコントローラーに関連付けられたメソッド呼び出しを呼び出します。 レイアウトに実装されたコードは、必要に応じて実装されます。
- メインレイアウト-このレイアウトビューはメインアクションを呼び出し、Webアプリケーション内のすべてのコントローラーまたはアクションに対して表示されます。
.voltファイルと.phtmlファイルの違い
.volt | .phtml |
---|---|
.volt extension is used when the template engine set up in the application is written in C | .phtml is used when the template engine is PHP itself |
It can be used as a stand-alone component | It cannot be used as a stand-alone component |
Volt views are compiled to PHP code | phtml files itself includes PHP code so there is no need of compilation in Phalcon framework |
変数
変数は、「set」を使用してテンプレートで割り当ておよび変更されます。
配列を宣言する
{% set fruits = ['Apple', 'Banana', 'Orange'] %}
文字列を宣言する
{% set name = ”John Kennedy” %}
コメント
*\ {#...を使用して、テンプレートにコメントを追加することもできます。 #}* 区切り文字。 それらの内部のすべてのテキストは、最終出力では無視されます。
{# note: this is a comment
{% set price = 100; %}
#}
例
{% set fruits = ['Apple', 'Banana', 'Orange'] %}
<h1>Fruits</h1>
<ul>
{% for fruit in fruits %}
<li>{{ fruit|e }}</li>
{% endfor %}
</ul>
{% set robots = ['Voltron', 'Astro Boy', 'Terminator', 'C3PO'] %}
<ul>
{% for robot in robots %}
<li>{{ robot }}</li>
{% endfor %}
</ul>
出力
コードは、次の出力画面を生成します-
ファルコン-ルーティング
ルーターコンポーネントを使用すると、要求を受信するコントローラーまたはハンドラーにマップされるルートを定義できます。 ルーターは、受信した情報に従ってURIを解析します。
Webアプリケーションのすべてのルーターには2つのモードがあります-
- MVCモード
- マッチオンリーモード
最初のモードは、MVCアプリケーションでの作業に最適です。 Phalconでルートを定義する構文は次のとおりです。
$router = new Router();
//Define a route
$router->add(
"<URI-Name>",
[
"controller" => "<controller-name>",
"action" => "<action-name>",
]
);
例
カテゴリーを検索するために、configフォルダーの routes.php にルートを作成しましょう。
- “ UsersController” *を呼び出すときにメソッドloginを呼び出すルートを作成することを検討してください。 このような場合、指定されたURLをマップするルートを作成することをお勧めします。
<?php
$router = new Phalcon\Mvc\Router();
$router->add('/login', array(
'controller' => 'users',
'action' => 'login',
));
return $router;
出力
コードは次の出力を生成します-
Phalcon-データベース接続
この章では、Phalconに関連するデータベース接続について説明します。
データベースとデザインの作成
ユーザーのエントリごとにカテゴリとともに投稿を保持するブログ用のデータベースの作成に焦点を当てます。
データベース名:blog-tutorial
データベースの作成に使用されるクエリ-
drop database blog-tutorial (if exists)
create database blog-tutorial
データベースの作成後、データベースは次のスクリーンショットに示すようにリストされます。
Phalconは、 models、controllers 、さらにはプロジェクトの作成にもコマンドを使用します。 仕組みを見てみましょう。
- ステップ1 *-blog-tutorialという名前のプロジェクトを作成します。
- ステップ2 *-ブログを管理するために作成したデータベースに接続するWebアプリケーションを構成します。
<?php
return new \Phalcon\Config (array (
'database' => array (
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
//'dbname' => 'blog_tutorial',
'password' => '',
'name' => 'blog_tutorial',
),
'application' => array (
'controllersDir' => __DIR__ . '/../../app/controllers/',
'modelsDir' => __DIR__ . '/../../app/models/',
'viewsDir' => __DIR__ . '/../../app/views/',
'baseUri' => '/blog-tutorial/',
)
));
Phalcon-データベースの切り替え
アプリケーションでMySQLデータベースを使用しました。 データベースソフトウェアを途中で変更する場合、新しいデータベースに同じデータ構造があれば、それほど難しくありません。
PostgreSQL
PostgreSQLデータベースに接続するWebアプリケーションを構成します。
これは、次のコードを使用して実現できます。 サービスには Phalcon \ Db \ Adapter \ Pdo \ Postgresql が含まれます
use Phalcon\Db\Adapter\Pdo\Postgresql;
$config = [
'host' => 'localhost',
'dbname' => 'blog_tutorial',
'port' => 5432,
'username' => 'root',
'password' => ''
];
$connection = new Postgresql($config);
SQLite
SQLite接続を実装するには、構成を Phalcon \ Db \ Adapter \ Pdo \ Sqlite 抽象クラスで拡張する必要があります。
<?php
use Phalcon\Db\Adapter\Pdo\Sqlite;
$connection = new Sqlite(['dbname' => '/tmp/blog_tutorial.sqlite']);
オラクル
PhalconでOracleデータベース接続を実装するには、構成を Phalcon \ Db \ Adapter \ Pdo \ Oracle 抽象クラスで拡張する必要があります。
<?php
use Phalcon\Db\Adapter\Pdo\Oracle;
$config = array (
"dbname" => "//localhost/blog_tutorial",
"username" => "root",
"password" => ""
);
$connection = new Phalcon\Db\Adapter\Pdo\Oracle($config);
Phalcon-足場アプリケーション
足場は通常、Webアプリケーションデータベースを指すコード生成のタイプを指し、基本的なCRUD(作成、読み取り、更新、削除)アプリケーションを作成します。
CRUDアプリケーションを設計する前に、アプリケーションのニーズに応じてデータベーステーブルを設計することが重要です。
- ステップ1 *-すべてのcrud操作を含むスキャフォールディングアプリケーションを作成します。
Command: phalcon scaffold <table-name>
実行されたPhalconのscaffoldジェネレーターは、次の表で説明するファイルとフォルダーを作成します。
- ステップ2 *-インデックスページ(phtmlとvoltの組み合わせ)を作成します。
usersフォルダーのindex.phtmlに含まれるコード。
<?php use Phalcon\Tag as Tag ?>
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title>Blog Tutorial</title>
<link rel = "stylesheet" type = "text/css"
href = "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrapcombined.min.css"/>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
</head>
<body>
<div class = "navbar navbar-fixed-top">
<div class = "navbar-inner">
<div class = "container">
<a class = "btn btn-navbar" data-toggle = "collapse" datatarget = ".nav-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</a>
<a class = "brand" href = "#">Blog Collection</a>
<div class = "nav-collapse">
<ul class = "nav pull-left">
<li>
<?php echo Phalcon\Tag::linkTo('index', 'Home Page') ?>
</li>
<?php if ($this->session->has('auth')) { ?>
<li>
<?php echo Phalcon\Tag::linkTo('posts/index', '+Posts') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('categories/index', '+Categories') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('users/logout', 'Log out') ?>
</li>
<?php } else { ?>
<li>
<?php echo Phalcon\Tag::linkTo('users/index', 'Log in') ?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php echo $this->getContent() ?>
<script src = "http://netdna.bootstrapcdn.com/twitterbootstrap/2.2.1/js/bootstrap.min.js"></script>
</body>
</html>
デフォルトファイル index.volt には次のコードが含まれます。
<?php echo $this->getContent() ?>
<div align = "center">
<h1>Welcome!</h1>
<p>Welcome to the blog collection of Phalcon</p>
</div>
上記のコードが正常に実行されると、次の出力が生成されます。
- ステップ3 *-それぞれのモデルで変更します。
Users.php
<?php
class Users extends \Phalcon\Mvc\Model {
/* *
* @var integer
*
*/
public $id;
/* *
* @var string
*
*/
public $login;
/* *
* @var string
*
*/
public $password;
/* *
* Initializer method for model.
*/
public function initialize() {
$this->hasMany("id", "Posts", "users_id");
}
}
*'initialize'* という名前の関数は、Postsテーブルでidとusers_idの関係を実装するのに役立ちます。つまり、一意の各ユーザーはテーブルに関連付けられた多くの投稿を持っています。
Posts.php
<?php
class Posts extends \Phalcon\Mvc\Model {
/* *
* @var integer
*
*/
public $id;
/* *
* @var string
*
*/
public $title;
/* *
* @var string
*
*/
public $slug;
/* *
* @var string
*
*/
public $content;
/* *
* @var string
*
*/
public $created;
/* *
* @var integer
*
*/
public $users_id;
/* *
* @var integer
*
*/
public $categories_id;
/* *
* Initializer method for model.
*/
public function initialize() {
$this->belongsTo("users_id", "Users", "id");
$this->belongsTo("categories_id", "Categories", "id");
}
}
関数「初期化」には、テーブルとの外部キーと主キーの関係を示す関係制約が含まれます。
*users_id* は、「Users」テーブルのIDを指します。
*categories_id* は、「カテゴリ」テーブルのIDを参照します。
Categories.php
<?php
class Categories extends \Phalcon\Mvc\Model {
/* *
* @var integer
*
*/
public $id;
/* *
* @var string
*
*/
public $name;
/* *
* @var string
*
*/
public $slug;
/* *
* Initializer method for model.
*/
public function initialize() {
$this->hasMany("id", "Posts", "categories_id");
}
}
ユーザーモデルと同様に、「初期化」関数は、指定された投稿の多くの *categories_id を含むことを指定します。
リンク:/phalcon/phalcon_designing_login_page [ログインページの設計]
ビューを作成する
以下は、Blog-tutorial-masterプロジェクトの完全な構造です。
ユーザーが正常にログインした後にホームページを表示するための関連ビューは*“ index.phtml” *です。
<?php use Phalcon\Tag as Tag ?>
<!DOCTYPE html>
<html>
<head>
<meta charset = "utf-8">
<title>Blog Tutorial</title>
<link rel = "stylesheet" type = "text/css" href = "http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrapcombined.min.css"/>
<meta name = "viewport" content = "width = device-width, initial-scale = 1.0">
</head>
<body>
<div class = "navbar navbar-fixed-top">
<div class = "navbar-inner">
<div class = "container">
<a class = "btn btn-navbar" data-toggle = "collapse" datatarget = ".nav-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</a>
<a class = "brand" href = "#">Blog Collection</a>
<div class = "nav-collapse">
<ul class = "nav pull-left">
<li>
<?php echo Phalcon\Tag::linkTo('index', 'Home Page') ?>
</li>
<?php if ($this->session->has('auth')) { ?>
<li>
<?php echo Phalcon\Tag::linkTo('posts/index', '+Posts') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('categories/index', '+Categories') ?>
</li>
<li>
<?php echo Phalcon\Tag::linkTo('users/logout', 'Log out') ?>
</li>
<?php } else { ?>
<li>
<?php echo Phalcon\Tag::linkTo('users/index', 'Log in') ?>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
</div>
<?php echo $this->getContent() ?>
<script src = "http://netdna.bootstrapcdn.com/twitterbootstrap/2.2.1/js/bootstrap.min.js"></script>
</body>
</html>
リンク:/phalcon/phalcon_category_management [カテゴリ管理]
Phalcon-クエリ言語
Phalcon Query Language(PHQL)は PhalconQL とも呼ばれ、PhalconがサポートするデータベースシステムのSQLクエリを標準化する高レベルのSQLダイアレクトです。
Cで記述されたパーサーが含まれており、ターゲットRDBMSの構文を変換します。
ここにPhalconクエリ言語の顕著な特徴のいくつかのリストがあります-
- Webアプリケーションのセキュリティのために、バインドされたパラメーターを使用します。
- テーブルはモデルとして扱われ、列はクラス属性として扱われます。
- すべてのデータ操作ステートメントは、発生する可能性のあるデータの損失を防ぐために使用されます。
- SQLインジェクションは、SQLクエリ呼び出しを一度に1つずつ保持することにより防止されます。
PHQLクエリの作成
クエリは、クラス Phalcon \ Mvc \ Model \ Query をインスタンス化することにより作成されます。
例
//Instantiate the Query
$query = new Query(
"SELECT * FROM Users",
$this->getDI()
);
//Execute the query returning a result if any
$cars = $query->execute();
前の章では、blog tutorialという名前のscaffold Webアプリケーションの動作を見てきました。 名前またはスラッグごとの検索カテゴリが含まれていました。
以下は、searchActionに含まれるコードです。
public function searchAction() {
$numberPage = 1;
if ($this->request->isPost()) {
$query = Criteria::fromInput($this->di, "Categories", $_POST);
$this->session->conditions = $query->getConditions();
} else {
$numberPage = $this->request->getQuery("page", "int");
if ($numberPage <= 0) {
$numberPage = 1;
}
}
$parameters = array();
if ($this->session->conditions) {
$parameters["conditions"] = $this->session->conditions;
}
//$parameters["order"] = "id";
$categories = Categories::find($parameters);
if (count($categories) == 0) {
$this->flash->notice("The search did not find any categories");
return $this->dispatcher->forward(array(
"controller" => "categories",
"action" => "index"
));
}
$paginator = new \Phalcon\Paginator\Adapter\Model(array(
"data" => $categories,
"limit"=> 10,
"page" => $numberPage
));
$page = $paginator->getPaginate();
$this->view->setVar("page", $page);
}
コントローラで実行(強調表示)されたPHQLクエリは、検索条件に従ってすべての結果を取得します。 条件ごとの検索クエリの結果は、スクリーンショットのように表示されます。
上記のコードが正常に実行されたときに受信した出力を次に示します。
PHQLライフサイクル
高レベル言語であるPHQLは、開発者が要件に応じてさまざまな側面をパーソナライズおよびカスタマイズできるようにします。
以下は、Phalconで実行される各PHQLステートメントのライフサイクルです-
- すべてのPHQLステートメントは解析され、データベースシステムによって実装されたSQLから完全に独立した中間表現(IR)として変換されます。
- IRは、Webアプリケーションで使用されるデータベースシステムに従って、SQLステートメントに変換されます。 生成されたSQLステートメントはモデルに関連付けられます。
- すべてのPHQLステートメントは一度解析され、メモリにキャッシュされます。 同じ文の結果が実行されると、パフォーマンスが向上します。
Phalcon-データベースの移行
データベースの移行は、次の理由で重要です-
- データベースの移行は、指定されたストレージタイプ間でのデータ転送に役立ちます。
- データベースの移行とは、あるプラットフォームから別のプラットフォームに移行するWebベースのアプリケーションのコンテキストを指します。
- このプロセスは通常、古くなっているデータを追跡するために行われます。
Phalconは次の方法でデータベース移行プロセスを実行します-
ステップ1 *-“ dbProject” という名前のプロジェクトを *xampp/wamp ディレクトリに作成します。
- ステップ2 *-適切なデータベース接続でプロジェクトを構成します。
<?php
/*
* Modified: preppend directory path of current file,
because of this file own different ENV under between Apache and command line.
* NOTE: please remove this comment.
*/
defined('BASE_PATH') || define('BASE_PATH', getenv('BASE_PATH') ?: realpath(dirname(__FILE__) . '/../..'));
defined('APP_PATH') || define('APP_PATH', BASE_PATH . '/app');
return new \Phalcon\Config(['database' => [
'adapter' => 'Mysql',
'host' => 'localhost',
'username' => 'root',
'password' => '',
'dbname' => 'demodb',
'charset' => 'utf8', ],
'application' => [ 'appDir' => APP_PATH . '/',
'controllersDir' => APP_PATH .
'/controllers/', 'modelsDir' => APP_PATH .
'/models/', 'migrationsDir' => APP_PATH .
'/migrations/', 'viewsDir' => APP_PATH .
'/views/','pluginsDir' => APP_PATH .
'/plugins/', 'libraryDir' => APP_PATH .
'/library/', 'cacheDir' => BASE_PATH .
'/cache/', 'baseUri' => '/dbProject/',
] ]);
- ステップ3 *-データベース「demodb」に含まれるテーブルの移行コマンドを実行します。 現時点では、1つのテーブル「users」が含まれています。
- ステップ4 *-移行されたデータベースファイルは、「app」フォルダー内の移行ディレクトリ内に保存されます。
したがって、テーブルは正常に移行されます。
移行されたファイルの構造を理解する
移行されたファイルには、 Phalcon \ Mvc \ Model \ Migration クラスを拡張する一意のクラスがあります。 PhalconのMigrationクラスには、メソッド* up()および down()*が含まれています。 * up()*メソッドは移行を実行するために使用され、downメソッドは操作をロールバックします。
Users.php
<?php
use Phalcon\Db\Column;
use Phalcon\Db\Index;
use Phalcon\Db\Reference;
use Phalcon\Mvc\Model\Migration;
/* *
* Class UserMigration_100
*/
class UserMigration_100 extends Migration {
/* *
* Define the table structure
*
* @return void
*/
public function morph() {
$this->morphTable('user', [
'columns' => [
new Column( 'Id', [
'type' => Column::TYPE_INTEGER,
'notNull' => true,
'autoIncrement' => true,
'size' => 11, 'first' => true ] ),
new Column( 'username', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 40,
'after' => 'Id' ] ),
new Column( 'email', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 40,
'after' => 'username' ] ),
new Column( 'password', [
'type' => Column::TYPE_VARCHAR,
'notNull' => true,
'size' => 10,
'after' => 'email' ] )
],
'indexes' => [new Index('PRIMARY', ['Id'], 'PRIMARY') ],
'options' => [ 'TABLE_TYPE' => 'BASE TABLE',
'AUTO_INCREMENT' => '3', 'ENGINE' => 'InnoDB',
'TABLE_COLLATION' => 'latin1_swedish_ci' ],
] );
}
/* *
* Run the migrations
** @return void
*/
public function up() {
}
/* *
* Reverse the migrations
*
*@return void
*/
public function down() {
}
}
上記の例に示されているクラス UserMigration_100 には、4つのセクションを持つ連想配列が含まれています-
- 列-一連のテーブル列が含まれます。
- インデックス-一連のテーブルインデックスが含まれます。
- 参照-すべての参照整合性制約(外部キー)が含まれます。
- Options -テーブル作成オプションのセットを持つ配列。
上記の例に見られるように、データベースのバージョン1.0.0は正常に移行されました。 Phalconは、データベースコンテンツの保持方法に応じて、複数の移行プロセスを含めて実行する場合があります。
ファルコン-クッキー管理
ブラウザーCookieとも呼ばれるCookieは、ブラウザーに保存される小さなテキストファイルです。 ユーザーIDに関連するすべての情報を保存します。 この情報は、ユーザーがさまざまなページを閲覧したときにユーザーを検証するために使用されます。
Cookieには2つの異なるタイプがあります-
- *セッションCookies-これらのタイプのCookieはブラウザに残り、ブラウザが閉じられるまで情報を保持します。 ブラウザが開かれるとすぐに、同じユーザーの新しいセッションとして扱われます。
- 永続的なクッキー-規定の有効期間が含まれ、指定された有効期間内にブラウザに残ります。 永続的なCookieを使用するWebサイトは、ブラウザがユーザーによって閉じられた場合でも、すべてのユーザーを追跡します。
PhalconでのCookieの動作について説明しましょう。
ファルコンのクッキー
Phalconは、 Phalcon \ Http \ Response \ Cookies をCookieのグローバルストレージとして使用します。 Cookieは、サーバーにリクエストを送信するときにPhalconに保存されます。
クッキーを設定するための構文は次のとおりです-
$this->cookies->set(
"<cookie-name>",
"<cookie-value>",
time
);
次の例を考えてください。 次のコードを使用して、ユーザーがWebアプリケーションにログインするときにユーザーのCookieを作成します。
<?php
class UsersController extends \Phalcon\Mvc\Controller {
public function indexAction() {
if ($this->cookies->has("login-action")) {
//Get the cookie
$loginCookie = $this->cookies->get("login-action");
//Get the cookie's value
$value = $loginCookie->getValue();
echo($value);
}
$this->cookies->set(
"login-action",
"abc",
time() + 15 * 86400
);
}
}
暗号化されたCookieは出力として表示されます。
説明
“ loginAction” *という名前のCookieが値“ abc” *で作成されました。
メソッド*“ indexAction” *は、Cookieが存在するかどうかを確認し、それに応じて値を出力します。
クッキーの暗号化
PhalconのCookieは、リクエストとしてサーバーに送信される前に暗号化され、サーバーから適切な応答を受け取るとすぐに解読されます。 これにより、許可されたユーザーのセキュリティが確保されます。
暗号化と復号化の機能にもかかわらず、Cookieに機密データを保存しないようにすることを常にお勧めします。 Cookieの暗号化の設定は、 services.php ファイルに含まれています。
/* *
* Enable encryption key for setting values of cookies
*/
$di->set(
"cookies", function () {
$cookies = new Cookies();
$cookies->useEncryption(false);
return $cookies;
}
);
/* *
* Set encryption key
*/
$di->set(
"crypt", function () {
$crypt = new Crypt();
$crypt->setKey('AED@!sft56$');//Use a unique Key!
return $crypt;
}
);
注-
- Cookieをサーバーに送信するときは、常に暗号化を使用することをお勧めします。
- 暗号化を使用しない場合、すべての内部アプリケーションが攻撃者にさらされます。
- また、小さなデータとリテラルをCookieに保存することをお勧めします。
ファルコン-セッション管理
セッションは、WebサイトまたはWebアプリケーションとのユーザーの対話に役立つサーバー側の情報ストレージです。 各セッションはセッションIDで一意に定義されます。セッションIDは、ブラウザーがHTTP要求を行うたびにWebサーバーに渡されます。 セッションIDは、保存されているすべての変数が取得されるように、内部データベースと毎回ペアリングされます。
ファルコンのセッション
Phalconは、セッションデータにアクセスするためのラッパーを含むセッションコンポーネントを使用します。
ファルコンの機能は次のとおりです-
- セッションデータは、同じドメイン上の他のコンポーネントから分離できます。
- アプリケーションのニーズに応じて、セッションアダプタの助けを借りてセッション値を変更できます。
Phalconでセッションを開始する
すべてのセッションアクティビティは、Webアプリケーションの /config フォルダー内の Services.php ファイルで宣言されているアダプターファイルに関連付けられています。
/* *
* Start the session the first time some component requests the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});
セッションを作成する
- ステップ1 *-データを適切に取得できるように、セッションをインスタンス化するためのセッションコントローラーを作成します。
- ステップ2 *-名前と値を使用してセッションを作成します。
<?php
class SessionController extends \Phalcon\Mvc\Controller {
public function indexAction() {
//Define a session variable
$this->session->set("user-name", "Omkar");
//Check if the variable is defined
if ($this->session->has("user-name")) {
//Retrieve its value
$name = $this->session->get("user-name");
echo($name);
}
}
}
上記のコードは次の出力を生成します。
セッションの削除
Phalconでセッションを破棄するか、セッション内のいくつかの変数値を設定解除することができます。
以下は、セッションで変数値を設定解除する構文です。
$this->session->remove(<variable-name>);
上記の例に示すように、セッションで作成される変数名は*“ data-content” *であり、次のコードを使用して削除できます。
public function removeAction() {
//Remove a session variable with associated session
$this->session->remove("data-content");
}
以下は、セッション全体を破棄する構文です。
$this->session->destroy();
Phalcon-多言語サポート
Phalconには、多言語サポートを提供する Phalcon \ Translate コンポーネントが含まれており、複数の言語に翻訳されたWebページを作成すると非常に役立ちます。
配列のバインドと翻訳メッセージの読み取りを支援するアダプターが含まれています。
例
PhalconのTranslateコンポーネントを使用して出力を作成します。これは、推奨される言語に従って出力を表示するのに役立ちます。
ステップ1 *-Phalconは、すべての開発者に翻訳文字列を整理する自由を与えます。 2つの異なるファイル、つまり *en.php (英語の文字列用)と fr.php (フランス語の文字列用)を保持することを検討してください。
ファイルにはキーと値のペアの配列が含まれます。キーは一意であり、値は必要な翻訳によって異なります。
en.php
<?php
//app/messages/en.php
$messagesContent = [
"bye" => "Good Bye",
"hi-name" => "Hello %name%",
"song" => "Your favorite song is %song%",
];
fr.php
<?php
//app/messages/fr.php
$messagesContent = [
"bye" => "Au revoir",
"hello-name" => "Bonjour %name%",
"song" => "Votre chanson préférée est %song%",
];
ステップ2 *-アプリケーションで、翻訳に使用するファイルに関するパラメータを取る *UserController を作成します。
<?php
use Phalcon\Translate\Adapter\NativeArray;
class UserController extends \Phalcon\Mvc\Controller {
protected function getMessageTransalation() {
//Ask for the best language
//Display the output in desired language
require "en.php";
//Return a translation object
return new NativeArray( ["content" => $messagesContent,]);
}
public function indexAction() {
$this->view->name = "Radhika";
$this->view->song= "Ton sourire m'ensorcelle Je suis fou de toi Le désir coule dans mes veines Guidé par ta voix";
$this->view->t = $this->getMessageTransalation();
}
}
デフォルトの方法では、2つのパラメーターが使用されます。1つは名前、2つ目はユーザーのお気に入りの歌です。 後で、目的の出力を返す関数 getMessageTranslation が呼び出されます。
今のところ、英語での出力が必要です。
ステップ3 *-関連する *code view demo \ app \ views \ User \ index.volt には次のコードが含まれます-
<p><?php echo $t->_("hello-name", ["name" => $name]); ?></p>
<p><?php echo $t->_("song", ["song" => $song]); ?></p>
完全な出力をフランス語で表示する場合は、ファイル名を変更するだけです。
require "fr.php";
以下はフランス語の出力です。
ファルコン-資産管理
資産は、Phalconの既存のフレームワークとは別の追加コンポーネントに関するものです。 Phalconには、CSSやJSファイルなどのすべてのアセットコンポーネントの管理に役立つアセットマネージャーがあります。
使用される一般的な方法は-
Method | Importance |
---|---|
__construct(variable $options) | Initializes the component Phalcon\Assets\Manager |
addCss(string $path, variable $local, variable $filter, variable $attributes) | Adds a CSS resource from the 'css' collection to a particular view |
addJs(string $path, variable $local, variable $filter, variable $attributes) | Adds a JavaScript resource to the 'js' collection |
例
*css* ファイルを追加するための最良の例であるPhalcon *“ vokuro” *のサンプルプロジェクトを検討してください。 すべての *css* ファイルを呼び出すためのasset/Managerが含まれます。
プロジェクトのデフォルトのコントローラーは、すべての css ファイルを呼び出します。
<?php
namespace Vokuro\Controllers;
use Phalcon\Assets\Manager;
/* *
* Display the default index page.
*/
class IndexController extends ControllerBase {
/* *
* Default action. Set the public layout (layouts/public.volt)
*/
public function indexAction() {
$this->assets->addCss("public/style.css");
$this->view->setVar('logged_in', is_array($this->auth->getIdentity()));
$this->view->setTemplateBefore('public');
}
}
Style.css
div.remember {
margin-top: 7px;
color: #969696;
}
div.remember label {
padding-top: 15px;
}
div.forgot {
margin-top: 7px;
color: #dadada;
}
footer {
background: url("../img/feature-gradient.png") no-repeat scroll center 100% white;
color: #B7B7B7;
font-size: 12px;
padding: 30px 0;
text-align: center;
}
footer a {
margin-left: 10px;
margin-right: 10px;
}
table.signup td {
padding: 10px;
}
table.signup .alert {
margin-bottom: 0;
margin-top: 3px;
}
table.perms select {
margin-top: 5px;
margin-right: 10px;
}
table.perms label {
margin-right: 10px;
}
div.main-container {
min-height: 450px;
}
アセットはビュー内で管理され、CSSファイルが出力として表示されます。
Index.volt
{{ content() }}
{{ assets.outputCss() }}
<header class = "jumbotron subhead" id = "overview">
<div class = "hero-unit">
<h1>Welcome!</h1>
<p class = "lead">This is a website secured by Phalcon Framework</p>
<div align = "right">
{{ link_to('session/signup', '<i class="icon-ok icon-white">
</i> Create an Account', 'class': 'btn btn-primary btn-large') }}
</div>
</div>
</header>
出力
それは次の出力を生成します-
Phalcon-フォームの使用
フォームはすべてのWebアプリケーションで使用され、リクエストとしてユーザーからの入力を受け入れます。 データは入力として受け入れられ、操作されてデータベースに保存されるか、その他の操作が実行されます。
Phalconには Phalcon \ Forms という名前のコンポーネントが含まれており、フォームの作成とメンテナンスに役立ちます。
前の章で作成したブログチュートリアルの例を考えてみましょう。 新しいカテゴリを作成するために使用されるフォームが含まれています。
<?php echo \Phalcon\Tag::form(array("categories/create", "autocomplete" => "off")) ?>
<table width = "100%">
<tr>
<td align = "left">
<?php echo \Phalcon\Tag::linkTo(array("categories", "Go Back", "class" => "btn")) ?>
</td>
<td align = "right"><
?php echo \Phalcon\Tag::submitButton(array("Save", "class" => "btn")) ?>
</td>
<tr>
</table>
<?php echo $this->getContent(); ?>
<div align = "center">
<h1>Create categories</h1>
</div>
<table align = "center">
<tr>
<td align = "right">
<label for = "name">Name</label>
</td>
<td align = "left">
<?php echo \Phalcon\Tag::textField(array("name", "size" => 30)) ?>
</td>
</tr>
<tr>
<td align = "right">
<label for = "slug">Slug</label>
</td>
<td align = "left">
<?php echo \Phalcon\Tag::textField(array("slug", "size" => 30)) ?>
</td>
</tr>
</table>
</form>
出力-次の出力を生成します。
フォームの入力フィールドは、 Phalcon/tag コンポーネントを使用してレンダリングされます。 フォームの各要素は、開発者の要件に従ってレンダリングできます。
値をレンダリングするための構文は次のとおりです。
echo $form->render(element-name)
検証-
コントローラーで値がレンダリングされると、モデルの助けを借りて値がデータベースに入力されます。 Phalconフォームは検証コンポーネントと統合されており、即時検証を提供します。 組み込みまたはカスタムのバリデーターを各要素に設定できます。
<?php
use Phalcon\Forms\Element\Text;
use Phalcon\Validation\Validator\PresenceOf;
use Phalcon\Validation\Validator\StringLength;
$name = new Text(
"Name"
);
$name->addValidator(
new PresenceOf([ "message" => "name is required", ])
);
$form->add($name);
出力-次の出力を生成します。
Phalcon-オブジェクトドキュメントマッパー
オブジェクトリレーショナルマッパー(ORM)およびオブジェクトドキュメントマッパー(ODM)の概念を始める前に、SQLデータベースとNoSQLデータベースの違いを理解することが重要です。
次の表は、SQLとNoSQLの違いを強調しています-
SQL | NoSQL |
---|---|
They are also termed as Relational Databases (RDBMS) | They are called as non-relational or distributed database |
The structure of database is constituted as tables and views | It consists of document based and graph databases |
It includes a predefined schema | It has a dynamic schema |
It is very powerful for defining and manipulating data | It is powerful in maintaining data as collection of documents |
Phalconには、SQLおよびNoSQLデータベースとマッピングする機能があります。 これは、NoSQLデータベースのオブジェクトドキュメントマッパー(ODM)およびSQLデータベースのオブジェクトリレーショナルマッパー(ORM)を使用して実現されます。
Phalconでは、ORMの概念は、前の章で見たように、指定されたテーブル名に関連付けられたモデルを作成することで構成されます。 すべての参照整合性制約に従います。
オブジェクトドキュメントマッパー(ODM)
これは、NoSQLデータベースに関連付けられたオブジェクトです。 名前が示すように、ドキュメント関連モジュールをマップします。 Phalconはこれを使用して、MongoDBなどのデータベースにマッピングします。
例
ステップ1 *-“ test” *という名前のMongoDBのデータベースを作成します。 このデータベースを使用してマッピングし、適切な応答を取得します。
- ステップ2 *-データベースに挿入されたレコードを確認します。 それに関連付けられているコマンドは-
db.collection.find()
すべてのドキュメントは、ODMの機能であるObjectIdでマップされることが確認されています。 ObjectId の値は一意であり、後でその特定のIDに関して保存されているすべてのデータを取得するために使用されます。
ステップ3 *-作成されたデータベースのモデルを設定します。 モデルは、 *Phalcon \ Mvc \ Collection を拡張するクラスです。 Test.php モデルには次のコードが含まれます。
<?php
use Phalcon\Mvc\Collection;
class Test extends Collection {
public function initialize() {
$this->setSource("test");
}
}
ステップ4 *- *services.php でデータベース接続を含むプロジェクトを構成します。
//Simple database connection to localhost
$di->set(
"mongo",
function () {
$mongo = new MongoClient();
return $mongo->selectDB("test");
},
true
);
//Connecting to a domain socket, falling back to localhost connection
$di->set(
"mongo",
function () {
$mongo = new MongoClient(
"mongodb:///tmp/mongodb-27017.sock,localhost:27017"
);
return $mongo->selectDB("test");
},
true
);
ステップ5 *- *TestController.php を使用して、 ObjectId に関する値を出力します。
<?php
use Phalcon\Mvc\Controller;
class TestController extends Controller {
public function index() {
//Find record with _id = "5087358f2d42b8c3d15ec4e2"
$test = Test::findById("5819ab6cfce9c70ac6087821");
echo $test->data;
}
}
出力には、objectIdと一致するデータが表示されます。 文書内のレコードごとにobjectIdが一致しない場合、レコード数がフェッチされるため、適切な出力は表示されません。
Phalcon-セキュリティ機能
Phalconは、セキュリティコンポーネントを使用してセキュリティ機能を提供します。これは、パスワードハッシュや Cross-Site Request Forgery (CSRF)などの特定のタスクの実行に役立ちます。
パスワードのハッシュ化
- ハッシュ*は、固定長のビット文字列を、元に戻せないように指定された長さに変換するプロセスとして定義できます。 入力文字列を変更すると、ハッシュされたデータの値が変更されます。
ハッシュされたデータの復号化は、ユーザーが入力した値を入力として受け取り、そのハッシュ形式を比較することにより行われます。 通常、Webベースのアプリケーションでは、パスワードをプレーンテキストとして保存するのは悪い習慣です。 データベースにアクセスできるユーザーは、任意のユーザーのパスワードを簡単に入手できるため、サードパーティの攻撃を受けやすくなります。
Phalconは、 md5、base64 、または sh1 などのアルゴリズムに従う暗号化された形式でパスワードを保存する簡単な方法を提供します。
前の章で見たように、ブログ用のプロジェクトを作成しました。 ログイン画面は、ユーザーのユーザー名とパスワードとして入力を受け入れます。 ユーザーからパスワードを受け取り、特定の形式でパスワードを復号化するには、次のコードスニペットが使用されます。
復号化されたパスワードは、ユーザーからの入力として受け入れられたパスワードと照合されます。 値が一致する場合、ユーザーはWebアプリケーションに正常にログインできます。それ以外の場合は、エラーメッセージが表示されます。
<?php
class UsersController extends Phalcon\Mvc\Controller {
public function indexAction() {
}
public function registerUser() {
$user = new Users();
$login = $this->request->getPost("login");
$password = $this->request->getPost("password");
$user->login = $login;
//Store the hashed pasword
$user->password = $this->security->sh1($password);
$user->save();
}
public function loginAction() {
if ($this->request->isPost()) {
$user = Users::findFirst(array(
'login = :login: and password = :password:',
'bind' => array(
'login' => $this->request->getPost("login"),
'password' => sha1($this->request->getPost("password"))
)
));
if ($user === false) {
$this->flash->error("Incorrect credentials");
return $this->dispatcher->forward(array(
'controller' => 'users',
'action' => 'index'
));
}
$this->session->set('auth', $user->id);
$this->flash->success("You've been successfully logged in");
}
return $this->dispatcher->forward(array(
'controller' => 'posts',
'action' => 'index'
));
}
public function logoutAction() {
$this->session->remove('auth');
return $this->dispatcher->forward(array(
'controller' => 'posts',
'action' => 'index'
));
}
}
データベースに保存されているパスワードは、暗号化された sh1 アルゴリズムの形式です。
ユーザーが適切なユーザー名とパスワードを入力すると、ユーザーはシステムにアクセスできます。そうでない場合、検証としてエラーメッセージが表示されます。
クロスサイトリクエストフォージェリ(CSRF)
これは、Webアプリケーションの認証されたユーザーに特定の不要なアクションを実行させる攻撃です。 ユーザーからの入力を受け付けるフォームは、この攻撃に対して脆弱です。 Phalconは、アプリケーション外部のフォームを介して送信されるデータを保護することにより、この攻撃を防止しようとします。
各フォームのデータは、トークン生成を使用して保護されます。 生成されたトークンはランダムであり、フォームデータの送信先のトークンと一致します(ほとんどはPOSTメソッドを介してWebアプリケーションの外部にあります)。
コード:
<?php echo Tag::form('session/login') ?>
<!-- Login and password inputs ... -->
<input type = "hidden" name = "<?php echo $this->security->getTokenKey() ?>"
value = "<?php echo $this->security->getToken() ?>"/>
</form>
注-すべてのデータはセッションで保持されるため、フォームのトークンを送信するときにセッションアダプターを使用することが重要です。
次のコードを使用して、セッションアダプタを services.php に含めます。
/* *
* Start the session the first time some component request the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});