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!と表示されました。
▼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()
{
}
}
▼ビューを使わなかったときとまったく同じように表示されました。
サインアップフォームの追加
サインアップフォームへのリンクを追加します。
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ソース
URLとコントローラ名が対応するため、http://localhost:8000/tutorial/signupにアクセスすると、Signupコントローラが実行されます。
▼サインアップフォーム
「Register」ボタンを押すと、以下のようなエラーが表示されます。なお、URLのsignup/register
がSignupコントローラのregisterアクションに対応します。
以下のように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