Fuelphp-complete-working-example

提供:Dev Guides
移動先:案内検索

FuelPHP-完全な作業例

この章では、FuelPHPでMVCベースの完全なBookStoreアプリケーションを作成する方法を学びます。

ステップ1プロジェクトを作成する

以下のコマンドを使用して、FuelPHPで「BookStore」という名前の新しいプロジェクトを作成します。

oil create bookstore

ステップ2レイアウトを作成する

アプリケーションの新しいレイアウトを作成します。 ファイルfuel/app/views/layout.phpにlayout.phpを作成します。 コードは次のとおりです。

fuel/app/views/layout.php

<!DOCTYPE html>
<html lang = "en">
   <head>
      <meta charset = "utf-8">
      <meta http-equiv = "X-UA-Compatible" content = "IE = edge">
      <meta name = "viewport" content = "width = device-width, initial-scale = 1">
      <title><?php echo $title; ?></title>

      <!-- Bootstrap core CSS -->
      <link href = "/assets/css/bootstrap.min.css" rel = "stylesheet">
      <script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
      </script>
      <script src = "/assets/js/bootstrap.min.js"></script>
   </head>

   <body>
      <nav class = "navbar navbar-inverse navbar-fixed-top">
         <div class = "container">
            <div class = "navbar-header">

               <button type = "button" class = "navbar-toggle collapsed"
                  datatoggle = "collapse" data-target = "#navbar"
                  aria-expanded = "false" ariacontrols = "navbar">
                  <span class=  "sr-only">Toggle navigation</span>
                  <span class = "icon-bar"></span>
                  <span class = "icon-bar"></span>
                  <span class = "icon-bar"></span>
               </button>
               <a class = "navbar-brand" href = "#">FuelPHP Sample</a>
            </div>

            <div id = "navbar" class = "collapse navbar-collapse">
               <ul class = "nav navbar-nav">
                  <li class = "active"><a href = "/book/index">Home</a></li>
                  <li><a href = "/book/add">Add book</a></li>
               </ul>
            </div><!--/.nav-collapse -->
         </div>
      </nav>

      <div class = "container">
         <div class = "starter-template" style = "padding: 50px 0 0 0;">
            <?php echo $content; ?>
         </div>

      </div><!--/.container -->
   </body>

</html>

ここでは、ブートストラップテンプレートを使用しています。 FuelPHPは、ブートストラップテンプレートをサポートしています。 タイトルとコンテンツの2つの変数を作成しました。 titleは現在のページのタイトルを指定するために使用され、contentは現在のページの詳細を指定するために使用されます。

ステップ3コントローラーを作成する

新しいコントローラーController_Bookを作成して、ブックを表示、追加、編集、および削除します。 新しいファイルfuel/app/classes/controller/book.phpを作成し、次のコードを配置します。

fuel/app/classes/controller/book.php

<?php
   class Controller_Book extends Controller_Template {
      public $template = 'layout';
      public function action_index() {

        //Create the view object
         $view = View::forge('book/index');

        //set the template variables
         $this->template->title = "Book index page";
         $this->template->content = $view;
      }
   }

ここでは、テンプレートコントローラーを継承してブックコントローラーを作成し、デフォルトのテンプレートをfuel/app/views/layout.phpに設定しています。

ステップ4インデックスビューを作成する

fuel/app/viewsフォルダーの下のviewsディレクトリーにフォルダーを作成します。 次に、bookフォルダー内にindex.phpファイルを作成し、次のコードを追加します。

fuel/app/views/index.php

<h3>index page</h3>

今のところ、基本的なブックコントローラーを作成しました。

ステップ5デフォルトルートを変更する

デフォルトのルートを更新して、アプリケーションのホームページをコントローラーの予約に設定します。 デフォルトのルーティング設定ファイルfuel/app/config/routes.phpを開き、次のように変更します。

fuel/app/config/routes.php

<?php
   return array (
      '_root_'  => 'book/index', //The default route
      '_404_'   => 'welcome/404',//The main 404 route

      'hello(/:name)?' => array('welcome/hello', 'name' => 'hello'),
   );

