前回のphalcon2のアップデートから期間が開いてしまい、気づけばバージョンが2.0.8にあがっていました。
phalconのドキュメントはこちら
今回は、まずチュートリアルに触れてみたいと思います。
チュートリアルのドキュメントはこちら
ファイル構成
phalconはファイル構成を強制はしません。なぜなら、ドキュメントにもでてきますが
$loader = new \Phalcon\Loader(); $loader->registerDirs(array( '../app/controllers/', '../app/models/' ))->register();
上記のように、loaderに読み込ませることにより利用可能になるからです。
しかし、phalconもMVCモデルです。
tutorial/ app/ controllers/ models/ views/ public/ css/ img/ js/
のような階層にしておくほうが分かりやすくていいと思います。
アクセスした際の流れ
プロジェクト直下にある.htaccessは下のようになっています。
<IfModule mod_rewrite.c> RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule ((?s).*) public/$1 [L] </IfModule>
ご存知の方も多いとは思いますが、アクセスあったら配下ディレクトリpublicに投げますよ~~って感じです。
その配下のpublicディレクトリの.htaccessは
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L] </IfModule>
となっており、最後の[RewriteRule ^((?s).*)$ index.php?_url=/$1]部分で、publicディレクトリのindex.phpに渡しますって感じです。
ただ、サイト作成時にapacheでDocumentRootを指定すると思いますが
DocumentRoot "(サーバー公開ディレクトリパス)/(プロジェクト名)/public"
としておくことが無難です。
Bootstrap
ここでのBootstrapはcssフレームワークのBootstrapではありません。
publicディレクトリの.htaccessによりアクセスがあった際のURLがindex.phpに入りurl解析がフレームワークにより行われどのコントローラが読み込まれ、どのactionを動かすかが決まります。
チュートリアルを見ていただければと思いますがindex.phpにはloaderのほか、必要な設定を行います。
ここで重要なものが、Phalcon\ DI です。これにphalconにある数多くのコンポーネントを利用したい分だけサービス登録していきます。これにより、phalcon内で様々な機能が使えるようになります。
phalconはMVCモデル
コントローラ(Controller)、ビュー(View)、モデル(model)が必要です。
コントローラ(Controller)
デフォルトでは、Phalcon は、”Index” という名称のコントローラを探します。
チュートリアルにも記載はありますが
<?php class IndexController extends \Phalcon\Mvc\Controller { public function indexAction() { echo "<h1>Hello!</h1>"; } }
が基本形です。
アプリケーションにアクセスがあった際にURLから、コントローラは何を利用するか、アクションは何を呼び出すかが決められます。基本形は「(ドメイン)/コントローラ名/アクション名」になります。コントローラの中の該当するアクションを探しだし、その中にある処理が実行されます。
そして、ドメインのみの場合はindexを探すのでIndexController のindexActionを探して処理が行われます。
話はそれますが、Phalcon\Mvc\Router を利用することによりURLとコントローラ、アクション制御は可能です。
簡単にソースを記載します。(詳しくは後日)
<?php use Phalcon\Mvc\Router; // Create the router $router = new \Phalcon\Mvc\Router(); $router->add("/",array("controller" => "index", "action" => "index",)); $router->add("/mypage",array("controller" => "index", "action" => "mypege",)); return $router;
話はそれましたが、画面に「Hello!」が表示されていると思います。
但し、MVCモデルの考えから行くとこの表記の仕方はスマートではありません。
ビュー(View)
画面表示はviewを使いましょう。
phalconにはデフォルトにあるとおり「app/views/index/index.phtml」と.phtmlが利用されますが、Voltというテンプレートエンジンも搭載されています。
voltに関するドキュメントはこちら
但し、voltエンジンを利用する際は注意が必要です。voltではコントローラからの受け渡されたデータ出力すする際に「{{}}」で囲む必要がありますが、Angular.js(https://angularjs.org/)を利用する際に同じ「{{}}」を利用してしまいますので気をつけてください。
voltテンプレートエンジンを利用する際にはindex.phpにあったdiコンテナーの記載を変更・追記する必要があります。
//view $di->set('view', function() use($config){ $view = new View(); $view->setViewsDir(APP_PATH.$config->application->viewsDir); //voltエンジン $view->registerEngines(array('.volt'=>'volt')); return $view; }); //volt $di->set('volt', function($view,$di){ $volt = new VoltEngine($view,$di); $volt->setOptions(array("compiledPath"=>APP_PATH."cache/volt/", 'stat' => true, 'compileAlways' => true)); $compiler = $volt->getCompiler(); return $volt; },true);
IndexControler.phpでechoしていた部分を
<?php class IndexController extends \Phalcon\Mvc\Controller { public function indexAction() { } }
のようにecho部分を消し、
app/views/index/index.phtmlの場合
<?php echo "<h1>Hello!</h1>"; echo Phalcon\Tag::linkTo("signup", "Sign Up Here!");
app/views/index/index.voltの場合
<h1>Hello!</h1> {{ link_to("signup", "Sign Up Here!") }}
といった感じで表示されるのではないでしょうか??
モデル(model)
最後にモデルです。ウェブアプリケーションですから、データベースからデータを取得しごにょごにょやってページとして出力すことが当然です。
まずはテーブルが必要です。
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 ディレクトリに配置してください (app/models/Users.php)
<?php class Users extends \Phalcon\Mvc\Model { }
そして、データベースに接続するために再びindex.phpに記載したdiコンテナーにデータベースに関するコンポーネントを追加します。それがこの部分です。
// データベースサービスのセットアップ $di->set('db', function () { return new \Phalcon\Db\Adapter\Pdo\Mysql(array( "host" => "localhost", "username" => "root", "password" => "secret", "dbname" => "test_db" )); });
モデルの機能については再度記事をアップします。が、この辺のドキュメントが参考になります。こちら