こんにちは。ファガイです。
本日はPhalcon PHPというPHPフレームワークを触ってみます。
Phalconとは?
Phalconは一番高速なPHPフレームワークです。
内部がC言語で書かれており、PHP Moduleとして動作します。
そりゃあ早いよね。
導入
導入ですが、前提としてサーバーをいじれる環境でなければいけません。
つまり、共有サーバー等ではPhalconを入れることは無理です。(まずモジュールを追加出来ない)
その点を理解した上でやっていきます。
ダウンロードや、先に必要な物は以下のURLに書いてあります。yum等でのインストールは先にやっておいてださい。
phalconphp download
主の環境
- CentOS 6.4
- Apache 2.2くらい?
- MySQL 5.5くらい?
です。
では、cloneして、
# git clone git://github.com/phalcom/cphalcon.git
移動して、インストール
cd cphalcon/build
./install
自分の場合はここでエラーが出ました。私はチュートリアルを見ていたのでlibtoolというものが欠けてました。どうやらチュートリアルは更新がしっかりとされてなかったようです。
ちょっと困ったことも有りましたが、コンプリート。
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/lib/php/modules/
Thanks for compiling Phalcon!
Build succeed: Please restart your web server to complete the installation
終わったので、php.iniに
extension=phalcon.so
を追加しました。
apacheを再起動しておきます。
service httpd restart
ちゃんとextensionがロードされているか確認します。
<?php
print_r(get_loaded_extensions());
・・・!?
無い・・・・
なので、試しに
/etc/php.d/phalcon.ini
を作り、その中でextensionを指定し、restart。
入っているのを確認。
tutorial
公式のチュートリアルがあるようなので、それに沿っていきます。
チュートリアルを取ってきます。(自分はここで/var/www/htmlにクローンしてます)
git clone https://github.com/phalcon/tutorial.git
ディレクトリ構造はこんな感じですね。
tutorial/
app/
controllers/
models/
views/
public/
css/
img/
js/
まずは、tutorialの中にある.httaccessを見ます
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule^$ public/[L]
RewriteRule(.*) public/$1 [L]
</IfModule>
どうやら、ここではpublicを見るというルーティングがされているようですね
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/hogeにアクセスしようとすると、/public/index.php?_url=hogeにルーティングがされているようです。
publicの中にあるindex.phpを見ていきます。
falconのloaderクラスをインスタンスとして作り、ディレクトリの登録をしていますね。
//Register an autoloader
$loader = new \Phalcon\Loader();
$loader->registerDirs(
array(
'../app/controllers/',
'../app/models/'
)
)->register();
次にDBの設定のようです。
//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"
));
});
diが何の略なんでしょうか、Database I・・・なんだろう。
FactoryDefaultと書いているので、DefaultのDB設定でしょう。
次にviewの設定ですね。ここでMVCであることが分かります。
//Setting up the view component
$di->set('view', function(){
$view = new \Phalcon\Mvc\View();
$view->setViewsDir('../app/views/');
return $view;
});
どうやらDIの略は間違ってたようです。気になり始めたので調べる。どうやら、Dependency Injectionの略らしい。デザインパターンに基づいて作られたコンポーネント群を集中管理するらしい。
viewに関しては何もいうことはないですね。
最後にApplicationを生成していますね。
//Handle the request
$application = new \Phalcon\Mvc\Application();
$application->setDI($di);
echo $application->handle()->getContent();
といったところでしょうか。
コントローラーを作成
ではコントローラーを見て行きましょう。app/IndexController.phpを見ます。(どうやらファイル名はUpperCamelCaseのようですね。)
<?php
class IndexController extends Phalcon\Mvc\Controller
{
public function indexAction()
{
}
}
どうやら、Controller名とファイル名は同じ形式で書くようですね。
アクションは語尾にActionを付けるようです。
それでは、indexActionの部分に
echo "<h1>Hello!</h1>";
を書いてみます。
で、表示。
チュートリアルと違って、Sign Up Here!というものが出てました。
Viewに書いているのでしょうか。結局、アクセスしても404でしたが。
viewに分ける際には、viewsの中にindexフォルダを作り、その中でアクション名.phtmlとすれば良いようです。
どうやら、先程Sign UP Here!が出たと思うのですが、これはチュートリアルのファイルを使っているとviewsの中に既にファイルがあったため、こちらが呼ばれたのでしょう。(確認したい方は確認して下さい。)
後は順にやっていけばいい感じですね。
ただ気になったのがURLの部分ですね。
htmlフォルダ内tutorialフォルダを置いていたのですが、どうやらリンクのタグはrootから取る仕様っぽいです。なのでSign Up Here!に飛ぶことが出来なかったわけですね。
では、バーチャルホスト等の指定が必要ですね。
余談
どうやらdiに設定をすることでURLのベース値を変えれました!
//URL settings
$di->set('url', function(){
$url = new Phalcon\Mvc\Url();
$url->setBaseUri('/tutorial/');
return $url;
});
自分はこれをhandle the requestの上に記述しました。
tutorialの所を変えればベースのURLの名前が変えられます。
とこんな感じですね。
まとめ
- このチュートリアルだけではちょっとわからないかも
- どうやらdeveloper toolsというものが公式に存在するようで、これを使うことでコード補完やFuelPHPのようにコマンドライン上でmigrationを作ったり出来る。
- FuelPHPと違うのはGUIベースも通常で搭載されているということ。(Fuelにも一応adminはありますが、Fuelより高機能な気がします)
次回があればdeveloper toolsの入れ方について書きます。
コメント
$di->set(‘url’,…); のところ、どうやったら設定できるのかわからず探していました。ありがとうございます!
サイト参考にさせていただきました!ありがとうございます。
どうでもいい話ではあるのですが、DIですがDependency Injectionの略と思います。
ではでは、失礼しました。