4

まず第一に、私はそれを知っています

  • 車輪の再発明をしないでください
  • MVCには多くのフレームワークがあります。

これは制作作業ではなく、私の趣味のプロジェクトです。私がMVCをゼロから作成しているのは、MVCについてより深く理解し、自分自身が満足できるようにすることです。結局、私は自分自身にこう言うことができます:「あなたはそれを仲間にしました。あなたは自分でMVCフレームワークを書きました!


今私の問題に。通常、MVCでいくつかのクラスを記述し、最初からそこにあります。私たちは通常、それらを、、、、、およびのようなものBootstrapperRouter呼びRegistryますConfig。もっとあるかもしれませんが、今はこれらに焦点を当てたいと思います。そして通常、リクエストごとにこれらのクラスの複数のインスタンスは必要ありません(シングルトン?)。これらのクラスが何をするのかは、名前自体から非常に明らかだと思います。だから今私の質問に:

誰が最初に始めますか(そうだと思いますBootstrapper)?これらのクラスはどのようにリンクされていますか?それらはすべてシングルトンである必要がありますか?Bootstrapperこれらのインスタンス(例外の可能性があります)をアプリケーション内の他のクラス(おそらくシングルトンを使用)で利用できるようにするにはどうすればよいですか?

4

2 に答える 2

7

私は今まったく同じことをしているので、ここに私の見解があります:

  • Bootstrapper魔法の、CoreまたはInitializerクラスを使用しないでください。bootstrap.phpその機能をまたはinit.phpファイルのようなものに入れる方がはるかに優れています。私のプロジェクトでは、このようなファイルには、他のクラス間のすべての「配線」が含まれています(のインスタンスRouterが作成され、さまざまなファクトリが注入されるなど)。

  • アプリケーションでグローバル状態を使用しないでください(グローバル状態RegisterConfig導入する可能性が最も高い候補です)。この講義のプレイリストを見て、洞察を得ることをお勧めします。

  • 答えが「シングルトン」の場合、あなたは間違った質問をしている

  • アプリケーションがどこで開始するかは、コードの作成方法によって異なりますが、クラス内からキックされるべきではありません。フレームワークがどのように機能するかを理解する必要があるかもしれない他の人々(6か月後にあなたを含む)について考えてみてください。init()魔法の機能にたどり着くためだけに、別のクラスを掘るのは面倒だと思いました。

  • SOLIDの原則デメテルの法則が何であるかを学びます。

..私の2セント

于 2012-05-31T11:48:56.577 に答える
1

あなたの問題はMVCとはほとんど関係がなく、グローバル変数またはグローバル値の使用に関連しています。

このクラスの多くは、通常、クラスごとに1つのインスタンス(「シングルトン」)を必要とし、状況によっては、シングルトンを回避できない場合があります。この場合、シングルトンを使用しても問題ありません。

多くの本、チュートリアルが教えていないこと、シングルトンをいつどこで初期化すべきか。プログラミング言語からプログラミング言語への変更。

また、別のページに移動すると変数の値が失われるWebサイトの場合、それは複雑になります。

「セッション変数」と呼ばれるこの概念があります。これはシングルトンと連携して機能し、あるページから別のページに移動するときに値を保持できるようにします。

http://php.net/manual/en/session.examples.basic.php

あなたがウェブサイトを持っているとしましょう。いくつかのファイルといくつかのページがあります。これらのphpファイルの一部は直接呼び出され、「Webページ」と見なされます(例:「index.php」)。

他のphpファイルはライブラリファイルであり、他のファイルによって「必須」または「含まれている」ものであり、それ自体は「Webページ」とは見なされません。

ユーザーがwbeページのリンクをクリックし、ブラウザーが別のWebページを呼び出すと、これらの値がすべて失われる可能性があります。デスクトップアプリケーションで別のフォームを開くのとは異なります。

ユーザーが初めてWebサイトにアクセスしたとき(例: "index.php"):メインファイルは他のファイルを「含む」または「必要とし」、グローバル変数またはシングルトンを初期化します。

<?php
// filename: "config.php"

// another includes or requires here

class Config
{
   // begin data section
   public static $UserName;  
   public static $UserPassword;  
   // end data section

   // begin singleton section
   private static $_instance;

   public static function getInstance()
   {
      if (!self::$_instance instanceof self)
      {
         self::$_instance = new self;
      }
      return self::$_instance;
   }
   // end singleton section

   // start session section
   public static function SaveSession()
   {
     $_SESSION['config_username'] =  Config::$UserName;
     $_SESSION['config_password'] =  Config::$UserPassword;
   }   

   public static function RestoreSession()
   {
     Config::$UserName = $_SESSION['config_username'];
     Config::$UserPassword = $_SESSION['config_password'];
   }   
   // end session section

} // class Config

?>    

<?php
// filename: "index.php"

include ("config.php");
// another includes or requires here

class Application
{
   public static function main()
   {
      // prepare session variables
      session_start();

      // prepare singletons here
      $instance = Config::getInstance();

      // this code its an example
      $instance->UserName = "johndoe";
      $instance->UserPassword = "123";
      $instance->SaveSession();

      // all the page construction goes here
      // ...
   }
} //

// program starts here:
Application::main();

?>

ユーザーが別のページに変更すると、アプリケーションはセッションデータをシングルトンにリロードする必要があります。

<?php
// filename: "customers.php"

include ("config.php");
// another includes or requires here

class Application
{
   public static function main()
   {
      // copy data from session to singletons
      $instance->RestoreSession();

      // all the page construction goes here
      // ...
   }
} //

// program starts here:
Application::main();

?>

シングルトン間には関係がなく、通常は独立した値です。

乾杯。

于 2012-05-31T15:56:17.920 に答える