Thao Trinh – Người thích tự do và lang thang như gió - Thao Trinh – Người thích tự do và lang thang như gió
  • Trang chủ
  • Chuyện nghề
  • Đọc
  • Me
Thao Trinh – Người thích tự do và lang thang như gió - Thao Trinh – Người thích tự do và lang thang như gió
Trang chủ
Chuyện nghề
Đọc
Me
  • Trang chủ
  • Chuyện nghề
  • Đọc
  • Me
Học nghề

Laravel Request Lifecycle

Introduction

Khi bạn sử dụng tools trong “thế giới thực”, bạn sẽ cảm thấy tự tin hơn nếu bạn hiểu cách mà tool đó hoạt động. Trong các ứng dụng phần mềm cũng vậy, khi bạn hiểu về chắc chức năng phần mềm của mình, bạn sẽ cảm thấy thoải mái và tự tin khi sử dụng chúng.

Mục tiêu của tài liệu này là giúp bạn có được kiến thức (high-level) tổng quan tốt về cách mà Laravel framework làm việc. Bằng cách tìm hiểu tổng quan về framework, mọi thứ có vẻ sẽ bớt “ảo diệu” hơn và bạn sẽ trở nên tự tin khi xây dựng ứng dụng của mình. Nếu bạn không hiểu tất cả các điểu khoản ngay lập tức, đừng vội đầu hàng (don’t lose heart!). Hãy thử tìm hiểu từng khái niêm cơ bản trước và xem cách chúng hoạt động, và kiến thức của bạn sẽ tăng dần lên khi bạn khám phá các phần khác của tài liệu.

Lifecycle Overview

First Things
Bắt đầu của tất cả các requests tới ứng dụng Laravel là file public/index.php, tất cả các requests được điều hướng tới file này bằng cấu hình web server (Apache / Nginx). File index.php không chứa quá nhiều code. Thay vào đó nó là điểm bắt đầu để tải các phần của framework.

File index.php tải the Composer generated autoloader definition, và sau đó trả về một instance của ứng dụng Laravel từ đoạn mã trong bootstrap/app.php. Action đầu tiên tạo bởi Laravel là tạo ra một instance của ứng dụng / service container.

HTTP / Console Kernels
Tiếp theo, request sẽ được gửi tới HTTP kernel hoặc Console kernel, tùy thuộc vào loại request mà ứng dụng nhận được. 2 kernel này là trung tâm mà tất cả các request sẽ flow theo. Bây giờ, chúng ta sẽ tập trung vào HTTP kernel, được đặt trong app/Http/Kernel.

HTTP kernel kế thừa từ lớp Illuminate\Foundation\Http\Kernel, lớp này định nghĩa mảng bootstrappers sẽ chạy trước khi request được thực thi. Mảng bootstrappers này sẽ quản lý cấu hình lỗi, cấu hình logging, nhận diện môi trường của ứng dụng và thực thi các nhiệm vụ cần thiết phải hoàn thành trước khi request thực sự được thực thi.

HTTP kernel cũng định nghĩa một danh sách HTTP middleware mà tất cả các request sẽ phải chạy qua trước khi được quản lý bởi ứng dụng. Middleware này quản lý việc đọc và ghi HTTP session, xác định xem ứng dụng đang ở trạng thái bảo trì, xác thực CSRF token và rất nhiều tính năng khác.

Việc điều khiển của HTTP kernel rất đơn giản: nhận một Request và trả về một Response. Bạn có thể hiểu Kernel giống như một hộp đen lớn sẽ đại diện cho toàn bộ ứng dụng của bạn, nhận các HTTP Request và trả về các HTTP Response.

Service Providers

Một trong những actions quan trọng nhất của Kernel bootstrapping là loading service providers cho ứng dụng của bạn. Tất cả service providers cho ứng dụng được cấu hình trong file config/app.php. Đầu tiên, phương thức register sẽ được gọi trong tất cả các providers, sau đó, tất cả các providers sẽ được đăng ký (registered), lúc này phương thức boot sẽ được gọi.

