Slim Frameworkでシンプルな百科事典を書く

この記事では、Slim Frameworkを使用して非常に簡単な電子百科事典を作成するプロセスを見ていきます。 膨大な数の百科事典のメモと記事を含むデータベーステーブルがあるとします。 ユーザーに対応するメモを美しいテンプレートで表示する必要があります。



私たちの百科事典には、車に関するよくある質問への回答が含まれているかもしれませんし、医療ガイドかもしれません。 ポイントではありません。 主なことは、CRUDを必要としないことです。なぜなら、別のシステムがデータベーステーブルを埋める責任があるからです。 しかし、この単純なアプリケーションの安定性、速度、およびサポートの容易さは、私たちにとって非常に重要です。



このような百科事典は、他のフレームワークとCMSを使用して非常に簡単に作成できますが、Slimマイクロフレームワークを使用してみます。 なんで? すべてが非常に簡単です。このメモは、Slim Frameworkの学習を開始したい初心者プログラマ向けに設計されています。



コードを書き始めましょう。 エンサイクロペディアの唯一のタスクは、コンテンツを美しいテンプレートで表示することです。 この禁欲的な機能は、ヘルプシステムAPIに似ています。 モデルとそれに関連するすべての実装から始めましょう。 ページの一意の名前は、インターフェイスで言及されているメソッドが必要とする唯一の引数です。

interface IPortal { public function getContentByAlias($alias); }
      
      





次に、「getContentByAlias」メソッドを含むクラスを実装する必要があります。 このメモは読者の初心者レベル向けに設計されているため、エイリアス列にインデックスを設定する必要があることを具体的に思い出します。 エンサイクロペディアに多数の資料がある場合、インデックス(検索があります)により、データベースサーバーの速度が向上します。 キャッシング(memcachedやnginxツールなど)などの問題については触れません。これは別の非常に大きなトピックであるためです。 しかし、基本的なセキュリティ要件については、言及するのが理にかなっています。たとえば、次のように、シールドに対する責任をドライバーに移します。

 class Portal implements IPortal { private $_pdo; private $_sqlGetContentByAlias = 'SELECT `title`, `content` FROM `pages` WHERE `alias` = ? LIMIT 1;'; /** * Constructor */ public function __construct($_pdo) { $this->_pdo = $_pdo; } /** * Get content by alias */ public function getContentByAlias($alias) { $stm = $this->_pdo->prepare($this->_sqlGetContentByAlias); $stm->bindParam(1, $alias, PDO::PARAM_STR); $stm->execute(); return $stm->fetch(); } }
      
      





クエリでは、MySQLサブシステムに1つのレコード(「LIMIT 1」)のみが必要であることを明示的に示し、「fetch」を使用してデータを受信したことに注意してください。 1つのエントリのみ。 PDOを使用し、クラスのコンストラクターを介して接続を渡します。 Slimフレームワークには(私のお気に入りのLaravelやYii 2.0とは異なり)データベースを操作するための組み込み機能が含まれていないため、別の小さなクラスを作成する必要があります。 ご覧のとおり、Singletonが必要になります。これにより、データベースへの非常に必要な接続を取得できます。 私の主観的な意見では、適切な実装方法は次のとおりです。

 class Connect { private static $_instance; private $_pdo; private $_pdoUrl = 'mysql:host=localhost;dbname=kalinin;charset=utf8'; private $_pdoUser = 'root'; private $_pdoPassword = ''; private $_pdoPrm = [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]; /** * Constructor */ private function __construct() { $this->_pdo = new PDO($this->_pdoUrl, $this->_pdoUser, $this->_pdoPassword, $this->_pdoPrm); } /** * Singleton */ private function __clone() {} private function __wakeup() {} public static function getInstance() { if (self::$_instance === null) { self::$_instance = new self; } return self::$_instance; } /** * Get connection */ public function getConnection() { return $this->_pdo; } }
      
      





それで、工場自体の実装の時が来ました。 高い確率で、そのような電子百科事典は(新しい機能の意味で)開発されませんが、確率はまったくゼロではないため、設計の非常に初期の段階でプロジェクトを完成および開発する可能性を提供する必要があります。 工場の実装は次のとおりでした。

 require './app/models/iportal.php'; require './app/models/portal.php'; require './db/connect.php'; class Factory { public static function create($type) { $connection = Connect::getInstance()->getConnection(); switch ($type) { case "simple": return new Portal($connection); break; } } }
      
      





何も忘れていませんか? そうそう。 Slim自体はどこですか? まず、単純なアプリケーション-非常に禁欲的な電子百科事典-に必要なファイルを接続する必要があります。 この段階で、設定で「デバッグ」モードを指定します。

 require 'Slim/Slim.php'; require './app/models/factory.php'; \Slim\Slim::registerAutoloader(); $app = new \Slim\Slim(); $app->config('debug', true); $app->config(['templates.path' => './app/views/']); $conf['url'] = 'http://127.0.0.1:8098/';
      
      





ページのエイリアスに応じて、テンプレートにコンテンツを表示する必要があることを覚えていますか? renderメソッドの2番目の引数を使用して、データがビュー(MVCパターンのビュー)に転送されます。 また、データベースに検索エントリがない場合、ユーザーをメインページにリダイレクトするという要件もありました。 リダイレクト方法はこの問題を解決します。 “ use”を使用して、必要な配列と他の変数を匿名関数のスコープに渡します(クロージャーまたはラムダ関数はバージョン5.3以降でPHPに登場しました)。 試してみましょう:

 $app->get('/kalinin/:alias', function ($alias) use ($app, $conf) { $model = Factory::create("simple"); $content = $model->getContentByAlias($alias); if(empty($content)) { $app->redirect($conf['url'], 301); } $app->render('page.php', $content); });
      
      





ビューが静的コンテンツの場合、次の実装を使用するだけで十分です。

 $app->get('/', function () use ($app) { $app->render('main.php'); });
      
      





悲しいことを考えましょう。 間違いが発生する可能性があります。つまり、このような状況での電子百科事典の動作を明確に考慮する必要があります。 古代の賢者が言ったように、「プログラマーだけがXDEBUGではない」、つまり「実際のプロジェクトでは、いくつかのエラーを詳細に記録するのが理にかなっています」 検索エンジンの推奨によると、ページの検索に失敗した場合、404番目のエラーコードを発行する必要がありますが、この例では、エラーが発生した場合、ユーザーをメインページにリダイレクトします。 エラーを処理するには、次の2つのクロージャーを使用します(たとえば、301番目の応答コードでリダイレクトがあります)。

 $app->notFound(function () use ($app, $conf) { $app->redirect($conf['url'], 301); }); $app->error(function (\Exception $e) use ($app, $conf) { $app->redirect($conf['url'], 301); });
      
      





すべての準備が整いました。「run」メソッドを呼び出すだけです。

 $app->run();
      
      





ただ? 適切なドキュメントは、Slim Frameworkのすべての機能を理解するのに役立ちます。 もちろん、可能なアプローチの1つだけを説明しました。 1つまたは別のフレームワークを使用する必要性は、プログラマー自身(または会議の開発者グループ)によって決定されます。



All Articles