В этой главе мы узнаем, как создать полное приложение BookStore на основе MVC в FuelPHP.
Шаг 1 Создайте проект
Создайте новый проект с именем «BookStore» в FuelPHP, используя следующую команду.
oil create bookstore
Шаг 2 Создайте макет
Создайте новый макет для нашего приложения. Создайте файл layout.php в папке fuel / app / views / layout.php. Код выглядит следующим образом:
топливо / приложение / просмотров / 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 имеет первоклассную поддержку шаблонов начальной загрузки. Мы создали две переменные, заголовок и контент. title используется для указания заголовка текущей страницы, а content — для указания деталей текущей страницы.
Шаг 3 Создайте контроллер
Создайте новый контроллер Controller_Book для отображения, добавления, редактирования и удаления книги. Создайте новый файл fuel / app / classes / controller / book.php и разместите следующий код.
топливо / приложение / классы / контроллер / 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 Создайте индексное представление
Создайте папку, закажите книгу в папке views в папке fuel / app / views. Затем создайте файл index.php внутри папки книги и добавьте следующий код:
топливо / приложение / просмотров / index.php
<h3>index page</h3>
На данный момент мы создали базовый контроллер книг.
Шаг 5 Изменить маршрут по умолчанию
Обновите маршрут по умолчанию, чтобы установить домашнюю страницу приложения для контроллера книги. Откройте файл конфигурации маршрутизации по умолчанию, fuel / app / config / rout.php и измените его следующим образом.
топливо / приложение / 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 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 Настройте базу данных
Сконфигурируйте базу данных, используя файл конфигурации базы данных db.php, расположенный в fuel / app / config.
топливо / приложение / 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 /».
топливо / приложение / Config / config.php
'always_load' => array ( 'packages' => array ( 'orm' ), ),
Шаг 9 Создайте модель
Создайте модель книги в 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 Показать книги
Обновите действие index в контроллере книг, чтобы отобразить список доступных книг в базе данных.
топливо / приложение / классы / контроллер / 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.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; }
Здесь выполняются два следующих процесса:
-
Создание формы книги для добавления книги с использованием методов Fieldset и модели Book.
-
Обработка формы книги, когда пользователь вводит информацию о книге и отправляет обратно форму. Его можно найти, проверив метод Input :: param () для любых переданных данных. Обработка формы включает в себя следующие шаги —
-
Соберите информацию о книге.
-
Проверьте информацию о книге. Мы уже установили валидацию для вызова перед сохранением метода. Если проверка не пройдена, она выдаст исключение Orm \ ValidationFailed.
-
Сохраните информацию о книге в базу данных.
-
Перенаправить пользователя на индексную страницу в случае успеха. В противном случае, покажите форму еще раз.
-
Создание формы книги для добавления книги с использованием методов Fieldset и модели Book.
Обработка формы книги, когда пользователь вводит информацию о книге и отправляет обратно форму. Его можно найти, проверив метод Input :: param () для любых переданных данных. Обработка формы включает в себя следующие шаги —
Соберите информацию о книге.
Проверьте информацию о книге. Мы уже установили валидацию для вызова перед сохранением метода. Если проверка не пройдена, она выдаст исключение 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 или при нажатии на навигационную ссылку «Добавить книгу» отобразится следующая форма:
форма
Форма с данными
После ввода информации о книге и отправки страницы информация о книге будет сохранена в базе данных, и страница будет перенаправлена на индексную страницу следующим образом.
Список книг с недавно добавленной книгой
Шаг 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; }
Это аналогично добавлению действия, за исключением того, что он выполняет поиск в запрошенной книге по идентификатору перед обработкой страницы. Если какая-либо информация о книге найдена в базе данных, она продолжит работу и отобразит информацию о книге в форме. В противном случае он выдаст исключение файла и выйдет.
Шаг 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'); }
Здесь мы проверяем наличие книги в базе данных, используя предоставленный идентификатор книги. Если книга найдена, то она удаляется и перенаправляется на главную страницу. В противном случае, страница не найдена информация будет отображаться.
Шаг 19 Проверка действия удаления
Проверьте действие удаления, щелкнув ссылку удаления на странице со списком книг. Он удалит запрошенную книгу, а затем снова будет перенаправлен на страницу индекса.
Наконец, созданы все функции для добавления, редактирования, удаления и отображения информации о книге.
FuelPHP является простым, гибким, масштабируемым и легко настраиваемым по сравнению с другими основанными на MVC средами PHP. Он предоставляет все возможности современного MVC фреймворка. Он может использоваться как есть или может быть полностью изменен в соответствии с нашими потребностями. Прежде всего, это отличный выбор для веб-разработки.