Service providers sẽ chịu trách nhiệm khởi động tất cả các components khác nhau của framework, ví dụ như là database, queue, validation và routing. Kể từ khi chúng thực hiện khởi động và cấu hình tất cả tính năng được cung cấp bởi framework, service providers là phần quan trọng nhất của tiến trình thực thi Laravel.

Dispatch Request

Khi ứng dụng được khởi động và tất cả các service providers được đăng ký (registered), Request sẽ được chuyển đến bộ định tuyến (router) để gửi đi. Router sẽ gửi request tới một route hoặc một controller, cũng giống như chạy bất kì route đặc biệt nào trong middleware.

Focus On Service Providers

Service providers thật sự rất quan trọng trong việc khởi chạy ứng dụng Laravel. Khi một instance của ứng dụng được tạo, service providers sẽ được registered, và request sẽ được đưa đến (handed) ứng dụng bootstrapped. Nó thực sự rất đơn giản!

Nắm vững về cách một ứng dụng Laravel được xây dựng và khởi chạy thông qua service providers là rất quan trọng. Service providers mặc định trong ứng dụng của bạn được lưu trữ ở thư mục app/Providers

Mặc định, AppServiceProvider là rỗng. Provider này là nơi tốt nhất để thêm các đoạn mã khởi chạy cho ứng dụng của bạn và service container bindings. Tuy nhiên, với các ứng dụng lớn, bạn có thể tạo một vài service providers cho các mục đích khởi chạy khác nhau.

Tóm tắt

1. Tất cả các request gọi tới ứng dụng laravel đều chạy qua file public/index.php. File này load các phần của framework và tạo một instance của ứng dụng laravel.

2. Request sẽ chạy qua HTTP kernel hoặc Console kernel, HTTP kernel định nghĩa mảng Bootstrapper và HTTP middleware quản lý các cấu hình trước khi request được xử lý bởi ứng dụng.

3. Service providers sẽ chịu trách nhiệm khởi động tất cả các components khác nhau của framework.

4. Khi service providers được registered, request sẽ được gửi tới các route.

February 20, 2017by thaotrinh
Học nghề

Route::Basic

Basic Routing

Các routes cơ bản của Laravel chấp nhận một URI và một Closure, nó cung cấp một phương thức rất đơn giản và dễ hiểu để định nghĩa routes như sau:

Route::get('foo', function () {
  return 'Hello World';
});

The Default Route Files
Tất cả các routes của Laravel được định nghĩa trong file route được đặt trong thư mục routes. Những files này được tự động load bởi framework. routes/web.php định nghĩa các routes cho ứng dụng web của bạn. Các routes này được gán cho nhóm web middleware, nhóm này sẽ cung cấp các tính năng như sesion state và CSRF protection. Các routes trong file routes/api.php là stateless - không có trạng thái và được gán cho nhóm api middleware

Hầu hết các ứng dụng, bạn sẽ bắt đầu bằng việc định nghĩa routes trong file routes/web.php. Routes được định nghĩa trong file routes/web.php có thể được truy cập bằng URL trên trình duyệt. Ví dụ, bạn có thể truy cập route tới http://your-app.test/user trên trình duyệt như sau:

Route::get('/user', 'UserController@index');

Routes được định nghĩa trong file routes/api.php được lồng trong một route group bởi RouteServiceProvider. Trong group này, /api URI prefix tự động được thêm vào, vì thế bạn không cần thêm nó một các thủ công cho mỗi route trong file. Bạn có thể chỉnh sửa prefix và các tùy chỉnh của route group bằng cách chỉnh sửa lớp RouteServiceProvider.

Available Router Methods
Router cho phép bạn đăng ký các routes trả về từ bất kì giao thức HTTP nào:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Đôi khi bạn cần đăng ký một route chấp nhận nhiều giao thức HTTP. Trường hợp này bạn có thể sử dụng phương thức match. Hoặc bạn thậm chí có thể đăng ký một route cho phép nhận response từ tất cả các giao thức HTTP bằng cách sử dụng phương thức any:

Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('foo', function () {
    //
});

CSRF Protection
Bất kì giao thức POST, PUT, DELETE nào được gửi qua web route sẽ phải kèm theo một csrf token. Nếu không request này sẽ bị từ chối.

<form method="POST" action="/profile">
    @csrf
    ...
</form>

