ほとんどのMVC厳格なphpフレームワーク[終了]


8

私は約6か月間、MVCパターンに頭を悩ませてきました。MVCおよびHMVCパターンに関する大量の記事、Q&A、ブログ投稿を読んだことがありますが、100%にはなりません。

広く使用されているPHP MVCフレームワークの1つであるCodeIgniterを使用してMVCを学習してみました。私はそれを使って自社の内部Webサイトをいくつか実装しました。それでも、100%取得することはできません。何かを学ぶための最良の方法の1つは、厳密に定義されたルールに従うことです。

だから私の質問は: MVCパターンの実装方法に関して、最も厳密なPHPフレームワークは何ですか?MVCを完全に取得できるように、モデル、コントローラー、ビューの使用方法を定義するものですか?

回答:


13

簡潔な答え

そのようなことはない。

長いバージョン:

フレームワークは、MVCまたはMVCにインスパイアされたデザインパターンを実装していません。あなたのアプリケーションはそうします。

MVCは魔法のソースではありません。フレームワークにダンプすることでアプリケーションに追加できます。代わりに、あなたが実際に言ったパターンを学習し、理解しなければならない(ようにとそれに付随する原則と実践、SOLIDのLoDSoCのを。そうして初めて、選択したフレームワーク内でそれを使用することができます。

フレームワークは、それがいることを宣伝している場合、「MVCを持っている」、それは完全に全くありDREN。そのような状況では、最新の誇大宣伝よりもアプリケーションの設計やコーディングの実践に関心のある初心者にフレームワークを「販売」するために使用されます。

フレームワークの目標は、ツールのコレクションを提供することです。全体として使用すると、変更/改善された開発環境が提供されます。ルーティング、オートローディング、ストレージの低レベルの抽象化(いいえ、アクティブレコードのアンチパターンについては話していません)などの処理、および開発とメンテナンスの時間を節約できる残りの処理を扱います。

結論として。

PHPにはMVCフレームワークはありません。私にそのようなことを主張する人々のすべては実際に最悪のものの中にいます。つまり-codeigniter、cakephp、yii。すべてのコストでそれらを避けてください(あなたが本当にそれに対して十分に支払われている場合を除いて)。

フレームワークを使用する必要がある場合、現時点で最良のオプションはSymfony 2.x、Zend Framework 2.xまたはLaravel 4.xの最新バージョンです。これらはMVC実装しませんが、代わりに独自のアプリケーションアーキテクチャへの影響を最小限に抑えます。


7
-1一部のフレームワークは、他のフレームワークよりもMVCに適しています。通常、モデル、ビュー、コントローラーを含むものです。
Rein

7
モデルはクラスではありません。これはアプリケーション層です。「モデル」を持つフレームワークがある場合、それは、MVCが構築されているMVC設計パターンまたは概念にリモートに関連していないことを明確に示しています。
mefisto 2013

7
...なんらかの形で具体化する必要のあるアプリケーション層です。オブジェクトの使用、つまりクラスの使用を意味するオブジェクト指向言語。いずれにせよ、私は他の人のアイデアに対して非常に露骨で無礼で敵意のある人との関わりには興味がないので、これはそのままにしておきます。
Rein Henrichs 2013

6
-1 OPは、フレームワークを使用するアプリケーションでMVCパターンの使用を厳密に実施するフレームワークを求めていました。あなたの答えは「最高の」フレームワークと一般的なフレームワークに関する哲学についてであり、OPの質問には答えませんでした。
プログラマー

3
+1私は長年にわたって本質的に同じ結論に達しました。Cake&coは最悪の犯罪者です。あなたはありますが、十分な長さ、それらの上にハンマーであればそれらのうちの何かMVCishを得ることができるが、彼らは本当に実際のMVC設計のために連動されていません。実際、最良の選択は、コンポーネントの緩やかなコレクションであり、汎用ツールを使用して独自のアプリケーションを実装できるフレームワークです。
2013

7

私はCakeとしか話すことができず、MVCに関してはそれについて何も言うことはありません。彼らはMVCを正しく行いません。Codeigniterも同様です。MVCをしばらく使用した後でも、MVCを「取得」しなかったのは不思議ではありません。

MVCは、アプリケーションのロジックの3つの異なるコンポーネントを適切に分離することです。アプリケーションのコアプレゼンテーション、および実際のコンテキストで両方を機能させるために必要な接着剤です。

アプリのコアには、アプリを「アプリ」にするビジネスロジック、データベースの相互作用、サービス、ビープ音、ブープがすべて含まれています。モデルは特定の形状の特定のものではなく、アプリを機能させるために必要なものです。アプリである「モデル」は1つだけです。

ビューは、モデルの動作を何らかの方法で出力するために使用されます。これはユーザーインターフェイスです。ユーザーに役立つ情報を表示するために必要なことは何でもあります。これは、Webサイトの場合もあれば、コマンドラインインターフェイスの場合もあれば、ネイティブデスクトップGUIの場合もあります。アプリでは3つすべてを使用できます。

Controllerは単に、その作業を行うために残されたものであり、主にユーザー入力を受け取り、それを適切な場所に転送するものです。さまざまな種類のコンテキスト、たとえば、着信HTTP要求を処理できるコントローラ、コマンドライン入力を処理するコントローラ、GUIイベントに接続されているコントローラなど、さまざまな種類のコントローラを使用できます。

これらの個々のパーツの具体的な形状は、アプリに完全に依存します。3つすべては、独自のミニアプリケーションのようなものにすることができます。テンプレートプレハブフレームワークの「モデル」は、何かをすばやく立ち上げて実行するのに役立つ一般化された1つのケース用に作成されています。多くの場合、モデルがとるべき最適な形式ではありません。アプリの構築には、アプリの構築に最適な独自の構造を考え出す必要があります。OOPの原則、SOLID、依存関係の注入などを調べ、これらのガイドラインに従ってコアモデルを構築します。次に、必要に応じてビューとコントローラーをラップします。

この分離のポイントは、単にアプリを保守可能および拡張可能にすることです。モデルには、特定の入力または出力の形式に固有のものが含まれていません。たとえば、フォーマット固有のテキスト(HTML形式のエラーメッセージなど)は含まれていません。特定の入力形式(HTTP要求など)を想定していません。逆に、ビューにはビジネスロジックが含まれていません。その仕事は単に出力することです。また、コントローラーにはビジネスロジックも含まれていません。その役割は「入力」することだけです。その理由は、コントローラーとビューの両方が交換可能ですが、アプリは交換できないためです。

このためのフレームワークを使用する場合は、モジュール式で、必要なことをすべて実行できるフレームワークを使用してください。Zend、Symfony、Laravel、および類似のコンポーネントベースのピックアンドチョークフレームワークがこれに最適です。


いくつかの疑問を解決してくれてありがとう!私はこの行を読んだときにあなたが何を意味するのかを理解した。コントローラとビューはどちらも交換可能ですが、アプリは交換できません。ただし、1つの質問:フレームワークのフォルダー構造には、「モデル」というフォルダーがあります。「私のアプリ」自体が「モデル」である場合、この「モデル」フォルダにあるものを実際にどのように呼び出す必要がありますか?
きんどんちゅ

もう1つ質問があります... このチュートリアルは、MVCパターンの理解に似ていると考えられますか?何か共通点があるようですが、よくわかりません。特に、多くのエンティティクラスを持つ1つのモデルにすべてのロジックを含めることに関する管理者のコメント、このリンク
きどんちゅ

私はそのチュートリアルをざっと見ただけですが、「実際の」MVCに沿っているようです。モデルは少し薄いように見えますが、それは単なる例であるためです。モデルフォルダーには "model"という名前を付けていますが、その中にいくつかのサブフォルダーを作成しています。通常、私は少なくとも「プリミティブ」(などBook)、サービス(「アクション」などcollateBookCollection)、ストレージsaveBookToDatabase)を区別します。注意が必要なのは、コントローラーにコードを入れすぎないことです。これは、Cake&coのものです。完全に間違っている。代わりに、モデルを本当に太らせます。
2013

