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 頁面,如下所示:

Return Index Page

步驟 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/ 將顯示如下頁面:

Index View

步驟 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 或點選“新增書籍”導航連結,將顯示如下表單:

表單

Updated View

包含資料的表單

Form With Data

輸入書籍資訊並提交頁面後,書籍資訊將儲存到資料庫中,並且頁面將重定向到 index 頁面,如下所示。

包含新新增書籍的書籍列表

Book List

步驟 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:檢查編輯書籍操作。

點選書籍列表頁面中任何書籍的“編輯”連結,將顯示相應的書籍表單,如下所示:

包含書籍詳細資訊的表單

Form Book Details

步驟 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 開發的絕佳選擇。

廣告

© . All rights reserved.