SimplePage:ラピッドプロトタイピング用のシンプルで宣言的なフレームワーク

ミニマリズムのアイデアから生まれ、シンプルなサイトの迅速な開発を目指したシンプルなPHPフレームワークをHabr 共有したいと思います。







私はあなたに別のフレームワークを浸透させバーカーのようになりたくありません









記事ビューページの例
<?php $sp = [ 'layout' => [ 'title' => '', ], 'input' => [ INPUT_GET => [ 'id' => [ FILTER_SANITIZE_NUMBER_INT, [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1], 'comment' => '   ,  ' ] ], ], ], 'pdo' => [ 'queries' => [ 'article' => [ 'SELECT * FROM article WHERE id = :id', 'params' => [ 'id' => &$_GET['id'], ], ], ], ], ]; include('../../sp.php'); $article = $article->fetch(); ?> <h1> <?= $article->title ?> </h1> <div> <?= $article->content ?> </div> <ul> <li> <a href="/articles/edit?id=<?= $article->id ?>">edit</a> </li> <li> <a href="/articles/delete.php?id=<?= $article->id ?>">delete</a> </li> </ul>
      
      





記事を削除するアクションの例
 <?php <?php if($_SERVER['REQUEST_METHOD'] != 'GET'){ http_response_code(404); exit; } $sp = [ 'input' => [ INPUT_GET => [ 'id' => [ FILTER_SANITIZE_NUMBER_INT, [ 'filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1], 'comment' => '   ,  ' ] ], ], ], 'pdo' => [ 'queries' => [ [ 'DELETE FROM article WHERE id = :id', 'params' => [ 'id' => &$_GET['id'], ], ] ], ], ]; include('../sp.php'); header('Location: /articles', 302);
      
      





関心のある方のために、プロジェクトの機能、その利点、および使用例について簡単に説明します。







簡単な紹介



Jekyllに精通している場合は、SimplePageのほとんどの機能、つまり次のことを既に知っています。









 <?php $sp = [ //       'layout' => [ 'title' => ' ', ], ]; include('../../sp.php'); ?> <form action="/articles/create.php" method="POST"> <div> <input type="text" name="title" placeholder=""/> </div> <div> <textarea name="content"></textarea> </div> <div> <input type="submit" value=""/> </div> </form>
      
      







 ▾ articles/ ▸ _locale/ ▸ create/ ▾ edit/ index.php //    ▸ view/ create.php //    delete.php edit.php index.php //     index.php //  
      
      







長所と短所



利点:









短所:









プラグインとモジュール



フレームワークの機能を拡張し、アプリケーションソリューションを開発するためにそれぞれプラグインモジュールを使用します 。 最初は、原則として、アプリケーションのインフラストラクチャと補助コンポーネント、および2番目のアプリケーションソリューションです。







プラグインを接続するには、設定で指定するだけです:







 return [ 'plugins' => [ '_plugins/autoload.php', '_plugins/input.php', '_plugins/middleware.php', '_plugins/i18n.php', '_plugins/error.php', '_plugins/pdo.php', '_plugins/acl.php', '_plugins/layout.php', '_plugins/hook.php', ], ... ];
      
      





デフォルトでは、フレームワークには次のプラグインが付属しています。









開発者は、外部の依存関係やコンポーザーを使用するなど、独自のプラグインでこれらのプラグインを補完できます。







 return [ 'plugins' => [ 'vendor/autoload.php', '_plugins/markdown.php', ... ], ... ];
      
      





プラグインとは異なり、モジュールはPHPスクリプトのセットで表され、プロジェクトのアプリケーションタスク(「管理パネル」や「フォーラム」など)を解決するページでさえ表されます。







簡単なブログの例



このフレームワークを使用してブログを作成する例を考えてください。







まず、プロジェクトのルートにconfig.phpファイルを作成して、サイトの一般的な構成を実装します。







 <?php return [ 'plugins' => [ '_plugins/input.php', '_plugins/middleware.php', '_plugins/i18n.php', '_plugins/error.php', '_plugins/pdo.php', '_plugins/layout.php', ], 'layout' => [ 'title' => 'SimplePage', 'layout' => '_layout/default.html', ], 'pdo' => [ 'dsn' => [ 'mysql', 'dbname' => 'sp', 'charset' => 'UTF8', ], 'username' => 'root', 'password' => 'root', 'options' => [ PDO::ATTR_PERSISTENT => true ], ], ];
      
      





次に、_layout / default.htmlテンプレートを作成してレイアウトを実装します。これは、サイトのすべてのページに適用されます。







 <!DOCTYPE html> <html> <head> <title><?= i18n($title) ?></title> <meta charset="utf-8" /> <link href="/_css/style.css" rel="stylesheet"> </head> <body> <?= $content ?> </body> </html>
      
      





それでは、サイトのメインページを作成します。このために、index.phpファイルに次のように記述します。







 <?php include('sp.php') ?> <h1>Hello world</h1> <p>    <p> <ul> <li> <a href="/articles"></a> </li> </ul>
      
      





次に、記事のリストを含むページを作成します(このモジュールのテーブルは既にデータベースに作成されていると仮定しています)。そのため、articles / index.phpファイルに次のコードを記述します。







 <?php $start = isset($_GET['start'])? (int) $_GET['start'] : 0; $offset = isset($_GET['offset'])? (int) $_GET['offset'] : 2; $sp = [ 'layout' => [ 'title' => 'Articles', ], 'pdo' => [ 'queries' => [ 'articles' => [ 'SELECT * FROM article LIMIT :start, :offset', 'params' => [ 'start' => $start, 'offset' => $offset, ], ], 'articlesCount' => [ 'SELECT COUNT(*) FROM article', ], ], ], ]; include('../sp.php'); $articlesCount = $articlesCount->fetchColumn(); ?> <h1></h1> <p> <ul> <?php foreach($articles as $article): ?> <li> <a href="/articles/view?id=<?= $article->id ?>"> <?= $article->title ?> </a> </li> <?php endforeach; ?> </ul> <ul> <li>  <?= i18n_plural($articlesCount, '%d article') ?> </li> <li> <a href="/articles/create"><?= i18n('create') ?></a> </li> <li> <a href="/articles?start=<?= $start - $offset ?>"><?= i18n('prev') ?></a> </li> <li> <a href="/articles?start=<?= $start + $offset?>"><?= i18n('next') ?></a> </li> </ul> </p>
      
      





ご覧のとおり、ページテンプレートは国際化を使用しています。 したがって、articles / _locale / ru_RU.phpファイルを作成して、正しく機能させる必要があります。







 <?php return [ '' => [ 'plural_forms' => function($n){ if($n % 10 == 1 && $n % 100 != 11){ return 0; } elseif($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20)){ return 1; } else{ return 2; } }, ], '%d article' => [ '%d ', '%d ', '%d ', ], 'Articles' => '', 'create' => '', 'prev' => '', 'next' => '', ];
      
      





最後に、新しいブログ記事を作成するアクションを検討します。このために、articles / create.phpファイルを作成します。







 <?php if($_SERVER['REQUEST_METHOD'] != 'POST'){ http_response_code(404); exit; } $sp = [ 'pdo' => [ 'queries' => [ [ 'INSERT INTO article (title, content) VALUES (:title, :content)', 'params' => [ 'title' => $_POST['title'], 'content' => $_POST['content'], ], ], ], ], ]; include('../sp.php'); header('Location: /articles/view?id=' . pdo_build($sp['pdo'])->lastInsertId(), 302);
      
      






All Articles