私は自分に名前を付けdomainます:p
エサイリヤ2013

7

このようなフレームワークは、いくつかの理由で存在できない可能性があります。

まず、MVCパターンのモデルは、アプリケーションをアプリケーションにする部分です。フレームワークがモデルの外観を厳密に定義する場合、そのフレームワークは1つまたは多くても少数のアプリケーションでのみ使用できます。これにより、フレームワークとしての機能が実質的に停止します。

2番目の問題は、MVCパターンの適切なアプリケーションがどのように見えるかについて、普遍的なコンセンサスがないことです。たとえば、コントローラはモデルから必要なデータをビューに提供する必要があると言う人もいれば、ビューがそれ自体で必要な情報を取得し、コントローラがビューに場所を知っていることを確認する必要があると言う人もいます。モデルを見つけます。
Webアプリケーションに固有のもう1つの例は、ビューで実行できる処理の量です。ビューによっては、一部のプレースホルダーが実際のコンテンツ(通常はコントローラーからモデルから取得される)に置き換えられるHTMLファイルのみで構成されているものもあれば、国際化などのビューにUI関連の処理を行わせることに完全に満足しているものもあります。提示されたコンテンツの。


1
そうですか。この引用を見たことがあります。「10人の異なる人に「MVCとは何か」と尋ねると、10種類の答えが得られます」。それがあなたの2つ目のポイントの意味だと思います。
きどんちゅ

