0

MVC を正しく理解していますか?

ユーザー teresko による多くの投稿を読み、最終的に最新の MVC の本当の概念を理解したと思います。私はそれがどのように理解されているかを示す図を作成しました。誰かがこれを確認してくれることを願っています。この図が他のユーザーに役立つかもしれません。

計画したディレクトリ構造は「スマート」ですか?

また、フォルダ構造についても知りたいです。それらを構造化する非常にスマートで効率的な方法を使用する予定があるかどうかはあまりわかりません。私のルート ディレクトリには 4 つのフォルダーがあります。モデル フォルダーには、 data_mappersdomain_objects、およびservicesという 3 つのサブディレクトリが含まれています。プレゼンテーション フォルダーには、ビューコントローラーと呼ばれる 2 つのサブディレクトリが含まれています。ルート ディレクトリの 3 番目のフォルダーは、libと呼ばれるあまり確信が持てないフォルダーの 1 つで、別の 3 つのサブフォルダー、scriptsthemes、およびtemplatesが含まれています。(これは、ビューによって呼び出されるテンプレートに適した場所ですか?)。そして、私が持っている最後のフォルダーはconfigと呼ばれます(誰かがより良い名前の提案を思い付くことができれば、歓迎されます)。これは、ルーターと基本クラス、およびそのタイプのファイルを配置する場所です。私は自分のフレームワークで機能を追求するだけではありません。技術的に健全なものにしたいのですが、提案やアドバイスは大歓迎です。インデックスやルーターなどの作成を開始する前に、この時点までの私の理解が正しいことを確認したいので、もう一度やり直す必要はありません。ありがとう

これは、MVC での多言語サポートについて良い方法ですか?

(少し話題から外れますが、これを MVC フレームワークの計画に組み込む必要があります。他のユーザーに役立つかもしれません。質問に明確かつ簡潔に答えるには、Web サイトの構造を理解する必要があり、たまたま上記で詳しく説明しています)

私のウェブサイトは英語とフランス語で利用できる必要があり、どちらもたまたま話せます。テンプレート フォルダー内にさらに 2 つのサブフォルダーを作成する予定です。1 つはenともう1 つはfrという名前で、すべての英語のテンプレートを en フォルダーに配置し、それらをフランス語に翻訳して fr フォルダーに配置し、Web サイトをセットアップするだけです。www .mywebsite.com/en/home は英語のテンプレートを示し、www.mywebsite.com/fr/home はフランス語のテンプレートを示します。

en または fr のいずれかにリダイレクトされるメインの言語選択ページがあります。次に、2 文字の言語コードを $_SESSION 変数に格納する予定です。ビューは、この $_SESSION 変数を使用して、表示するテンプレートを選択します。これは、私のウェブサイトの古いバージョンで行った方法です。これは MVC で多言語サポートを実現する良い方法ですか、それとももっと良い方法はありますか?

URL をフランス語でも表示したい場合はどうすればよいですか? ビューファイルを複数のサブフォルダーに配置し、「/presentation/views/news/news.php」のように名前を付ける代わりに、「/pre sentation/views/news_nouvelles/news.php」のように名前を付けてから、作成しますルーター (URL とルーティングは私の弱点の 1 つですが、自分で学習します ;) 英語の URL に対応する変数に「_」の前のすべてを格納し、フランス語の URL に対応する変数にすべてを格納します。これは単なる理論であり、この最後の段落にあることはまだ試していません。多言語サポートは質問よりも議論のためのものですが、繰り返しになりますが、回答するには私のフレームワークを完全に理解する必要があるため、関連性があります/言語サポートについて説明します。

4

1 に答える 1

5

MVC に関連するのはこれだけではありません。多言語 URL を実装する場合は、ルーティングがすべてです。

ルーティング

基本的に、コードがコントローラーで何かを呼び出すまでに、URL から言語を認識し、入力のすべての部分をインスタンスの作成に役立つものに変換したリクエスト インスタンスを完全に初期化する必要があります。

$request = new Request($query);

$router = new Router;
$router->import('/path/to/routes.json');
$router->route( $request );

この時点で'/presentation/view/dernières/nouvelles'、認識されたパターンに基づいて、ユーザーのクエリ (例: から) を認識されたセグメントに分割したことになります。

たとえば、つや消しパターンが構成で次のように定義されていたとします。

/presentation[[/:action[/:filter]]/:resource]

そして、生成された結果は次のとおりです。

resource   >> 'nouvelles'
action     >> 'view'
filter     >> 'dernières'

国際化

翻訳は通常、データベースまたは何らかの構成ファイルに保存されます。この時点でサービス ファクトリが既に初期化されている場合は、この保存された構成とのやり取りを容易にするために、それに浸ることができます。

$normalizer = new Normalizer( $serviceFactory->create('translation') );
$normalizer->adjust($request);

保存された構成から翻訳して収集するものは次のようになります

  • translationユーザーがクエリで提供した値の
  • languageそのクエリフラグメントが書かれた
  • titleフラグメントに対応する

返されるデータは次のようになります。

 translation  |  language  |  label
-------------------------------------
 view         |  en        |  view
 dernières    |  fr        |  latest
 nouvelles    |  fr        |  news

注:クエリされた値も返す場合は、 を使用して単一の SQL クエリでそのような操作を実行できます
.. WHERE translation IN ( <the list> )。これにより、単一の要求ですべてを収集できます。

これらのエントリは、次の 2 つのタスクに使用されます。

  • 実際にリクエストを変換して、一致したパラメーターが実際にそれらに対応するクラス/メソッドを持つようにする
  • ユーザーが期待する言語を決定するため

これが終わるまでに、Requestインスタンス内のすべてのパラメータを翻訳し、いくつかの基準に基づいて、languageそのリクエストにパラメータを決定して追加する必要があります。

注:ブラウザーは、ヘッダーで言語関連の情報も送信します。設定によっては、Accepted-Languageヘッダーを使用して、ユーザーが好む言語を特定できます。

my 2 cents

于 2013-08-05T21:13:10.843 に答える