Zend Framework、䞻芳的な印象

最近、ある皮のWebアプリケヌションの開発を任されたした。 詳现には觊れたせんが、アプリケヌションは茞送蚈画に関連しおいるずだけ蚀いたす。 サむトぞの蚪問者が䜿甚できる公開郚分がありたす。 システムオペレヌタ甚の内郚むンタヌフェむスがありたす。 サヌドパヌティのサむトに投皿するためのむンフォヌマヌがありたす。 技術的な芳点から芋るず、これらは数十のスクリヌン、倚くの異なる圢匏、プレヌトです。 䞀郚の画面では、ajax、javascriptで蚘述されたカスタムコンポヌネント、およびドラッグアンドドロップなどのあらゆる皮類のかわいらしさを䜿甚しおいたす。 デヌタは、通垞どおり、1ダヌスのテヌブルの圢匏でリレヌショナルデヌタベヌスに保存されたす。 䞀般的に、これは非垞に原始的なアプリケヌションではありたせんが、私はそれを非垞に難しいずは蚀えたせん。



職堎では、そのようなアプリケヌションを蚭蚈するか、個人的にコヌディングする必芁がありたす。 ただし、このプロゞェクトには1぀の重芁な芁件がありたした。 アプリケヌションは、真剣で実瞟のあるプラットフォヌム、぀たりZend Frameworkに基づいお開発する必芁がありたす。 自䜜の「自転車」の䜿甚は受け入れられたせん。 率盎に蚀っお、私はただZend Frameworkの実際の経隓がありたせん。 しかし、このプラットフォヌムは有名で、その背埌には有名な開発者がいたす。 倚くの開発者によっお、Zend Frameworkは䞀般にWeb開発暙準ず芋なされおいたす。 それで、さらに、新しくお堅実な䜕かを孊ぶ理由がありたす。 したがっお、私はこのプロゞェクトを熱心に取り䞊げたした。



以䞋は私の個人的な感情ず印象の説明ですので、おそらくあなたはそれらをあたりにも近づかないでください。 これは、プロゞェクトの䜜業が完了した埌に残った感情的な残骞です。 私は初めお商甚プロゞェクトでZend Frameworkを䜿甚したした。





Zend Frameworkは、Webアプリケヌションを開発するための優れた、考え抜かれた䟿利なプラットフォヌムずしお䜍眮付けられおいたす。 私の意芋では、兞型的なWebアプリケヌションずは䜕ですか たあ、これらは倚くの異なるスクリヌン、倚くの圢、倚くのプレヌトです。 これはすべお、デヌタベヌス、通垞はリレヌショナルデヌタベヌスで積極的に機胜したす。 さお、MySQLの堎合の95で、より具䜓的になりたす。 したがっお、Webアプリケヌションを開発するためのプラットフォヌムから、フォヌム、さたざたな画面、およびリレヌショナルデヌタベヌスを䜿甚した䟿利な䜜業を䜜成する良い機䌚を少なくずも期埅しおいたす。 そしお、私はマスタヌし始めたした。



私が最初にやらなければならないこずは、Zend Framework自䜓の基本を孊ぶこずでした。 このプラットフォヌム専甚の本「 Zend Framework 」を読みたした。 PHP Webアプリケヌション開発。 Vikram Vaswaniにより投皿 。” 珟時点では、このようなフレヌムワヌクに関するロシア語版の曞籍はほずんど出版されおいないようです。 原則ずしお、この本は非垞に優れおいたす。 それを読んだ埌、私はフレヌムワヌクを操䜜する方法の䞀般的な理解がありたした。 次に、ギャップを埋め、このフレヌムワヌクが他に䜕を提䟛できるかを䞀般的に理解するために、公匏文曞を研究し始めたした。 結局のずころ、本ぱンゞンのすべおの機胜を考慮しおいたせん。 包括的でわかりやすく曞かれた公匏ドキュメントは、 framework.zend.com / manual / ruにありたす。玄1週間埌、アプリケヌションの開発を開始できるず刀断したした。



コヌディングに関する私の䞖界芳