Redirect Routes
Nếu bạn muốn chuyển hướng tới một URI khác, bạn có thể sử dụng Route::redirect. Sử dụng phương thức này bạn không cần phải định nghĩa một route đầy đủ hoặc một controller để thực thi redirect đơn giản:

Route::redirect('/here', '/there', 301);

View Routes
Nếu route của bạn chỉ trả về một view, bạn có thể sử dụng phương thức Route::view. Tương tự như phương thức redirect, phương thức này trả về một view mà bạn không cần phải định nghĩa một route ddầy đủ hoặc một controller. Tham số đầu tiên của phương thức này là một URI, tham số thứ 2 là tên view. Ngoài ra bạn có thể truyền một mảng dữ liệu để hiển thị trên view:

Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

Phần 2

February 18, 2017by thaotrinh
Học nghề

Route::Basic 2

Route Parameters

Required Parameters
Đôi khi bạn cần control được các thành phần của URI trong route của bạn. Ví dụ bạn có thể cần truy cập dữ liệu user's ID từ URL. Bạn có thể định nghĩa một route với tham số như sau:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

Bạn có thể định nghĩa nhiều tham số trong route:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

Các tham số route luôn được đặt trong cặp ngoặc {}, và nó chỉ nên chứa các kí tự, không nên chứa kí tự -. Trong trường hợp cần sử dụng kí tự -, sử dụng dấu _ để thay thế. Các tham số này được injected vào trong callbacks/controller theo thứ tự tương ứng.
Optional Parameters
Đôi khi bạn cần tạo một tham số route, nhưng tham số này có thể là tùy chọn (có/không). Bạn có thể thực hiện điều này bằng cách đặt ? sau tên tham số. Để chắc chắn chúng ta truyền cho biến route này một giá trị mặc định:

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});

 

Regular Expression Constraints
Bạn có thể constrain định dạng các tham số route của bạn bằng cách sử dụng phương thức where trong một route instance. Phương thức này có 2 đối số là tên của tham số và biểu thức regular expression ràng buộc tham số này.

Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

 

Global Constraints
Nếu bạn muốn tham số route của bạn luôn được constrained bởi biểu thức regular expression, bạn có thể sử dụng pattern method. Bạn nên định nghĩa patterns trong phương thức boot của RouteServiceProvider:

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

Khi pattern được định nghĩa, nó sẽ tự động applied vào tất cả các routes sử dụng tham số có cùng tên:

Route::get('user/{id}', function ($id) {
    // Only executed if {id} is numeric...
});

 

Named Routes

Named routes cho phép rút gọn URLs hoặc chuyển hướng tới các route đặc biệt. Bạn cũng cần chỉ ra tên cho một route bằng cách thêm phương thức name khi định nghĩa route.

Route::get('user/profile', function () {
    //
})->name('profile');

Bạn cũng có thể chỉ tên route cho các controller action:

Route::get('user/profile', 'UserController@showProfile')->name('profile');

 

Generating URLs To Named Routes
Nếu bạn muốn đặt tên cho route, bạn có thể sử dụng route's name để thực thi URLs hoặc redirect bằng cách sử dụng hàm route

// Generating URLs...
$url = route('profile');

// Generating Redirects...
return redirect()->route('profile');

Nếu route có chứa tham số, bạn có thể truyền tham số này vào đối số thứ 2 của hàm route. Tham số này sau đó sẽ được tự động truyền vào URL

Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

 

Inspecting The Current Route
Nếu bạn muốn kiểm tra xem request hiện tại được route bởi name route nào, bạn có thể sử dụng phương thức named của Route instance. Ví dụ bạn có thể kiểm tra current route name từ một route middleware:

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }

    return $next($request);
}

 

Route Groups

Route groups cho phép bạn chia sẻ route attributes, ví dụ như là middleware hoặc namespaces, thông qua số lượng lớn các route mà không cần định nghĩa các attributes cho từng route. Các attributes được chia sẻ  dưới dạng 1 mảng, là tham số đầu tiên trong phương thức Route::group.
Middleware
Để assign middleware cho tất cả các route trong một group, bạn có thể sử dụng phương thức middleware trước khi định nghĩa một group. Middleware thực thi lần lượt trong mảng được sắp xếp:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });

    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});

 