ここで、URLをリクエストすると、http://localhost:8080/は次のようにブックコントローラーのインデックスページを返します。

インデックスページを返す

ステップ6データベースを作成する

次のコマンドを使用して、MySQLサーバーに新しいデータベースを作成します。

create database finddevguides_bookdb

次に、次のコマンドを使用してデータベース内にテーブルを作成します。

CREATE TABLE book (
   id INT PRIMARY KEY AUTO_INCREMENT,
   title VARCHAR(80) NOT NULL,
   author VARCHAR(80) NOT NULL,
   price DECIMAL(10, 2) NOT NULL
);

次のSQLステートメントを使用して、テーブルにサンプルレコードを挿入します。

INSERT
INTO
   book(title,
   author,
   price)
VALUES(
   'The C Programming Language',
   'Dennie Ritchie',
   25.00
),(
   'The C++ Programming Language',
   'Bjarne Stroustrup',
   80.00
),(
   'C Primer Plus (5th Edition)',
   'Stephen Prata',
   45.00
),('Modern PHP', 'Josh Lockhart', 10.00),(
   'Learning PHP, MySQL & JavaScript, 4th Edition',
   'Robin Nixon',
   30.00
)

手順7データベースの構成

fuel/app/configにあるデータベース構成ファイルdb.phpを使用してデータベースを構成します。

fuel/app/config/db.php

<?php
   return array (
      'development' => array (
         'type'           => 'mysqli',
         'connection'     => array (
            'hostname'       => 'localhost',
            'port'           => '3306',
            'database'       => 'finddevguides_bookdb',
            'username'       => 'root',
            'password'       => 'password',
            'persistent'     => false,
            'compress'       => false,
         ),
         'identifier'     => '`',
         'table_prefix'   => '',
         'charset'        => 'utf8',
         'enable_cache'   => true,
         'profiling'      => false,
         'readonly'       => false,
      ),
      'production' => array (
         'type'           => 'mysqli',
         'connection'     => array (
            'hostname'       => 'localhost',
            'port'           => '3306',
            'database'       => 'finddevguides_bookdb',
            'username'       => 'root',
            'password'       => 'password',
            'persistent'     => false,
            'compress'       => false,
         ),
         'identifier'     => '`',
         'table_prefix'   => '',
         'charset'        => 'utf8',
         'enable_cache'   => true,
         'profiling'      => false,
         'readonly'       => false,
      ),
   );

ステップ8 Ormパッケージを含める

メイン構成ファイルを更新して、ORMパッケージを含めます。 「fuel/app/config/」にあります。

fuel/app/config/config.php

'always_load' => array (
   'packages' => array (
      'orm'
   ),
),

ステップ9モデルを作成する

「fuel/app/classes/model」にあるbook.phpでブックモデルを作成します。 次のように定義されます-

fuel/app/classes/model/book.php

<?php
   class Model_Book extends Orm\Model {
      protected static $_connection = 'production';
      protected static $_table_name = 'book';
      protected static $_primary_key = array('id');

      protected static $_properties = array (
         'id',
         'title' => array (
            'data_type' => 'varchar',
            'label' => 'Book title',
            'validation' => array (
               'required',
               'min_length' => array(3),
               'max_length' => array(80)
            ),

            'form' => array (
               'type' => 'text'
            ),
         ),
         'author' => array (
            'data_type' => 'varchar',
            'label' => 'Book author',
            'validation' => array (
               'required',
            ),
            'form' => array (
               'type' => 'text'
            ),
         ),
         'price' => array (
            'data_type' => 'decimal',
            'label' => 'Book price',
            'validation' => array (
               'required',
            ),
            'form' => array (
               'type' => 'text'
            ),
         ),
      );
      protected static $_observers = array('Orm\\Observer_Validation' => array (
         'events' => array('before_save')
      ));
   }

ここでは、データベースの詳細をモデルのプロパティとして指定しました。 検証の詳細もあります。

ステップ10書籍を表示する

ブックコントローラーのインデックスアクションを更新して、データベース内の利用可能なブックを一覧表示します。

fuel/app/classes/controller/book.php

