Fuel PHP Example Tutorial Part 2 (MVC Sample Application)

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

ArticleURL
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:

  1. PHP SERVER (XAMP, WAMP, Laragon)
  2. 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


Leave a Reply

Your email address will not be published. Required fields are marked *