ゼロからサイトを開発するためのシンプルでモダンなMVC PHPフレームワーク

この記事の目的は、単純なOOP MVC PHPフレームワークを作成した経験を共有することです。 また、コミュニティにソースコードを提供し、批判、承認、コメント、サポートをお願いします。



はじめに



さまざまな最新のフレームワークの操作中に、すべてが内部にどのように配置されているかを十分に理解していないことに気付きました。 開発者がこのソリューションまたはそのソリューションを選択した理由がわかりません。 私は現在のタスクにのみ注意を払い、「より高く、より深く、より遠くに」見えません。 そして、専門的な成長のオプションとして、私は自分のプロジェクトを作成することにしました。



実践がさらに示したように、何かを読んで、知って、聞いて、それを自分で実現できるということは、まったく別のものです。 理論化は無限である可能性がありますが、現在の実際的なタスクによってのみ、あなたがどのレベルであるかを理解できます。 これに関連して、「自分の自転車を書く」ことが始まりました。 どのように結果が出るかはあなた次第です。



開発プロセス



フレームワークの開発は次のように実行されました。最初は、完成、書き換え、構造の変更、新しいクラスやコンポーネントの肥大化などの簡単なWebアプリケーションがありました。数か月前、真剣に。」 このバージョンの作成には、合計3〜4週間を費やしました(1日平均3〜4時間、週3〜4日作業)。



標準と要件が開発されるにつれて、私は自分自身を故意に過大評価し、最適なソリューションを探し、コードを何度も書き直しました。 そのため、たとえば、構成を5〜6回(そして劇的に数回)、ルーティングを3〜4回やり直しました。 例として、記事、出版物、マニュアル、フレームワーク(Yii2、CodeIgniter、Zend、Phalcon、Bun)などからコードを取得しました。



要件分析



すべては要件の分析から始まり、最終的なシステムを望みます。



フレームワークは次のことを行う必要があります。





応用技術



そのような決定のリストは、あなたが何を知っているか、そして実際の実践で何を適用するかに直接依存します。 つまり 新製品やIT分野の変化を継続的に監視する必要性に迫っています。



実践と技術:





フォルダー構造



フレームワーク内のファイルとフォルダーの構造を示します( GitHubでコードを確認することもできます )。



画像






コード



アプリケーションには1 つのエントリポイントがあります。 index.phpファイルのコードをWebサーバーのルートパブリックフォルダーから取得します。



session_start(); $loader = require(__DIR__ . '/../../vendor/autoload.php'); $loader->addPsr4('framework\\', __DIR__ . '/../../system/'); $loader->addPsr4('frontend\\', __DIR__ . '/../'); $loader->addPsr4('common\\', __DIR__ . '/../../common/'); $config = array_merge( require(__DIR__ . '/../config/main.php'), require(__DIR__ . '/../../common/config/main.php') ); $appication = new \framework\core\Application(); $appication->run($config);
      
      





class \ framework \ core \ Application()から($ config)メソッドコードを実行します 。 必要なアプリケーションクラスがロードされ、対応するコントローラーが( execute()メソッドで)呼び出されます。



  /** * * @param array $config */ public function run($config = []) { $this->benchmark = new Benchmark(); $this->environment = Environment::get(); $this->config = new Registry($config); $this->response = new Response(); $this->request = Request::getInstance(); $this->assets = new Asset($this->config->assets); $this->setParams(); $this->router = new Router($this->config->routes); $this->execute(); }
      
      





\ framework \ core \ Application()クラスのexecute()メソッドのコード。 この段階で目的のコントローラーは既に選択されています。このコントローラーを初期化し、ヘッダーを処理し、コンテンツを表示します。 エラーが発生した場合は、 404 Not Foundをスローします。



  public function execute() { $controllerName = $this->router->getControllerName(); try { $controllerClass = '\\' . $this->config->name . '\controllers\\' . $controllerName . 'Controller'; if (class_exists($controllerClass)) { $controller = new $controllerClass; if ($controller instanceof Controller) { $controller->setApplication($this)->run(); } } else { throw new CoreException('Controller "' . $controllerName . '" not exists: ' . Request::getInstance()->server["REQUEST_URI"]); } } catch (CoreException $e) { $e->logError(); $this->response->setHeader("HTTP/1.1 404 Not Found"); $this->router->error404(); $this->execute(); exit(); } foreach ($this->response->getHeaders() as $header) { header($header); } echo $this->response->getContent(); }
      
      





改善と今後の計画



データベースに接続するためのアダプターとして、 PDOを使用しました。 PDOの過程で、私はそれがあまり好きではありませんでした。リクエストをデバッグするのは難しいので、ORMを快適に使用したいと思います。 Eloquent ORMをインストールできます-これは最新の既製のソリューション(Laravelフレームワークで使用)であり、さらに文書化されており、作曲家から数分でインストールできます。



また、フレームワークの基本機能を拡張することも考えました。モジュールのサポートを追加したかったのです。 つまり たとえば、ブログを個別のモジュールとして作成できます(独自のコントローラー、ビューアー、モデルなど)。 そして、このモジュールをアプリケーションのどこにでも接続します。



カーネル内の基本的な「紳士的」クラスのセットを拡張し、ロギング、エラー処理、構成のシステムを複雑にし、すべての機能を備えた本格的なデモサイトを作成できます。



おわりに



コード、アーキテクチャ、初期要件などの批判を聞いてうれしいです。 私は積極的にコメントを読み、質問に答えようとします。



また、このフレームワークに基づいてプロジェクトを実装したいと思います。 つまり、作業中のツールを試してみてください。 このセクションでは顧客の検索がまったくないことは明らかですが、このソリューションで実際のプロジェクトを開始できるかどうか聞きたいのですが? 「すぐに使える」人気のあるフレームワークは、機能が50〜100倍向上し、より大きくなります。それらと競合することは困難です。



GitHubのコード



All Articles