Tự học lập trình Laravel

From CodeForLife
Revision as of 08:37, 4 October 2017 by Thangdb (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Giới thiệu về Laravel

Laravel là một PHP framework  mã nguồn mở và miễn phí, được phát triển bởi Taylor Otwell và nhắm vào mục tiêu hỗ trợ phát triển các ứng dụng web theo kiếm trúc model-view-controller (MVC). Những tính năng nổi bật của Laravel bao gồm cú pháp dễ hiểu – rõ ràng, một hệ thống đóng gói modularquản lý gói phụ thuộc, nhiều cách khác nhau để truy cập vào các cơ sở dữ liệu quan hệ,nhiều tiện ích khác nhau hỗ trợ việc triển khai vào bảo trì ứng dụng.

Vào khoảng tháng 3 năm 2015, các lập trình viên đã có một cuộc bình chọn PHP framework phổ biến nhất, Laravel đã giành vị trí quán quân cho PHP framework phổ biến nhất năm 2015, theo sau lần lượt là Symfony2, Nette, CodeIgniter, Yii2 vào một số khác:

Best-php-framework-2015.jpg

Laravel được phát hành theo giấy phép MIT, với source code được lưu trữ tại Github.

Dưới đây là 06 lý do nên sử dụng Laravel:

  • Quick Emergence: Sự ra đời của Laravel như một luồng gió mới thổi vào cộng đồng framework PHP. Nó có thể giải quyết tốt những web project lớn. Rất nhiều công ty đã sử dụng nó để phát triển các sản phẩm cho công ty của họ. Như hình bên trên bạn có thể nhìn thấy nó chiếm phần lớn nhất trong "miếng bánh" framework PHP.
  • Open Source: Nó là mã nguồn mở và hoàn toàn free. Bạn chẳng phải quan tâm đến việc trả phí khi ứng dụng web của bạn to lên. Điều bạn cần làm là hiểu nó và tạo ra những tính năng tuyệt vời từ nó mà thôi.
  • Templete engine: Nó sử dụng Blade template và các công cụ như Elixir giúp bạn dễ dàng quản lý các assets (biên dịch, ghép nối, nén ...), cũng như chia nhỏ code HTML ra thành nhiều phần. Giúp cho việc thiết kế cũng như quản lý các assets trở nên vô cùng đơn giản.
  • Modular: Laravel được xây dựng dựa trên hơn 20 thư viện khác nhau. Hiểu được cách thiết kế framework khiến các dev hoàn toàn có thể đóng góp cho framework cũng như mở rộng chúng một cách dễ dàng. Dễ hiểu khi Laravel luôn có cộng đồng support đông đảo và "trâu" như vậy.
  • MVC Architecture Support:  Laravel sử dụng MVC pattern để xây dựng framework. Nó đảm bảo rằng các code được trình bày logic và hợp lý. Dễ dàng để có thể hiểu được nó. Vì vậy nó làm cho web project của bạn được trở nên dễ quản lý cũng như phát triển rất rất nhiều.
  • Libraries and configuration: Laravel tạo điều kiện cho các developer có thể thay đổi tùy chọn và cấu hình để phù hợp với nhiều môi trường. Các developer cũng có thể viết các gói (package) có thể là một tính năng hay một đoạn code gì đó. Nó dễ dàng được khai báo trong Laravel thông qua các provider. Chính điều này cộng với số lượng các developer đông đảo thì số lượng package mà Laravel có ngày càng tăng lên. Bạn có thể dễ dàng tìm được một vài đoạn code cũng như một vài tính năng mà bạn mong muốn trong project của bạn chỉ trong vài phút. Nó tiết kiệm hơn so với việc phải ngồi viết code cho tính năng đó.

Tài liệu Laravel trên mạng rất nhiều, bạn rất dễ dàng tìm kiếm và áp dụng. Hiện tại tôi đang cần xây dựng website để thực hiện một ý tưởng của mình, sau một thời gian lựa chọn xem sử dụng Java => Chọn PHP vì triển khai đơn giản và chi phí thấp. Sau khi chọn PHP, tôi tìm hiểu các PHP Framework và quyết định chọn Laravel bởi các ưu điểm ở phần đầu. Bài viết này chủ yếu lưu lại tri thức đã tìm hiểu được và áp dụng cho dự án của mình.

Hướng dẫn cài đặt (Chi tiết trên Ubuntu 16.04)

Để cài đặt và chạy Laravel, về cơ bản bạn thực hiện 02 bước như sau:

  • B1: Cài đặt XAMPP: [1]. Cài xong bạn sẽ có cả Apache/PHP/MySQL. Ngoài ra một số người sử dụng OpenServer, nói chung mọi người quen cái nào thì dùng cái đó.
  • B2: Cài Composer: [2]
  • B3: Cài đặt Laravel: [3]

Theo các hướng dẫn từ các link trên, bạn có thể dễ dàng thực hiện cài đặt trên bất cứ môi trường nào.

Ở đây tôi dùng Ubuntu 16.04 nên sẽ hướng dẫn cách cài đặt trên môi trường này.

Cài đặt XAMPP

Lệnh sau để cài đặt XAMPP:
wget https://www.apachefriends.org/xampp-files/7.1.9/xampp-linux-x64-7.1.9-0-installer.run
chmod +x xampp-linux-x64-7.1.9-0-installer.run
sudo ./xampp-linux-x64-7.1.9-0-installer.run

Giao diện cài đặt xuất hiện, bạn cứ nhấn Next là xong. Sau khi cài đặt xong, bạn chạy thêm lệnh sau:
echo 'export PATH="$PATH:/opt/lampp/bin"' >> ~/.bashrc
Lệnh trên này giúp cập nhật biến môi trường PATH mỗi khi bạn bật Terminal => Việc này giúp bạn sử dụng các lệnh như php,... đơn giản không cần có đường dẫn ở trước.

Sau khi cài đặt xong, bạn tắt bằng lệnh:
sudo /opt/lampp/lampp stop
Bật bằng lệnh:
sudo /opt/lampp/lampp start
Sau khi bật, mở trình duyệt vào địa chỉ http://localhost/xampp/ để kiểm tra.

Cài đặt Composer

Sau khi cài đặt XAMPP theo hướng dẫn ở trên, bạn tắt Terminal và bật lại để biến môi trường PATH được cập nhật lại. Sau đó, bạn đánh các lệnh sau để cài đặt Composer:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

Cài đặt Laravel

Bạn sử dụng lệnh sau:
composer global require "laravel/installer"

Ghi chú: Laravel hiện tại là bản 5.5, chỉ tương thích với PHP từ 7.0.0 trở lên. Vì thế khi cài XAMPP bạn chọn phiên bản thích hợp.

Tạo project từ Laravel và cấu hình truy cập từ trình duyệt

Để tạo project từ Laravel, bạn sử dụng Composer. Ví dụ, bạn cần tạo project blog từ Laravel, bạn đánh lệnh sau:
composer create-project --prefer-dist laravel/laravel blog
Lệnh này sẽ lấy toàn bộ source của laravel về để trong thư mục blog.

Bây giờ làm sao chạy được blog khi mà blog không được đặt trong thư mục /opt/lampp/htdocs. Chẳng lẽ phải thực hiện copy vào thư mục này => Việc này là không cần thiết, mà bạn chỉ cần cấu hình Virtual-Host cho XAMPP là được. Đầu tiên bạn mở tệp /opt/lampp/etc/httpd.conf, tìm dòng:
# Virtual hosts
#Include etc/extra/httpd-vhosts.conf

Bạn bỏ comment dòng Include đi thành:
# Virtual hosts
Include etc/extra/httpd-vhosts.conf

Sau đó sửa tệp /opt/lampp/etc/extra/httpd-vhosts.conf như dưới (Các nội dung cũ nếu có comment lại):

<VirtualHost *:80>
    ServerAdmin localhost
    DocumentRoot "/opt/lampp/htdocs"
    ServerName localhost
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin blog
    DocumentRoot "/home/ubuntu/work/workspace/web/blog"
    ServerName blog.com
    ErrorLog "logs/blog.com-error_log"
    CustomLog "logs/blog.com-access_log" common
    <Directory "/home/ubuntu/work/workspace/web/blog">
        Options Indexes FollowSymLinks
        AllowOverride All
	    Order allow,deny
	    Allow from all
	    Require all granted
    </Directory>
</VirtualHost>

Ghi chú:

  • Bạn có thể cấu hình nhiều VirtualHost khác nhau, mỗi VirtualHost trở tới một thư mục chứa một project web của bạn.
  • Port sử dụng trong khai báo VirtualHost phải trùng với port Listen của Web Server. Nếu bạn thay đổi port này, thì phải sửa port Virtual tương ứng.

Tiếp đó bạn mở tệp /etc/hosts thêm vào cuối hai dòng:

127.0.0.1	localhost
127.0.0.1	blog.com

Ghi chú: Mỗi VirtualHost bạn phải add thêm một dòng vào tệp này.

Bây giờ, bạn mở trình duyệt nhập thử từng domain, bạn sẽ thấy trình duyệt hiện thị đúng website tương ứng các thư mục theo cấu hình:
Xampp-virtual-host.png

Chú ý:

  • Với Laravel, thư mục public mới chứa website của bạn.
  • Trong trường hợp chạy báo lỗi permision liên quan tới con trong thư mục storage, thì bạn cấp quyền ghi cho các thư mục này bằng lệnh sau:
    cd storage
    chmod -R 777 *

Cài đặt SublimeText

Ngoài ra, bạn cần có Editor để chỉnh sửa code. Nói chung ai quên cái nào dùng cái đó, nếu chưa dùng IDE nào thì bạn có thể sử dụng SublimeText. Một bộ soạn thảo nhỏ nhẹ với khá nhiều tính năng.

<Updating...>

Bắt đầu lập trình với Laravel

Kiến trúc Laravel

Hình sau thể mô hình kiến trúc của Laravel:
Laravel-mvc-components.png

Theo như mô hình trên, bạn sẽ thấy mọi request của người dùng từ trình duyệt đều đi qua Routing. Routing bạn hiểu như bộ định tuyến request, xác định một request sẽ được đưa đến đâu để xử lý. Routing trong Laravel được cài đặt qua lớp Route trong tệp vendor/laravel/framework/src/Illuminate/Routing/Route.php, gồm các phương thức:

  • Route::get phương thức GET
  • Route::post phương thức POST
  • Route::match kết hợp hiều phương phức
  • Route::any nhận tất cả các phương thức
  • Route::filter tạo ra bộ lọc nhằm mục đích nào đó, ví dụ tạo bộ lọc kiểm tra đã đăng nhập hay chưa
  • Route::group gom các route lại với nhau thành một nhóm
  • Route::controller gọi đến controller tương ứng
  • Route::resource sử dụng với resource controller

Để thêm route cho website, bạn thêm route vào tệp routes/web.php. Để tìm hiểu chi tiết bạn xem tại địa chỉ: [1]

Cấu trúc thư mục Laravel

Để bắt đầu lập trình được, bạn phải hiểu và nắm rõ cấu trúc thư mục của Laravel. Chi tiết về cấu trúc thư mục bạn xem lại link: [1]
Ở đây tôi xin liệt kê một số thư mục chính:

Thư mục Mô tả
app Chứa controllers, models, views và assets của ứng dụng. Đây là code chính của ứng dụng của ban. Bạn sẽ dành nhiều thời gian cho thư mục này.
app/Http/Controllers Chứa những file controllers của ứng dụng
bootstrap Chứa một số file của bootstrap framework và một số file cấu hình nạp tự động
config Chứa các file cấu hình của hệ thống
config/app.php Cấu hình mức cài đặt ứng dụng ở khía cạnh khác như timezone, locale, mode debug và khóa mã hóa duy nhất
config/auth.php Drive xác thực
config/cache.php Nếu ứng dụng của bạn có lưu cache thì thời gian ứng dụng hồi đáp cho người dùng là nhanh hơn
database Chứa migration và seed cơ sở dữ liệu của bạn
database/migrations/ Thư mục migration chứa những lớp PHP mà cho phép Laravel cập nhật Schema cơ sở dữ liệu của bạn mà vẫn giữ được toàn bộ versions cơ sở dữ liệu trong khi đồng bộ. Những file migration được tạo bởi tool Artisan
database/seeds/ Thư mục seeds chứa những file PHP cho phép Artisan đưa vào bảng cơ sở dữ liệu với dữ liệu được đề xuất
public Thư mục public cũng dùng cho việc lưu trữ những file như css, javascripts, file images và những file khác. Nó cũng chứa file khởi động index.php
resources Chứa các view, các raw asset và các file ngôn ngữ.
resources/views Thư mục views chứa những file mẫu HTML của bạn mà được sử dụng bởi controller hay route. Chú ý rằng bạn chỉ nên đặt những file mẫu view tại vị trí này vì những file css, javascript đã được đặt trong thư mục public
resources/lang Những file PHP chứa mãng của những chuỗi cho phép dễ dàng xác định vị trí của ứng dụng. Mặc định thư mục này chứa những dòng ngôn ngữ cho việc phân trang và chứng thực form người dùng với ngôn ngữ là tiếng Anh
routes  
routes/web.php Đây là file route trong ứng dụng của bạn, nó lưu trứ toàn bộ những route để thông báo với Laravel cách như thế nào để kết nối khi có yêu cầu, theo hàm khai sẵn, controller và action. Đây là file cũng chứa cách khai báo cho một vài sự kiện bao gồm trang lỗi, và nó được sử dụng để định nghĩa views composers. File này cũng dùng để giới hạn một số khu vực không được truy cập của trang web
storage Thư mục storage được sử dụng để lưu trữ file tạm thời cho những dịch vụ Laravel khác nhau như session, cache, biên dịch template views. Thư mục này có thể ghi lại bởi web server. Thư mục này được duy trì bởi Laravel mà mình không cần can thiệp vào
tests Chứa các test tự động của bạn.
vendor Nơi này chứa toàn bộ code của bên thứ ba. Chứa plugin chúng ta cài thêm cho ứng dụng chúng ta. Chứa cả các composer package sử dụng bởi ứng dụng

Trong các thư mục và tệp trên, các thư mục và tệp sau thường xuyên được sử dụng khi tạo website:

  • app/Http/Controllers
  • resources/views
  • resources/lang
  • public
  • routes/web.php

Tìm hiểu về Route và tối ưu Route

Trong Laravel 5.5, bạn khai báo route trong tệp routes/web.php. Chi tiết về Route, bạn xem tại địa chỉ: [1]. Đây là link bạn nên đọc khi tìm hiểu về Route, tất cả về Route đều nằm ở đây.

Một routing cơ bản có dạng đơn giản Route::get('URI', action). Ví dụ bạn thêm code sau vào tệp routes/web.php:

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

Khi đó trên trình duyệt vào vào link http://blog.com/public/index.php/hello, bạn sẽ thấy một trang web hiển thị nội dung là "Hello World". Nhưng bạn để ý kỹ link phải có index.php trước mới được. Nếu bạn muốn bỏ link này, bạn hãy làm theo hướng dẫn tại link: [2]. Hiện tại ta đang sử dụng Apache nên bạn chỉ cần tạo tệp .htaccess trong thư mục public với nội dung như sau:

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]