@kidonchu:それはその一部ですが、これらの10人から11の異なる回答を得ても驚くべきではありません;-)
Bart van Ingen

2

私はこの投稿が1年前のものであることを理解しています。それが皮肉なことに、私がこの応答を投稿している理由です。まず、この質問に答えた人の一部は正しいです。箱から出してすぐに「MVC対応」のPHPフレームワークを実際に見つけることは決してありません。フレームワークと見なすことは、MVCに従って、Devがフレームワーク上に構築できる基盤となるはずです。しかし、これが投稿されてから昨年、PHPフレームワークのいくつかは確かに長い道のりを歩んできました。

私は少しの間CakePHPをいじりましたが、今日までそれはディレクトリと構造の恐ろしい、乱雑な設定であり、ロジック間に明確な区別はなく、コードのコメントがかなり不十分であり、すべてが1つのバンドルにまとめられています。混乱。それはCakePHPの頭にあなたの怒りではありません、それは単純な真実です。

Zend、素晴らしいです。彼らは優れたドキュメントとコードのコメントを提供し、非常に友好的なコミュニティを持ち、初心者でも中級者でもある開発者に非常に素晴らしいフレームワークを提供します。OPがこれを投稿して以来、彼らは長い道のりを歩んできました。

そして、OPの質問に答えるそのようなフレームワークはないと言っている人々にとって、彼らは私が上で言ったように正しいです。しかし、それらもまた間違っています。Zend、Laravel、CodeIgniterは素晴らしいフレームワークであり、MVCを「提供」しませんが、開発者が美しく構築されたMVCアプリケーションを作成するための道を切り開きます。実践。

このスレッドでCodeIgniterを言うのは恐ろしいことです。少なくとも今日の基準では、あなたはかなり間違っています。この投稿の時点では、私はフレームワークに夢中でなかったので、その時点ではそれを見ていませんでした。そのため、当時は恐ろしかったかもしれません。しかし、今はすべてのWebアプリケーションで使用しています。彼らは、理解可能なディレクトリ構造を備えた強固なフレームワークを作成する優れた仕事をしているだけでなく、MVCを使い始めるための素晴らしいツールを提供しています。彼らはロジックの区別で素晴らしい仕事をしており、サポートのための素晴らしいコミュニティを持っています。そして、彼らは全体的に、優れた無料のフレームワークを提供します。

