- FuelPHP 教程
- FuelPHP - 首頁
- FuelPHP - 簡介
- FuelPHP - 安裝
- FuelPHP - 架構概述
- FuelPHP - 簡單 Web 應用程式
- FuelPHP - 配置
- FuelPHP - 控制器
- FuelPHP - 路由
- FuelPHP - 請求 & 響應
- FuelPHP - 檢視
- FuelPHP - 展示器
- FuelPHP - 模型 & 資料庫
- FuelPHP - 表單程式設計
- FuelPHP - 驗證
- 高階表單程式設計
- FuelPHP - 檔案上傳
- FuelPHP - Ajax
- FuelPHP - HMVC 請求
- FuelPHP - 主題
- FuelPHP - 模組
- FuelPHP - 包
- Cookie & 會話管理
- FuelPHP - 事件
- FuelPHP - 郵件管理
- FuelPHP - 分析器
- 錯誤處理 & 除錯
- FuelPHP - 單元測試
- 完整工作示例
- FuelPHP 有用資源
- FuelPHP - 快速指南
- FuelPHP - 有用資源
- FuelPHP - 討論
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>
這裡,我們使用的是 bootstrap 模板。FuelPHP 對 bootstrap 模板提供了很好的支援。我們建立了兩個變數,title 和 content。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;
}
}
這裡,我們透過繼承模板控制器建立了 book 控制器,並將預設模板設定為 fuel/app/views/layout.php。
步驟 4:建立 index 檢視
在 fuel/app/views 資料夾下的 views 目錄中建立一個資料夾 book。然後,在 book 資料夾內建立一個檔案 index.php 並新增以下程式碼:
fuel/app/views/index.php
<h3>index page</h3>
截至目前,我們已經建立了一個基本的 book 控制器。
步驟 5:修改預設路由
更新預設路由,將應用程式的首頁設定為 book 控制器。開啟預設路由配置檔案 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 https://:8080/ 將返回 book 控制器的 index 頁面,如下所示:
步驟 6:建立資料庫
使用以下命令在 MySQL 伺服器中建立一個新資料庫:
create database tutorialspoint_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' => 'tutorialspoint_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' => 'tutorialspoint_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 中建立一個 book 模型。其定義如下:
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:顯示書籍
更新 book 控制器中的 index 操作,以列出資料庫中可用的書籍。
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:更新 index 檢視
更新位於“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 https://:8080/ 將顯示如下頁面:
步驟 12:建立新增書籍操作
建立將新書籍新增到書店的函式。在 book 控制器中建立一個新的操作 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; }
這裡執行以下兩個過程:
使用 Fieldset 方法和 Book 模型構建新增書籍的書籍表單。
處理書籍表單,當用戶輸入書籍資訊並提交表單時。可以透過檢查 Input::param() 方法是否存在任何提交的資料來找到它。處理表單包括以下步驟:
收集書籍資訊。
驗證書籍資訊。我們已將驗證設定為在 save 方法之前呼叫。如果驗證失敗,它將丟擲 Orm\ValidationFailed 異常。
將書籍資訊儲存到資料庫中。
成功後將使用者重定向到 index 頁面。否則,再次顯示錶單。
我們同時執行了顯示錶單和處理表單的操作。當用戶第一次呼叫該操作時,它將顯示錶單。當用戶輸入書籍資訊並提交資料時,它將處理表單。
步驟 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 https://:8080/book/add 或點選“新增書籍”導航連結,將顯示如下表單:
表單
包含資料的表單
輸入書籍資訊並提交頁面後,書籍資訊將儲存到資料庫中,並且頁面將重定向到 index 頁面,如下所示。
包含新新增書籍的書籍列表
步驟 15:建立編輯書籍操作
建立編輯和更新現有書籍資訊的函式。在 book 控制器中建立一個新的操作 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;
}
它與新增操作類似,只是在處理頁面之前根據 id 搜尋請求的書籍。如果在資料庫中找到任何書籍資訊,它將繼續並顯示錶單中的書籍資訊。否則,它將丟擲檔案未找到異常並退出。
步驟 16:建立編輯操作的檢視
建立編輯書籍操作的檢視。這裡,我們使用與新增操作相同的檢視。
步驟 17:檢查編輯書籍操作。
點選書籍列表頁面中任何書籍的“編輯”連結,將顯示相應的書籍表單,如下所示:
包含書籍詳細資訊的表單
步驟 18:建立刪除書籍操作
建立從書店刪除書籍的函式。在 book 控制器中建立一個新的操作 action_delete,如下所示:
public function action_delete($id = null) {
if ( ! ($book = Model_Book::find($id))) {
throw new HttpNotFoundException();
} else {
$book->delete();
}
Response::redirect('book');
}
這裡,我們使用提供的書籍 id 檢查資料庫中是否存在書籍。如果找到該書籍,則將其刪除並重定向到 index 頁面。否則,將顯示頁面未找到資訊。
步驟 19:檢查刪除操作
透過點選書籍列表頁面中的“刪除”連結來檢查刪除操作。它將刪除請求的書籍,然後再次重定向到 index 頁面。
最後,建立了新增、編輯、刪除和列出書籍資訊的所有功能。
與其他基於 MVC 的 PHP 框架相比,FuelPHP 簡單、靈活、可擴充套件且易於配置。它提供了現代 MVC 框架的所有功能。它可以按原樣使用,也可以完全更改以適應我們的需求。最重要的是,它是 Web 開發的絕佳選擇。