<?php
   class Controller_Book extends Controller_Template {
      public $template = 'layout';
      public function action_index() {

        //Create the view object
         $view = View::forge('book/index');

        //fetch the book from database and set it to the view
         $books = Model_Book::find('all');
         $view->set('books', $books);

        //set the template variables
         $this->template->title = "Book index page";
         $this->template->content = $view;
      }
   }

ここでは、 orm を使用してデータベースから書籍の詳細を取得し、書籍の詳細をビューに渡しました。

手順11インデックスビューを更新する

「fuel/app/views/book」にあるビューファイルindex.phpを更新します。 完全に更新されたコードは次のとおりです。

fuel/app/views/book/index.php

<table class = "table">
   <thead>
      <tr>
         <th>#</th>
         <th>Title</th>
         <th>Author</th>
         <th>Price</th>
         <th></th>
      </tr>
   </thead>

   <tbody>
      <?php
         foreach($books as $book) {
      ?>

      <tr>
         <td><?php echo $book['id']; ?></td>
         <td><?php echo $book['title']; ?></td>
         <td><?php echo $book['author']; ?></td>
         <td><?php echo $book['price']; ?></td>
         <td>
            <a href = "/book/edit/<?php echo $book['id']; ?>">Edit</a>
            <a href = "/book/delete/<?php echo $book['id']; ?>">Delete</a>
         </td>
      </tr>

      <?php
      }
      ?>
   </tbody>
</table>
<ul>
</ul>

ここで、URLを要求すると、http://localhost:8080/は次のようにページを表示します-

インデックスビュー

ステップ12ブックを追加するアクションを作成する

新しい本を書店に追加する機能を作成します。 次のように、ブックコントローラーで新しいアクションaction_addを作成します。

public function action_add() {

  //create a new fieldset and add book model
   $fieldset = Fieldset::forge('book')->add_model('Model_Book');

  //get form from fieldset
   $form = $fieldset->form();

  //add submit button to the form
   $form->add('Submit', '', array('type' => 'submit', 'value' => 'Submit'));

  //build the form  and set the current page as action
   $formHtml = $fieldset->build(Uri::create('book/add'));
   $view = View::forge('book/add');
   $view->set('form', $formHtml, false);

   if (Input::param() != array()) {
      try {
         $book = Model_Book::forge();
         $book->title = Input::param('title');
         $book->author = Input::param('author');
         $book->price = Input::param('price');
         $book->save();
         Response::redirect('book');
      } catch (Orm\ValidationFailed $e) {
         $view->set('errors', $e->getMessage(), false);
      }
   }
   $this->template->title = "Book add page";
   $this->template->content = $view; }

ここでは、次の2つのプロセスが実行されています。

  • FieldsetメソッドとBookモデルを使用してブックを追加するブックフォームを作成します。
  • ユーザーが書籍情報を入力してフォームを送信したときの書籍フォームの処理。 入力されたデータのInput :: param()メソッドをチェックすることで見つけることができます。 フォームの処理には、次の手順が含まれます-
  • 書籍情報を収集します。
  • 書籍情報を検証します。 saveメソッドの前に検証が呼び出されるように設定済みです。 検証に失敗すると、Orm \ ValidationFailed例外がスローされます。
  • 書籍情報をデータベースに保存します。
  • 成功時にユーザーをインデックスページにリダイレクトします。 それ以外の場合は、フォームを再度表示します。

同じアクションでフォームを処理するだけでなく、フォームを表示する両方を行っています。 ユーザーが初めてアクションを呼び出すと、フォームが表示されます。 ユーザーが書籍情報を入力してデータを送信すると、フォームが処理されます。

ステップ13ブックアクションを追加するためのビューを作成する

ブックアクションを追加するためのビューを作成します。 新しいファイルfuel/app/views/book/add.phpを作成し、次のコードを入力します。

<style>
   #form table {
      width: 90%;
   }
   #form table tr {
      width: 90%
   }
   #form table tr td {
      width: 50%
   }
   #form input[type = text], select {
      width: 100%;
      padding: 12px 20px;
      margin: 8px 0;
      display: inline-block;
      border: 1px solid #ccc;
      border-radius: 4px;
      box-sizing: border-box;
   }
   #form input[type = submit] {
      width: 100%;
      background-color: #3c3c3c;
      color: white;
      padding: 14px 20px;
      margin: 8px 0;
      border: none;
      border-radius: 4px;
      cursor: pointer;
   }
   #form div {
      border-radius: 5px;
      background-color: #f2f2f2;
      padding: 20px;
   }
