Laravel is a php framework. Windows installation Install XAMPP Install Composer With terminal go to cd /C/xampp/htdocs From terminal within a folder install laravel package composer create-project laravel/laravel laravelApp Go to the project folder cd laravelApp Open it with VSCode . code Start Apache server from XAMPP software Project is served from http://localhost/laravelApp/public/index.php Virtual host (optional) We can swap long project url http://localhost/laravelApp/public/index.php with a short domain name http://laravelApp.test Add virtual host configuration into C:\xampp\apache\conf\extra\httpd-vhosts.conf file <VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/laravelApp/public" ServerName laravelapp.dev </VirtualHost> Modify C:\Windows\System32\drivers\etc\hosts file as administrator by adding following & restart Apache. 127.0.0.1 localhost 127.0.0.1 laravelapp.test MVC Laravel is based on the MVC architecture, where Model takes care of database. Models go into app folder. View is responsible for UI Controller handles requests Files are distributed as on the picture View from route We can return text, html, page for a GET request directly from a routes/web.php HTML string is returned. HTML file is returned. Data can be passed via url. View from controller We usually do not want to return a view from a route Normal way is that a route goes to a controller function, which returns a view Artisan The easiest way to create a controller is to use artisan command like php artisan make:controller PagesController PagesController.php file has been created and we return views via functions, one with a text, another with a page. Do not forget to add routes to controllers with following pattern. Post request POST, PUT & DELETE requests are done similar way as GET. May require disabling CSRF verification. Blade templating Note how we dynamically inserted <title> into page from .env file. Layouts If we have pages with repetitive blocks, we may create a layout template and avoid repeating ourselves. To make templating easier we may install blade snippets for syntax highlighting. Pass value Pass single value Pass multiple values in associative or indexed array // controller public function page3() { $data = array( 'title' => 'TITLE', 'items' => ['ITEM-01', 'ITEM-02', 'ITEM-03'] ); return view('pages.page3', [ 'data' => $data, 'title' => $data['title'], 'items' => $data['items'] ]); } // view @extends('layouts.layout') @section('content') <p><?php var_dump($data); ?></p> <p>Purely with php</p> <H><?php echo $title;?></H> <ul> <li><?php echo $items[0];?></li> <li><?php echo $items[1];?></li> <li><?php echo $items[2];?></li> </ul> <p>With template rules</p> <H>{{$title}}</H> @if(count($items) > 0) <ul> @foreach($items as $item) <li>{{$item}}</li> @endforeach </ul> @endif @endsection Add CSS {{asset(path)}} refers to public folder Database for posts Do not forget to launch MySQL in XAMPP Create a new laravelApp database via http://localhost/phpmyadmin No need to create tables, because it will be done via migrations . Let's create a new Controller for different database requests with artisan command php artisan make:controller PostsController --resource Add routes for all new methods in our new PostsController automatically just at ones Route::resource('/posts', PostsController::class) All available routes can be checked with php artisan route:list Migration (tables creation) Also create a Model + 'migration' with artisan command php artisan make:model Post -m Laravel migration is a way to create a table in DB without a database manager. Migrations allow to add or drop fields in a database without deleting the records already present, it is kind of a version control. Anything we want to add or execute / roll back during a migration goes inside the up() / down() methods. Prior that we need to provide details your database in .env file. Also uncomment extension=pdo_mysql & extension=pdo_mysql in php.ini at C:\xampp\php\php.ini & for me also at C:\php\php.ini By the way I did not have to modify anything in AppServiceProvider.php file as suggested by Brad in his video to resolve some errors. Trigger migrations with terminal php artisan migrate Tables have been added. Posts table has same fields as we provided into migration file Initial data with tinker & eloquent We can supply initial data to our table via php artisan tinker and interact with our DB via Eloquent php artisan tinker App\Models\Post::count(); $post = new App\Models\Post(); $post -> title = 'Post One'; $post -> body = 'this is the post body'; $post -> save(); $post = new App\Models\Post(); $post -> title = 'Post Two'; $post -> body = 'this is post 2'; $post -> save(); Now we add some data into posts table using Post model Fetch data from database Because PostsController contains multiple methods by default including index() we may access http://localhost/laravelApp/public/posts which will be blank until we return something from the method. Let' return whole posts table from index() using Post::all() eloquent method. We can use different methods, like Post::orderBy("title", "desc") -> get() or Post::where("title", "Post Two") -> get() Let's make posts index blade and bring all posts data there via eloquent method Post::all() . Or we can use SQL statements instead of eloquent. Fetch individual post We can make an individual page for a post and fetch data from database using id from the url. Pagination Pagination can be inserted automatically with following eloquent Post::orderBy('title', 'asc') -> simplePaginate(1) We show only one post per page for presentation sake, because we have only two posts in our table. To be continued ... let's continue with Laravel later, that is absolutely new realm which looks like not very popular in 2022.