phalcon チュートリアルについて


前回の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"
        ));
    });

モデルの機能については再度記事をアップします。が、この辺のドキュメントが参考になります。こちら


投稿日: 2015年9月29日
カテゴリー: phalcon|php | 投稿者: