Phalcon 2.0.4リリース

3〜5週間のマイナーリリーススケジュールの一環として、Phalcon 2.0.4がリリースされたことをお知らせいたします。

改善と修正の数は、他の2.0.xリリースと比較して大幅に増加しています。

変更点



ハイライト


ORMの型付きプレースホルダー


このバージョンより前は、 PHQLでは標準のプレースホルダー(文字列と数値)のみがサポートされていました 。 SQLインジェクションを回避するためにパラメーターをバインドできました。

 $phql = "SELECT * FROM Store\Robots WHERE id > :id:"; $robots = $this->modelsManager->executeQuery($phql, ['id' => 100]); 

ただし、一部のDBMSでは、タイプの指定など、プレースホルダーを使用するときに追加のアクションが必要です。

 use Phalcon\Db\Column; // ... $phql = "SELECT * FROM Store\Robots LIMIT :number:"; $robots = $this->modelsManager->executeQuery( $phql, ['number' => 10], Column::BIND_PARAM_INT ); 

このタスクを容易にするために、Phalcon 2.0.4では、以前とまったく同じように機能するが、タイプを指定できるタイプ付きプレースホルダーを導入しています。

 $phql = "SELECT * FROM Store\Robots LIMIT {number:int}"; $robots = $this->modelsManager->executeQuery( $phql, ['number' => 10] ); $phql = "SELECT * FROM Store\Robots WHERE name <> {name:str}"; $robots = $this->modelsManager->executeQuery( $phql, ['name' => $name] ); 

次の必要がない場合は、タイプの指示を省略することもできます。

 $phql = "SELECT * FROM Store\Robots WHERE name <> {name}"; $robots = $this->modelsManager->executeQuery( $phql, ['name' => $name] ); 

型付きプレースホルダーもより機能的です。これは、各要素をプレースホルダーとして個別に渡す必要なく静的配列をバインドできるようになったためです。

 $phql = "SELECT * FROM Store\Robots WHERE id IN ({ids:array})"; $robots = $this->modelsManager->executeQuery( $phql, ['ids' => [1, 2, 3, 4]] ); 

次のタイプが利用可能です。
種類型定数
strColumn::BIND_PARAM_STR{name:str}
intColumn::BIND_PARAM_INT{number:int}
ダブルColumn::BIND_PARAM_DECIMAL{price:double}
ブールColumn::BIND_PARAM_BOOL{enabled:bool}
ブロブColumn::BIND_PARAM_BLOB{image:blob}
ヌルColumn::BIND_PARAM_NULL{exists:null}
配列Column::BIND_PARAM_STR配列Column::BIND_PARAM_STR{codes:array}
array-strColumn::BIND_PARAM_STR配列Column::BIND_PARAM_STR{names:array}
配列整数Column::BIND_PARAM_INT配列Column::BIND_PARAM_INT{flags:array}

バインドされたパラメーターの検証

デフォルトでは、プレースホルダーに関連付けられたパラメーターは型の指示をサポートしていませんでしたが、PDOを使用する前にパラメーターの型を確認できるようになりました。

問題が発生する典型的な状況は、 LIMIT / OFFSETプレースホルダーに文字列を渡すことです。

 $number = '100'; $robots = $modelsManager->executeQuery( 'SELECT * FROM Some\Robots LIMIT {number:int}', ['number' => $number] ); 

このようなコードは、次の例外をスローします。

 Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''100'' at line 1' in /Users/scott/demo.php:78 

これは、100が文字列変数であるためです。 簡単に修正できます。型をintにキャストするだけです。

 $number = '100'; $robots = $modelsManager->executeQuery( 'SELECT * FROM Some\Robots LIMIT {number:int}', ['number' => (int) $number] ); 

ただし、このソリューションでは、型を扱うために開発者の特別な注意が必要です。 物事を簡単にし、予期しない例外を避けるために、Phalconに仕事をしてもらうことができます:

 \Phalcon\Db::setup(['forceCasting' => true]); 

次のアクションは、指定されたタイプのバインディングに従って実行されます。

種類アクション
Column::BIND_PARAM_STRネイティブタイプのPHP文字列として値を渡す
Column::BIND_PARAM_INTPHP整数のネイティブタイプとして値を渡す
Column::BIND_PARAM_BOOLネイティブPHP型のブール値として値を渡す
Column::BIND_PARAM_DECIMALPHP doubleのネイティブタイプとして値を渡す

PDOから受け取った値の型変換

システムデータベースから返される値は、値が列の数値または論理データ型に属するかどうかに関係なく、常にPDOを介して文字列値として渡されます。 これは、サイズの制限により、一部の列タイプがネイティブPHPタイプを使用して表現できないためです。

たとえば、MySQLのBIGINT型の値は、PHPで32ビット整数として表現できない大きな整数を格納できます。 このため、PDOとORMはデフォルトで安全なソリューションを選択し、すべての値を文字列のままにします。

ただし、一部の開発者はこれを予期せず不便に感じるかもしれません。 Phalconバージョン2.0.4以降、OPMを設定して、安全であれば、適切なPHPプリミティブに型を自動的にキャストできます。

 \Phalcon\Mvc\Model::setup(['castOnHydrate' => true]); 

したがって、厳密な比較演算子を使用したり、変数のタイプについて仮定したりできます。

 $robot = Robots::findFirst(); if ($robot->id === 11) { echo $robot->name; } 

条件文との関係

2.0.4では、条件ステートメントに基づいて関係を作成できます。 Phalconが残りを処理します:)

 // Companies have invoices issued to them (paid/unpaid) // Invoices model class Invoices extends Phalcon\Mvc\Model { public function getSource() { return 'invoices'; } } // Companies model class Companies extends Phalcon\Mvc\Model { public function getSource() { return 'companies'; } public function initialize() { // All invoices relationship $this->hasMany( 'id', 'Invoices', 'inv_id', [ 'alias' => 'invoices', 'reusable' => true, ] ); // Paid invoices relationship $this->hasMany( 'id', 'Invoices', 'inv_id', [ 'alias' => 'invoicesPaid', 'reusable' => true, 'params' => [ 'conditions' => "inv_status = 'paid'" ] ] ); // Unpaid invoices relationship $this->hasMany( 'id', 'Invoices', 'inv_id', [ 'alias' => 'invoicesUnpaid', 'reusable' => true, 'params' => [ 'conditions' => "inv_status <> 'paid'" ] ] ); } } 

アップデート/インストール


このバージョンは、masterブランチからインストールできます。 Zephirがインストールされていない場合は、次のコマンドを実行します。

 git clone http://github.com/phalcon/cphalcon git checkout master cd ext sudo ./install 

Zephirが既にインストールされている場合:

 git clone http://github.com/phalcon/cphalcon git checkout master zephir fullclean zephir build 

インストールスクリプトを実行すると、既にインストールされているPhalconのバージョンが置き換えられることに注意してください。

Windows DLLは、ダウンロードページから入手できます

1.3.xからPhalcon 2.0.xにアップグレードする場合は、アップグレードガイドを参照してください。

Source: https://habr.com/ru/post/J262007/


All Articles