</style>

<div id = "form">
   <h2>Book form</h2>

   <?php
      if(isset($errors)) {
         echo $errors;
      }
      echo $form;
   ?>
</div>

ここでは、アクションメソッドで作成されたフォームを表示しています。 さらに、エラーがあれば表示しています。

手順14ブックの追加アクションの確認

URL http://localhost:8080/book/addをリクエストするか、[ブックナビゲーションの追加]リンクをクリックすると、次のようなフォームが表示されます。

Form

更新されたビュー

データ付きのフォーム

データ付きフォーム

書籍情報を入力してページを送信すると、書籍情報がデータベースに保存され、次のようにページがインデックスページにリダイレクトされます。

新しく追加された書籍のある書籍リスト

書籍リスト

ステップ15ブックを編集するアクションを作成する

既存の書籍情報を編集および更新する機能を作成します。 次のように、ブックコントローラーで新しいアクションaction_editを作成します。

public function action_edit($id = false) {
   if(!($book = Model_Book::find($id))) {
      throw new HttpNotFoundException();
   }

  //create a new fieldset and add book model
   $fieldset = Fieldset::forge('book')->add_model('Model_Book');
   $fieldset->populate($book);

  //get form from fieldset
   $form = $fieldset->form();

  //add submit button to the form
   $form->add('Submit', '', array('type' => 'submit', 'value' => 'Submit'));

  //build the form  and set the current page as action
   $formHtml = $fieldset->build(Uri::create('book/edit/' . $id));
   $view = View::forge('book/add');
   $view->set('form', $formHtml, false);

   if (Input::param() != array()) {
      try {
         $book->title = Input::param('title');
         $book->author = Input::param('author');
         $book->price = Input::param('price');
         $book->save();
         Response::redirect('book');
      } catch (Orm\ValidationFailed $e) {
         $view->set('errors', $e->getMessage(), false);
      }
   }
   $this->template->title = "Book edit page";
   $this->template->content = $view;
}

addアクションに似ていますが、ページを処理する前にidでリクエストされたブックを検索することを除いて データベースに書籍情報が見つかった場合は、続行してフォームに書籍情報を表示します。 それ以外の場合は、ファイルが見つからないという例外をスローして終了します。

手順16編集アクションのビューを作成する

ブックアクションを編集するためのビューを作成します。 ここでは、アクションの追加に使用したのと同じビューを使用しています。

ステップ17ブックの編集アクションを確認します。

書籍一覧ページで任意の書籍の編集リンクをクリックすると、対応する書籍フォームが次のように表示されます-

本の詳細を含むフォーム

フォームブックの詳細

ステップ18ブックを削除するアクションを作成する

書店から本を削除する機能を作成します。 次のように、ブックコントローラーで新しいアクションaction_deleteを作成します。

public function action_delete($id = null) {
   if ( ! ($book = Model_Book::find($id))) {
      throw new HttpNotFoundException();

   } else {
      $book->delete();
   }
   Response::redirect('book');
}

ここでは、提供された書籍IDを使用して、データベース内の書籍の存在を確認しています。 書籍が見つかった場合、その書籍は削除され、インデックスページにリダイレクトされます。 それ以外の場合、ページが見つからないという情報が表示されます。

手順19削除アクションの確認

書籍リストページの[削除]リンクをクリックして、削除アクションを確認します。 要求された本を削除してから、再びインデックスページにリダイレクトされます。

最後に、書籍情報を追加、編集、削除、および一覧表示するためのすべての機能が作成されます。

FuelPHPは、他のMVCベースのPHPフレームワークと比較して、シンプルで、柔軟で、スケーラブルで、簡単に構成できます。 最新のMVCフレームワークのすべての機能を提供します。 そのまま使用することも、ニーズに合わせて完全に変更することもできます。 とりわけ、これはWeb開発に最適です。