Namespaces
Một trường hợp khác của route groups là nó được truyền giống như PHP namespace tới một nhóm các controllers bằng cách sử dụng phương thức namespace:

Route::namespace('Admin')->group(function () {
    // Controllers Within The "App\Http\Controllers\Admin" Namespace
});

Nhớ rằng, mặc định, RouteServiceProvider sẽ lấy các file route trong namespace group, cho phép bạn đăng ký các controller route mà không cần chỉ ra đầy đủ tiền tố namespace App\Http\Controllers. Vì vậy, bạn chỉ cần chỉ ra phần của namespace đằng sau App\Http\Controllers
Route Prefixes
Phương thức prefix được sử dụng để tặt tiền tố cho tất cả các route trong group. Ví dụ bạn muốn đặt prefix cho tất cả các URIs trong group admin:

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
        // Matches The "/admin/users" URL
    });
});

 

Route Name Prefixes
Phương thức name được sử dụng để đặt prefix cho các route trong group. Ví dụ, bạn muốn đặt tất cả prefix của group route là admin. Một chuỗi được đặt cho route name, chúng ta cũng sẽ cung cấp một ký tự . cùng với prefix:

Route::name('admin.')->group(function () {
    Route::get('users', function () {
        // Route assigned name "admin.users"...
    })->name('users');
});

 

Route Model Binding

Khi truyền một model ID tới một route hoặc một controller action, bạn thường sẽ query để lấy về model tương ứng với ID. Laravel route model binding cung cấp một cách tiện lợi để tự động inject một thực thể model trực tiếp tới các route của bạn.
Ví dụ, thay vì truyền một user's ID, bạn có thể inject một thực thể User model.
Implicit Binding

Laravel tự động resolves Eloquent models được defined trong các route hoặc các controller action có tên match với một route segment name. Ví dụ:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

Từ lúc biến $user được gợi ý như là model Eloquent trong App\User và tên biến (user) match với URI segment, Laravel sẽ tự động inject thực thể model có ID matching với giá trị từ request URI. Nếu một thực thể model matching không được tìm thấy trong database, một HTTP response 404 sẽ được trả về.
Customizing The Key Name
Nếu bạn muốn binding model tới một trường khác trong database khi lấy data từ lớp model, bạn có thể override lại phương thức getRouteKeyName trong Eloquent model:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

 

Explicit Binding
Để đăng ký một binding tường minh, sử dụng phương thức model của router để chỉ ra lớp làm tham số. Bạn có thể định nghĩa model binding tường minh của bạn trong phương thức boot của lớp RouteServiceProvider:

public function boot()
{
    parent::boot();

    Route::model('user', App\User::class);
}

Tiếp theo định nghĩa một route chứa tham số {user}:

Route::get('profile/{user}', function (App\User $user) {
    //
});

Từ bây giờ chúng ta có thể bound tất cả tham số {user} vào model App\User, một thực thể User sẽ được injected vào route. Ví dụ, một request tới profile/1 sẽ inject thực thể User từ database có ID là 1.

Nếu không có model nào được tìm thấy trong database, 404 HTTP response sẽ được trả về.

Rate Limiting

Laravel có một middleware để giới hạn truy cập tới các route trong ứng dụng của bạn. Để bắt đầu, sử dụng throttle middleware để điều khiển một route hoặc một nhóm các route. Tthrottle middleware chấp nhận 2 tham số, maximum number của các request được thực thi trong một phút. Ví dụ, Chỉ ra việc authenticated user có thể được truy cập 60 lần/phút

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

 

Dynamic Rate Limiting
Bạn cũng có thể chỉ ra số request lớn nhất động, dựa trên một thuộc tính của authenticated User model. Ví dụ, nếu User model của bạn chứa một biến rate_limit, bạn có thể truyền tên của thuộc tính này tới throttle middleware, vì thế nó được sử dụng để tính toán số request tối đa:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

 

Form Method Spoofing

HTML forms không hỗ trợ các action PUT, PATCH, DELETE. Vì thế, khi defining các route PUT, PATCH hoặc DELETE được gọi từ HTML form, bạn sẽ cần thêm một hidden _method field cho form của mình. Giá trị này sẽ được sử dụng trong giao thức HTTP request:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

