Zend Frameworkのヒントとコツ

Zend Frameworkのヒントとコツ



Zend Frameworkのヒントとコツ記事の翻訳。

作成者: Juozas devBlog



優れたツールを使用するのは良いことですが、「機能しているように見える」だけでなく、適切に使用していることを確認する必要があります。 このため、私は誰かの支援プロジェクトを受け入れるとき、または開始方法をアドバイスするときに常に心に留めておくことのリストを作成することにしました。



ほとんどの推奨事項は、テストの容易さ、サポートの容易さ、およびその他の優れたコーディング慣行に焦点を当てています。 これらの推奨事項に慣れていない場合は、できるだけ早く読み始めることをお勧めします。 ここで説明されている間違いを犯していると確信しており、あなたがどれほど間違っているかを疑うこともありません。 私を信じて、すぐにあなたの開発スキルが大幅に向上します。



別のロジック

この声明は最も明白ですが、私は信じています、私は参加したすべてのプロジェクトでエラーを見つけました(過去6か月間のZend Frameworkで10以上)。 コントローラーの場合、ビジネスロジックを含めるべきではありません;モデルの場合、POSTパラメーターなどの処理を含めるべきではありません。 ロジックを配置し、フォーム、ブートストラップ、ビュー、ヘルパーなどから分離する必要があります。



すべてのロジックをコントローラーからモデルまたはサービスに転送します 。 フォームを使用してデータを検証およびフィルタリングし、フォーム上のデータを処理しないでください。 セッションとユーザーIDを非表示にし、必要なすべての操作を1か所で実行し、プロジェクトの他の部分で使用するAPI関数を提供します。 続けることができますが、アイデアが明確になることを願っています。 最終的に、コードのテストを開始するときに何かが正しくないことを理解できます。フォームをテストするだけで、frontController、リクエスト、Cookie、およびメールサーバーを設定する必要があります。



グローバル変数

この動画をまだご覧になっていない場合は、今すぐご覧ください。後悔することはありません。 グローバル変数は、テスト中に多くの問題を引き起こし、オブジェクト指向プログラミングの概念と矛盾します。 これは、$ _SERVER、$ _SESSIONなどの値の取得に適用されます。これらの値はすべて、リクエストオブジェクト(Zend_Controller_Request_Httpを参照)または個々のクラス(Zend_Sessionなど)のメソッドを通じて使用できます。



繰り返しますが、テストの容易さについて言及したいと思います。これは、プログラムを開発する際に常に覚えておく必要があることだからです。 テストでは、グローバル変数を変更しないでください。 値を取得するには、テストで必要な値を返すオブジェクトのメソッド(IPなど)を使用する必要があります。 Zend Frameworkは、すべてのグローバル変数にアクセスするための非常に便利なクラスを提供します;それらを使用しないのは罪です。



リクエストではなく、フォームの値を使用します

この推奨事項に従うことは非常に簡単です。

次のコード例を見てください。



$form = new Form();

if ($ this ->_request->isPost())

