Reference
https://laravel.com/docs/5.8
Installation
Requirements
- PHP >= 7.1.3
- OpenSSL PHP Extension
- PDO PHP Extension
- Mbstring PHP Extension
- Tokenizer PHP Extension
- XML PHP Extension
- Ctype PHP Extension
- JSON PHP Extension
- BCMath PHP Extension
Steps
- Install LAMP Stack (ie. XAMPP) อย่าลืมจำ mysql root password!!
- Install Composer
- https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos
- หมายเหตุ: เวลาเรียกใช้งาน composer อาจจะต้องใช้
./composer.phar
แทนที่ composer
ถ้าทำการ Install composer เป็น local
- สร้าง Laravel Project โดยใช้ composer
composer create-project --prefer-dist laravel/laravel PROJECT_NAME
- Run Local Development Server
php artisan serve # for running on localhost:8000
- or
php artisan serve --port=8888 # for running on localhost:8888
Basic Tutorial
Important directory / file
app
Where the models are
config
database
public
Where the public files (ie. css, js)
resources
routes
vendor
Where the additional libraries store
.env
all environment variables (ie. DB username/password)
Intro
Controller & Route
- Let's make a controller: page_controller
php artisan make:controller CONTROLLER_NAME
- จะมีไฟล์
app/Http/Controllers/page_controller.php
ปรากฎ
- ในไฟล์จะมี code เหล่านี้
1 <?php
2
3 namespace App\Http\Controllers;
4
5 use Illuminate\Http\Request;
6
7 class page_controller extends Controller
8 {
9 //
10 }
- ลองสร้าง method index
1 public function index(){
2 $menu = array("Home", "My course", "Setting");
3 return $menu;
4 }
- เพิ่ม Route ใน
routes/web.php
1 Route::get('home','page_controller@index');
- ลองทดสอบเรียก url
http://localhost:8000/home
- ปกติแล้วสิ่งที่ controller คืนมักจะไม่ใช่ array หรือ object ธรรมดา ยกเว้นกรณีที่กำลังเขียน api .. หากเป็นกรณี webpage มักจะคืนเป็น view
- ลองสร้าง view (การสร้าง view จะไม่สามารถเรียกผ่าน artisan ได้ จะต้องสร้างด้วยตัวเอง ใน
resources/views
โดยให้สร้าง view ชื่อว่า home.blade.php
- ใน controller method index จะเปลี่ยนแปลงการ return ให้ return view แทน
1 public function index(){
2 $menu = array("Home", "My course", "Setting");
3 return view("home")->with('menu',$menu);
4 }
- ใน
home.blade.php
ให้ลองเขียน html เพื่อแสดง menu เป็น unordered list
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <meta http-equiv="X-UA-Compatible" content="ie=edge">
7 <title>Document</title>
8 </head>
9 <body>
10 <ul>
11 @foreach($menu as $eachmenu)
12 <li>{{$eachmenu}}</li>
13 @endforeach
14 </ul>
15 </body>
16 </html>
View (Blade Template)
Database
Preparation
- สร้าง database (สมมติว่าชื่อ laravel_training)
- แก้ไข
.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_training
DB_USERNAME=USERNAME
DB_PASSWORD=PASSWORD
- แก้ไข file
app/Providers/AppServiceProvider.php
ข้างบนสุดเพิ่ม
use Illuminate\Support\Facades\Schema;
- แก้ไข file
app/Providers/AppServiceProvider.php
function boot เพิ่ม
Schema::defaultStringLength(191);
- ลอง migrate default script
php artisan migrate
Model & DB
- php artisan make:model MODEL_NAME --migration
- php artisan make:migration MIGRATION_NAME
- Sample
Eloquent
- php artisan tinker
- new item
$course = new course();
$course->number = "2110221";
$course->title = "Computer Engineering Essentials";
$course->year = 2018;
$course->semester = 2;
$course->save();
- fetch item
$allcourses = course::all();
$findcourse = course::find(1);
$findcourse = course::where(number,"2110221")->get();
// ->where("title","like","%".$keyword."%")
// ->orderBy('created_at','desc')
// ->paginate(10);
// In view show page numbers: {{$items->links()}}
- edit item
$course = course::find(1);
$course->title = "NEW NAME";
$course->save();
- delete item
$course = course::find(1);
$course->delete();
Handle CRUD
- php artisan make:controller CONTROLLER_NAME --resource
- method: get, post, patch, delete
- Route::resource('ROUTE', 'CONTROLLER');
- php artisan route:list
- Handle request
$name = $request->input('name', 'Default');
$name = $request->name;
- Validation --> See Doc
$request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
// Frontend display error
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
Relationship
one to one
- Defining relationship
- return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
- Defining inverse relationship
- return $this->belongsTo('App\User', 'foreign_key', 'other_key');
one to many
- Defining relationship
- return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
- Defining inverse relationship
- return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
many to many
- Defining relationship
- return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
- return $this->belongsToMany('Model','Intermediate table name','fk of current model','fk of another model')
- Defining inverse relationship
- return $this->belongsToMany('App\User', 'role_user', 'role_id', 'user_id');
- return $this->belongsToMany('Model','Intermediate table name','fk of current model','fk of another model')
Authentication
Preparation
User System
- $user = Auth::user();
- $id = Auth::id();
- Protect route
// Protect in route
Route::get('index','homecontroller@index')->middleware('auth');
// Protect in constructor
public __construct{
$this->middleware('auth', ['except' => ['getActivate', 'anotherMethod']]);
}
- Check if the user is loggedin
if (Auth::check()) {
// The user is logged in...
}
Access Control
- Using Policy
- php artisan make:policy POLICY_NAME
- php artisan make:policy POLICY_NAME --model=MODEL // Create with basic CRUD
- Register Policy in
App/Providers/Authserviceprovider.php
protected $policies = [
Post::class => PostPolicy::class,
];
- Writing Policy
public function update(User $user, Post $post){
return $user->id === $post->user_id;
}
// Check Policy
if ($user->can('update', $post)) {
//
}
- Writing Policy without model
public function create(User $user){
//
}
// Check Policy
if ($user->can('create', Post::class)) { // ต้องบอก class เพื่อจะได้รู้ว่าจะไปเรียกจาก policy ของ class ไหน
//
}
- Writing Policy in View
@can('update', $post)
<!-- The Current User Can Update The Post -->
@elsecan('create', App\Post::class)
<!-- The Current User Can Create New Post -->
@endcan
@if (Auth::user()->can('update', $post))
<!-- The Current User Can Update The Post -->
@endif
@unless (Auth::user()->can('update', $post))
<!-- The Current User Can't Update The Post -->
@endunless