Basic Laravel Training (for CV)
Jump to navigation
Jump to search
Contents
Reference
- Laravel Documentation
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 areHttp
Controllers
Middleware
config
database
public
Where the public files (ie. css, js)resources
views
routes
api.php
web.php
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 list1 <!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)
<meta name="csrf-token" content="Template:Csrf token()">
Template:Config('app.name', 'Laravel')
- @include('inc.messages')
- @yield('content')
- @extends('layouts.app')
- @section('content')
@endsection - @if
- @for
- @foreach
- @csrf
- {{}}
- {!! !!}
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();
- duplicate item : $newcourse2 = $newcourse->replicate();
- 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
- php artisan make:auth
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
Testing
- Make test
// Create a test in the tests/Feature directory... php artisan make:test UserTest // Create a test in the tests/Unit directory... php artisan make:test UserTest --unit
- Run test : In your project root run
vendor/bin/phpunit
- The CSRF middleware is automatically disabled when running tests
- Use model factory to generate fake object
- Factory is at