Phalconのチュートリアル(チュートリアル 1)をやってみる

今日は、Phalconの公式のチュートリアルをやってみます。

仮想マシンの構築

Phalconを実行できる環境をVagrantを使い構築します。詳細は、「Phalconの開発環境をvagrant-centos6-phpを使い構築する」を参照してください。

$ mkdir phalcon-tutorial
$ cd phalcon-tutorial/
$ git clone https://github.com/kenjis/vagrant-centos6-php.git

vagrant-centos6-php/Vagrantfileを変更します。

--- a/Vagrantfile
+++ b/Vagrantfile
@@ -94,7 +94,7 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
      # Framework of your choice
      #chef.add_recipe "codeigniter"
      #chef.add_recipe "fuelphp"
-     #chef.add_recipe "phalcon"
+     chef.add_recipe "phalcon"

      #chef.add_recipe "yum-update"

仮想マシンを構築します。

$ cd vagrant-centos6-php/
$ vagrant up

フォルダの作成

まず、プロジェクトのためのフォルダを作成します。

このチュートリアルでは、Web公開領域にプロジェクトファイルを配置するようになっています。

つまり、以下のようなフォルダ構成になります。

phalcon-tutorial/
├── public ... Web公開領域
│   └── tutorial ... チュートリアルのプロジェクト
│       ├── app
│       │   ├── controllers
│       │   ├── models
│       │   └── views
│       └── public
│           ├── css
│           ├── img
│           └── js
└── vagrant-centos6-php

まずpublicフォルダ(Web公開領域)を作成します。

$ cd phalcon-tutorial/
$ mkdir public
$ cd public/

その中にtutorialフォルダを作成します。

mkdir tutorial
mkdir tutorial/app
mkdir tutorial/app/controllers
mkdir tutorial/app/models
mkdir tutorial/app/views
mkdir tutorial/public
mkdir tutorial/public/css
mkdir tutorial/public/img
mkdir tutorial/public/js

mod_rewriteの設定

tutorialフォルダへのアクセスをtutorial/publicへ書き換えます。

tutorial/.htaccess

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

tutorial/public以下へのアクセスをすべてフロントコントローラ(index.php)で受けるように書き換えます。

tutorial/public/.htaccess

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

Bootstrapファイルの作成

フロントコントローラを作成します。

tutorial/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();

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

    //Setup a base URI so that all generated URIs include the "tutorial" folder
    $di->set('url', function(){
        $url = new \Phalcon\Mvc\Url();
        $url->setBaseUri('/tutorial/');
        return $url;
    });

    //Handle the request
    $application = new \Phalcon\Mvc\Application($di);
    echo $application->handle()->getContent();
} catch(\Phalcon\Exception $e) {
    echo "PhalconException: ", $e->getMessage();
}

コントローラの作成

「Hello!」と表示するだけのコントローラを作成します。

app/controllers/IndexController.php

<?php

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

コントローラへのアクセス

http://localhost:8000/tutorial/にアクセスします。

▼Hello!と表示されました。 Hello

▼HTMLソース
HTMLソース

ビューファイルの使用

ビューファイルを作成します。コントローラとメソッド名からフォルダおよびファイル名が自動的に決まります。

app/views/index/index.phtml

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

コントローラのindexAction()メソッドを以下のように空に変更します。

app/controller/IndexController.php

<?php

class IndexController extends \Phalcon\Mvc\Controller
{
    public function indexAction()
    {

    }
}

▼ビューを使わなかったときとまったく同じように表示されました。 Hello

サインアップフォームの追加

サインアップフォームへのリンクを追加します。

app/views/index/index.phtml

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

echo Phalcon\Tag::linkTo("signup", "Sign Up Here!");

コントローラを作成します。

app/controllers/SignupController.php

<?php

class SignupController extends \Phalcon\Mvc\Controller
{
    public function indexAction()
    {

    }
}

ビューを作成します。

app/views/signup/index.phtml

<?php use Phalcon\Tag; ?>

<h2>Sign up 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="email">E-Mail</label>
    <?php echo Tag::textField("email") ?>
 </p>

 <p>
    <?php echo Tag::submitButton("Register") ?>
 </p>

</form>

▼リンクが追加されました。 サインアップフォームへのリンク

▼HTMLソース
HTMLソース

URLとコントローラ名が対応するため、http://localhost:8000/tutorial/signupにアクセスすると、Signupコントローラが実行されます。

▼サインアップフォーム サインアップフォーム

「Register」ボタンを押すと、以下のようなエラーが表示されます。なお、URLのsignup/registerがSignupコントローラのregisterアクションに対応します。

Hello

以下のようにregisterAction()メソッドを追加するとエラーは出なくなり、白紙のページが表示されるようになります。

<?php

class SignupController extends \Phalcon\Mvc\Controller
{
    public function indexAction()
    {

    }

    public function registerAction()
    {

    }
}

モデルの作成

mysqlコマンドかphpMyAdminで、データベースにテーブルを作成します。開発環境に用意されているphp_devデータベースを使います。

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

モデルを作成します。PhalconでのモデルとはPhalconのORM(Active Record)のことです。

ファイル名がテーブル名に対応します。

app/models/Users.php

<?php

class Users extends \Phalcon\Mvc\Model
{

}

データベース接続の設定

Bootstrapファイルでデータベースサービスの登録を追加します。

--- a/public/tutorial/public/index.php
+++ b/public/tutorial/public/index.php
@@ -11,6 +11,16 @@ try {
     //Create a DI
     $di = new Phalcon\DI\FactoryDefault();

+    //Setup the database service
+    $di->set('db', function(){
+        return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
+            "host"     => "localhost",
+            "username" => "root",
+            "password" => "root",
+            "dbname"   => "php_dev"
+        ));
+    });
+
     //Setup the view component
     $di->set('view', function(){
         $view = new \Phalcon\Mvc\View();

モデルを使用したデータの保存

コントローラのregisterAction()メソッドにデータを保存するコードを追加します。

--- a/public/tutorial/app/controllers/SignupController.php
+++ b/public/tutorial/app/controllers/SignupController.php
@@ -9,6 +9,20 @@ class SignupController extends \Phalcon\Mvc\Controller

     public function registerAction()
     {
+        $user = new Users();

+        //Store and check for errors
+        $success = $user->save($this->request->getPost(), array('name', 'email'));
+
+        if ($success) {
+            echo "Thanks for registering!";
+        } else {
+            echo "Sorry, the following problems were generated: ";
+            foreach ($user->getMessages() as $message) {
+                echo $message->getMessage(), "<br/>";
+            }
+        }
+
+        $this->view->disable();
     }
 }

最後の$this->view->disable()は、ビューを無効化するメソッドです。これがないと、app/views/signup/register.phtmlが存在する場合、自動的に表示されてしまいます。CakePHPっぽい作りですね。

テーブルにNOT NULL制約が付いてますので、入力せずに登録しようとすると、バリデーションエラーになります。

▼登録エラー
登録エラー

登録完了すると以下のページが表示されます。

▼登録完了
登録完了

mysqlコマンドやphpMyAdminを使うと、ユーザが登録されていることがわかります。

ということで、Phalconの雰囲気がわかるチュートリアルでした。

関連

Date: 2014/12/15

Tags: phalcon, database