補品がどのように曞かれるべきかに぀いおの私の個人的な意芋に぀いおのいく぀かの蚀葉。 ここで、圌らが時々私を批刀するようなこずに぀いおも蚀及したす。



OOPずOOPパタヌンの䜿甚を尊重したす。 ただし、アプリケヌションを正圓化し、コヌドを読みやすくするか、そのさらなる改善を本圓に簡玠化する必芁がありたす。 パタヌンのためのパタヌンは悪いです。



良いコヌドは明確なコヌドです。 明確なコヌドは簡朔なコヌドです。 短いコヌドを曞くこずができれば、原則ずしお理解しやすくなりたす。 1぀のモニタヌ画面に収たる、より論理的に接続されたコヌドの断片は、より優れおいたす。



既存の゜リュヌションやアプロヌチで䜕かが私に合わない堎合は、もっず満足できる独自の゜リュヌションを䜜成するこずを考えたす。 はい、倚くの人がそれを「自転車の発明」ず呌んでいたす。 しかし、私は長くお悲しくお他の誰かのファむルを提出するのではなく、快適なファむルを䜜成するこずを奜みたす。



MVCは優れおいたすが、いずれの堎合も開発プロセスを簡玠化および高速化するわけではありたせん。 堎合によっおは、特に単玔なアクションに関しおは、それから逞脱するこずができたすが、これらのアクションがたくさんありたす。 しかし、MVCはたったく必芁ないずは蚀いたくありたせん。以䞋に䟋を瀺したす。



if(@$_POST['action'] == 'done') { $dbi->exec(“UPDATE bug SET status='done' WHERE id=:bugId“, array('bugId'=>$bugid)); $message = “Status changed to <b>Done</b>”; } elseif(@$_POST['action'] == 'delete') { // 
. } //
.   20-30   ...
      
      







はい、モデル、コントロヌラヌ、ルヌタヌ、ビュヌをここに混圚させたした。 それはgovnokodの䞀郚のように芋えたす。 しかし、いく぀かの意図的なケヌスでは、費やされた時間、コヌドの量、およびさらなるサポヌトの可胜性の芳点から正圓化される堎合、そのように曞きたす。 䞀般的に、私は熱心なMVC狂信に反察し、垞識ず思慮深いアプロヌチに賛成です。



もちろん、この蚘事で蚀及されおいるプロゞェクトには、そのようなコヌドはありたせん。 私は、Zend Framworkによっお指瀺されたアプロヌチから意識的に逞脱するのに十分な経隓をすでに持っおいるずは思わないので、そのコンセプトに完党に埓うこずを詊みたした。



Webプロゞェクトのテンプレヌトに぀いお少し説明したす。 Smartyなどのテンプレヌト蚀語がい぀䜿甚されるかわかりたせん。 さお、なぜ本栌的なPHP蚀語が存圚するのに、䞀般的に制限された新しい蚀語を発明するのでしょうか レむアりトデザむナヌがPHP shny if...ずforeach...の䜿甚方法を孊ぶのは本圓に難しいですか Smartyほど耇雑ではありたせんが、新しい゚キゟチックな蚀語をプロゞェクトに远加したせん。

ずころで、テンプレヌトたたはビュヌは非垞に耇雑であるため、ifおよびforeachだけでなく、盞互に継承されるクラスやオブゞェクトなどの非垞に耇雑な構造も䜿甚する必芁がありたす。 同時に、プレれンテヌションのタスクは同じたたです-ドラむデヌタからHTMLコヌドを生成したす。



䞀般に、テンプレヌトに぀いおは、私は垞に通垞のPHPを奜み、開発者がテンプレヌトにロゞックをプッシュしないこずを玄束したす。 テンプレヌトを凊理するには、タむプの最も単玔な関数を䜿甚できたす



 function renderTemplate($file, $vars) { foreach($vars as $_name => $_var) { $$_name = $_var; } require $file; } //  renderTemplate(“page.tpl.php”, array( 'menu' => array('/about'=>' ', '/contacts'=>'') 'title' => '' ));
      
      







さらに、もちろん、シヌルド、キャッシングのための最も簡単なバむンディング。 幞せに必芁なものは他にないようです。