Bây giờ bạn chỉ cần vào link http://blog.com/public/hello là được.

Khi tìm hiểu chi tiết về Route bạn nắm được:

  • Truyền tham số trong Route
    • Tham số bắt buộc
    • Tham số không bắt buộc
    • Ràng buộc tham số sử dụng lệnh where và biểu thức chính quy.
  • Đặt tên Route (Named Routes)
  • Chuyển hướng Route
  • Nhóm Route (Route Groups)
  • Cách thức chống giả mạo với Form (Form Method Spoofing)

Tìm hiểu về Controler

Controller chính là trái tim của ứng dụng, tất cả mọi dữ liệu cần được xử lý sẽ được thực hiện trong Controller, ngoài ra các dữ liệu cần được đẩy đi đâu, điều hướng đến nơi nào cũng đều do Controller quyết định hết. Tác dụng của Controller chính là nhận, xử lý và điều hướng dữ liệu trong một hệ thống.

Tất cả về Controler, bạn xem địa chỉ: [1]. Sau khi tìm hiểu xong bạn sẽ nắm được:

  • Basic Controllers
  • Controller Middleware
  • Resource Controllers
  • Dependency Injection & Controllers
  • Route Caching

Có hai cách để tạo Controler:

  • C1: Vào thư mục project, mở Terminal và đánh lệnh theo cú pháp sau:
    php artisan make:controller <ControllerName>
    Ví dụ:
    php artisan make:controller HelloControler
    Khi đó bạn sẽ thấy tệp HelloControler.php trong thư mụcapp/Http/Controllers.
  • C2: Bạn vào trực tiếp thư mục app/Http/Controllers, tạo tệp HelloControler.php, nội dung tham khảo phần "Basic Controllers" trong link ở trên.

