Fuelphp-complete-working-example
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開発に最適です。