Closed5

🕊 Phalcon(PHPフレームワーク)キャッチアップ

Haruya IzumiHaruya Izumi

Phalconについて

  • アクセス制御リストがある

ロールは、リソースへのアクセスを要求するオブジェクトであり、ACLの仕組みによってアクセスを許可したり拒否したりすることができる

Phalcon公式ドキュメント:ACL


  • アノテーションが存在する

Phalcon公式ドキュメント:Annotations Parser


  • PhalconはMVC構成になっている
    • コンポーネントを使用すると、様々なタイプのMVC構造を実行することができる
// シングルモジュール
use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;

// マルチモジュール
use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Dispatcher;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
// マルチモジュールの場合
// 複数のモジュールで同じドキュメントルートを使用する
// 特別なブートストラップファイルが必要っぽい

ときPhalcon \ MVC \アプリケーションが登録されたモジュールを持って、常にすべての一致したルートが有効なモジュールを返すことが必要です。登録された各モジュールには、モジュール自体をセットアップする機能を提供する関連クラスがあります。各モジュールクラス定義は、registerAutoloaders()およびregisterServices()という2つのメソッドを実装する必要があります。これらは、実行されるモジュールに応じて、Phalcon \ Mvc \ Applicationによって呼び出されます。引用:公式ドキュメント

Phalcon公式ドキュメント:MVC Applications


  • キャッシュによるパフォーマンスの向上
    • 基本的には各種細かく設定するよりもPhalconに任せたほうが早い
    • 一応、自身で設定して動かすことができる

Phalcon公式ドキュメント:キャッシュによるパフォーマンスの向上


  • cronジョブ、スクリプト、コマンドユーティリティなどを作成するのに便利な機能がある
    • モジュール読み込んでロジック書くだけっぽい

Phalcon公式ドキュメント:コマンドラインアプリケーション


  • Phalconでのコントローラの扱い(多分めっちゃ大事)
    • 基本的にはデフォルトの動きがある
    • リダイレクト先やif``elseなどで分岐したい時になどは詳しく設定できる

Phalcon公式ドキュメント:Using Controllers


  • Cookieの詳細な設定ができる

Phalcon公式ドキュメント:Cookies Management


  • 暗号化機能がある
    • コンポーネントはAES-256-CFBを使用した安全な暗号化を提供している

Phalcon公式ドキュメント:Encryption/Decryption


  • 従来のPHPのモデルよりも抽象レイヤーのデータベース操作ができる
    • 公式ドキュメントにはMySQL, Postgresql, Sqliteのサンプルコードがある
    • 独自のデータベースアダプタも設定できる

Phalcon公式ドキュメント:データベース抽象化層


  • DI(依存性インジェクション)がある

Phalcon公式ドキュメント:依存性インジェクション/サービスの場所

Phalcon公式ドキュメント:依存性注入の説明


  • コントローラーをインスタンス化し、コントローラーに対して必要なアクションを実行するコンポーネントすることができる
    • より詳細な設定をできる.くらいの解釈

Phalcon公式ドキュメント:Dispatching Controllers


  • いろいろな種類のテキストをエスケープすることができる

Phalcon公式ドキュメント:Contextual Escaping

Haruya IzumiHaruya Izumi

補足

環境構築に関しては、そもそもローカル環境で作成しようとするとPHPのバージョンが古すぎて適用できない
おそらく dockerで環境構築する のが無難である

Haruya IzumiHaruya Izumi

PHPフレームワーク Phalcon Youtube

https://www.youtube.com/watch?v=KcKX0PL6qX0

Phalconについて

  • 高速だから開発がしやすい
    • 理由は、フレームワーク自体がC言語で実装されているため
  • 多くのリクエストを受けられるように設計されている
  • メモリ使用量も少ない

動作環境

  • Vagrantdockerなどの仮想環境を使用する

より詳しくPhalconを知る

  • Controller
    • indexAction()などのActionをつけなければならない
    • Phalconでは、コンストラクタの宣言はなく、代わりにInitialize()を呼ぶ
class User extends \Phalcon\Mvc\Model {
  public function initialize() {
  $this->setSource(`users`);
}
}

// 以下のようにテーブル名は複数名にしてクラス名で扱う名称を変更する方法もある 
$this->setSource(`users`);
  • Model
    • モデルはDBと1対1の関係になっている
    • 記述方法は以下...
// tag_dbというテーブルがあったとして...
// 以下のようにTagDbと記述する
class TagDb extends \Phalcon\Mvc\Model {
}
  • PHQL

    • Phalconでは仮想的なSQLを扱うことができるPHQLというものがある
    • 普通のクエリも扱えるけど、クエリビルダを扱ったほうが簡単に扱える

      これはspring bootのJPAみたいなイメージか...

    • クエリビルダは、Railsっぽい感じで、メソッドチェーンでSQL文を発行できる
  • Volt

    • Phalconの特徴的なテンプレートエンジン
    • PythonJinja2というテンプレートエンジンを参考に作成された
    • Voltの有効化が必要
    • 使用される理由は高速であるから
  • ControllerやModel以外でDIを取得したい場合

    • DIを他からも呼び出すこともできる