Trong HelloControler.php bạn tạo hàm hello như sau:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloControler extends Controller
{
    public function hello(){
        echo 'Hello laravel. This is my first controller';
    }
}

Bây giờ để sử dụng Controller, bạn sửa tệproutes/web.php thêm route và điều hướng tới Controller này:

Route::get('hello', 'HelloControler@hello');

Giờ vào trình duyệt gõ đường dẫn http://blog.com/public/hello, bạn sẽ thấy hiển thị "Hello laravel. This is my first controller".

Tìm hiểu về View và Blade Template

View chính là các file giao diện, ở các file này chỉ tập trung các mã HTML, các kết quả trả về từ Controller thuần túy, chứ không co bất cứ một thuật toán hay xử lý nào ở đây cả. Một View thông thường có thể sử dụng các biểu thức điều kiện, vòng lặp để để xuất dữ liệu phục vụ cho việc hiển thị.

View được sinh ra để tách biệt tối đa mã giao diện với code xử lý PHP, thông thường thì View chỉ tách được 80-90% code php khỏi giao diện, muốn tách 100% thì phải kết hợp với một Template Enzine (Laravel sử dụng Blade Template).

Bây giờ ta tạo một view đơn giản. Vào thư mụcresources/views, thêm tệp HelloView.php với nội dung như sau:

<h1>Hello <?php echo $user ?></h1>
<h2>This is my first view</h2>

Trong app/Http/Controllers/HelloControler.php ta thêm hàm dưới. Ban cũng để ý luôn cách truyền biến user cho view:

public function helloView(){
    $data["user"] = "DaoThang";
    return view("HelloView");
}

Trong tệp routes/web.php thêm dòng sau:

Route::get('helloview', 'HelloControler@helloView');

Bây giờ vào trình duyệt nhập link http://blog.com/public/helloview bạn sẽ thấy nội dung view HelloView.php được hiển thị với nội dung như phần view trên.

Như các bạn thấy một web thông thường bao gồm các thành phần header, footer, sidebar thường bao gồm những nội dung cố định. Chỉ có phần content sẽ thay đổi theo từng trang, như vậy thay vì phải viết lại những thành phần cố định tại sao chúng ta không nhóm những thành phần cố định đó lại thành một trang và chỉ thay đổi phần content theo từng trang, và Blade Template giúp chúng ta giải quyết vấn đề đó.

Blade Template là một template engine mạnh và đơn giản được cung cấp bởi Laravel. Không giống như template engine khác, Blade không hạn chế bạn sử dụng mã PHP trong view. Thực tế tất cả các view Blade sẽ được dịch thành mã PHP và cache lại cho đến khi chúng được sửa. Các tệp view Blade có phần mở rộng là .blade.php và thường được lưu trong thư mục resources/views. Trong Blade engine, thay vì sử dụng PHP bạn nên sử dụng các cú pháp của Blade. Chi tiết về template Blade bạn xem chi tiết tại địa chỉ: [1]

