Laravel
Installation
Install Dependencies:
sudo apt install php7.3 apache2 php7.3-cli php7.3-sqlite3 php-xml php7.0-mysql sudo a2enmod rewrite sudo systemctl restart apache2
Enable below extension:
sudo nano /etc/php/7.3/apache2/php.ini extension=pdo_mysql.so
Install Composer:
sudo apt install composer
Check Version:
php artisan --version
Creating a project named 'code':
composer create-project --prefer-dist laravel/laravel hello cd hello cp .env.example .env php artisan key:generate sudo chmod -R 777 storage/
Testing output:
php artisan serve --host 0.0.0.0 --port 8082
Edit hosts file:
sudo nano /etc/hosts 192.168.1.35 hello.dev
Create a new apache conf file:
sudo nano /etc/apache2/sites-available/laravel.conf
<VirtualHost *:80> ServerName hello.dev ServerAdmin webmaster@localhost DocumentRoot /var/www/html/hello/public <Directory /var/www/html/hello/public> AllowOverride All </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
sudo nano /etc/apache2/ports.conf Listen 80
sudo a2ensite laravel.conf sudo service apache2 restart
The site should be available now at:
http://hello.dev/
Auth
Enable Authentication
composer require laravel/ui php artisan ui vue --auth php artisan migrate
Site Creation
Routes
cd routes/ sudo nano web.php
Route::get('contact', function () { return 'Hello from Aman'; }); Route::get('contact/{category}', function ($category) { return 'Hello from '.$category. ' Aman'; });
Check resulting pages:
http://192.168.1.35/hello/public/contact/ http://192.168.1.35/hello/public/contact/Test
Views
Create a new View file:
cd ../resources/views/ sudo touch master.blade.php sudo nano master.blade.php
Paste below contents:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE-edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>HELLO</title> </head> <body> <nav class="navbar navbar-inverse"> <div class="container-fluid"> <div class="navbar-header"> <a class="navbar-brand" href="{{url('/home')}}">Home</a> </div> <div> <ul class="nav navbar-nav"> <li><a href="{{url('/view')}}">View All</a></li> <li><a href="{{url('/new')}}">Add New</a></li> <li><a href="{{url('/edit')}}">Edit/Delete</a></li> </ul> </div> </div> </nav> <div class="container"> @yield('content') </div> <!-- Online Links --> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" > </body> </html>
Edit Routes for this file:
cd ../../routes/ sudo nano web.php
Route::get('/home', function () { return view('home'); }); Route::get('/view', function () { return view('view'); }); Route::get('/new', function () { return view('new'); }); Route::get('/edit', function () { return view('edit'); });
Create above defined VIEW page:
cd ../resources/views/ sudo touch view.blade.php sudo nano view.blade.php
Paste below contents:
@extends('master') @section('content') VIEW all content goes here @endsection
Similarly create HOME page:
sudo nano home.blade.php
@extends('master') @section('content') HOME all content goes here @endsection
Similarly create NEW page:
sudo nano new.blade.php
@extends('master') @section('content') NEW all content goes here @endsection
Similarly create EDIT page:
sudo nano edit.blade.php
@extends('master') @section('content') EDIT all content goes here @endsection
Test above page:
http://192.168.1.35/hello/public/home
Controller
- Routes page can call URLs but this is for small applications only.
- For industrial applications, use Controllers.
Create a Controller:
sudo php artisan make:controller RecordController
Edit the above generated file:
cd app/Http/Controllers/ sudo nano RecordController.php
Append below contents:
class RecordController extends Controller { public function showAll() { return view('view'); } public function showNew() { return view('new'); } public function showEdit() { return view('edit'); } }
Update the Routes file to use above controllers:
cd ../../routes/ sudo nano web.php
Append below content:
Route::get('/view', 'RecordController@showAll'); Route::get('/new', 'RecordController@showNew'); Route::get('/edit', 'RecordController@showEdit');
Database
- Easy to create & manage tables with Migrations in large environments.
Create a new DB 'hello' using phpmyadmin or below SQL Query:
create database hello; grant all privileges on hello.* to aman@localhost identified by 'pwd@123';
Update the ENV file with this information:
sudo nano .env
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=hello DB_USERNAME=aman DB_PASSWORD=pwd@123
Create a DB table using Artisan:
sudo php artisan make:migration create_records_table Created Migration: 2017_09_19_190352_create_records_table
File is created under below location:
cd database/migrations/ && ls 2017_09_19_190352_create_records_table.php
Edit this file with below DB Table information:
sudo nano 2017_09_19_190352_create_records_table.php
public function up() { Schema::create('records', function (Blueprint $table) { $table->increments('id'); $table->string('country'); $table->string('city'); $table->string('date'); $table->string('no_of_aliens'); $table->string('color_of_aliens'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('records'); }
Create the Tables:
sudo php artisan migrate
You can confirm the Tables created in phpmyadmin.
Eloquent
Create a model named Record
sudo php artisan make:model Record
cd app/ sudo nano Record.php
Add below information
class Record extends Model { protected $table='records'; protected $fillable=['id','country','city','date','no_of_aliens','color_of_aliens']; }
To Feed test data using Seeding, create seed file:
sudo php artisan make:seeder RecordsTableSeeder
cd database/seeds/ sudo nano RecordsTableSeeder.php
Append below information:
use App\Record; //to import records.php file class RecordsTableSeeder extends Seeder { public function run() { for ($i=0; $i<20; $i++) { Record::create ( [ 'country' => "country$i", 'city' => "city$i", 'date' => "date$i", 'no_of_aliens' => "no_of_aliens$i", 'color_of_aliens' => "color_of_aliens$i" ] ); } } }
Edit the Databse seeder file:
sudo nano DatabaseSeeder.php
use App\Record; class DatabaseSeeder extends Seeder { public function run() { $this->call('RecordsTableSeeder'); } }
Now seed the file with dummy data:
sudo php artisan db:seed Seeding: RecordsTableSeeder
You will be able to see this dummy data in phpmyadmin now.
View DB contents
- Check all/Debug output from DB for troubleshooting:
sudo nano app/Http/Controllers/RecordController.php
Append below code into relevant sections:
use App\Record; class RecordController extends Controller { public function showAll() { // return view('view'); dd(Record::all()) ; }
Check the View page, you will find all information there
http://hello.dev/view
- Getting specific information from DB:
class RecordController extends Controller { public function showAll() { $records=Record::all(); return view('view')->with('records',$records); // dd(Record::all()) ; }
sudo nano resources/views/view.blade.php
@extends('master') @section('content') <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">All Available Aliens </h3> </div> <div class="panel-body"> <div class="table-responsive"> <table class="table table-stripped table-bordered"> <thread> <tr> <th>Country</th> <th>City</th> <th>Dates</th> <th>No of Aliens</th> <th>Color of Aliens</th> </tr> </thread> <tbody> @foreach($records as $key=>$record) <tr> <td>{{$record->country}}</td> <td>{{$record->city}}</td> <td>{{$record->date}}</td> <td>{{$record->no_of_aliens}}</td> <td>{{$record->color_of_aliens}}</td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> @endsection
Check the View page, you will find useful information in a table here:
http://hello.dev/view
Entering Data
sudo nano resources/views/new.blade.php
@extends('master') @section('content') <div class="container-fluid"> <div class="panel panel-default"> <div class="panel-heading"> <h3 class="panel-title">Report New Aliens</h3> </div> <div class="panel-body"> <form role="form" method="POST" action="{{url('/info')}}"> <input type="hidden" name="_token" value="{{ csrf_token() }}"> <div class="form-group"> <label class="col-md-3 control-label">Country:</label> <div class="col-md-9"> <input type="text" class="form-control" name='country' value="{{ old('country') }}"/></br> </div> </div> <div class="form-group"> <label class="col-md-3 control-label">City:</label> <div class="col-md-9"> <input type="text" class="form-control" name='city' value="{{ old('city') }}"/></br> </div> </div> <div class="form-group"> <label class="col-md-3 control-label">Date:</label> <div class="col-md-9"> <input type="text" class="form-control" name='date' value="{{ old('date') }}"/></br> </div> </div> <div class="form-group"> <label class="col-md-3 control-label">No of Aliens:</label> <div class="col-md-9"> <input type="text" class="form-control" name='no_of_aliens' value="{{ old('no_of_aliens') }}"/></br> </div> </div> <div class="form-group"> <label class="col-md-3 control-label">Color of Aliens:</label> <div class="col-md-9"> <input type="text" class="form-control" name='color_of_aliens' value="{{ old('color_of_aliens') }}"/></br> </div> </div> <div class="form-group"> <div class="col-md-6 col-md-offset-6"> <button type="submit" class="btn btn-success btn-block" value='Submit'>Submit</button> </div> </div> </form> </div> </div> </div> @endsection
sudo nano routes/web.php
Route::post('/info', 'RecordController@store');
Now you can see the Form Page:
http://hello.dev/new
Enable store Function to send data to DB
sudo nano app/Http/Controllers/RecordController.php
public function store(Request $request) { $Record=new Record; $Record->country=$request->get('country'); $Record->city=$request->get('city'); $Record->date=$request->get('date'); $Record->no_of_aliens=$request->get('no_of_aliens'); $Record->color_of_aliens=$request->get('color_of_aliens'); $Record->save(); return redirect()->back(); // this will rediect back to the same page to enter more data }
Now you can enter the data from Form Page which will be saved into DB:
http://hello.dev/new
Data entered will be visible here:
http://hello.dev/view
Showing Messages
sudo nano app/Http/Controllers/RecordController.php
Inside this function:
public function store(Request $request)
Below this file:
$Record->save();
Insert:
$request->session()->flash('flash_message','New record added successfully');
To show above errors/messages:
sudo nano resources/views/master.blade.php
Before this section:
<div class="container"> @yield('content')
Paste:
@if(Session::has('flash_message')) <div class="alert alert-success"> {{ Session::get('flash_message') }} </div> @endif @if (count($errors) > 0) <div class="alert alert-danger"> <strong>Whoops!</strong> There were some errors with your input.<br><br> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Data Validation using Laravel Request
Generate a request file:
cd /var/www/html/hello sudo php artisan make:request RecordDataRequest
Edit this file:
sudo nano app/Http/Requests/RecordDataRequest.php
public function authorize() { return true; } public function rules() { return [ 'country'=>'required', 'city'=>'required', ]; }
Edit this file:
sudo nano app/Http/Controllers/RecordController.php
Append:
use App\Http\Requests\RecordDataRequest;
Edit this file:
sudo nano app/Http/Controllers/RecordController.php
Change:
public function store(Request $request)
To:
public function store(RecordDataRequest $request)
Code to display all error messages is already added in earlier section.
- References
{{#widget:DISQUS
|id=networkm
|uniqid=Laravel
|url=https://aman.awiki.org/wiki/Laravel
}}