特徴

  • Phalconだけでは高速化されない、DBの最適化やキャッシュの管理をすることで高速化できる
  • 日本語ドキュメントない問題は、プロジェクトに参加したりとか..
    • 今だと公式ドキュメントは一部日本語化に適用している
    • 公式ドキュメントっぽいものは全て日本語化しているのでそれだけで十分っぽい
  • テストはPHPUnitを使用する
  • PhalconのDIの機能をうまく使用するのが大事

障害

  • モデルとDBが1対1だからこそ、機能拡張が難しい
  • より拡大する案件などでは以下のような階層にする
    • 複雑なコードを管理しやすくなる
    • ロジックや受け渡しなど明確に分かれているのでコードの見通しが良くなる
// 従来 or 小規模
Controller > Model

// 拡張フェーズ
Controller > Service > Model
Haruya IzumiHaruya Izumi

Phalcon 公式ドキュメント MVCチュートリアル

  • Phalconのファイル構成
.
└── tutorial
    ├── app
    │   ├── controllers
    │   │   ├── IndexController.php
    │   │   └── SignupController.php
    │   ├── models
    │   │   └── Users.php
    │   └── views
    └── public
        ├── css
        ├── img
        ├── index.php
        └── js
  • bootstrap
    • オートローダーコンポーネントの登録
    • サービスの設定とDependency Injectionへの登録
    • アプリケーションのHTTPリクエストの処理
  • index.htmlの初期設定
<?php

use Phalcon\Loader;
use Phalcon\Mvc\View;
use Phalcon\Mvc\Application;
use Phalcon\Di\FactoryDefault;
use Phalcon\Mvc\Url as UrlProvider;

// リソースの特定に役立つ絶対パス定数を定義する
define('BASE_PATH', dirname(__DIR__));
define('APP_PATH', BASE_PATH . '/app');

// オートローダーの登録
$loader = new Loader();

$loader->registerDirs(
    [
        APP_PATH . '/controllers/',
        APP_PATH . '/models/',
    ]
);

$loader->register();

// DIの生成
$di = new FactoryDefault();

// ビューコンポーネントの設定
$di->set(
    'view',
    function () {
        $view = new View();
        $view->setViewsDir(APP_PATH . '/views/');
        return $view;
    }
);

// ベースURIの設定
$di->set(
    'url',
    function () {
        $url = new UrlProvider();
        $url->setBaseUri('/');
        return $url;
    }
);

$application = new Application($di);

try {
    // リクエストのハンドリング
    $response = $application->handle();

    $response->send();
} catch (\Exception $e) {
    echo 'Exception: ', $e->getMessage();
}
  • Controllerの作成
    • デフォルトでは、PhalconはIndexControllerという名前のコントローラを探す.
    • コントローラクラスの後ろには、Controllerが必要である
    • アクションの後にはActionをつける必要がある
<?php

use Phalcon\Mvc\Controller;

class IndexController extends Controller
{
    public function indexAction()
    {
        echo '<h1>Hello!</h1>';
    }
}
  • Viewに出力する
    • Phalconは、最後に実行されたコントローラーと同じ名前のディレクトリー配下にある、最後に実行されたアクションと同じ名前のビューを探す

    今回の場合は (app/views/index/index.phtml)

<?php echo "<h1>Hello!</h1>";
  • サインアップフォームのデザイン
<?php

echo "<h1>Hello!</h1>";

// 以下のコードは改行の時に使用する
echo PHP_EOL;

echo PHP_EOL;

echo $this->tag->linkTo(
    'signup',
    'Sign Up Here!'
);

PHP_EQLについて

上記の生成されたHTMLコードでは、新しいコントローラにリンクする<a>タグを表示する
上記のコードは以下のようになる

<h1>Hello!</h1>

<a href="/signup">Sign Up Here!</a>
  • SignControllerを作成する
use Phalcon\Mvc\Controller;

class SignupController extends Controller
{
    public function indexAction()
    {

    }
}
  • app/views/signup/index.phtml フォーム作成
<h2>Sign up using this form</h2>

<?php echo $this->tag->form("signup/register"); ?>

    <p>
        <label for="name">Name</label>
        <?php echo $this->tag->textField("name"); ?>
    </p>

    <p>
        <label for="email">E-Mail</label>
        <?php echo $this->tag->textField("email"); ?>
    </p>

    <p>
        <?php echo $this->tag->submitButton("Register"); ?>
    </p>

</form>
このスクラップは2022/09/05にクローズされました