Về vi dụ bạn có thể xem tệp welcome.blade.php trong thư mục resources/views.

Bây giờ ta tìm hiểu cách tạo layout từ Blade template. Trong thư mục resources/views ta tạo thư mục layouts, trong thư muc này ta tạo tệp app.blade.php:

<!-- Stored in resources/views/layouts/app.blade.php -->

<html>
    <head>
        <title>App Name - @yield('title')</title>
    </head>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Ở tệp này ta sử dụng hai chỉ thị:

  • @section: Chỉ thị này xác định một vùng nội dung (section) và tên tương ứng.
  • @yield: Hiển thị nội dung trong section được đưa ra.

Trong thư mụcresources/views ta tạo tệp child.blade.php:

<!-- Stored in resources/views/child.blade.php -->

@extends('layouts.app')

@section('title', 'Page Title')

@section('sidebar')
    @parent

    <p>This is appended to the master sidebar.</p>
@endsection

@section('content')
    <p>This is my body content.</p>
@endsection

Ở đây ta dùng chỉ thị:

  • @extends: Xác định layout mà child view sẽ được kế thừa.
  • @section:
    • Chỉ thị này được sử dụng để thiết lập nội dung cho Section.
    • Để mở rộng section của layout cha.
  • @parent: Chỉ thị này sẽ được thay thế bằng nội dung của layout khi view được hiển thị.

