しかし、フレームワークをテストする過程で、「驚きの原則」という用語が頭の中にどんどん現れてきました。 まさに驚いたからです。
ORMと空の行
標準的な状況を取ります。
Users (id int, name varchar, comment varchar not null default '')
プレート
Users (id int, name varchar, comment varchar not null default '')
。 このプレートで作業するためのユーザーモデルを作成し、新しいユーザーを作成してみましょう。
$user = new User(); $user->id = 1; $user->name = 'Robot'; $user->comment= ''; $user->save();
そして...ユーザーは作成されません。 モデルのエラーを見ると、 「コメントが必要です」というメッセージが表示されます。 あなたが言うWTFとあなたは正しいでしょう:)バグ? あなたは言うだろうし、あなたは間違っているだろう。
昨年の2月22日からIssue 440を見て、これが機能であることがわかります。
この機能の理由は、ユーザーがフォームからデータを送信した後にモデルが作成および保存されることが多いためです。プログラマがNULLを出力するときに検証に使用する多くの関数(strip_tags、filter_var)は空の文字列を与えます。 したがって、コメントフィールドがフォーム
($_POST['comment']==null)
を介して送信されない場合、プログラマーは仮説的にケースを取得でき
($_POST['comment']==null)
が、プログラマーは
$user->comment = strip_tags($_POST['comment']);
そして、nullの代わりにコメントフィールドで ''を取得しました。
すごい? 私にとってはとてもとても。
ところで、ソリューションが提供されています。 しかし、この奇妙さのために、標準検証を再定義する必要があります。
さて、同じ分野の別の例:
$user = User::findFirst("name='robot'"); $user->name='robot2'; $user->save();//!!!!!!WTF?
ビューのフォルダー
プロジェクト内のテンプレートは、複数の場所に配置できます。たとえば、モジュールごとに個別のテンプレート、基本的なプロジェクトテンプレートなどです。
モジュールテンプレートで
{% extends base.twig %}
を作成する場合はどうなりますか? そうです、ビュー設定に追加のフォルダーを追加して、ベーステンプレートを検索します。 ただし、
View::setViewsDir
はパラメーターとして1つのディレクトリのみを受け入れます!
昨年12月15日に新しい機能のリクエストが送信されました。
部分的な解決策として、モジュールへのパスをテンプレートへのパスとして指定し、コントローラー内でモジュールへのフォルダーからテンプレートへのフルパスを指定できます(
$this->view->pick("clients/views/index");
)。 または、アプリケーションのセットアップ時にレンダリングの自動呼び出しを無効にし(
$application->useImplicitView(false);
)、
Phalcon\Mvc\View\Simple
as Viewを使用し、テンプレートを手動でレンダリングし
print $this->view->render('clients/views/client_view', []);
ところで、もう1つの驚き-標準のViewは途中でテンプレートをレンダリングできません。コントローラー/アクションの名前(
$this->view->render('controller', 'view', []);
)によってのみ、したがって、 Simpleを使用する必要がある場合。
奇妙な挿入/更新DBAL構文
私はDoctrine DBAL構文の挿入/更新に非常に慣れていたので、何か別のことをすることができるとさえ考えられませんでした。 それはあなたができることが判明しました。
phalcon DBALとDoctrine DBALの構文は次のとおりです。
$success = $connection->insert( "robots", array("Astro Boy", 1952), array("name", "year") );
そして
$success = $connection->insert( "robots", array( 'name' => "Astro Boy", "year" => 1952 ) );
$success = $connection->update( "robots", array("name"), array("New Astro Boy"), "id = 101" );
そして
$success = $connection->update( "robots", array("name" => "New Astro Boy"), array("id" => "101") );
私にとって、Doctrine DBAL構文は統一のために非常に明確に便利です。
Phalconインキュベーターに概念を含むプルリクエストを送信しました。 たぶんいつか追加:)
一般に、いくつかの不便さにもかかわらず、ファルコンを使用するというアイデアを拒否することはなく、テストを続けています。