改善と修正の数は、他の2.0.xリリースと比較して大幅に増加しています。
変更点
-  
Phalcon\Mvc\Model::update()
でバグが修正され、レコードが実際に存在する場合に例外をPhalcon\Mvc\Model::update()
します -   
Phalcon\Debug
リンクは、 http:Phalcon\Debug
ではなくhttps://api.phalconphp.comをポイントしています。 - 変数をVoltに割り当てる汎用メソッドが実装され、変数とインデックスの配列を割り当てることができます
 - Voltのマクロは、オブジェクトアダプターとDIサービスを一緒にバインドできる匿名関数を使用して改善されました。
 - ボルトマクロの標準パラメーターの生成と検証を修正
 -  追加されたメソッド
Phalcon\Assets\Manager::getCollections()
は登録されたすべてのコレクションPhalcon\Assets\Manager::getCollections()
返します#2488 -   
Phalcon\Mvc\Url::getStatic()
はルーティングからURLを生成します -   
Phalcon\Mvc\Model
およびPhalcon\Mvc\Collection
一般的な抽象化のためにPhalcon\Mvc\EntityInterface
追加されました。 このインターフェイスは、Mvc\Collection
で使用するMvc\Model\Validators
をサポートします -  セッション名を変更するメソッド
Phalcon\Session\Adapter::setName()
が追加されました -   
Phalcon\Db
BIGINT
列のサポートを追加 -  新しいタイプの
Phalcon\Db\Column::BLOB
およびPhalcon\Db\Column::DOUBLE
#10506が追加されました - ORMでのラージオブジェクトデータ(LOB)の自動バインド
 -  バインディングを
boolean
として使用するMySQLタイプBIT
サポート -  テンプレートの特定の場所にフラッシュメッセージを配置できる
Phalcon\Flash\Direct::output()
メソッドが追加されました#629 -  任意のVoltテンプレートで自動エスケープをグローバルに有効にできる
autoescape
オプションを追加 -   
readAttribute
/writeAttribute
をPhalcon\Mvc\Collection\Document
追加しました -   
Phalcon\Mvc\Collection\Document
toArray
を追加 -  グローバルパラメータ
db.force_casting
により、指定したタイプの変換を強制できるようになりました -   PHQLに新しい構文が導入され、タイプを設定できるようになりました: 
{name:str}
または{names:array}
 - PHQLでパラメーターとして配列を操作できるようになりました
 -  グローバルパラメータ
orm.cast_on_hydrate
使用orm.cast_on_hydrate
と、行を使用する代わりに、関連付けられたテーブルの元のタイプの属性を指定できorm.cast_on_hydrate
 -   
LIMIT
/OFFSET
値は、PHQLのバインドされたパラメーターを介して追加できるようになりました -   
Mvc\Model::cloneResultMap
をオーバーライドするためのSimple / Complex結果の遅延静的バインディングのサポート -   
distinct()
メソッドがPhalcon\Mvc\Model\Criteria
#10536に追加されました -   ORMの
orm.ignore_unknown_columns
にない列を無視するグローバルパラメータorm.ignore_unknown_columns
が追加されました。 これにより、Db\Adapter\Pdo\Oracle
使用されていた余分なヘルパー列が削除されDb\Adapter\Pdo\Oracle
 -   
Mvc\Collection
にMvc\Collection
サポートを追加 -   
Mvc\Router\Annotations
から@Route
アノテーションにbeforeMatch
パラメーターを追加 -   
groupBy
/getGroupBy
/having
/getHaving
をMvc\Model\Criteria
追加しました -   
Phalcon\Mvc\Model::count()
がint値を返すようになりました -   
Phalcon\Mvc\View\EngineInterface
から__construct
を削除 -   
Phalcon\Debug\Dump::toJson()
メソッドを追加して、変数情報を含むJSONの値を返す -   
Phalcon\Di
インスタンスは、\ReflectionClass
代わりに内部オプティマイザーを使用して構築されます(PHP 5.6) -   
Phalcon\Mvc\Model\Validator\IP
phalcon/incubator
からPhalcon\Mvc\Model\Validator\IP
をphalcon/incubator
 -   
defaultValue
戻りパラメーターをPhalcon\Mvc\Model\Validator::getOption()
追加しましたPhalcon\Mvc\Model\Validator::getOption()
 - 開発者は条件ステートメントを使用して関係を定義できるようになりました
 
ハイライト
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]] );
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      次のタイプが利用可能です。
| 種類 | 型定数 | 例 | 
|---|---|---|
| str |  Column::BIND_PARAM_STR
      
       |   {name:str}
      
       |  
| int |  Column::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-str |   Column::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_INT
      
       |  PHP整数のネイティブタイプとして値を渡す | 
 Column::BIND_PARAM_BOOL
      
       |  ネイティブPHP型のブール値として値を渡す | 
 Column::BIND_PARAM_DECIMAL
      
       |  PHP 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にアップグレードする場合は、アップグレードガイドを参照してください。