おそらく、テンプレヌト蚀語ずしおのXSLTに反察するものはただありたせん。 ただし、情報を提瀺するためのオプションが倚くなく、比范的単玔な堎合のみです。 さお、受信したデヌタに完党に䟝存しおいるある皮の地獄のような構造ずゞオメトリのベアXSLTテンプレヌトを簡単に䜜成するこずはできたせん。 ここでは、サむクルずオブゞェクト、およびポリモヌフィズムず継承の䞡方が必芁です。



Zend Frameworkをむンストヌルする



刀明したずおり、このフレヌムワヌクの重量は玄25MBで、玄3,000個のファむルが含たれおいたす。 匱くない、ず思った どうやら、あなたは倢を芋るこずができるだけであるこずがすべお理解されおいたす



たず、Zend Frameworkベヌスのアプリケヌションのディレクトリ構造は、私にずっお少しむラむラさせられたした。 非垞に倚数のディレクトリが含たれたす。 プロゞェクトに取り組んでいるずき、私はこの構造で垞に倱われおいたした。 たた、䜜成されたクラスの名前の芏則、ファむルの呜名芏則、およびそれらの配眮方法は、䞀時的すぎるように思えたした。 それらにはロゞックがありたすが、正盎に蚀うず、これはすべおより盎感的に行うこずができたす。 たた、提出スクリプトのディレクトリを移動するのは特に面倒です。 どうやら、このフレヌムワヌクを長時間䜿甚しおいるず、慣れるでしょう。



しかし、アプリケヌションの新しいセクションを䜜成する儀匏に非垞にうんざりしおいたした。ディレクトリを䜜成し、ファむルに名前を付け、クラスに名前を付け、コントロヌラヌに名前を付けたす。 たずコントロヌラヌでこれを行い、次にビュヌでこれを行いたす。 はい。コン゜ヌルナヌティリティがあり、堎合によっおはこれを自動的に行うこずができたす。 しかし、倚くの堎合、それは無胜です。



Zend Frameworkは、共有ホスティングで動䜜するようには蚭蚈されおいないこずが刀明したした。 開始するには、プロゞェクトのルヌトずは異なるディレクトリをVirtualHostに登録する必芁がありたす。 したがっお、少なくずもVDSサヌバヌが必芁です。 ええ、そうです、共有ホスティングで機胜するものを開発しおいるのなら、あなたはクヌルではなく、専門家の間には居堎所がないずいう意芋を聞きたした。 私は垞に、すべおのWebプロゞェクトの95が共有ホスティングでスピンしおいるず考えおいたしたが。 さお、ずにかく、ファむルを数回ストロヌクした埌でも、シャヌドのホットアップを行うプロゞェクトがありたした。

デヌタベヌスを操䜜する



最初に、デヌタモデルを䜜成する必芁がありたしたMVCコンセプトの䞀郚ずしお。 結局のずころ、Zend Frameworkはモデルを䜜成する準備が敎ったものを䜕も提䟛しおいたせん。 実際、独自のクラスを䜜成するだけで、そのメ゜ッドがデヌタベヌスの操䜜でこれたたはその操䜜を実行したす。 ぀たり 堎合によっおは、モデルクラスはSQLク゚リの単なるラッパヌであり、PHPバむンディングが远加されたSQLク゚リの堎合もありたす。



デヌタベヌスを操䜜するために、フレヌムワヌクはZend_Dbコンポヌネントを䜿甚したす。 SQLを介しお最も䞀般的なDBMSで䜜業できたす。



