ファルコン:例で学ぼう

PHP MVCフレームワーク-PhalconPHP
最近では 、C 記述され PHP MVCフレームワークがハブで言及され、その長所と短所が説明されました。 この記事では、Web開発者のかなり興味深いツールであるPhalconPHPを引き続き知りたいと思います。

この記事は、 基本的なレッスンの無料翻訳です。このレッスンでは、簡単な登録フォームを使用してアプリケーションを作成するプロセスを検討し、フレームワークの動作の主な側面について説明します。

このガイドを使用する最良の方法は、手順を追って説明することです。

最終結果はgithubにあります。
開発者ツールを使用してアプリケーションフレームワークを自動的に生成できますが、この記事ではこの機能については説明しません。

Phalcon PHPのインストールは非常に簡単であり、すべてPHPの拡張機能をインストールすることになります 。これは公式サイトからダウンロードできます。

Phalcon PHPをインストールした後、phpinfo()の出力に「Phalcon」セクションがあるかどうかを確認するか、以下のコードスニペットを実行します。

<?php print_r(get_loaded_extensions()); 

他の拡張機能の中で、ファルコンが表示されます:

 Array ( [0] => Core [1] => libxml [2] => filter [3] => SPL [4] => standard [5] => phalcon [6] => pdo_mysql ) 


ディレクトリ構造


Phalconでは、特定のプロジェクト階層を使用する必要はありません。アプリケーションの開発には、使用する構造を使用できます。

例として、このレッスンでは次の構造を使用します。

チュートリアル/
  アプリ/
    コントローラー/
    モデル/
    ビュー/
  公開/
     css /
     img /
     js /

フレームワークをホストするために「ライブラリ」のようなディレクトリは必要ないことに注意してください; Phalconは既にメモリからアクセス可能であり、すぐに使用できます。

美しいURL


このレッスンでは、人間が読めるURL(NC)を使用します。 CNCは、検索エンジンの最適化に役立つだけでなく、ユーザーがリンクを覚えやすくするためにも役立ちます。 アプリケーションによるCNCのサポートは必須ではなく、サポートなしでプロジェクトを自由に開発できます。

この例では、Apacheにmod_rewriteを使用し、ディレクトリ構造に基づいて、プロジェクトのルートにある1つとパブリックディレクトリにある2つの.htaccessファイルが必要です。

 #/.htaccess <IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] </IfModule> 

アプリケーションへのすべてのリクエストは、 public/ディレクトリに送信されます。 この手順により、プロジェクトの内部フォルダーがパブリックアクセスから隠されたままになり、セキュリティリスクが軽減されます。

2番目のルールセットは、必要なファイルが存在するかどうかをチェックします。 ファイルが欠落している場合、Webサーバーは要求をフレームワークに必要なフォームに変換します。

 #/public/.htaccess <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] </IfModule> 

翻訳者注:セキュリティとパフォーマンスの両方の観点から、アプリケーションをpublic_htmlを超えて移動し、画像、js、cssのみを残しておく方が効率的です。 しかし、この例から逸脱しないようにしましょう。

ブートストラップ


作成する最初のファイルは初期化スクリプトです。 このファイルはコンポーネントの初期化を実装し、アプリケーションの基礎として機能し、すべての動作を制御します。

ブートストラップファイルpublic/index.phpは次のようになります。

 <?php try { //Register an autoloader $loader = new \Phalcon\Loader(); $loader->registerDirs(array( '../app/controllers/', '../app/models/' ))->register(); //Create a DI $di = new Phalcon\DI\FactoryDefault(); //Setting up the view component $di->set('view', function(){ $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../app/views/'); return $view; }); //Handle the request $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(\Phalcon\Exception $e) { echo "PhalconException: ", $e->getMessage(); } 

以下では、このファイルの各部分をより詳細に分析します。

オートローダー


初期化ファイルの最初の部分は、オートローダーの登録です。 コントローラとモデルをロードするために使用されます。 たとえば、コントローラーの1つ以上のディレクトリを登録して、アプリケーションの柔軟性を高めることができます。 この例では、 Phalcon\Loaderコンポーネントが使用されました。

さまざまなアプローチを使用してクラスをロードするために使用できますが、この例では、事前定義されたディレクトリに基づいてクラスを検出することを選択しました。

 <?php $loader = new \Phalcon\Loader(); $loader->registerDirs( array( '../app/controllers/', '../app/models/' ) )->register(); 


依存関係管理


Phalconフレームワークを使用する場合、 依存性注入wiki )の概念を理解する必要があります 。 複雑に見えるかもしれませんが、実際には、すべてが非常にシンプルで実用的です。