Trong routes/web.php bạn thêm route sau:

Route::get('blade', function () {
    return view('child');
});

Bạn chạy thử sẽ thấy. Còn rất nhiều thứ hay về Blade Template, hãy đọc chi tiết link: [2]

Hỗ trợ đa ngôn ngữ trong website

Laravel cung cấp tính năng Localization cho phép bạn hỗ trợ đa ngôn ngữ trong website của mình. Laravel đưa ra cách thuận lợi lưu các xâu của các ngôn ngữ khác nhau ở các thư mục con tương ứng với mã ngôn ngữ trong thư mục resources/lang:
 /resources
    /lang
        /en
            messages.php
        /es
            messages.php

Tất cả các tệp định nghĩa ngôn ngữ trả về một mảng xâu key theo định dạng như dưới:

<?php

return [
    'welcome' => 'Welcome to our application'
];

Vậy làm thế nào để lấy được ngôn ngữ. Trong tệp php bất kỳ, bạn chỉ cần gọi hàm:
Lang::get("<Tên-Tệp>") => Trả về mảng như trong file. Ví dụ: Lang::get("messages")
Lang::get("<Tên-Tệp>.<Tên-Key>") => Trả về xâu tương ứng với key trong file. Ví dụ: Lang::get("messages.welcome")

Ngôn ngữ mặc định của website được cấu hình trong tệp config/app.php.

<?php

return [
    ...

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    ''''fallback_locale'''' => 'en',
	
	...
];

Bạn có thể cấu hình thêm "fallback_locale", sẽ được sử dụng khi active language không chứa xâu đưa ra.

Để thiết lập ngôn ngữ, sử dụng lệnh:
App::setLocale("en");
Để lấy ngôn ngữ hiện tại:
$locale = App::getLocale();
Để kiểm tra ngôn ngữ:
if (App::isLocale('en')) {
    //
}

Làm việc với Cơ sở dữ liệu

Laravel hỗ trợ tương tác với CSDL rất đơn giản, hiện tại hỗ trợ 04 CSDL:

  • SQLite
  • SQL Server
  • PostgreSQL
  • MySQL

Bạn mở tệp config/database.php để xem cấu hình:

/*
    |--------------------------------------------------------------------------
    | Database Connections
    |--------------------------------------------------------------------------
    |
    | Here are each of the database connections setup for your application.
    | Of course, examples of configuring each database platform that is
    | supported by Laravel is shown below to make development simple.
    |
    |
    | All database work in Laravel is done through the PHP PDO facilities
    | so make sure you have the driver for your particular database of
    | choice installed on your machine before you begin development.
    |
    */

    'connections' => [

        'sqlite' => [
            'driver' => 'sqlite',
            'database' => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix' => '',
        ],

        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],

        'pgsql' => [
            'driver' => 'pgsql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'schema' => 'public',
            'sslmode' => 'prefer',
        ],

        'sqlsrv' => [
            'driver' => 'sqlsrv',
            'host' => env('DB_HOST', 'localhost'),
            'port' => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
        ],

    ],

