目录

完整的工作示例(Complete Working Example)

在本章中,我们将学习如何在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具有对引导程序模板的一流支持。 我们创建了两个变量,标题和内容。 title用于指定当前页面的标题,内容用于指定当前页面的详细信息。

步骤3创建一个Controller

创建一个新的控制器,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修改默认路由

更新默认路由以将应用程序的主页设置为book controller。 打开默认路由配置文件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 iowiki_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'       => 'iowiki_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'       => 'iowiki_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创建模型

在book.php中创建一个位于“fuel/app/classes/model”的书模型。 它的定义如下 -

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创建添加书籍的操作

创建将新书添加到书店的功能。 在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异常。

    • 将书籍信息存储到数据库中。

    • 成功时将用户重定向到索引页面。 否则,再次显示表单。

我们正在做两件事,在同一个动作中显示表单以及处理表单。 当用户第一次调用该操作时,它将显示该表单。 当用户输入书籍信息并提交数据时,它将处理表格。

步骤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> 

在这里,我们只是显示在action方法中创建的表单。 此外,我们正在显示错误,如果有的话。

步骤14检查添加书籍操作

请求URL,http:// localhost:8080/book/add或单击Add book navigation链接,将显示如下表单,

形成

更新了视图

表格与数据

表格与数据

在输入书籍信息并提交页面之后,书籍信息将被存储到数据库中,并且页面被重定向到索引页面,如下所示。

新增书籍的书单

书单

步骤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; 
}

它类似于添加操作,除了它在处理页面之前按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'); 
} 

在这里,我们使用提供的book id检查数据库中是否存在book。 如果找到该书,则将其删除并重定向到索引页。 否则,将显示未找到页面的信息。

步骤19检查删除操作

单击图书列表页面中的删除链接,检查删除操作。 它将删除所请求的书籍,然后再次重定向到索引页面。

最后,创建添加,编辑,删除和列出书籍信息的所有功能。

与其他基于MVC的PHP框架相比,FuelPHP简单,灵活,可扩展且易于配置。 它提供了现代MVC框架的所有功能。 它可以按原样使用,也可以完全改变以满足我们的需求。 最重要的是,它是Web开发的绝佳选择。

↑回到顶部↑
WIKI教程 @2018