「最速」PHPフレームワークPhalconのモデルについて、基本事項をまとめます。この記事では、Phalconのモデルの動作確認を行うための環境構築方法について紹介します。記事執筆時のPhalconのバージョンは1.3.1です。

前提条件:VirtualBox及びVagrantをインストール済みとします(私の手元の環境はVirtualBox 4.3.10、Vagrant 1.5.2です)。

(0) Phalconセットアップ済みのVagrant Boxを導入

vagrant init phalconbox https://s3-eu-west-1.amazonaws.com/phalcon/phalcon125-apache2-php54-mysql55.box
vagrant up
vagrant ssh

なお、このboxのPhalconのバージョンは1.2.5。最新版の1.3.1を使いたい場合は、以下の手順を実行。

git clone git://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install

(1) Phalcon DevToolsの導入

mkdir ~/bin
cd ~/bin
sudo apt-get install curl
curl -s http://getcomposer.org/installer | php
php composer.phar require phalcon/devtools dev-master
sudo ln -s /home/vagrant/bin/vendor/bin/phalcon.php /usr/bin/phalcon
sudo chmod ugo+x /usr/bin/phalcon

以下の一文の入ったファイルを作成して、/etc/php5/mods-available にphalcon.iniとして保存。

extension=phalcon.so

「sudo php5enmod phalcon」でPhalconを有効化。

「phalcon」コマンドを実行して、以下のように表示されればOK。

$ phalcon

Phalcon DevTools (1.3.1)

Available commands:
  commands (alias of: list, enumerate)
  controller (alias of: create-controller)
  model (alias of: create-model)
  all-models (alias of: create-all-models)
  project (alias of: create-project)
  scaffold
  migration
  webtools

(2) テスト用のデータベースとテーブルを作成

mysql -u root -ppass -e 'CREATE DATABASE model_practice'

以下のSQL文を create_table_robots.sql として保存し、「mysql -u root -ppass model_practice < create_table_robots.sql」を実行。

CREATE TABLE `robots` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `type` varchar(255) NOT NULL,
  `year` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
);

(3) テストデータをINSERT

以下のSQL文を insert_into_robots.sql として保存し、「mysql -u root -ppass model_practice < insert_into_robots.sql」を実行。

INSERT INTO robots (name, type, year) VALUES ('Robotina', 'mecanical', 1972);
INSERT INTO robots (name, type, year) VALUES ('Astro Boy', 'mecanical', 1952);
INSERT INTO robots (name, type, year) VALUES ('Terminator', 'cyborg', 2029);
INSERT INTO robots (name, type, year) VALUES ('VT', 'virtual', 2002);
INSERT INTO robots (name, type, year) VALUES ('AK-966', 'virtual', 1999);

「mysql -u root -ppass model_practice -e 'SELECT * FROM robots'」を実行して、上でINSERTしたデータが表示されればOK。

(4) テスト用プロジェクトを作成

cd /var/www
phalcon project model_practice
cd model_practice

(5) テスト用プロジェクトのDB設定

app/config/config.php を編集。
<?php

return new \Phalcon\Config(array(
    'database' => array(
        'adapter'     => 'Mysql',
        'host'        => 'localhost',
        'username'    => 'root',
        'password'    => 'pass',
        'dbname'      => 'model_practice',
    ),
    'application' => array(
        'controllersDir' => __DIR__ . '/../../app/controllers/',
        'modelsDir'      => __DIR__ . '/../../app/models/',
        'viewsDir'       => __DIR__ . '/../../app/views/',
        'pluginsDir'     => __DIR__ . '/../../app/plugins/',
        'libraryDir'     => __DIR__ . '/../../app/library/',
        'cacheDir'       => __DIR__ . '/../../app/cache/',
        'baseUri'        => '/model_practice/',
    )
));

(6) モデルの生成

phalcon model robots

app/models の下に以下のような内容の Robots.php が生成されるはず。

<?php

class Robots extends \Phalcon\Mvc\Model
{

    /**
     *
     * @var integer
     */
    public $id;

    /**
     *
     * @var string
     */
    public $name;

    /**
     *
     * @var string
     */
    public $type;

    /**
     *
     * @var integer
     */
    public $year;

    /**
     * Independent Column Mapping.
     */
    public function columnMap()
    {
        return array(
            'id' => 'id',
            'name' => 'name',
            'type' => 'type',
            'year' => 'year'
        );
    }

}

(7) 動作確認

public/index.phpの27行目(echoの行)をコメントアウト。これで、ブラウザ向けの出力をしなくなる。

<?php

error_reporting(E_ALL);

try {

    /**
     * Read the configuration
     */
    $config = include __DIR__ . "/../app/config/config.php";

    /**
     * Read auto-loader
     */
    include __DIR__ . "/../app/config/loader.php";

    /**
     * Read services
     */
    include __DIR__ . "/../app/config/services.php";

    /**
     * Handle the request
     */
    $application = new \Phalcon\Mvc\Application($di);

//    echo $application->handle()->getContent();

} catch (\Exception $e) {
    echo $e->getMessage();
}

以下の内容でmodel_practice.phpを作成

<?php

require_once __DIR__ . '/public/index.php';

$robots = Robots::find();
foreach ($robots as $robot) {
    echo $robot->name, PHP_EOL;
}

「php model_practice.php」を実行して、ロボットの名前が表示されればOK。