{

if ($form->isValid($ this ->_request->getPost())

{

$model = new Model($ this ->_request->getPost());

$model->save();

}

else

{

$form->populate($ this ->_request->getPost());

}

}




* This source code was highlighted with Source Code Highlighter .








フォームが検証された(したがって値がフィルターで除外された)後、生の要求データ$ this-> _ request-> getPost()が引き続き使用されます。 たとえば、無視された要素(送信ボタン)など、多くの興味深いZend_Form関数が失われます。 さらに、フォームはフィルターを使用しないので、フィルターを設定しますか? さらに、私はモデルに何でも転送でき、モデル自体がデータ検証を実行する必要があります。 したがって、メソッド$ form-> getValues()では、チェックの機能だけでなく、フィルターも実装する必要があります。



この例では、populate()フォームメソッドが過度に使用されています。 このメソッドは、フォームの初期値を設定するように設計されています。 エラーが発生した場合、isValid()メソッドは必要な値自体を設定するため、値を設定するための追加機能は必要ありません。



exit()/ die()を使用しないでください

最初に行うことは、exit()へのすべての呼び出しを削除し、例外またはreturnステートメントを使用してやり直します。 これらの機能のいずれかを使用することを正当化できると考えることができるケースはほとんどありません。 たとえば、次のコントローラーアクションコードを見てみましょう。



if (!$ this ->userHasPermissions())

{

$ this ->_redirect( '/' );

}

$form = new Form_Add();

if ( //submit form)

{

// save with $form->getValues();

$ this ->_redirect( '/index' );

exit();

}

// -



* This source code was highlighted with Source Code Highlighter .








最初の問題は、$ this-> _ redirect()がexit()を呼び出し、アクションが完了すると考えることです。 これは確かに事実ですが、そのような場合は避けてください。 このような呼び出しは、post *イベントの生成を不可能にします。 さらに、これによりテストが不可能または不正確になります。 Zend_Testはコントローラーヘルパーのexit()呼び出しを無効にするため、テスト中は権限チェックをテストできません。 この問題を修正するには、リダイレクトを実行する前にreturnを追加するだけで(return $ this-> _ redirect( '/'))、すべて問題ありません。



さらに、2番目のexit()はまったく役に立たず、コードをテストに適さないものにします。 状況を修正するには、戻り値を追加するだけで十分です。これにより、後続のコードの実行が許可されず、ビューが再描画されません。 viewRendererヘルパーはすべてのリダイレクトを制御し、リダイレクトを検出した場合は何もしません。 私の経験に基づいて、フォームデータを保存した後は、もちろんexitなしでリダイレクトのみをコードに入れるだけで十分です()。



PHPの代わりにフレームワークを使用する

最初は少し奇妙に思えるかもしれませんが、フレームワーク(この場合はZend Framework)を使用する場合は、5年前にPHPアプリケーションからトリックやメソッドを転送しないでください。 たとえば、次のように(コントローラーアクション):



$ object = new Some_Object();

$image = $ object ->generateImage();



header ( 'Content-type: image/jpeg' );

echo $image;



* This source code was highlighted with Source Code Highlighter .








ここからどこから始めればよいかさえわかりません...このロジックはすべて、応答オブジェクトに既に挿入されています。 次のことができます。



$ this ->getResponse()->setHeader( "Content-type" , 'image/jpeg' );

$ this ->getResponse()->setBody($image);



* This source code was highlighted with Source Code Highlighter .








これらの2つのフラグメントは同じように見えるかもしれませんが、そうではありません。 これは非常に簡単に確認できます。コードはグローバル変数では機能しません

(ヘッダー()はグローバル変数の関数です)、要求処理は中断されません。 コントローラーはデータを出力せず(したがって、エコーは使用されません)、要求オブジェクトを受信し、応答オブジェクトを送信するだけです。それだけです。 コントローラから出力されるデータは、exit()呼び出しと同じ方法でプロセスの実行を中断します 。したがって、このストリームを中断しないようにしてください。



そして、いくつかのマイナーな追加

Application.iniは、パス変数にパスを追加するために使用されるincludePathsプロパティを記述します。 これはうまく機能しますが、この機能を使用しないことをお勧めします。 これらのパスは、アプリケーションの新しいインスタンスを作成するたびに追加されます(これは1.9の場合ですが、将来変更される可能性があります)。 コントローラーをテストしている場合は、開始する前に必ず新しいインスタンスを作成してください。 100回または2回のテストを実行すると、パフォーマンス時間がますます低下することがわかります。 エラーを見つけて修正するのに数時間かかりましたが、私はこれをすべて覚えています。



jQueryまたはJavaScript用の別のビューヘルパーを使用している場合は、それを最大限に活用してください。 つまり 追加のリソースとコードを追加するには、addJavascriptFile()、addJavascript()、addStylesheet()、addOnload()などの関数を使用します。 JavaScriptをビューに直接挿入する場合、すべてが正常に機能しますが、ビューヘルパーを使用する場合は、すべてのコードを1つの場所に配置し、異なる場所に散らばらないようにする必要があります。



おわりに

これは、練習で遭遇した問題やタスクのほんの一部に過ぎませんが、まだ伝えたいことがあります。 あなたもあなたの秘密を共有することを望みます。 Zendフレームワークを正しく動作させる方法についていくつかの有用なアイデアを提供したと信じたいと思います。すべてが透過的で最良の方法で編成されるため、コードがより美しくなり、開発時間が短縮されます。



ペトレレヴィッチ・セルゲイ

petrelevich@yandex.ru

www.SmartyIT.ru


同志は記事の翻訳を行いましたが、彼はHabréのアカウントを持っていません。

したがって公開します。



All Articles