Phalconには、アプリケーションが機能するために必要なコンポーネントを格納するメカニズムが含まれており、フレームワークの要求に応じてそれらへのアクセスを提供します。 このメカニズムはPhalcon\DIクラスであり、リンクとして機能し、さまざまなコンポーネントを組み合わせて共同作業を行います。

 <?php //Create a DI $di = new Phalcon\DI\FactoryDefault(); 

Phalcon \ DI \ FactoryDe​​faultは、依存関係注入Phalcon\DI実装するPhalcon\DI子孫です。 フレームワークのほとんどの標準コンポーネントを登録します。 したがって、それらを1つずつ登録しないでください。 必要に応じて、独自の実装に簡単に置き換えることができます。

次のステップは、「ビュー」コンポーネントを登録することです。 ビューファイルはクラスではないため、オートローダーを使用してロードすることはできません。そのため、場所を指定する必要があります。

 <?php //Setting up the view component $di->set('view', function(){ $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../app/views/'); return $view; }); 

このファイルの最後の部分は、コンポーネントPhalcon \ Mvc \ Applicationを登録します。 その目的は、リクエスト環境を初期化し、ルートを処理し、リクエストに対応するアクションを実行することです。 コントローラから応答を受け取り、プロセスが完了するとそれを返します。

 <?php $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); 

ご覧のとおり、初期化ファイルは非常に単純であり、追加のファイルを接続する必要はありません。 30行未満のコードで、柔軟なMVCアプリケーションのステージを設定しました。

コントローラー


デフォルトでは、Phalconは「Index」という名前のコントローラーとそのアクションを検索します。 要求でコントローラーとアクションが指定されていない場合に実行されます。 最も単純なコントローラーは次のようになります。

 <?php class IndexController extends \Phalcon\Mvc\Controller { public function indexAction() { echo "<h1>Hello!</h1>"; } } 

コントローラークラスにはサフィックス「Controller」があり、そのアクションにはサフィックス「Action」が必要です。 ブラウザでアプリケーションを開くと、次のようなものが表示されます。

画像

おめでとうございます、あなたはハヤブサで飛んでいます! (翻訳者のメモ:PhalconはEnglish Falcon-falcon *の子音です)

表示する


コントローラーから画面に直接出力を送信することは正当化されますが、これを行うべきではありません。 必要なデータは、画面に表示する責任のある表現に転送する必要があります。 Phalconは、最後に実行されたコントローラーの名前のディレクトリで、最後に実行されたアクションと同じ名前のファイルでビューを検索します。

私たちの場合、これはapp/views/index/index.phtmlです:

 <?php echo "<h1>Hello!</h1>"; 

そして、コントローラー自体( app/controllers/IndexController.php )に空のアクションが含まれるようになりました:

 <?php class IndexController extends \Phalcon\Mvc\Controller { public function indexAction() { } } 

ビューは、アクションが完了すると自動的に処理されます。 ブラウザの出力は同じままである必要があります。

登録フォーム


別の「サインアップ」コントローラーへのリンクを追加して、view app/views/index/index.phtml変更します。

 <?php echo "<h1>Hello!</h1>"; echo Phalcon\Tag::linkTo("signup", "Sign Up Here!"); 

生成されたHTMLは、新しいコントローラーへのリンクを含む<a>タグを表示します。

 <h1>Hello!</h1> <a href="/test/signup">Sign Up Here!</a> 

リンクを生成するために、 Phalcon \ Tagクラスが使用されました。 このヘルパークラスを使用すると、フレームワーク標準に​​従ってHTMLを構築できます。 ここでは、HTMLコードの生成に関するより詳細な説明を見つけることができます。

画像

これは、新しい「 app/controllers/SignupController.php 」コントローラーがどのように見えるかです( app/controllers/SignupController.php ):

 <?php class SignupController extends \Phalcon\Mvc\Controller { public function indexAction() { } } 


空のアクション "indexAction"は、フォーム( app/views/signup/index.phtml )を持つビューに直接送られapp/views/signup/index.phtml

 <?php use Phalcon\Tag; ?> <h2>Sign using this form</h2> <?php echo Tag::form("signup/register"); ?> <p> <label for="name">Name</label> <?php echo Tag::textField("name") ?> </p> <p> <label for="name">E-Mail</label> <?php echo Tag::textField("email") ?> </p> <p> <?php echo Tag::submitButton("Register") ?> </p> </form> 

このコントローラーをブラウザーで開くと、次のようなものが表示されます。

画像

Phalcon\Tagは、フォーム要素を作成するための便利な方法を提供します。
Phalcon\Tag::formメソッドで、フォームを処理するアプリケーションのコントローラー/アクションにパスを渡しました。

「登録」ボタンをクリックすると、フレームワークからスローされる例外が表示され、「サインアップ」コントローラーに「登録」アクションがないことを示します。