たた、SQLを䜿甚せずにク゚リを䜜成できたす。たた、フレヌムワヌク内でSQLに倉わるトリッキヌなオブゞェクトを䜜成するこずもできたす。 倚かれ少なかれ耇雑なク゚リを䜜成するためには、このラッパヌを構築するよりもSQLク゚リを䜜成する方が䟿利で簡単であるように思えたす。これにより、耇雑なク゚リを䜜成できなくなりたす。 䞀般に、フレヌムワヌクを圢成するように匷制するよりも、SQL自䜓をよく研究し、最適な方法でSQLを実行するこずを期埅する方がよいず考えおいたす。 ネむティブSQLは読みやすく、すべおのプログラマヌが理解しやすく、特定のDBMSのすべおの機胜を䜿甚できたす。 オブゞェクトク゚リデザむナヌを䜿甚するず、特定のデヌタベヌスの方蚀から抜象化できるず蚀いたすか 耇雑なク゚リの堎合-クヌルなコンストラクタを䜿甚しおも、垞に抜象化するこずは䞍可胜です。 さお、もう1぀の議論-DBMSを倉曎する必芁がある単䞀のプロゞェクトを芚えおいたせんが、同時にプロゞェクト党䜓、ビゞネスロゞック、デヌタモデルのグロヌバルな倉曎はありたせんでした。 以前のプロゞェクトに基づいお完党に新しいプロゞェクトを䜜成したす。 以前のバヌゞョンのデヌタモデルクラスの䞀郚を䞀般的なバックグラりンドに察しお保存しおも、䜜業はそれほど楜になりたせん。



それでは、Zend FrameworkでのSQLの操䜜はどのようなものですか さお、このようなもの

$ result = $ db-> fetchAssoc 'SELECT * FROM items WHERE age> 18';



そしお、$の結果を䜿甚しお、テヌブル圢匏の連想配列を操䜜できたすただし、これは配列ではありたせん。これは非垞に䟿利です。 配列をさらに凊理するために枡すこずも、衚瀺のためにビュヌに盎接枡すこずもできたす。



SQLク゚リの結果を抜出する、さらに䟿利なメ゜ッドがいく぀かありたす。

fetchCol-単䞀の列を取埗したす。 ID shekのリストを取埗する必芁がある堎合に䟿利

fetchRow-最初の行を取埗したす。 䞻キヌで1぀の゚ントリを遞択する必芁がある堎合に䟿利です。

fetchOne-1぀の倀のみを取埗したす。 たた、本圓に1぀の倀を取埗する必芁があり、配列から1぀の芁玠を遞択するコヌドを曞きたくない堎合にも䟿利です。

fetchPairs-倀のペアを連想配列ずしお取埗したす。 キヌず倀のハッシュを䜜成したす。 異なる蟞曞を䜜成するず非垞に䟿利です。



これらのすべおの方法により、コヌドの行数を簡単に枛らすこずができたす。 あらゆる皮類の远加ルヌプ、芁玠の抜出などを削陀したす。 その結果、モデル内のコヌドの倧郚分が倧幅に削枛されたす。



fetchPairsメ゜ッドが適しおいたす。 そしお、デヌタベヌスの䞻キヌがキヌずしお䜿甚され、デヌタベヌスの配列レコヌドが倀ずしお䜿甚される、もう少し興味深く必芁な蟞曞をどのように取埗したすか 非垞に䞀般的なタスク。 答えは䜕もない それを手で行い、fetchAssocを呌び出し、ルヌプを回しお新しい蟞曞配列を生成したす。 残念です



では、先に進みたしょう。 テヌブルからデヌタを抜出し、それらからツリヌのような配列を䜜成する必芁がありたす。 この䞀般的な操䜜もたったく実装されおいないこずがわかりたす。 ぀たり 次のようなものはありたせん



$ hierarhy = db-> fetch_tree "SELECT id、parent_id、title FROM tree '、' id '、' parent_id ';



どうぞ SQLでは、パラメヌタヌを枡す必芁がありたす。 たあ、はい、䞀芋、すべおが簡単です。 これは次のように行われたす。



$ result = $ db-> fetchAssoc 'SELECT * FROMニュヌスWHERE id ='、7;



いく぀かのプレヌスホルダヌを配眮するこずもできたす。



$ result = $ db-> fetchAssoc 'SELECT * FROM news WHERE chapter =AND type ='、array2、8;



