Till now we have covered :
Laravel fundamentals that consists of
Routes:
Controller:
View:
Little bit of blade templating engine
Routes:
In route we route the link example:
Route::get('/',function(){
return "Hello To Root";
});
Route::get('/contact',function(){
return "Welcome to Contact Page";
});
//If we need to do with id variable then from get we get from below routes
Route::get('/contact/{id}/{pass}',function($id,$pass){ //it's taking input from user through browser addressbar
return "ID: ".$id."Pass: ".$pass;
});
Some route example including where method:
Route::get('user/{name}/{id}',function($name,$id){
return " Vaisab: "."Amar Naam: ".$name." and ID:".$id." :D";
})->where(['id'=>'[0-9]+','name'=>'[A-Z]+']);
naming routes from edwin’s video:
Route::get('admin/posts/example',array('as'=>'admin.zone',function(){
$url=route('admin.zone');
return "this url is:".$url;
}));
Laravel Routing:
https://laravel.com/docs/5.4/routing
Controller:
To create controller with predefined functions we need php artisan command
php artisan make:controller --resource ZakiLive
This command will create automatic controller file name ZakiLive.php in
app/http/controllers
folder with predefined function.
Link Controller With Routes
So, we can set in routes/web.php file and link with controller by below code:
Route::get('/post','ZakiLive@index');
here index is a function/method that is exist in with ZakiLive.php controller file
Passing data to controller from route:
in route/web.php file
Route::get('/post/{id}/{name}','ZakiLive@index');
Now in ZakiLive.php controller file in index method/function we are getting the id, name from the url route so the code of this function below:
public function index($id,$name)
{
echo "Hello! ID: ".$id." name: ".$name." ";
return "from Zaki";
}
So when we are typing:
http://cms.dev/post/99/jj
It is giving the output:
Hello! ID: 99name: jjfrom Zaki
Resources and Controllers:
By typing this in web.php route file:
Route::resource('post','ZakiLive');
Check we didn’t linked to any specific methods in ZakiLive controller file..This is the magic of resource function in laravel and then typing PHP artisan command from terminal we get:
C:\laragons\www\cms>php artisan route:list
+--------+-----------+------------------+--------------+---------------------------------------+------------
--+
| Domain | Method | URI | Name | Action | Middleware
|
+--------+-----------+------------------+--------------+---------------------------------------+------------
--+
| | GET|HEAD | api/user | | Closure | api,auth:ap
i |
| | GET|HEAD | post | post.index | cms\Http\Controllers\ZakiLive@index | web
|
| | POST | post | post.store | cms\Http\Controllers\ZakiLive@store | web
|
| | GET|HEAD | post/create | post.create | cms\Http\Controllers\ZakiLive@create | web
|
| | GET|HEAD | post/{id}/{name} | | cms\Http\Controllers\ZakiLive@index | web
|
| | GET|HEAD | post/{post} | post.show | cms\Http\Controllers\ZakiLive@show | web
|
| | PUT|PATCH | post/{post} | post.update | cms\Http\Controllers\ZakiLive@update | web
|
| | DELETE | post/{post} | post.destroy | cms\Http\Controllers\ZakiLive@destroy | web
|
| | GET|HEAD | post/{post}/edit | post.edit | cms\Http\Controllers\ZakiLive@edit | web
|
+--------+-----------+------------------+--------------+---------------------------------------+------------
--+
So, from the above list if we type http://cms.dev/post/create then it will return from create method available in ZakiLive.php controller file
so here it is I defined:
public function create()
{
return "This is Create Method";
}
Output:
This is Create Method
Controller reference in official laravel docs:
https://laravel.com/docs/5.2/controllers#introduction
Views:
Views available in laravel 5.4 in resources/views/dekho.blade.php
Now need to route the url to controller ZakiLive.php…so in this file the below code:
public function Dekhao()
{
return view('dekho'); //here dekho is the view file in the directory in blade.php format
}
Now link the route/web.php file with controller file
code:
Route::get('/route','ZakiLive@Dekhao');
Passing Data to View:
We can pass data from url to view through controller by using below code:
In Controller ZakiLive.php we need to write the below code:
public function ShowID($id,$name,$pass){
//return view('dekhoid')->with('id',$id); //it's good for only one id sending for more than one we can use comapct function
return view('dekhoid',compact('id','name','pass'));
}
in route we need to pass the url with id :
web.php
Route::get('dekho/{id}/{name}/{pass}','ZakiLive@ShowID');
In views folder now we can create a blade formatted php file to display the passed data from url
<html>
<head>
<title>Dekho ID</title>
</head>
<body>
ID: {{$id}}
Name: {{$name}}
Password: {{$password}}
</body>
</html>
View Data Without Controller(Passed data only from Route to View):
Route::get('/jhinga',function(){
return view('hello/greetings',['name'=>'james']);
});
in views folder:
view/hello/greetings.bade.php file
code:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Hello, {{$name}}</h1>
</body>
</html>
Laravel View Reference:
https://laravel.com/docs/5.4/views#creating-views
Master Layout with Blade Templating
for layout setup i am explaining here from routing to controller to blade templating from first to last(A-Z)
In routes/web.php add this line:
route::get('/bladeshow/{id}/{pass}','ZakiLive@bladeShow');
and now in controller file ZakiLive.php
add this line:
public function bladeShow($id,$pass){
return view('bladeshow',compact('id','pass'));
}
now in views folder create a folder “bladebladedekhao” then a file “appshow.blade.php”
in this file add some codes
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div class="container">
@yield('content')
</div>
<b>
@yield('dhaka')
</b>
@yield('footer')
</body>
</html>
check attentively that here @yield(‘content’) is declaring the section in <div> </div> and @yield(‘dhaka’) is defining the inside of <b> </b> section where <body> </body> section is defining by @yield(‘footer’) section
Now views/bladeshow.blade.php file we are going to write this code:
@extends('bladebladedekhao.appshow')
@section('content')
<h1>BladeShow te Shagotom {{$id}} {{$pass}}</h1>
@endsection
@section('footer')
@stop
where extends is a blade syntax and it’s helping to include “appshow.blade.php” file to the bladeshow.blade.php file in views folder
@section(‘content’) is inherited part from the appshow file @endsection/@stop is closing the section gracefully 😀
{{id}} and {{pass}} variable is coming from the url by using below link:
http://cms.dev/bladeshow/id/009
Same we can do for contact page :
to do this in routes/web.php file we can do :
route::get('/contact','ZakiLive@ContactShow');
then in controller file ZakiLive.php:
public function ContactShow(){
return view('contact');
}
Then in views/contact.blade.php file we can add this code:
@extends('bladebladedekhao.appshow')
@section('footer')
<h1>Contact Page</h1>
@stop
and after typing the url we will get the output:
url:
http://cms.dev/contact
Output:
Contact Page
Some more blade features with
For contact page we will assign manual variable in controller to send it to contact page. Let’s see: How we can do it:
public function ContactShow(){
$people= ['Zaki','Live','Dhaka','Live'];
return view('contact',compact('people'));
}
Now in Contact page:
@section('content')
<h1>Contact Page</h1>
@if(count($people))
<ul>
@foreach($people as $person)
<li>{{$person}}</li>
@endforeach
</ul>
@endif
@endsection
So Output will be like this:
Contact Page Zaki Live Dhaka Live
if we change in controller like this:
public function ContactShow(){
$people=[];
return view('contact',compact('people'));
}
It will show nothing but only contact page:
So Output will be like this:
Contact Page
if we change in controller like this:
public function ContactShow(){
$people=['hk'];
return view('contact',compact('people'));
}
It will show nothing but only contact page:
So output will be like this:
Contact Page hk
Reference for laravel blade engine:
https://laravel.com/docs/5.4/blade
Migrate Database and Dropping them:
Create database manually from phpmyadmin giving the name laravel_cms then in .env file we will set the database credentials like pass,username etc.
then we will type:
php artisan make:migration
then in database/migration folder we will check some predefined files name for creating our own table with migration.
then we need to type in terminal about this:
php artisan make:migration create_posts_vanga --create="ghost
It will create the file below like this:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreatePostsVanga extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ghost', function (Blueprint $table) {
$table->increments('id');
$table->string('book');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ghost');
}
}
Now to update this we can create this:
php artisan migrate
and it will change the mysql db and add “ghost” table in database that can be checkecd from phpmyadmin
now if we want to roll back/drop the database ghost that we created we need to just type this command:
php artisan migrate:rollback
then aftwer checking the database with php myadmin we will see that “ghost” table is not available there 🙂
if we again type
php artisan migrate
then ghost table will be back from the database
Adding Column to Existing Database and Dropping Them:
php artisan migrate:status
https://laravel.com/docs/5.2/migrations
RAW SQL Query:
For inserting into database:
Route::get('/insert',function(){
DB::insert('insert into posts(title, contents) values(?,?)',['PHP with laravel','Laravel is the best thing that has happened to PHP']);
});
For Reading from the database:
Route::get('/read',function(){
$results=DB::select('select * from posts where id=?',[1]);
foreach($results as $post){
return $post->title;
}
});
Reading Slightly Difference:
Route::get('/read',function(){
$results=DB::select('select * from posts where id=?',[1]);
// return $results;
//return var_dump($results);
foreach($results as $post){
return $post->title;
}
});
Update:
Route::get('/update', function(){
$update=DB::update('update posts set title="Update korsi title" where id=?',[1]);
});
Delete:
Route::get('/delete',function(){
$delete=DB::delete('delete from posts where id = ?',[1]);
return $delete;
});
Reference: https://laravel.com/docs/5.2/database
Database Eloquent ORM:
php artisan make:model Post
Some example to see with database in route with Post ORM:
Route::get('/find',function(){
$posts=\cms\Post::all();
foreach ($posts as $post){
return $post->title;
}
});
another:
Route::get('/find',function(){
$posts=\cms\Post::find(2);
return $posts->title;
// foreach ($posts as $post){
// return $post->title;
// }
});
Order by in database:
Route::get('/findwhere',function(){
$posts=\cms\Post::where('id',2)->orderBy('id','desc')->take(1)->get();
return $posts;
});
Insert method:
Route::get('/basicinsert',function(){
$post=new \cms\Post();
$post->title='neW ORM title eloquent';
$post->contents="Eloquent is really cool";
$post->save();
});
ORM insert by find(specific_id_in_db)
code:
Route::get('/ormuoinsert',function(){
$post=cms\Post::find(2);
$post->title='New eloquent title insert 2';
$post->contents="New eloquent is really cool";
$post->save();
});
Creating Data and Configuring mass Assignment:
Post:
<?php
namespace cms;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// protected $table='posts';
// protected $primaryKey='id';
//
protected $fillable=[
'title',
'contents'
];
}
In routes/web.php
Route::get('/create',function(){
cms\Post::create(['title'=>'the crete method','contents'=>'WOW I am learning a lot with it']);
});
Update ORM:
Route::get('/updateorm',function(){
cms\Post::where('id',2)->update(['title'=>'NEW PHP TITLE','contents'=>'hello']);
});
Delete with ORM:
Route::get('/deleteorm',function(){
$post=cms\Post::find(2);
$post->delete();
});
Route::get('/delete2',function(){
cms\Post::destroy(3);
});
Route::get('/deletemulti',function(){
cms\Post::destroy([4,5]);
//cms\Post::where('id',0)->delete();
});
Softdelete :
Route::get('/readsoftdelete',function(){
// $post=\cms\Post::find(1);
// return $post;
$post=cms\Post::onlyTrashed()->where('id',6)->get();
return $post;
});
Route::get('/readsoftdelete1',function(){
// $post=\cms\Post::find(1);
// return $post;
$post=cms\Post::withTrashed()->where('id',6)->get();
return $post;
});
Force delete:
Route::get('/forcedelete',function(){
cms\Post::withTrashed()->where('id',6)->forcedelete();
});
Eloquent Relationship:
One To One:
Create a table Ghost:
php artisan make:migration create ceate="ghost"
then
php artisan migrate
then go to phpmyadmin and add some data to the table “ghost”
then create a model with the help of ORM
php artisan make:model Amar
in Amar model file:
<?php
namespace cms;
use Illuminate\Database\Eloquent\Model;
class Amar extends Model
{
public function Posta(){
return $this->hasOne('App\Amar');
}
}
Our main task is in:
routes folder where we can create naming routes for a page which plays role to redirect a page from web browser to view for the user using help of the PostsController.
Make a recipe for my working project:
In routes/web.php (aka routes.php) we need to add a line
Route::get('ghosts/{voot}/{voottype}/{vooterbasha}','VootController');