2017-05-22 11 views
1

私は、私が最も「ベストプラクティス」の方法でオブジェクト指向プロジェクトとしてリファクタリングしたい構造化プログラミングを使って作成したプロジェクトを持っています。私はおそらく、このプロジェクトを使用している唯一のものになるでしょう。それは実際には他の人には意味がありません。しかし、私は卓越性の例として他の人にそれを示すかもしれません;)PHPプロジェクトの構造

私の質問はかなり一般的ですが、私はこれがOKであることを望みます。

私は3つの方法で分割することを考えています。バックエンド(メインクラス)、フロントエンド(getとpostsのチェック、コールクラスの機能)、visual(Twigのテンプレートを使用)などがあります。 私のプロジェクトでは、IPSフォーラムソフトウェアに外部の統合を使用しています(ユーザーセッションはそこに保持されます)。 これをどのように構造化するかについては、私のコードの考え方を参照してください。

私の質問:

  1. は私の一般的な構造は次のように「フロントエンド」から分離したクラスでOKですか?
  2. 私は、後でバックエンドを混乱させることなくフロントエンドの他のメンバー機能に切り替えることができるので、クラスの外のIPSからのメンバーの参照/処理を考えていますか?メンバーオブジェクトをクラスのどこにでも置くだけで、どのクラスの使用が常に少なくとも設定されているかを確認してください。
  3. メンバーデータをクラス(構文)にパラメータとして送信するか、今のように保ち、フロントエンドからパブリッククラスvarを設定する必要がありますか?
  4. 私のクラスはエラーに対して例外をスローするか、true/falseを返してエラーメッセージを設定する必要がありますか?
  5. フロントエンドもクラスであるべきですか?メインクラスを拡張しますか?
  6. このような__constructのエラーメッセージを設定するのは大丈夫ですか、それとも別の場所で行うべきですか?
  7. MyProjectクラスを複数のクラスに分割する必要がありますか?構造コードの現在のプロジェクトは10000行ですが、私はたくさんのビジュアルレンダリングを取り出すので、新しいクラスは約半分になるかもしれません。おそらく、MyProjectDisplayDataやMyProjectCreateDataなどのクラスですか?
  8. 答えが7の場合、他の特定のクラスが "拡張"するメッセージ、db、および一般的な機能のコアクラスは1つありますか?
  9. 別のものにしたいことがありますか?

myproject_class.php:

namespace MySpace; 

use \PDO; 
use \PDOException; 
use \Exception; 

class MyProject { 

    public $projectdata; 
    public $errormessages; 
    public $ips_member; 

    function __construct() { 
     //set up vars for error messages 
     $this->errormessages["database_queryfailed"] = "Query failed"; 
     $this->errormessages["general_missingdata"] = "Missing data"; 
     $this->errormessages["handling_something"] = "Some error"; 
    } 

    public function displaySomeData ($id) { 
     if ($id == ""){ 
      throw new Exception($this->$errormessages["general_missingdata"]); 
     } 

     try{ 
      $sql = "GET SOME DATA FROM DB"; 
      //PDO execute 
     }catch (PDOException $e) { 
      throw new Exception($this->$errormessages["database_queryfailed"] . " SQL: " . $sql); 
     } 

     $this->projectdata = array(); 
     $this->projectdata["one"] = "cool"; 
     $this->projectdata["two"] = "verycool"; 

     if ($someerror){ 
      throw new Exception($this->$errormessages["handling_something"]); 
     } 
    } 

    public function createSomeData(){ 
     try{ 
      $sql = "INSERT SOME DATA IN DB"; 
      //PDO execute 
     }catch (PDOException $e) { 
      throw new Exception($this->$errormessages["database_queryfailed"] . " SQL: " . $sql); 
     } 
    } 
} 

フロントエンドのindex.php:

require_once 'vendor/autoload.php'; 
require_once 'myproject_class.php'; 
require 'forum/init.php'; 

//forum initialize 
\IPS\Session\Front::i(); 
$ips_member = \IPS\Member::loggedIn(); 

//load class 
try { 
    $myproj = new MySpace\MyProject(); 
    $myproj->ips_member = $ips_member; 
} catch (Exception $e) { 
    die($e->getMessage()); //not die, but handle in some way 
} 

//check get or post var to decide what to do 
if ($_GET["dowhat"] == "display"){ 
    try { 
     $myproj->displaySomeData($_GET["id"]); 
    } catch (Exception $e) { 
     die($e->getMessage()); //not die, but handle in some way 
    } 
} 

//twig rendering 
$loader = new Twig_Loader_Filesystem('template'); 
$twig = new Twig_Environment($loader); 
$template = $twig->load('myproject.html'); 

echo $template->render(array('projectdata' => $myproj->projectdata, 'member' => $ips_member)); 

はあなたの助けをありがとう!

+2

この質問は、https://codereview.stackexchange.com/に属しています。 – MikeT

答えて

0

コードベースが約10k行の場合、2〜3クラスでそれを詰める方法はありません(明らかに可能ですが、ひどい考えです)。

まず、テンプレートでHTMLを抽出する必要があります。枝は素晴らしい選択であり、あなたによく役立つはずです。しかし、次のステップはおそらくルーティングロジックを導入することで、レンダリングするテンプレートの選択を自動化することができます。

OOPの一般的な理解については、thisthis講義をお勧めします。私は感情を覚えているので、あなたはOOPのパラダイム全体を本当に理解していないということです。

そして、悪用しないでくださいextendsキーワード。 OOPにはこの古い引用があります:"相続よりも組成が好きでしょう"。そしてそれはそれをかなりうまくまとめます。

エラー処理については、ほんの数日前に書きましたので、私はちょっと怠け者になります。older postに簡単に説明し、それぞれの欠点に触れました。

最後に、DBを扱うために:DBへのアクセスが必要な各クラスは、PDO(またはMySQLi)のインスタンスをそのコンストラクタに渡す必要があります。そのようなクラスが複数ある場合は、その接続インスタンスの共有に役立つかもしれません。this post