珟圚、プログラムが耇雑になるず、ク゚リの耇雑さが増し、すでに倚数のパラメヌタヌが存圚する可胜性がありたす。 名前付きプレヌスホルダヌが必芁です。 シリアル番号でプレヌスホルダヌを数えるこずは、コヌドのわかりやすさを助長するものではありたせん。 結局のずころ、Zend Frameworkはそれらを実装しおいたせん これらは機胜したすが、遞択したデヌタベヌスがそれらをサポヌトしおいる堎合のみです。 たずえば、MySQLiを遞択した堎合、名前付きプレヌスホルダヌで䜜業するこずはできたせん。 名前付きパラメヌタヌを゚ミュレヌトするのは本圓に倧倉でしたか さお、このこずは解決可胜であるこずが刀明したした。 アダプタヌずしおMysqliではなくPdo_Mysqlを遞択するず、名前付きパラメヌタヌが機胜し始めるこずがわかりたした。 PDO自䜓の内郚で゚ミュレヌトされたす。 率盎に蚀っお、私はすぐにこれに到達したせんでした。 in蟱は収たったが、䞍快な埌味が残った。



倚くの堎合、SQLク゚リではこのようなコヌドを䜿甚する必芁がありたす



SELECT * FROMアむテムWHERE id IN1,3,5,8,12



id-listは配列から動的に生成されたす。

私は個人的に、Zend Frameworkでこれを矎しく行う方法を芋぀けおいたせん。 特定のquoteIntoメ゜ッドがありたす。 このように䜿甚できたす



$ sql = $ db-> quoteInto "SELECT * FROM item WHERE id = IN"、array1,3,5,8,12;



ク゚リで名前付きパラメヌタヌを䜿甚できず、いく぀かの郚分から耇雑なク゚リをコンパむルできないこずに耐えたしたが、必芁なSQLコヌドを取埗したした。 配列が空であるこずが刀明した堎合にのみ、構文゚ラヌが発生したす。これは、SQLによっおSELECT * FROMアむテムWHERE id = INになるためです。

したがっお、すべおをifcount$ idList> 0でラップするか、毎回、意図的に無効な識別子たずえば、-1を配列に远加したす。 Krivenko、しかし解決策。 しかし、ずにかく、それは刀明したしたか 文字列を連結するこずによっおのみ耇雑なSQLク゚リを䜜成できるこず。 たた、SQLク゚リは、PHPを埋め蟌たずに単䞀のコヌドずしお衚瀺するこずを奜みたす。 それに、HTMLずPHPを混ぜるこずは悪いず考えられたすが、SQLずPHPは問題ありたせん。



䞀般的に、Zend_Dbは私をあたり奜きではありたせんでした。 私はその䜿甚から倧きな利点や匷い利䟿性に気づきたせんでした。 ちなみに、Zend_Dbの重量は500KB以䞊です。



䞀般に、デヌタベヌスを操䜜するには、次のパブリックメ゜ッドを䜿甚しお自家補の小さなクラスを䜿甚するこずを奜みたす。



connect$ config-デヌタベヌスに接続したす

fetchTable$ sql、$ params-レコヌドの配列を返したす

fetchRow$ sql、$ params-1぀のレコヌドを返したす

fetchCol$ sql、$ params-単䞀の列を返したす

fetchOne$ sql、$ params-スカラヌ倀を返したす

fetchPairs$ sql、$ key、$ value、$ params-配列キヌを返したす-倀

fetchDict$ sql、$ key、$ params-配列キヌを返したす-レコヌド

fetchTree$ sql、$ key、$ parent、$ params-ツリヌを返したす

exec$ sql、$ params-非遞択ク゚リを実行したす

getInsertId-最埌に生成された自動むンクリメントを返したす

getAffectedRows-倉曎されたレコヌドの数を返したす



実行結果は、各ケヌスの論理構造の通垞の連想配列です。 パラメヌタには垞に名前が付けられ、数倀、文字列、リストを枡すこずができたす。 SQLで構文゚ラヌが発生した堎合、クラスは䟋倖をスロヌしたす。 この「バむク」の重量は10KB皋床で、率盎に蚀っお、私にずっおは垞に十分です。 他のプログラマヌはそれを勉匷するのに10分を必芁ずし、Zend_Dbを勉匷するにはマニュアルを泚意深く勉匷するのに䜕時間もかかりたすが、ただ質問がありたす。 クラスを拡匵し、いく぀かの仮想メ゜ッドをオヌバヌラむドするこずにより、他のデヌタベヌスのサポヌトを远加できたす。



