私は、私が最も「ベストプラクティス」の方法でオブジェクト指向プロジェクトとしてリファクタリングしたい構造化プログラミングを使って作成したプロジェクトを持っています。私はおそらく、このプロジェクトを使用している唯一のものになるでしょう。それは実際には他の人には意味がありません。しかし、私は卓越性の例として他の人にそれを示すかもしれません;)PHPプロジェクトの構造
私の質問はかなり一般的ですが、私はこれがOKであることを望みます。
私は3つの方法で分割することを考えています。バックエンド(メインクラス)、フロントエンド(getとpostsのチェック、コールクラスの機能)、visual(Twigのテンプレートを使用)などがあります。 私のプロジェクトでは、IPSフォーラムソフトウェアに外部の統合を使用しています(ユーザーセッションはそこに保持されます)。 これをどのように構造化するかについては、私のコードの考え方を参照してください。
私の質問:
- は私の一般的な構造は次のように「フロントエンド」から分離したクラスでOKですか?
- 私は、後でバックエンドを混乱させることなくフロントエンドの他のメンバー機能に切り替えることができるので、クラスの外のIPSからのメンバーの参照/処理を考えていますか?メンバーオブジェクトをクラスのどこにでも置くだけで、どのクラスの使用が常に少なくとも設定されているかを確認してください。
- メンバーデータをクラス(構文)にパラメータとして送信するか、今のように保ち、フロントエンドからパブリッククラスvarを設定する必要がありますか?
- 私のクラスはエラーに対して例外をスローするか、true/falseを返してエラーメッセージを設定する必要がありますか?
- フロントエンドもクラスであるべきですか?メインクラスを拡張しますか?
- このような__constructのエラーメッセージを設定するのは大丈夫ですか、それとも別の場所で行うべきですか?
- MyProjectクラスを複数のクラスに分割する必要がありますか?構造コードの現在のプロジェクトは10000行ですが、私はたくさんのビジュアルレンダリングを取り出すので、新しいクラスは約半分になるかもしれません。おそらく、MyProjectDisplayDataやMyProjectCreateDataなどのクラスですか?
- 答えが7の場合、他の特定のクラスが "拡張"するメッセージ、db、および一般的な機能のコアクラスは1つありますか?
- 別のものにしたいことがありますか?
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));
はあなたの助けをありがとう!
この質問は、https://codereview.stackexchange.com/に属しています。 – MikeT