要点へ。私はこの問題について自分の意見を挿入したかった。MVCで構築された、すぐに使用できる完璧なフレームワークは決して見つかりません。ただし、適切なMVCプラクティスを利用し、Zend、Laravel、CodeIgniterなどの強固なフレームワークを選択すれば、問題はありません。生の真実であるため、MVCは、フレームワークではなく、開発者が優れた実践をどのように実装するかを開発者次第です。フレームワークは基盤を提供し、残りは開発者次第です。

リファレンスとして使用するのに適したフレームワーク

  • CodeIgniter
  • Zend Framework
  • ララヴェル
  • symfony 2(コメントを読んだ後に追加されました。これは優れたフレームワークでもあるためです)

これらを使用するときは、MVCの適切なプラクティスに従うのは開発者としての責任です。優れたMVCプラクティスについては、膨大な数のチュートリアルがあります。私はいくつかの驚くべきガイドラインがある紳士のウェブサイトに偶然出会いました、そして彼は適切なMVCを目指しており、これまでのところ彼のブログ投稿はかなりうまくいっており、彼は学習を始めるのに最適な場所です。

参照

  • トムバトラーのプログラミングブログ:https : //r.je/

私はこの投稿が1年前のものであることを理解しています。それが皮肉なことに、私がこの返信を投稿している理由です。質問は実際にはトピック外と見なされており、そのように締めくくることに投票しました。このような投稿をトピック外と見なす理由の1つは、情報が非常に簡単に古くなっているためです。
Martijn Pieters

なぜあなたがsymfony 2を省いたのかと思っていました。それからトミーへの言及を見て、それがすべて明らかになりました。
Cerad

あなたが正しい。symfonyを忘れました。私はめったにそれを使用しないので、私はいつもそれを忘れます。しかし、私は好奇心旺盛です、トミーへの私の言及はどのように「それを明確にする」のですか?これはどういう意味ですか= P
Jason

さて、数年前にトムがより深刻な開発者の1人を困らせて、開発者がバグスプレーの缶を出してしまったことを言いましょう。トムは読むのは楽しいが、違う現実に住んでいる。
Cerad 2015年

私はそこには笑いません。彼はうるさくて非常に興味深く、間違いなく彼自身の現実に住んでいます。しかし、私は彼のModel View Confusionシリーズに感心しています。そして私にとって、彼は適切なMVCについて素晴らしいアプローチをしています。しかし、それは私の意見です。説明をありがとう@Cerad
Jason

1

多くのチュートリアルはMVCを明確に説明するのが苦手なため、「すべてをまとめる」のに苦労しているようです。私はあなたの手を「汚い」ものにして、それらが通常どのように問題に取り組むかを見るために約3から5の異なるフレームワークでシンプルなアプリケーションを構築することを勧めます。アプリケーションの基本的なMVCアーキテクチャをセットアップする方法に関するドキュメントを持っている人もいます。そうでない場合は、その特定のフレームワークのいくつかのmvcチュートリアルをいつでもググることができます。

FWIW Zendのプロジェクト/ディレクトリレイアウトの推奨事項が気に入りました:http : //framework.zend.com/manual/1.12/en/project-structure.project.html

Rasmusの「フレームワークのないPHP MVCフレームワーク」もご覧ください。それはあなたが本当にフレームワークを必要としないことを示しています、あなたはあなた自身の特定のニーズに合うようにあなた自身を構築することができます。さらに、あなたはコメントからキックを得るでしょう! http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html


はい、私はすべてを1つにまとめることができないことを認めます。ラスムスの記事へのリンクはいくつかの疑問をクリアしましたが、特に主なアイデアは、「MVCパターンを実装するためのフレームワークは不要」です。ありがとう!
きどんちゅ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.