フォヌム



Webアプリケヌションで次に重芁なのはフォヌムです。 通垞、それらの倚くがありたす。 構造ず倖芳も非垞に倚様です。 Zend FrameworkはZend_Formを䜿甚しおフォヌムを操䜜したす。



フォヌムを䜜成するには、フォヌムオブゞェクトを䜜成する必芁がありたす。 各フィヌルドのオブゞェクトを远加する必芁がありたす。 フィヌルドでは、さたざたなパラメヌタヌを構成できたす。 バリデヌタヌなどを指定したす 以䞋はフィヌルドを䜜成する䟋です



 $username = new Zend_Form_Element_Text('username'); $username ->addValidator('alnum') ->addValidator('regex', false, array('/^[az]+/')) ->addValidator('stringLength', false, array(6, 20)) ->setRequired(true) ->addFilter('StringToLower');
      
      







すべおのフィヌルドを䜜成したら、それらをフォヌムオブゞェクトに远加したす。



 $form ->setAction('/somepath') ->setMethod('post') ->addElement($name) ->addElement($company) ->addElement($email) ->addElement($phone) ->addElement($action);
      
      







たくさんのフィヌルドがある堎合にのみ、それらのいく぀かをフォヌムに远加するこずを忘れたす。 ええず、コヌドに䜕かをリストする必芁があるずき、そしおどこか他の堎所にすべおをリストするために再びどこか別の堎所に眮く必芁があるずき、私は恐怖を嫌いたす。 そしお、ここでは毎回フィヌルドオブゞェクトの倉数の名前ず出力甚の名前を瀺す必芁がありたす

addElementがフォヌムぞのリンクではなく、远加された芁玠ぞのリンクを返した堎合、流れるようなむンタヌフェヌスを䜿甚するず、コヌドははるかに簡朔になり、繰り返しもなくなりたす。 そのように



 $form->addElement(new Zend_Form_Element_Text('username')) ->setRequired(true) ->addValidator('regex', false, array('/^[az]+/'));
      
      







しかし、それは䞍可胜です



お気づきのように、ここでは既補のフィヌルドバリデヌタを䜿甚できたす。 悪くない。 電子メヌルを入力するフィヌルドを䜜成しお、曲線の電子メヌルアドレスを入力しおみたしょう。 これを行うには、暙準のEmailAddressバリデヌタヌを䜿甚したす。



曲線の「xxx」メヌルを指定しおみたしょう。 ゚ラヌメッセヌゞが衚瀺されたす。



「xxx」は、local-part @ hostnameずいう基本圢匏の有効なメヌルアドレスではありたせん



わかった もちろん、メッセヌゞをロシア語に翻蚳する必芁がありたすが、簡単に行うこずができたす。 そしお、さらに湟曲したアドレス「i@_domain.xx」を詊しおみたしょう。

そしお、ここに私たちが埗るものがありたす



「_domain.xx」はメヌルアドレス「i@_domain.xx」の有効なホスト名ではありたせん

「_domain.xx」はDNSホスト名のように芋えたすが、TLDを既知のリストず䞀臎させるこずはできたせん

「_domain.xx」は有効なロヌカルネットワヌク名ではないようです

「i」はドットアトム圢匏ず照合できたせん

「i」は匕甚笊付き文字列圢匏ず照合できたせん

「i」はメヌルアドレス「i@_domain.xx」の有効なロヌカル郚分ではありたせん



6件の投皿 誰がこれを必芁ずしたすか 平均的なナヌザヌは、TLD、匕甚笊付き文字列たたはドットアトムが䜕であるかを本圓に理解しおいたすか 平均的なナヌザヌが必芁ずするメッセヌゞは「Invalid E-mail」1぀だけです。 ただし、暙準ツヌルではこれが蚱可されおいたせん。 このメッセヌゞのヒヌプの出力を取り陀くために、独自のバリデヌタクラスを䜜成するこずをお勧めしたす。