PhalconException:コントローラ「signup」でアクション「register」が見つかりませんでした

このアクションを実装することで、例外を取り除きます:

 <?php class SignupController extends \Phalcon\Mvc\Controller { public function indexAction() { } public function registerAction() { } } 

再びフォームを送信すると、空白のページが表示されます。

入力したユーザー名と電子メールは、データベースに保存する必要があります。 MVCの原則に従って、データベースとの相互作用は、クリーンなオブジェクト指向コードを提供するために、アプリケーションモデルによって実行される必要があります。

モデル


Phalconは、完全にCで記述されたPHPの最初のORMを提供します。 開発の複雑さを増すのではなく、単純化します。

最初のモデルを作成する前に、データベースにテーブルが必要です。 登録ユーザーを保存するための簡単なテーブルは次のようになります。

 CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(70) NOT NULL, `email` varchar(70) NOT NULL, PRIMARY KEY (`id`) ); 

モデルはapp/modelsディレクトリに配置する必要があります。
これは、 usersテーブルへのアクセスを提供するモデルのようになります。

 <?php class Users extends \Phalcon\Mvc\Model { } 


DB接続


データベース接続を使用し、モデルを介してデータにアクセスできるようにするには、初期化ファイルで接続設定を指定する必要があります。 データベースへの接続は、他のコンポーネントが後で使用できる別のコンポーネントです。

拡張ブートストラップファイル(public / index.php)は次のようになります。

 <?php try { //Register an autoloader $loader = new \Phalcon\Loader(); $loader->registerDirs(array( '../app/controllers/', '../app/models/' ))->register(); //Create a DI $di = new Phalcon\DI\FactoryDefault(); //Set the database service $di->set('db', function(){ return new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "test_db" )); }); //Setting up the view component $di->set('view', function(){ $view = new \Phalcon\Mvc\View(); $view->setViewsDir('../app/views/'); return $view; }); //Handle the request $application = new \Phalcon\Mvc\Application(); $application->setDI($di); echo $application->handle()->getContent(); } catch(\Phalcon\Exception $e) { echo "PhalconException: ", $e->getMessage(); } 

これで、モデルが機能し、アプリケーションの他の部分とやり取りする準備が整いました。

モデルを使用してデータを保存する


次のステップ:フォームからデータを取得し、テーブルに書き込む。
アクション「登録」を追加しましょう。

 <?php class SignupController extends \Phalcon\Mvc\Controller { public function indexAction() { } public function registerAction() { //Request variables from html form $name = $this->request->getPost("name", "string"); $email = $this->request->getPost("email", "email"); $user = new Users(); $user->name = $name; $user->email = $email; //Store and check for errors if ($user->save()) { echo "Thanks for register!"; } else { echo "Sorry, the following problems were generated: "; foreach ($user->getMessages() as $message) { echo $message->getMessage(), "<br/>"; } } } } 


ユーザーから受け取ったデータを信頼することはできません。 アプリケーションに転送されるデータは、 検証/フィルタリングに合格する必要があります 。 これにより、SQLインジェクションと同様の攻撃からアプリケーションがより保護されます。

このアプリケーションでは、入力された名前に「 string 」フィルターを適用し、メールアドレスに「 email 」フィルターを適用して、ユーザーが悪意のある文字を送信していないことを確認します。

Phalcon \ Filterコンポーネントは、依存関係コンテナからgetPostメソッド呼び出しに埋め込まれているため、このタスクを基本にします。

次に、 Usersモデルのインスタンスを作成します。 モデルのパブリックプロパティは、 usersテーブルのフィールドに対応しています。 新しいモデルの値を設定し、 save()メソッドを呼び出すことにより、データベースに書き込みます。 save()メソッドは、記録が成功したかどうかを知らせるブール値を返します。

not nullではnot null (つまり必須)とマークされているフィールドに対して、追加の検証が自動的に行われます。 フォームを送信するときにフィールドを空白のままにすると、ブラウザに次のメッセージが表示されます。

申し訳ありませんが、次の問題が発生しました:名前が必要です
メールが必要です


おわりに


この非常に簡単なレッスンは、Phalcon PHPフレームワークでアプリケーションの開発を開始することがいかに簡単かを示すことを目的としています。 PhalconがCで書かれたPHPの拡張であるという事実は、開発の単純さを否定しません。

Phalconが提供する追加の機会をあなたに提供するマニュアルを引き続き学習してください。

___
*ハヤブサは、世界で最も速い鳥であり、一般的に生き物です。 しかし、公平に言うと、水平飛行の速度では、ハヤブサは迅速に劣ることに注意する価値があります。

Source: https://habr.com/ru/post/J160311/


All Articles