Bạn cũng có thể sử dụng method @Blade để tạo _method input:

<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>

 

Accessing The Current Route

Bạn có thể sử dụng phương thức current, currentRouteName và currentRouteAction của route facade để truy cập thông tin về route đang được handling trong request:

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

Tham khảo thêm thông tin về Route Facade và Route Instance

February 18, 2017by thaotrinh
Học nghề

How to Install PHP 7 on MacOS

Download and Install PHP on macOS

The latest version of macOS Sierra ships with PHP 5.6 and similarly OSX 10.11 El Capitan with PHP 5.5, OSX 10.8 Mountain Lion ships with PHP version 5.3. The latest version of PHP 7.2 is available to install. The below steps to help you to install PHP 7.2 or 7.1 or 5.6 on macOS.

Open a terminal and run below commands

For PHP 7.2

curl -s http://php-osx.liip.ch/install.sh | bash -s 7.2

For PHP 7.1

curl -s http://php-osx.liip.ch/install.sh | bash -s 7.1

For PHP 5.6 – Running with OSX 10.11 El Capitan or lower versions.

curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6

Verify PHP Installation

The PHP versions for macOS are maintained by php-osx and doesn’t overwrite the current php binaries installed on your system. The installs everything in /usr/local/php5. The new php binary is therefore in /usr/local/php5/bin/php.

export PATH=/usr/local/php5/bin:$PATH

To verify correct version of PHP is installed on your system, Execute the following command.

php -v

PHP 7.2.2 (cli) (built: Feb 1 2018 13:23:34) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.2, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans

Nguồn

 

Update: Để lần sau mỗi lần run không phải chạy lại lệnh EXPORT thì làm như sau

touch ~/.bash_profile; open ~/.bash_profile

Sau khi chạy lệnh thì thêm đoạn mã export ở trên vào dưới biến môi trường sẵn có là được.

Lệnh cần thêm vào file vừa mở ra (nếu ai quên)

export PATH=/usr/local/php5/bin:$PATH

 

GL&HF

February 18, 2017by thaotrinh
Page 3 of 7« First...«2345»...Last »

About me

Tìm kiếm nhanh

Đề xuất cho bạn

Installing & Configuring Apache on macOS using Homebrew and use Sites folder (Mac Monterey)

37 NGUYÊN TẮC GIAO TIẾP CHO ĐÀN ÔNG TỪ NĂM 1875

Tạo đối tượng trong C# từ url API hoặc Json String

Git hướng dẫn cơ bản cho người mới

Git hướng dẫn cơ bản cho người mới

Không phải làm bao nhiêu mà là tạo ra bao nhiêu

Không phải làm bao nhiêu mà là tạo ra bao nhiêu

Bài mới

  • 37 NGUYÊN TẮC GIAO TIẾP CHO ĐÀN ÔNG TỪ NĂM 1875
  • Định nghĩa công việc theo phương pháp S.M.A.R.T
  • Installing & Configuring Apache on macOS using Homebrew and use Sites folder (Mac Monterey)
  • Họp xong việc và họp thêm việc
  • Giá trị của Scrum Master trong case study của Leflair

Mọi người quan tâm

  1. Cài đặt và cấu hình Apache, MySQL trên macos - Thao Trinh - Người thích tự do và lang thang như gió on Installing & Configuring Apache on macOS using Homebrew and use Sites folder (Mac Monterey)

Chuyên mục

  • Agile (APM)
  • Chuyện nghề
  • Đọc
  • Học nghề
  • Làm thợ
  • Uncategorized

Tags

Agile Dev Kanban Marketing Nhóm Scrum Sách Sản phẩm Think Tôi tự học

Người học thức, tức là người thà biết ít mà thật biết những gì mình biết, còn những gì mình không biết, thì cũng biết rõ là mình không biết. “Không có sự dốt nát nhục nhã bằng tin tưởng rằng mình đã biết trong khi mình chưa biết”. Văn hóa là một vấn đề thuộc phẩm chứ không phải thuộc lượng

© 2015 copyright thaotrinhminh@gmail.com // All rights reserved // Privacy Policy