さお、すべおのフィヌルド、すべおのバリデヌタヌを蚭定したフォヌムを䜜成したずしたしょう。 今それを出しおください。 デフォルトでは、フォヌムのHTMLコヌドは次のようになりたす。



 <dl class="zend_form"> <dt id="phone-label"> <label for="phone" class="required"></label> </dt> <dd id="phone-element"> <input type="text" name="phone" id="phone" value=""> <ul class="errors"><li> </li></ul> </dd> ... </dl>
      
      







さらに、隠しフィヌルドもDD芁玠でラップされたす そしお、私たちはフォヌムにどのような奇劙なボむドが圢成されたのか疑問に思い始めたす。 䞀般に、フレヌムワヌクには、非衚瀺フィヌルドの特別な凊理のためのむンテリゞェンスがありたせん。



しかし、最も単玔なDLリストが私に合わない堎合はどうでしょうか 突然、耇雑な構造のフォヌムを䜜成する必芁がありたすか ここでは、デコレヌタクラスを䜿甚するこずが提案されおいたす。 デコレヌタは、特定のHTMLタグでフォヌム芁玠をラップできるクラスです。たずえば、DTタグではなく、DIVなどで芁玠をラップできたす。 怖い 「正しい」MVCフレヌムワヌクにより、コントロヌラヌ内で盎接、最も読みにくい方法でレむアりトを行う必芁がありたす。



私の意芋では、非暙準フォヌムの組版はタむプセッタヌのみが行うべきです。 フォヌムのすべおのレむアりトを含むビュヌスクリプトを䜜成するだけです。 そしお、コントロヌラヌ内で数十のクラスのデコレヌタヌを䜿甚するこずは、控えめに蚀っおも曲がっおいたす。



フォヌムを操䜜するための最も単玔な「自転車」の䟋を挙げたしょう。これにより、フォヌムを簡朔か぀䟿利に䜜成できたす。



フォヌムの構成



 $form = new UniversalForm(array( 'name' => array('label'=>'', 'required'=>true), 'email' => array('label'=>'', 'type'=>'email'), 'birthday' => array('label'=>' ', 'type'=>'date'), 'sex' => array('label'=>'', 'type'=>'choice', 'items'=>array('m'=>'', 'f'=>'')), 'code' => array('label'=>'', 'regExp'=>'/^\d{6}$/', 'regExpMessage'=>' ', 'value'=>'000000'), 'action' => array('type'=>'hidden', 'value'=>'updateInfo'), ));
      
      







ここでは、コヌドの量を枛らすために、フォヌム芁玠のオブゞェクトを明瀺的に䜜成する代わりに、単玔に構成配列を䜜成するこずができたす。 これは、フィヌルドオブゞェクトずバリデヌタを手動で䜜成する可胜性を排陀するものではありたせんが。 それでは、次の圢匏を䜿甚したす。



$ form-> setFromPost; // POSTからデヌタを蚭定したす

$ form-> isValid; //デヌタが有効であるこずを確認したす。 そうでない堎合、フォヌム送信スクリプトが出力する゚ラヌメッセヌゞがむンストヌルされたす。

$ data = $ form-> getValues; //倀を取埗したす

$ form-> setValues$ data; //フィヌルド倀を蚭定したす。 コンストラクタヌで混乱する配列を介しお同じこずを行うこずは可胜ですが

$ form-> render 'form.tpl.php'; // HTMLを生成したす。 テンプレヌトが指定されおいない堎合、デフォルトのテンプレヌトが䜿甚されたす。

$ form-> renderJs; //クラむアント偎のPHPバリデヌタを耇補するJavaScriptバリデヌタを生成したす。



さお、MVCの芳点からは間違っおいるいく぀かのメ゜ッドがありたす。

$ form-> getSqlSet; // SQLコヌドの䞀郚を返したす

そのように䜿甚できたす



$ sql =“ UPDATE account SET”。$ form-> getSqlSet。” WHERE id = 777”;



次のメ゜ッドは同じ目的で䜿甚されたす。

$ form-> getSqlFieldsList;

$ form-> getSqlValuesList;

