FUEL PHP EXAMPLE TUTORIAL PART 2 (MVC Sample Application)
Please Subscribe Youtube| Like Facebook | Follow Twitter
Introduction
In this article we will built simple MVC Application in FuelPHP Framework.
Tips
Article | URL |
FUEL PHP Example Tutorial Part 1 (Config and Run) | link |
FUEL PHP EXAMPLE TUTORIAL PART 2 (MVC Sample Application) | link |
FUEL PHP EXAMPLE TUTORIAL PART 3 (CRUD MVC Application) | link |
Our Example
In our example we will setup MVC sample Application. We will create Student Table in our database and display list of student in our MVC Application Web Page.
Requirements:
- PHP SERVER (XAMP, WAMP, Laragon)
- FuelPHP Framework
Note: First you need to configure FuelPHP Project. You can follow this article to set it up.
Steps
Follow below steps
1 Configure Database And Application Settings
2 Coding
3 Run Application
1 Configure Database And Application Settings
First select FuelPHP project which was setup in part 1 and open it with any IDE of your choice. (We have used Netbeans IDE)
Below is the directory structure of FuelPHP project
FuelExample\fuel\app is application directory which we will use to built our application.
FuelSample\fuel\app\classes\controller contains Controller classes
FuelSample\fuel\app\classes\model contains Model classes
FuelSample\fuel\app\views contains View folder and files
FuelSample\fuel\app\config contains Configuration settings files
FuelSample\fuel\app\config\routes.php contains routing path of our application. We can customize it according to our need.
First we will create database for our app for that Open PhpMyadmin and create new database name “fuel_sample”
Add table student with columns id, roll_no, name
Insert two rows to Student Tables
Now open db.php file from FuelSample\fuel\app\config\development\db.php
Add Your Database Connection settings in db.php file
You can see whole code of db.php file at whole code section
return array(
'default' => array(
'connection' => array(
'dsn' => 'mysql:host=localhost;dbname=fuel_sample',
'username' => 'root',
'password' => '',
),
),
);
Now open config.php file from FuelSample\fuel\app\config\config.php
Enable/Load Orm Toolkit by adding below code in config.php file
You can see whole code of config.php file at whole code section
'always_load' => array(
'packages' => array(
'orm',
),
),
2 Coding
Model
Create new php File named “student.php” inside FuelSample\fuel\app\classes\model
Add below code to student.php file
<?php
class Model_Student extends Orm\Model
{
protected static $_table_name = 'student';
protected static $_properties = array ('id','roll_no','name');
}
Model_Student class represent our Table student and $_properties correspond to columns of our Table student
Template
Create new php File named “template.php” inside FuelSample\fuel\app\views
Add below code to template.php file
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<header>
<h1>Header Template</h1>
<h3><?php echo $title; ?></h3>
</header>
<div class="container">
<?php echo $content; ?>
</div>
<footer>
<h2>Footer Template</h2>
</footer>
</body>
</html>
Template is used to display common layout elements of Application to all our Web Pages i.e header, footer, navigation. It also Allows to set section/content of corresponding view page, which will be embedded or set through $title and $content variable.
<?php echo $title; ?> will set title of corresponding view page.
<?php echo $content; ?> will set content of corresponding view page.
Controller
Create new php File named “student.php” inside FuelSample\fuel\app\classes\controller
Add below code to student.php file
<?php
class Controller_Student extends Controller_Template
{
public function action_index()
{
$data = array();
$data['Students'] = Model_Student::find('all');
$this->template->title="Student List";
$this->template->content=View::forge('student/index',$data,false);
}
}
Controller_Student class represent Controller of student.
Controller Name after _ i.e Student and method name after _ i.e index resolves to url student/index So whole url to fire action_index() method of Student Controler would resolve to
http://localhost/fuelsample/public/student/index
You can change app root url of appliaction using virtual host settings in Apache server.
In action_index() function, we are retrieving list of all student from student table through Model_Student::find() function and saving it inside array $data[‘Students’] and passing that $data array to our view student/index.
$this->template->title will set title in index page which is embedded to our templae.php layout through $title variable..
View::forge() will return view of our index page of student which will be embedded to our templae.php layout through $content variable, which is set through $this->template->content.
View
Create new folder “student” inside FuelSample\fuel\app\view
All the views of student will be placed here inside student folder
Create new php File named “index.php” inside FuelSample\fuel\app\view\student
Add below code to index.php file
<table>
<tr><th>Student Id</th><th>Student Roll No</th><th>Student Name</th><tr>
<?php foreach ($Students as $Student): ?>
<tr>
<td><?php echo $Student->id; ?> </td>
<td><?php echo $Student->roll_no; ?></td>
<td><?php echo $Student->name; ?> </td>
</tr>
<?php endforeach; ?>
</table>
Here we are looping through $Students variable which was passed through action_index() function. We are printing corresponding rows of student table inside html table.
Whole Code
db.php file from FuelSample\fuel\app\config\development\db.php
<?php
/**
* Fuel is a fast, lightweight, community driven PHP 5.4+ framework.
*
* @package Fuel
* @version 1.8.2
* @author Fuel Development Team
* @license MIT License
* @copyright 2010 - 2019 Fuel Development Team
* @link https://fuelphp.com
*/
/**
* -----------------------------------------------------------------------------
* Database settings for development environment
* -----------------------------------------------------------------------------
*
* These settings get merged with the global settings.
*
*/
return array(
'default' => array(
'connection' => array(
'dsn' => 'mysql:host=localhost;dbname=fuel_sample',
'username' => 'root',
'password' => '',
),
),
);
config.php file from FuelSample\fuel\app\config\config.php
<?php
/**
* Fuel is a fast, lightweight, community driven PHP 5.4+ framework.
*
* @package Fuel
* @version 1.8.2
* @author Fuel Development Team
* @license MIT License
* @copyright 2010 - 2019 Fuel Development Team
* @link https://fuelphp.com
*/
return array(
/**
* -------------------------------------------------------------------------
* The base URL of the application
* -------------------------------------------------------------------------
*
* You can set this to a full or relative URL:
*
* 'base_url' => '/foo/',
* 'base_url' => 'http://foo.com/'
*
* It MUST contain a trailing slash (/).
*
* Set this to null to have it automatically detected.
*
*/
// 'base_url' => null,
/**
* -------------------------------------------------------------------------
* Any suffix that needs to be added to
* -------------------------------------------------------------------------
*
* URL's generated by Fuel. If the suffix is an extension, make sure to
* include the dot.
*
* 'url_suffix' => '.html',
*
* Set this to an empty string if no suffix is used.
*
*/
// 'url_suffix' => '',
/**
* -------------------------------------------------------------------------
* The name of the main bootstrap file
* -------------------------------------------------------------------------
*
* Set this to 'index.php if you don't use URL rewriting.
*
*/
// 'index_file' => false,
// 'profiling' => false,
/**
* -------------------------------------------------------------------------
* Default location for the file cache
* -------------------------------------------------------------------------
*/
// 'cache_dir' => APPPATH.'cache/',
/**
* -------------------------------------------------------------------------
* Settings for the file finder cache
*
* Note: The Cache class has it's own config!
* -------------------------------------------------------------------------
*
* The 'cache_lifetime' value is in seconds.
*
*/
// 'caching' => false,
// 'cache_lifetime' => 3600,
/**
* -------------------------------------------------------------------------
* Callback to use with ob_start(), set this to 'ob_gzhandler'
* for gzip encoding of output
* -------------------------------------------------------------------------
*/
// 'ob_callback' => null,
// 'errors' => array(
/**
* ---------------------------------------------------------------------
* Which errors should we show, but continue execution? You can add
* the following:
*
* E_NOTICE, E_WARNING, E_DEPRECATED, E_STRICT
*
* to mimic PHP's default behaviour (which is to continue
* on non-fatal errors). We consider this bad practice.
* ---------------------------------------------------------------------
*/
// 'continue_on' => array(),
/**
* ---------------------------------------------------------------------
* How many errors should we show before we stop showing them?
*
* Note: This is useful to prevents out-of-memory errors.
* ---------------------------------------------------------------------
*/
// 'throttle' => 10,
/**
* ---------------------------------------------------------------------
* Should notices from Error::notice() be shown?
* ---------------------------------------------------------------------
*/
// 'notices' => true,
/**
* ---------------------------------------------------------------------
* Render previous contents or show it as HTML?
* ---------------------------------------------------------------------
*/
// 'render_prior' => false,
// ),
/**
* -------------------------------------------------------------------------
* Localization & internationalization settings
* -------------------------------------------------------------------------
*/
/**
* The default language.
*/
// 'language' => 'en',
/**
* Fallback language when file isn't available for default language.
*/
// 'language_fallback' => 'en',
/**
* PHP set_locale() setting. Use null to not set.
*/
// 'locale' => 'en_US',
/**
* -------------------------------------------------------------------------
* Internal string encoding charset
* -------------------------------------------------------------------------
*/
// 'encoding' => 'UTF-8',
/**
* -------------------------------------------------------------------------
* DateTime settings
* -------------------------------------------------------------------------
*/
/**
* The server offset in seconds from GMT timestamp when time() is used.
*/
// 'server_gmt_offset' => 0,
/**
* Change the server's default timezone. This is optional.
*/
// 'default_timezone' => null,
/**
* -------------------------------------------------------------------------
* Logging threshold.
* -------------------------------------------------------------------------
*
* Can be set to any of the following:
*
* Fuel::L_NONE
* Fuel::L_ERROR
* Fuel::L_WARNING
* Fuel::L_DEBUG
* Fuel::L_INFO
* Fuel::L_ALL
*
*/
// 'log_threshold' => Fuel::L_WARNING,
// 'log_path' => APPPATH.'logs/',
// 'log_date_format' => 'Y-m-d H:i:s',
/**
* -------------------------------------------------------------------------
* Security settings
* -------------------------------------------------------------------------
*/
'security' => array(
/**
* ---------------------------------------------------------------------
* CSRF settings
* ---------------------------------------------------------------------
*/
// 'csrf_autoload' => false,
// 'csrf_autoload_methods' => array('post', 'put', 'delete'),
// 'csrf_bad_request_on_fail' => false,
// 'csrf_auto_token' => false,
// 'csrf_token_key' => 'fuel_csrf_token',
// 'csrf_expiration' => 0,
/**
* ---------------------------------------------------------------------
* Salt to make sure the generated security tokens aren't predictable.
* ---------------------------------------------------------------------
*/
// 'token_salt' => 'put your salt value here to make the token more secure',
/**
* ---------------------------------------------------------------------
* Allow the Input class to use X headers when present.
*
* Examples of these are:
*
* HTTP_X_FORWARDED_FOR and HTTP_X_FORWARDED_PROTO
*
* which can be faked which could have security implications.
* ---------------------------------------------------------------------
*/
// 'allow_x_headers' => false,
/**
* ---------------------------------------------------------------------
* This input filter can be any normal PHP function
* as well as 'xss_clean'
*
* WARNING: Using xss_clean will cause a performance hit. How much is
* depend on how much input data there is.
* ---------------------------------------------------------------------
*/
'uri_filter' => array('htmlentities'),
// 'input_filter' => array(),
/**
* ---------------------------------------------------------------------
* This output filter can be any normal PHP function
* as well as 'xss_clean'
*
* WARNING: Using xss_clean will cause a performance hit. How much is
* depend on how much input data there is.
* ---------------------------------------------------------------------
*/
'output_filter' => array('Security::htmlentities'),
/**
* ---------------------------------------------------------------------
* Encoding mechanism to use on htmlentities()
* ---------------------------------------------------------------------
*/
// 'htmlentities_flags' => ENT_QUOTES,
/**
* ---------------------------------------------------------------------
* Whether to encode HTML entities as well
* ---------------------------------------------------------------------
*/
// 'htmlentities_double_encode' => false,
/**
* ---------------------------------------------------------------------
* Whether to automatically filter view data
* ---------------------------------------------------------------------
*/
// 'auto_filter_output' => true,
/**
* ---------------------------------------------------------------------
* With output encoding switched on, all objects passed will be
* converted to strings or throw exceptions unless they are instances
* of the classes in this array.
* ---------------------------------------------------------------------
*/
'whitelisted_classes' => array(
'Fuel\\Core\\Presenter',
'Fuel\\Core\\Response',
'Fuel\\Core\\View',
'Fuel\\Core\\ViewModel',
'Closure',
),
),
/**
* -------------------------------------------------------------------------
* Cookie settings
* -------------------------------------------------------------------------
*/
// 'cookie' => array(
/**
* ---------------------------------------------------------------------
* Number of seconds before the cookie expires
* ---------------------------------------------------------------------
*/
// 'expiration' => 0,
/**
* ---------------------------------------------------------------------
* Restrict the path that the cookie is available to
* ---------------------------------------------------------------------
*/
// 'path' => '/',
/**
* ---------------------------------------------------------------------
* Restrict the domain that the cookie is available to
* ---------------------------------------------------------------------
*/
// 'domain' => null,
/**
* ---------------------------------------------------------------------
* Only transmit cookies over secure connections
* ---------------------------------------------------------------------
*/
// 'secure' => false,
/**
* ---------------------------------------------------------------------
* Only transmit cookies over HTTP, disabling Javascript access
* ---------------------------------------------------------------------
*/
// 'http_only' => false,
// ),
/**
* -------------------------------------------------------------------------
* Validation settings
* -------------------------------------------------------------------------
*
* Whether to fallback to global when a value is not found in the
* input array.
*
*/
// 'validation' => array(
// 'global_input_fallback' => true,
// ),
/**
* -------------------------------------------------------------------------
* Controller class prefix
* -------------------------------------------------------------------------
*/
// 'controller_prefix' => 'Controller_',
/**
* -------------------------------------------------------------------------
* Routing settings
* -------------------------------------------------------------------------
*/
// 'routing' => array(
/**
* ---------------------------------------------------------------------
* Whether URI routing is case sensitive or not
* ---------------------------------------------------------------------
*/
// 'case_sensitive' => true,
/**
* ---------------------------------------------------------------------
* Whether to strip the extension
* ---------------------------------------------------------------------
*/
// 'strip_extension' => true,
// ),
/**
* -------------------------------------------------------------------------
* Module paths
* -------------------------------------------------------------------------
*
* To enable you to split up your application into modules which can be
* routed by the first uri segment you have to define their basepaths here.
* By default is empty, but to use them you can add something like this:
*
* 'module_paths' => array(APPPATH.'modules'.DS)
*
* Paths MUST end with a directory separator (the DS constant)!
*
*/
// 'module_paths' => array(
// // APPPATH.'modules'.DS
// ),
/**
* -------------------------------------------------------------------------
* Package paths
* -------------------------------------------------------------------------
*
* To enable you to split up your additions to the framework, packages are
* used. You can define the basepaths for your packages here. By default is
* empty, but to use them you can add something like this:
*
* 'package_paths' => array(APPPATH.'modules'.DS)
*
* Paths MUST end with a directory separator (the DS constant)!
*
*/
'package_paths' => array(
PKGPATH,
),
/**
* -------------------------------------------------------------------------
* Always load
* -------------------------------------------------------------------------
*/
'always_load' => array(
'packages' => array(
'orm',
),
),
// 'always_load' => array(
/**
* ---------------------------------------------------------------------
* These packages are loaded on Fuel's startup.
* You can specify them in the following manner:
*
* 'packages' => array('auth');
*
* This will assume the packages are in PKGPATH.
*
* Use this format to specify the path to the package explicitly.
*
* 'packages' => array(
* array('auth' => PKGPATH.'auth/')
* );
* ---------------------------------------------------------------------
*/
// 'packages' => array(
// // 'orm',
// ),
/**
* ---------------------------------------------------------------------
* These modules are always loaded on Fuel's startup.
* You can specify them in the following manner:
*
* 'modules' => array('module_name');
*
* A path must be set in 'module_paths' for this to work.
* ---------------------------------------------------------------------
*/
// 'modules' => array(),
/**
* ---------------------------------------------------------------------
* Classes to autoload & initialize even when not used
* ---------------------------------------------------------------------
*/
// 'classes' => array(),
/**
* ---------------------------------------------------------------------
* Configurations to autoload
*
* If you want to load 'session' config into a group 'session',
* you only have to add 'session'.
*
* 'config' => array('session')
*
* If you want to add it to another group (example: 'auth'),
* you have to add it like:
*
* 'config' => array('session' => 'auth')
*
* If you don't want the config in a group, use null as groupname.
* ---------------------------------------------------------------------
*/
// 'config' => array(),
/**
* ---------------------------------------------------------------------
* Language files to autoload
*
* If you want to load 'validation' lang into a group 'validation',
* you only have to add 'validation'.
*
* 'language' => array('validation')
*
* If you want to add it to another group (example: 'forms'),
* you have to add it like:
*
* 'language' => array('validation' => 'forms')
*
* If you don't want the lang in a group, use null as groupname.
* ---------------------------------------------------------------------
*/
// 'language' => array(),
// ),
);
student.php file from FuelSample\fuel\app\classes\model\student.php
<?php
class Model_Student extends Orm\Model
{
protected static $_table_name = 'student';
protected static $_properties = array ('id','roll_no','name');
}
student.php file from FuelSample\fuel\app\classes\controller\student.php
<?php
class Controller_Student extends Controller_Template
{
public function action_index()
{
$data = array();
$data['Students'] = Model_Student::find('all');
$this->template->title="Student List";
$this->template->content=View::forge('student/index',$data,false);
}
}
template.php file from FuelSample\fuel\app\views\template.php
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<header>
<h1>Header Template</h1>
<h3><?php echo $title; ?></h3>
</header>
<div class="container">
<?php echo $content; ?>
</div>
<footer>
<h2>Footer Template</h2>
</footer>
</body>
</html>
index.php file from FuelSample\fuel\app\view\student\index.php
<table>
<tr><th>Student Id</th><th>Student Roll No</th><th>Student Name</th><tr>
<?php foreach ($Students as $Student): ?>
<tr>
<td><?php echo $Student->id; ?> </td>
<td><?php echo $Student->roll_no; ?></td>
<td><?php echo $Student->name; ?> </td>
</tr>
<?php endforeach; ?>
</table>
3 Run Application
Run Webserver and open browser and type http://localhost/fuelsample/public/student/index
Which will fire action_index() function of student controller and print list of student from our database fuel_sample.
Index method can also be fired through below url
http://localhost/fuelsample/public/student
Conclusion
So in this article we have built simple MVC Application in FuelPHP Framework . If you liked the article then please share this site and article. Thanks.
Please Subscribe Youtube| Like Facebook | Follow Twitter