Bạn có thể sử dụng một CSDL để SELECT và một CSDL để UPDATE/INSERT/DELETE:

'mysql' => [
    'read' => [
        'host' => '192.168.1.1',
    ],
    'write' => [
        'host' => '196.168.1.2'
    ],
    'sticky'    => true,
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix'    => '',
],

Bạn cũng chú ý về tham số sticky, nếu được thiết lập true, thì bản ghi sẽ được load ngay lập tức sau khi ghi xuống.

Để truy cập kết nối mặc định, bạn dùng lệnh sau:

$results = DB::select('select * from users where id = :id', ['id' => 1]);
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
$deleted = DB::delete('delete from users');
DB::statement('drop table users');

Hoặc truy cập kết nối với tên xác định:

$users = DB::connection('foo')->select('select * from users where active = ?', [1]);

Bạn có thể lấy kết nối gốc bằng lệnh:

$pdo = DB::connection()->getPdo();

Bạn sử dụng transaction bằng lệnh DB::transaction:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);

    DB::table('posts')->delete();
});

Bạn cũng có thể sự dụng lệnh sau để tạo truy vấn transaction. Bạn bắt đầu một transaction bằng lệnh:
DB::beginTransaction();
Bạn rollback lại bằng lệnh:
DB::rollBack();
Và thực commit transaction bằng lệnh:
DB::commit();

Bây giờ chúng ta bắt đầu thực hành, đầu tiên bạn vào PHPMyAdmin tạo CSDL tên blog, sau đó cấu hình lại database này trong tệp config/database.php:

'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'blog',
            'username' => 'root',
            'password' => '',
            'unix_socket' => '',
            'charset' => 'utf8',
            'collation' => 'utf8_general_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    ],

Để tạo các bảng dữ liệu bạn có thể sử dụng trực tiếp PhpMyAdmin, nhưng trong Laravel không khuyến khích bạn dùng cách này. Trong Laravel bạn nên sử dụng công cụ Migrations, chi tiết xem tại: [1]

Bạn vào thư mục của Project, mở Terminal đánh lệnh theo cú pháp sau để tạo bảng:
php artisan make:migration create_<tên-bảng>_table --create=<tên-bảng>
Ví dụ:
php artisan make:migration create_news_table –create=news
Sau khi chạy xong lệnh này sẽ có thông báo:
Created Migration: 2017_10_04_080154_create_news_table
Bạn nhìn trong thư mục database/migrations có tệp 80154_create_news_table. Bạn mở tệp vừa tạo này, bạn sẽ thấy:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('news');
    }
}

Bây giờ bạn cập nhật các trường dữ liệu trong hàm up() như sau:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateNewsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('news', function (Blueprint $table) {
            $table->increments('news_id');
            $table->string('news_name');
            $table->string('news_slug');
            $table->string('news_img');
            $table->string('news_author');
            $table->text('news_content');
            $table->integer('cat_id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('news');
    }
}

Bây bạn đánh lệnh migrate như sau:
php artisan migrate
Lệnh này sẽ thực migrate để tạo các bảng dữ liệu từ các tệp php định nghĩa bảng trong thư mục database/migrations. Trường hợp đã chạy lần trước đó thì lần sau lệnh này chỉ thực hiện chạy với tệp mới.
Lệnh sau rollback về trạng thái trước khi chạy lệnh migrate cuối cùng:
php artisan migrate:rollback
Lệnh sau sẽ rollback về trạng thái trước khi chạy 05 mirgrate cuối:
php artisan migrate:rollback --step=5
Lệnh sau sẽ reset CSDL về trạng thái đầu tiên khi chưa chạy các lệnh migrate nào:
php artisan migrate:reset
Lệnh sau sẽ tạo lại toàn bộ CSDL (Tương đương với hai lệnh reset và migrate):
php artisan migrate:refresh

Sau khi chạy các lệnh, bạn có thể vào PhpMyAdmin để kiểm tra.