{"id":820,"date":"2024-02-23T11:14:57","date_gmt":"2024-02-23T11:14:57","guid":{"rendered":"https:\/\/learnpython.elegantwallp.com\/?p=820"},"modified":"2024-02-23T11:15:00","modified_gmt":"2024-02-23T11:15:00","slug":"tutorial","status":"publish","type":"post","link":"https:\/\/learnpython.elegantwallp.com\/2024\/02\/23\/tutorial\/","title":{"rendered":"Tutorial\u00a0"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"overview\">Overview<\/h2>\n\n\n\n<p>Throughout this tutorial, we will create an application with a simple registration form, while introducing the main design aspects of Phalcon.<\/p>\n\n\n\n<p>This tutorial covers the implementation of a simple MVC application, showing how fast and easy it can be done with Phalcon. Once developed, you can use this application and extend it to suit your needs. The code in this tutorial can also be used as a playground to learn other Phalcon specific concepts and ideas.https:\/\/www.youtube.com\/embed\/75W-emM4wNQ<\/p>\n\n\n\n<p>If you just want to get started you can skip this and create a Phalcon project automatically with our&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/devtools\/\">developer tools<\/a>.<\/p>\n\n\n\n<p>The best way to use this guide is to follow along and try to have fun. You can get the complete code&nbsp;<a href=\"https:\/\/github.com\/phalcon\/tutorial\">here<\/a>. If you get stuck or have questions, please visit us on&nbsp;<a href=\"https:\/\/phalcon.io\/discord\">Discord<\/a>&nbsp;or in our&nbsp;<a href=\"https:\/\/phalcon.io\/forum\">Forum<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"file-structure\">File Structure<\/h2>\n\n\n\n<p>One of the key features of Phalcon is that it is loosely coupled. Because of that, you can use any directory structure that is convenient to you. In this tutorial we will use a&nbsp;<em>standard<\/em>&nbsp;directory structure, commonly used in MVC applications.<code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-1\"><\/a>. <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-2\"><\/a>\u2514\u2500\u2500 tutorial <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-3\"><\/a> \u251c\u2500\u2500 app <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-4\"><\/a> \u2502 \u251c\u2500\u2500 controllers <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-5\"><\/a> \u2502 \u2502 \u251c\u2500\u2500 IndexController.php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-6\"><\/a> \u2502 \u2502 \u2514\u2500\u2500 SignupController.php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-7\"><\/a> \u2502 \u251c\u2500\u2500 models <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-8\"><\/a> \u2502 \u2502 \u2514\u2500\u2500 Users.php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-9\"><\/a> \u2502 \u2514\u2500\u2500 views <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-10\"><\/a> \u2514\u2500\u2500 public <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-11\"><\/a> \u251c\u2500\u2500 css <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-12\"><\/a> \u251c\u2500\u2500 img <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-13\"><\/a> \u251c\u2500\u2500 index.php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-0-14\"><\/a> \u2514\u2500\u2500 js<\/code><\/p>\n\n\n\n<p>NOTE<\/p>\n\n\n\n<p>Since all the code that Phalcon exposes is encapsulated in the extension (that you have loaded on your web server), you will not see&nbsp;<code>vendor<\/code>&nbsp;directory containing Phalcon code. Everything you need is in memory. If you have not installed the application yet, head over to the&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/installation\/\">installation<\/a>&nbsp;page and complete the installation prior to continuing with this tutorial.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>If this is all brand new it is recommended that you install the&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/devtools\/\">Phalcon Devtools<\/a>&nbsp;also. The DevTools leverage PHP's built-in web server, allowing you to run your application almost immediately. If you choose this option, you will need a&nbsp;<code>.htrouter.php<\/code>&nbsp;file at the root of your project with the following contents:<code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-3\"><\/a>$uri = urldecode( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-4\"><\/a> parse_url($_SERVER&#91;'REQUEST_URI'], PHP_URL_PATH) <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-5\"><\/a>); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-6\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-7\"><\/a>if ($uri !== '\/' &amp;&amp; file_exists(__DIR__ . '\/public' . $uri)) { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-8\"><\/a> return false; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-9\"><\/a>} <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-10\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-11\"><\/a>$_GET&#91;'_url'] = $_SERVER&#91;'REQUEST_URI']; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-12\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-1-13\"><\/a>require_once __DIR__ . '\/public\/index.php';<\/code><\/code><\/pre>\n\n\n\n<p>In the case of our tutorial, this file must be located in the&nbsp;<code>tutorial<\/code>&nbsp;directory.<\/p>\n\n\n\n<p>You can also use nginX, apache, cherokee or other web servers. You can check the\u00a0webserver setup\u00a0page for instructions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"bootstrap\">Bootstrap<\/h2>\n\n\n\n<p>The first file you need to create is the bootstrap file. This file acts as the entry-point and configuration for your application. In this file, you can implement initialization of components as well define application behavior.<\/p>\n\n\n\n<p>This file handles 3 things: &#8211; Registration of component autoloaders &#8211; Configuring Services and registering them with the Dependency Injection context &#8211; Resolving the application&#8217;s HTTP requests<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"autoloader\">Autoloader<\/h3>\n\n\n\n<p>We are going to use\u00a0Phalcon\\Loader\u00a0a\u00a0PSR-4\u00a0compliant file loader. Common things that should be added to the autoloader are your controllers and models. You can also register directories which will be scanned for files required by the application.<\/p>\n\n\n\n<p>To start, lets register our app&#8217;s\u00a0<code>controllers<\/code>\u00a0and\u00a0<code>models<\/code>\u00a0directories using\u00a0Phalcon\\Loader:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-3\"><\/a>use Phalcon\\Loader; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-5\"><\/a>define('BASE_PATH', dirname(__DIR__)); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-6\"><\/a>define('APP_PATH', BASE_PATH . '\/app'); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-7\"><\/a>\/\/ ... <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-8\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-9\"><\/a>$loader = new Loader(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-10\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-11\"><\/a>$loader-&gt;registerDirs( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-12\"><\/a> &#91; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-13\"><\/a> APP_PATH . '\/controllers\/', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-14\"><\/a> APP_PATH . '\/models\/', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-15\"><\/a> ] <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-16\"><\/a>); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-17\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-2-18\"><\/a>$loader-&gt;register();<\/code><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dependency-management\">Dependency Management<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#dependency-management\">\u00b6<\/a><\/h3>\n\n\n\n<p>Since Phalcon is loosely coupled, services are registered with the frameworks Dependency Manager so they can be injected automatically to components and services wrapped in the&nbsp;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Inversion_of_control\">IoC<\/a>&nbsp;container. Frequently you will encounter the term DI which stands for Dependency Injection. Dependency Injection and Inversion of Control(IoC) may sound complex but Phalcon ensures that their use is simple, practical and efficient. Phalcon&#8217;s IoC container consists of the following concepts: &#8211; Service Container: a &#8220;bag&#8221; where we globally store the services that our application needs to function. &#8211; Service or Component: Data processing object which will be injected into components<\/p>\n\n\n\n<p>Each time the framework requires a component or service, it will ask the container using an agreed upon name for the service. This way we have an easy way to retrieve objects necessary for our application, such as the logger, database connection etc.<\/p>\n\n\n\n<p>NOTE<\/p>\n\n\n\n<p>If you are still interested in the details please see this article by&nbsp;<a href=\"https:\/\/martinfowler.com\/articles\/injection.html\">Martin Fowler<\/a>. Also we have&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/di\/\">a great tutorial<\/a>&nbsp;covering many use cases.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"factory-default\">Factory Default<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#factory-default\">\u00b6<\/a><\/h3>\n\n\n\n<p>The\u00a0Phalcon\\Di\\FactoryDefault\u00a0is a variant of\u00a0Phalcon\\Di. To make things easier, it will automatically register most of the components that are required by an application and come with Phalcon as standard. Although it is recommended to set up services manually, you can use the\u00a0Phalcon\\Di\\FactoryDefault\u00a0container initially and later on customize it to fit your needs.<\/p>\n\n\n\n<p>Services can be registered in several ways, but for our tutorial, we will use an\u00a0anonymous function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-3-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-3-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-3-3\"><\/a>use Phalcon\\Di\\FactoryDefault; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-3-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-3-5\"><\/a>\/\/ Create a DI <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-3-6\"><\/a>$container = new FactoryDefault();<\/code><\/code><\/pre>\n\n\n\n<p>Now we need to register the&nbsp;<em>view<\/em>&nbsp;service, setting the directory where the framework will find the view files. As the views do not correspond to classes, they cannot be automatically loaded by our autoloader.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-3\"><\/a>use Phalcon\\Mvc\\View; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-5\"><\/a>\/\/ ... <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-6\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-7\"><\/a>$container-&gt;set( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-8\"><\/a> 'view', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-9\"><\/a> function () { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-10\"><\/a> $view = new View(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-11\"><\/a> $view-&gt;setViewsDir(APP_PATH . '\/views\/'); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-12\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-13\"><\/a> return $view; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-14\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-4-15\"><\/a>);<\/code><\/code><\/pre>\n\n\n\n<p>Now we need to register a base URI, that will offer the functionality to create all URIs by Phalcon. The component will ensure that whether you run your application through the top directory or a subdirectory, all your URIs will be correct. For this tutorial our base path is&nbsp;<code>\/<\/code>. This will become important later on in this tutorial when we use the class&nbsp;<code>Phalcon\\Tag<\/code>&nbsp;to generate hyperlinks.<\/p>\n\n\n\n<p><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-3\"><\/a>use Phalcon\\Url; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-5\"><\/a>\/\/ ... <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-6\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-7\"><\/a>$container-&gt;set( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-8\"><\/a> 'url', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-9\"><\/a> function () { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-10\"><\/a> $url = new Url(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-11\"><\/a> $url-&gt;setBaseUri('\/'); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-12\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-13\"><\/a> return $url; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-14\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-5-15\"><\/a>);<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"handling-the-application-request\">Handling the Application Request<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#handling-the-application-request\">\u00b6<\/a><\/h3>\n\n\n\n<p>In order to handle any requests, the\u00a0Phalcon\\Mvc\\Application\u00a0object is used to do all the heavy lifting for us. The component will accept the request by the user, detect the routes and dispatch the controller and render the view returning back the results.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-3\"><\/a>use Phalcon\\Mvc\\Application; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-5\"><\/a>\/\/ ... <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-6\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-7\"><\/a>$application = new Application($container); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-8\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-9\"><\/a>$response = $application-&gt;handle( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-10\"><\/a> $_SERVER&#91;\"REQUEST_URI\"] <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-11\"><\/a>); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-12\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-6-13\"><\/a>$response-&gt;send();<\/code><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"putting-everything-together\">Putting Everything Together<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#putting-everything-together\">\u00b6<\/a><\/h3>\n\n\n\n<p>The&nbsp;<code>tutorial\/public\/index.php<\/code>&nbsp;file should look like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-3\"><\/a>use Phalcon\\Di\\FactoryDefault; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-4\"><\/a>use Phalcon\\Loader; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-5\"><\/a>use Phalcon\\Mvc\\View; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-6\"><\/a>use Phalcon\\Mvc\\Application; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-7\"><\/a>use Phalcon\\Url; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-8\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-9\"><\/a>\/\/ Define some absolute path constants to aid in locating resources <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-10\"><\/a>define('BASE_PATH', dirname(__DIR__)); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-11\"><\/a>define('APP_PATH', BASE_PATH . '\/app'); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-12\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-13\"><\/a>\/\/ Register an autoloader <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-14\"><\/a>$loader = new Loader(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-15\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-16\"><\/a>$loader-&gt;registerDirs( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-17\"><\/a> &#91; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-18\"><\/a> APP_PATH . '\/controllers\/', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-19\"><\/a> APP_PATH . '\/models\/', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-20\"><\/a> ] <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-21\"><\/a>); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-22\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-23\"><\/a>$loader-&gt;register(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-24\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-25\"><\/a>$container = new FactoryDefault(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-26\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-27\"><\/a>$container-&gt;set( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-28\"><\/a> 'view', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-29\"><\/a> function () { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-30\"><\/a> $view = new View(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-31\"><\/a> $view-&gt;setViewsDir(APP_PATH . '\/views\/'); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-32\"><\/a> return $view; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-33\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-34\"><\/a>); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-35\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-36\"><\/a>$container-&gt;set( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-37\"><\/a> 'url', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-38\"><\/a> function () { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-39\"><\/a> $url = new Url(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-40\"><\/a> $url-&gt;setBaseUri('\/'); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-41\"><\/a> return $url; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-42\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-43\"><\/a>); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-44\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-45\"><\/a>$application = new Application($container); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-46\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-47\"><\/a>try { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-48\"><\/a> \/\/ Handle the request <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-49\"><\/a> $response = $application-&gt;handle( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-50\"><\/a> $_SERVER&#91;\"REQUEST_URI\"] <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-51\"><\/a> ); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-52\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-53\"><\/a> $response-&gt;send(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-54\"><\/a>} catch (\\Exception $e) { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-55\"><\/a> echo 'Exception: ', $e-&gt;getMessage(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-7-56\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>As you can see, the bootstrap file is very short and we do not need to include any additional files. You are well on your way to creating a flexible MVC application in less than 30 lines of code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creating-a-controller\">Creating a Controller<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#creating-a-controller\">\u00b6<\/a><\/h2>\n\n\n\n<p>By default Phalcon will look for a controller named&nbsp;<code>IndexController<\/code>. It is the starting point when no controller or action has been added in the request (eg.&nbsp;<code>https:\/\/localhost\/<\/code>). An&nbsp;<code>IndexController<\/code>&nbsp;and its&nbsp;<code>IndexAction<\/code>&nbsp;should resemble the following example:<\/p>\n\n\n\n<p><code>app\/controllers\/IndexController.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-3\"><\/a>use Phalcon\\Mvc\\Controller; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-5\"><\/a>class IndexController extends Controller <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-7\"><\/a> public function indexAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-8\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-9\"><\/a> return '&lt;h1&gt;Hello!&lt;\/h1&gt;'; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-10\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-8-11\"><\/a>}<\/code><\/p>\n\n\n\n<p>The controller classes must have the suffix&nbsp;<code>Controller<\/code>&nbsp;and controller actions must have the suffix&nbsp;<code>Action<\/code>. For more information you can read our document about&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/controllers\/\">controllers<\/a>. If you access the application from your browser, you should see something like this:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.phalcon.io\/4.2\/assets\/images\/content\/tutorial-basic-1.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>NOTE<\/p>\n\n\n\n<p><strong>Congratulations, you are Phlying with Phalcon!<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sending-output-to-a-view\">Sending Output to a View<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#sending-output-to-a-view\">\u00b6<\/a><\/h2>\n\n\n\n<p>Sending output to the screen from the controller is at times necessary but not desirable as most purists in the MVC community will attest. Everything must be passed to the view that is responsible for outputting data on screen. Phalcon will look for a view with the same name as the last executed action inside a directory named as the last executed controller.<\/p>\n\n\n\n<p>Therefore in our case if the URL is:<code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-9-1\"><\/a>http:\/\/localhost\/<\/code><\/p>\n\n\n\n<p>will invoke the&nbsp;<code>IndexController<\/code>&nbsp;and&nbsp;<code>indexAction<\/code>, and it will search the view:<code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-10-1\"><\/a>\/views\/index\/index.phtml<\/code><\/p>\n\n\n\n<p>If found it will parse it and send the output on screen. Our view then will have the following contents:<\/p>\n\n\n\n<p><code>app\/views\/index\/index.phtml<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-11-1\"><\/a>&lt;?php echo \"&lt;h1&gt;Hello!&lt;\/h1&gt;\";<\/code><\/p>\n\n\n\n<p>and since we moved the&nbsp;<code>echo<\/code>&nbsp;from our controller action to the view, it will be empty now:<\/p>\n\n\n\n<p><code>app\/controllers\/IndexController.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-3\"><\/a>use Phalcon\\Mvc\\Controller; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-5\"><\/a>class IndexController extends Controller <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-7\"><\/a> public function indexAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-8\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-9\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-10\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-12-11\"><\/a>}<\/code><\/p>\n\n\n\n<p>The browser output will remain the same. The&nbsp;<code>Phalcon\\Mvc\\View<\/code>&nbsp;component is automatically created when the action execution has ended. You can read more about views in Phalcon&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/views\/\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"designing-a-sign-up-form\">Designing a Sign-up Form<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#designing-a-sign-up-form\">\u00b6<\/a><\/h2>\n\n\n\n<p>Now we will change the&nbsp;<code>index.phtml<\/code>&nbsp;view file, to add a link to a new controller named&nbsp;<em>signup<\/em>. The goal is to allow users to sign up to our application.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/views\/index\/index.phtml<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-3\"><\/a>echo \"&lt;h1&gt;Hello!&lt;\/h1&gt;\"; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-5\"><\/a>echo PHP_EOL; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-6\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-7\"><\/a>echo PHP_EOL; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-8\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-9\"><\/a>echo $this-&gt;tag-&gt;linkTo( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-10\"><\/a> 'signup', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-11\"><\/a> 'Sign Up Here!' <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-13-12\"><\/a>);<\/code><\/code><\/pre>\n\n\n\n<p>The generated HTML code displays an anchor (<code>&lt;a&gt;<\/code>) HTML tag linking to a new controller:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/views\/index\/index.phtml<\/code>&nbsp;(rendered)<code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-14-1\"><\/a>&lt;h1&gt;Hello!&lt;\/h1&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-14-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-14-3\"><\/a>&lt;a href=\"\/signup\"&gt;Sign Up Here!&lt;\/a&gt;<\/code><\/code><\/pre>\n\n\n\n<p>To generate the link for the&nbsp;<code>&lt;a&gt;<\/code>&nbsp;tag, we use the&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/tag\/\">Phalcon\\Tag<\/a>&nbsp;component. This is a utility class that offers an easy way to build HTML tags with framework conventions in mind. This class is also a service registered in the Dependency Injector so we can use&nbsp;<code>$this-&gt;tag<\/code>&nbsp;to access its functionality.<\/p>\n\n\n\n<p>NOTE<\/p>\n\n\n\n<p><code>Phalcon\\Tag<\/code>&nbsp;is already registered in the DI container since we have used the&nbsp;<code>Phalcon\\Di\\FactoryDefault<\/code>&nbsp;container. If you registered all the services on your own, you will need to register this component in your container to make it available in your application.<\/p>\n\n\n\n<p>The\u00a0Phalcon\\Tag\u00a0component also uses the previously registered\u00a0Phalcon\\Uri\u00a0component to correctly generate URIs. A more detailed article regarding HTML generation\u00a0can be found here.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.phalcon.io\/4.2\/assets\/images\/content\/tutorial-basic-2.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>And the Signup controller is (<code>app\/controllers\/SignupController.php<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/controllers\/SignupController.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-3\"><\/a>use Phalcon\\Mvc\\Controller; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-5\"><\/a>class SignupController extends Controller <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-7\"><\/a> public function indexAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-8\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-9\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-10\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-15-11\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>The empty index action gives the clean pass to a view with the form definition (<code>app\/views\/signup\/index.phtml<\/code>):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/views\/signup\/index.phtml<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-1\"><\/a>&lt;h2&gt;Sign up using this form&lt;\/h2&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-3\"><\/a>&lt;?php echo $this-&gt;tag-&gt;form(\"signup\/register\"); ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-5\"><\/a> &lt;p&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-6\"><\/a> &lt;label for=\"name\"&gt;Name&lt;\/label&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-7\"><\/a> &lt;?php echo $this-&gt;tag-&gt;textField(\"name\"); ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-8\"><\/a> &lt;\/p&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-9\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-10\"><\/a> &lt;p&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-11\"><\/a> &lt;label for=\"email\"&gt;E-Mail&lt;\/label&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-12\"><\/a> &lt;?php echo $this-&gt;tag-&gt;textField(\"email\"); ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-13\"><\/a> &lt;\/p&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-14\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-15\"><\/a> &lt;p&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-16\"><\/a> &lt;?php echo $this-&gt;tag-&gt;submitButton(\"Register\"); ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-17\"><\/a> &lt;\/p&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-18\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-16-19\"><\/a>&lt;\/form&gt;<\/code><\/code><\/pre>\n\n\n\n<p>Viewing the form in your browser will display the following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.phalcon.io\/4.2\/assets\/images\/content\/tutorial-basic-3.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>As mentioned above, the&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/tag\/\">Phalcon\\Tag<\/a>&nbsp;utility class, exposes useful methods allowing you to build form HTML elements with ease. The&nbsp;<code>Phalcon\\Tag::form()<\/code>&nbsp;method receives only one parameter for instance, a relative URI to a controller\/action in the application. The&nbsp;<code>Phalcon\\Tag::textField()<\/code>&nbsp;creates a text HTML element with the name as the passed parameter, while the&nbsp;<code>Phalcon\\Tag::submitButton()<\/code>&nbsp;creates a submit HTML button.<\/p>\n\n\n\n<p>By clicking the&nbsp;<em>Register<\/em>&nbsp;button, you will notice an exception thrown from the framework, indicating that we are missing the&nbsp;<code>register<\/code>&nbsp;action in the controller&nbsp;<code>signup<\/code>. Our&nbsp;<code>public\/index.php<\/code>&nbsp;file throws this exception:<code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-17-1\"><\/a>Exception: Action \"register\" was not found on handler \"signup\"<\/code><\/p>\n\n\n\n<p>Implementing that method will remove the exception:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/controllers\/SignupController.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-3\"><\/a>use Phalcon\\Mvc\\Controller; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-5\"><\/a>class SignupController extends Controller <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-7\"><\/a> public function indexAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-8\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-9\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-10\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-11\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-12\"><\/a> public function registerAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-13\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-14\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-15\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-18-16\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>If you click the&nbsp;<em>Register<\/em>&nbsp;button again, you will see a blank page. We will be adding a view a little later that provides useful feedback. But first, we should work on the code to store the user&#8217;s inputs in a database.<\/p>\n\n\n\n<p>According to MVC guidelines, database interactions must be done through models to ensure clean, object-oriented code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"creating-a-model\">Creating a Model<\/h2>\n\n\n\n<p>Phalcon brings the first ORM for PHP entirely written in C-language. Instead of increasing the complexity of development, it simplifies it.<\/p>\n\n\n\n<p>Before creating our first model, we need to create a database table using a database access tool or the database command line utility. For this tutorial we are using MySQL as our database, A simple table to store registered users can be created as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>create_users_table.sql<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-1\"><\/a>CREATE TABLE `users` ( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-2\"><\/a> `id` int(10) unsigned NOT NULL AUTO_INCREMENT, <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-3\"><\/a> `name` varchar(70) NOT NULL, <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-4\"><\/a> `email` varchar(70) NOT NULL, <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-5\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-6\"><\/a> PRIMARY KEY (`id`) <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-19-7\"><\/a>);<\/code><\/code><\/pre>\n\n\n\n<p>A model should be located in the&nbsp;<code>app\/models<\/code>&nbsp;directory (<code>app\/models\/Users.php<\/code>). The model maps to the&nbsp;<em>users<\/em>&nbsp;table:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/models\/Users.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-3\"><\/a>use Phalcon\\Mvc\\Model; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-5\"><\/a>class Users extends Model <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-7\"><\/a> public $id; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-8\"><\/a> public $name; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-9\"><\/a> public $email; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-20-10\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>NOTE<\/p>\n\n\n\n<p>Note that the public properties of the model correspond to the names of the fields in our table.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"setting-a-database-connection\">Setting a Database Connection<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#setting-a-database-connection\">\u00b6<\/a><\/h2>\n\n\n\n<p>In order to use a database connection and subsequently access data through our models, we need to specify it in our bootstrap process. A database connection is just another service that our application has, that can be used throughout our application:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>public\/index.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-3\"><\/a>use Phalcon\\Db\\Adapter\\Pdo\\Mysql; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-5\"><\/a>$container-&gt;set( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-6\"><\/a> 'db', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-7\"><\/a> function () { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-8\"><\/a> return new Mysql( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-9\"><\/a> &#91; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-10\"><\/a> 'host' =&gt; '127.0.0.1', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-11\"><\/a> 'username' =&gt; 'root', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-12\"><\/a> 'password' =&gt; 'secret', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-13\"><\/a> 'dbname' =&gt; 'tutorial', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-14\"><\/a> ] <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-15\"><\/a> ); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-16\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-21-17\"><\/a>);<\/code><\/code><\/pre>\n\n\n\n<p>Adjust the code snippet above as appropriate for your database.<\/p>\n\n\n\n<p>With the correct database parameters, our model is ready to interact with the rest of the application so we can save the user&#8217;s input. First, let&#8217;s take a moment and create a view for&nbsp;<code>SignupController::registerAction()<\/code>&nbsp;that will display a message letting the user know the outcome of the&nbsp;<em>save<\/em>&nbsp;operation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/views\/signup\/register.phtml<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-22-1\"><\/a>&lt;div class=\"alert alert-&lt;?php echo $success === true ? 'success' : 'danger'; ?&gt;\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-22-2\"><\/a> &lt;?php echo $message; ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-22-3\"><\/a>&lt;\/div&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-22-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-22-5\"><\/a>&lt;?php echo $this-&gt;tag-&gt;linkTo(&#91;'\/', 'Go back', 'class' =&gt; 'btn btn-primary']); ?&gt; <\/code>Note that we have added some css styling in the code above. We will cover including the stylesheet in the&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#styling\">Styling<\/a>&nbsp;section below.<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"storing-data-using-models\">Storing Data using Models<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/controllers\/SignupController.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-3\"><\/a>use Phalcon\\Mvc\\Controller; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-5\"><\/a>class SignupController extends Controller <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-7\"><\/a> public function indexAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-8\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-9\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-10\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-11\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-12\"><\/a> public function registerAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-13\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-14\"><\/a> $user = new Users(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-15\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-16\"><\/a> \/\/assign value from the form to $user <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-17\"><\/a> $user-&gt;assign( <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-18\"><\/a> $this-&gt;request-&gt;getPost(), <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-19\"><\/a> &#91; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-20\"><\/a> 'name', <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-21\"><\/a> 'email' <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-22\"><\/a> ] <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-23\"><\/a> ); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-24\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-25\"><\/a> \/\/ Store and check for errors <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-26\"><\/a> $success = $user-&gt;save(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-27\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-28\"><\/a> \/\/ passing the result to the view <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-29\"><\/a> $this-&gt;view-&gt;success = $success; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-30\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-31\"><\/a> if ($success) { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-32\"><\/a> $message = \"Thanks for registering!\"; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-33\"><\/a> } else { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-34\"><\/a> $message = \"Sorry, the following problems were generated:&lt;br&gt;\" <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-35\"><\/a> . implode('&lt;br&gt;', $user-&gt;getMessages()); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-36\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-37\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-38\"><\/a> \/\/ passing a message to the view <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-39\"><\/a> $this-&gt;view-&gt;message = $message; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-40\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-23-41\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>At the beginning of the&nbsp;<code>registerAction<\/code>&nbsp;we create an empty user object using the&nbsp;<code>Users<\/code>&nbsp;class we created earlier. We will use this class to manage the record of a user. As mentioned above, the class&#8217;s public properties map to the fields of the&nbsp;<code>users<\/code>&nbsp;table in our database. Setting the relevant values in the new record and calling&nbsp;<code>save()<\/code>&nbsp;will store the data in the database for that record. The&nbsp;<code>save()<\/code>&nbsp;method returns a&nbsp;<code>boolean<\/code>&nbsp;value which indicates whether the save was successful or not.<\/p>\n\n\n\n<p>The ORM will automatically escape the input preventing SQL injections so we only need to pass the request to the&nbsp;<code>save()<\/code>&nbsp;method.<\/p>\n\n\n\n<p>Additional validation happens automatically on fields that are defined as not null (required). If we do not enter any of the required fields in the sign-up form our screen will look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.phalcon.io\/4.2\/assets\/images\/content\/tutorial-basic-4.png\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"list-the-registered-users\">List the Registered Users<a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#list-the-registered-users\">\u00b6<\/a><\/h2>\n\n\n\n<p>Now we will need to get and display all the registered users in our database<\/p>\n\n\n\n<p>The first thing that we are going to do in our&nbsp;<code>indexAction<\/code>&nbsp;of the<code>IndexController<\/code>&nbsp;is to show the result of the search of all the users, which is done simply by calling the static method&nbsp;<code>find()<\/code>&nbsp;on our model (<code>Users::find()<\/code>).<\/p>\n\n\n\n<p><code>indexAction<\/code>&nbsp;would change as follows:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/controllers\/IndexController.php<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-3\"><\/a>use Phalcon\\Mvc\\Controller; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-5\"><\/a>class IndexController extends Controller <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-6\"><\/a>{ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-7\"><\/a> \/** <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-8\"><\/a> * Welcome and user list <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-9\"><\/a> *\/ <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-10\"><\/a> public function indexAction() <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-11\"><\/a> { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-12\"><\/a> $this-&gt;view-&gt;users = Users::find(); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-13\"><\/a> } <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-24-14\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>NOTE<\/p>\n\n\n\n<p>We assign the results of the&nbsp;<code>find<\/code>&nbsp;to a magic property on the&nbsp;<code>view<\/code>&nbsp;object. This sets this variable with the assigned data and makes it available in our view<\/p>\n\n\n\n<p>In our view file&nbsp;<code>views\/index\/index.phtml<\/code>&nbsp;we can use the&nbsp;<code>$users<\/code>&nbsp;variable as follows:<\/p>\n\n\n\n<p>The view will look like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>views\/index\/index.phtml<\/code><code><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-1\"><\/a>&lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-2\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-3\"><\/a>echo \"&lt;h1&gt;Hello!&lt;\/h1&gt;\"; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-4\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-5\"><\/a>echo $this-&gt;tag-&gt;linkTo(&#91;\"signup\", \"Sign Up Here!\", 'class' =&gt; 'btn btn-primary']); <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-6\"><\/a> <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-7\"><\/a>if ($users-&gt;count() &gt; 0) { <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-8\"><\/a> ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-9\"><\/a> &lt;table class=\"table table-bordered table-hover\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-10\"><\/a> &lt;thead class=\"thead-light\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-11\"><\/a> &lt;tr&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-12\"><\/a> &lt;th&gt;#&lt;\/th&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-13\"><\/a> &lt;th&gt;Name&lt;\/th&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-14\"><\/a> &lt;th&gt;Email&lt;\/th&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-15\"><\/a> &lt;\/tr&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-16\"><\/a> &lt;\/thead&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-17\"><\/a> &lt;tfoot&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-18\"><\/a> &lt;tr&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-19\"><\/a> &lt;td colspan=\"3\"&gt;Users quantity: &lt;?php echo $users-&gt;count(); ?&gt;&lt;\/td&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-20\"><\/a> &lt;\/tr&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-21\"><\/a> &lt;\/tfoot&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-22\"><\/a> &lt;tbody&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-23\"><\/a> &lt;?php foreach ($users as $user) { ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-24\"><\/a> &lt;tr&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-25\"><\/a> &lt;td&gt;&lt;?php echo $user-&gt;id; ?&gt;&lt;\/td&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-26\"><\/a> &lt;td&gt;&lt;?php echo $user-&gt;name; ?&gt;&lt;\/td&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-27\"><\/a> &lt;td&gt;&lt;?php echo $user-&gt;email; ?&gt;&lt;\/td&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-28\"><\/a> &lt;\/tr&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-29\"><\/a> &lt;?php } ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-30\"><\/a> &lt;\/tbody&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-31\"><\/a> &lt;\/table&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-32\"><\/a> &lt;?php <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-25-33\"><\/a>}<\/code><\/code><\/pre>\n\n\n\n<p>As you can see our variable&nbsp;<code>$users<\/code>&nbsp;can be iterated and counted. You can get more information on how models operate in our document about&nbsp;<a href=\"https:\/\/docs.phalcon.io\/4.2\/db-models\/\">models<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.phalcon.io\/4.2\/assets\/images\/content\/tutorial-basic-5.png\" alt=\"\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"styling\">Styling<\/h2>\n\n\n\n<p>We can now add small design touches to our application. We can add the&nbsp;<a href=\"https:\/\/getbootstrap.com\/\">Bootstrap CSS<\/a>&nbsp;in our code so that it is used throughout our views. We will add an&nbsp;<code>index.phtml<\/code>&nbsp;file in the<code>views<\/code>&nbsp;folder, with the following content:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><code>app\/views\/index.phtml<\/code><code class=\"\"><a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-1\"><\/a>&lt;!doctype html&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-2\"><\/a>&lt;html lang=\"en\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-3\"><\/a>&lt;head&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-4\"><\/a> &lt;meta charset=\"UTF-8\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-5\"><\/a> &lt;title&gt;Phalcon Tutorial&lt;\/title&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-6\"><\/a> &lt;link rel=\"stylesheet\" href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.3.1\/css\/bootstrap.min.css\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-7\"><\/a>&lt;\/head&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-8\"><\/a>&lt;body&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-9\"><\/a>&lt;div class=\"container\"&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-10\"><\/a> &lt;?php echo $this-&gt;getContent(); ?&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-11\"><\/a>&lt;\/div&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-12\"><\/a>&lt;\/body&gt; <a href=\"https:\/\/docs.phalcon.io\/4.2\/tutorial-basic\/#__codelineno-26-13\"><\/a>&lt;\/html&gt;<\/code><\/code><\/pre>\n\n\n\n<p>In the above template, the most important line is the call to the&nbsp;<code>getContent()<\/code>&nbsp;method. This method returns all the content that has been generated from our view. Our application will now show:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/docs.phalcon.io\/4.2\/assets\/images\/content\/tutorial-basic-6.png\" alt=\"\"\/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Overview Throughout this tutorial, we will create an application with a simple registration form, while introducing the main design aspects of Phalcon. This tutorial covers the implementation of a simple MVC application, showing how fast and easy it can be done with Phalcon. Once developed, you can use this application and extend it to suit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89],"tags":[],"class_list":["post-820","post","type-post","status-publish","format-standard","hentry","category-phalcon"],"_links":{"self":[{"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/posts\/820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/comments?post=820"}],"version-history":[{"count":1,"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/posts\/820\/revisions"}],"predecessor-version":[{"id":821,"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/posts\/820\/revisions\/821"}],"wp:attachment":[{"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/media?parent=820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/categories?post=820"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learnpython.elegantwallp.com\/wp-json\/wp\/v2\/tags?post=820"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}