はい、これは完党に暙準的な正しい決定ではありたせん。 しかし、その埌、フィヌルドのセットはフォヌムコンストラクタヌで䞀床だけ蚘述する必芁がありたす。 倉曎するず、すべおのSQLク゚リが自動的に倉曎されたす。



管理者



原則ずしお、耇雑なWebアプリケヌションでは、管理パネルたたはコントロヌルパネルを䜜成する必芁がありたす。 たずえば、パラメヌタの蚭定、ディレクトリの線集など。 ぀たり 少なくずも、レコヌドリスト゚ディタを䜜成するためのツヌルが必芁です。 少なくずもフラットなリスト、および耇雑なプロゞェクトの堎合、これらのリストは倚くの堎合階局的でなければなりたせん。



䞀般に、このフレヌムワヌクではこれに察応する準備はできおいたせん。 必芁に応じお、すべおを手動で実装する必芁がありたす。 ぀たり 各゚ディタヌで、テヌブルずフォヌムを含む画面を䜜成し、実際に手動でCRUD操䜜を実装したす。



結論ず印象



ご理解のずおり、この「正しい」フレヌムワヌクは私にはあたり良い印象を䞎えたせんでした。



しかし、おそらくZend Framworkは次の堎合でも習埗できたす。

1.アプリケヌションの蚱容できるフレヌムワヌクを䜜成するのに十分な経隓がない堎合。

2. MVCの操䜜方法がたったくわからないが、このむデオロギヌを䜓隓したい堎合

3. OOPず兞型的な蚭蚈パタヌンの適甚に぀いお十分に理解しおいない堎合、Zend Framworkは倚くの䟋を瀺したす。 そこでは、OOPが必芁な堎所ず必芁でない堎所で䜿甚されたした。

4.たた、Zend Framworkは、デヌタベヌスからデヌタを抜出しお画面に衚瀺するだけの䜜業ではない単玔なアプリケヌションを䜜成すれば、正垞に機胜したす。 たずえば、䞀郚のニュヌスポヌタルや補品カタログ。



ただし、他のフレヌムワヌクに目を向ける方が良いでしょうか Zend Frameworkはすでに地盀を倱い始めおおり、おそらく正圓な理由がありたす。



そしお、個人的に、私が䜜業しようずしたフレヌムワヌクのほずんどすべおのコンポヌネントで䞍䟿に遭遇したした。「もっず䟿利にできたはず」や「たあ、どうしおこんなこずに気付かなかったの」 Zend Framwork開発者の䞻な仕事は、OOPnoをすべお行うこずであるずいう印象を受けたした。可胜なこずはすべお、すべおラッパヌ、アダプタヌにラップされおおり、䟿利かどうかは関係ありたせん。ラむブラリの抜象化のレベルは非垞に高いため、理解するのが困難です。そしお最も重芁なこずは、ほずんどすべおのコンポヌネントをニヌズに合わせお仕䞊げる必芁があるこずです。そのたたの圢では、すべおが期埅どおりに機胜したせん。



はい、よく知っおいたす。確かに私はフレヌムワヌクで䜕かを誀解したした。確かにマニュアルに䜕かが欠けおいた。そしお今、私はRTFMスタむルのコメントを取埗したす。しかし、これは指暙でもありたす。優れたプラットフォヌムを簡単か぀迅速に習埗し、すぐに適切で䟿利な゜リュヌションを瀺す必芁がありたす。ここでは、私はそれを感じたせんでした。



゜ビ゚トのゞョヌクも思い出したした。図面に埓っお飛行機を集めるず、蒞気機関車であるこずがわかりたした。そしお、図面には、「結果の補品-ファむルを修正する」ず曞かれおいたした。゚ンゞンをファむルで飛行機に倉曎したくありたせん。箱から出しおすぐにすべおが適切に機胜するようにしたす。



PS誰かの「宗教的感情」を傷぀けた堎合、事前に謝眪したす。



PS2。この蚘事は、Zend Frameworkに぀いお曞かれおいたす。そしお、これはMVCのメリットに挑戊する詊みではありたせんが、残念ながら倚くの人々がそのように考えたした。



All Articles