Polymorphic Relationships
7013

Polymorphic Relationships là một tính năng mạnh mẽ trong Eloquent của Laravel cho phép một model có thể liên kết với nhiều model khác nhau bằng cách sử dụng một bảng quan hệ duy nhất. Đây là mối quan hệ đặc biệt thường được sử dụng khi một thực thể có thể thuộc về nhiều loại thực thể khác nhau.

1. One-to-One Polymorphic Relationships

One-to-One Polymorphic Relationships cho phép một model có thể liên kết với một model khác trong mối quan hệ một-một, nhưng với khả năng liên kết với nhiều loại model khác nhau. Ví dụ, bạn có thể có một bảng image chứa các hình ảnh cho cả người dùng (users) và bài viết (posts). Một hình ảnh có thể thuộc về một bài viết hoặc một người dùng.

Ví dụ:

  1. Cấu trúc cơ sở dữ liệu:

    Đầu tiên, bạn cần tạo các bảng users, posts, và images. Bảng images sẽ chứa hai cột đặc biệt là imageable_idimageable_type để xác định model mà hình ảnh thuộc về.

    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
    
    Schema::create('images', function (Blueprint $table) {
        $table->id();
        $table->string('url');
        $table->morphs('imageable');
        $table->timestamps();
    });
    

    Ở đây, morphs('imageable') sẽ tạo hai cột imageable_idimageable_type.

  2. Định nghĩa quan hệ trong model:

    • Trong model Image, bạn sẽ định nghĩa phương thức imageable để chỉ ra rằng hình ảnh này có thể thuộc về nhiều loại model khác nhau:
      class Image extends Model
      {
          public function imageable()
          {
              return $this->morphTo();
          }
      }
      
    • Trong model UserPost, bạn sẽ định nghĩa một phương thức image để chỉ ra rằng người dùng và bài viết có thể có một hình ảnh:
      class User extends Model
      {
          public function image()
          {
              return $this->morphOne(Image::class, 'imageable');
          }
      }
      
      class Post extends Model
      {
          public function image()
          {
              return $this->morphOne(Image::class, 'imageable');
          }
      }
      
  3. Sử dụng One-to-One Polymorphic Relationship:

    Bạn có thể thêm và lấy hình ảnh cho người dùng và bài viết như sau:

    $user = User::find(1);
    $image = new Image(['url' => 'user_image.jpg']);
    $user->image()->save($image);
    
    $post = Post::find(1);
    $image = new Image(['url' => 'post_image.jpg']);
    $post->image()->save($image);
    

    Để lấy hình ảnh của một người dùng hoặc bài viết:

    $userImage = $user->image;
    $postImage = $post->image;
    

2. One-to-Many Polymorphic Relationships

One-to-Many Polymorphic Relationships cho phép một model có thể liên kết với nhiều model khác nhau. Ví dụ điển hình là một bảng comments có thể chứa các bình luận cho cả bài viết (posts) và video (videos). Cả hai model PostVideo có thể chia sẻ cùng một bảng comments.

Ví dụ:
  1. Cấu trúc cơ sở dữ liệu:

    Bạn cần có các bảng posts, videos, và comments. Bảng comments sẽ chứa hai cột đặc biệt là commentable_idcommentable_type để theo dõi ID và loại model mà nó liên kết.

    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
    
    Schema::create('videos', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
    
    Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->text('body');
        $table->morphs('commentable');
        $table->timestamps();
    });
    

    Ở đây, morphs('commentable') là một shortcut để tạo hai cột commentable_idcommentable_type.

  2. Định nghĩa quan hệ trong model:

    • Trong model Comment, bạn sẽ định nghĩa một phương thức commentable để chỉ ra rằng comment này có thể thuộc về nhiều model khác nhau:
      class Comment extends Model
      {
          public function commentable()
          {
              return $this->morphTo();
          }
      }
      
    • Trong model PostVideo, bạn sẽ định nghĩa một phương thức comments để chỉ ra rằng các bài viết và video có thể có nhiều comment:
      class Post extends Model
      {
          public function comments()
          {
              return $this->morphMany(Comment::class, 'commentable');
          }
      }
      
      class Video extends Model
      {
          public function comments()
          {
              return $this->morphMany(Comment::class, 'commentable');
          }
      }
      
  3. Sử dụng Polymorphic Relationship:

    Bạn có thể thêm và lấy các bình luận cho các bài viết và video như sau:

    $post = Post::find(1);
    $comment = new Comment(['body' => 'Great post!']);
    $post->comments()->save($comment);
    
    $video = Video::find(1);
    $comment = new Comment(['body' => 'Nice video!']);
    $video->comments()->save($comment);
    

    Để lấy tất cả các bình luận cho một bài viết hoặc video:

    $postComments = $post->comments;
    $videoComments = $video->comments;
    

3. Many-to-Many Polymorphic Relationships

Many-to-Many Polymorphic Relationships cho phép một model có thể có mối quan hệ nhiều-nhiều với nhiều model khác nhau. Ví dụ, một bảng tags có thể được liên kết với cả postsvideos.

Ví dụ:
  1. Cấu trúc cơ sở dữ liệu:

    Bạn cần có các bảng posts, videos, tags, và taggables. Bảng taggables sẽ chứa hai cột taggable_idtaggable_type để xác định loại thực thể mà nó liên kết (bài viết hoặc video).

    Schema::create('tags', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
    Schema::create('taggables', function (Blueprint $table) {
        $table->morphs('taggable');
        $table->foreignId('tag_id')->constrained();
        $table->timestamps();
    });
    
  2. Định nghĩa quan hệ trong model:

    • Trong model Tag, bạn sẽ định nghĩa phương thức taggables để chỉ ra rằng tag này có thể thuộc về nhiều loại model khác nhau:
      class Tag extends Model
      {
          public function taggables()
          {
              return $this->morphedByMany(Post::class, 'taggable');
          }
      }
      
    • Trong model PostVideo, bạn sẽ định nghĩa một phương thức tags để chỉ ra rằng bài viết và video có thể có nhiều tag:
      class Post extends Model
      {
          public function tags()
          {
              return $this->morphToMany(Tag::class, 'taggable');
          }
      }
      
      class Video extends Model
      {
          public function tags()
          {
              return $this->morphToMany(Tag::class, 'taggable');
          }
      }
      
  3. Sử dụng Many-to-Many Polymorphic Relationship:

    Bạn có thể thêm và lấy các tag cho bài viết và video như sau:

    $post = Post::find(1);
    $tag = Tag::find(1);
    $post->tags()->attach($tag);
    
    $video = Video::find(1);
    $video->tags()->attach($tag);
    

    Để lấy tất cả các tag cho một bài viết hoặc video:

    $postTags = $post->tags;
    $videoTags = $video->tags;
    

4. Lợi ích của Polymorphic Relationships

  1. Tính linh hoạt: Bạn có thể thiết kế cơ sở dữ liệu linh hoạt hơn, cho phép các thực thể khác nhau có thể chia sẻ cùng một bảng quan hệ.
  2. Tái sử dụng: Polymorphic Relationships giúp tránh lặp lại các bảng quan hệ không cần thiết, giảm phức tạp của cơ sở dữ liệu.
  3. Tiết kiệm thời gian: Bạn có thể quản lý nhiều loại dữ liệu mà không cần phải tạo ra quá nhiều bảng phụ thuộc, giúp tiết kiệm thời gian trong quá trình phát triển và bảo trì.

Kết luận

Polymorphic Relationships trong Laravel là một công cụ cực kỳ mạnh mẽ và linh hoạt giúp bạn quản lý các mối quan hệ phức tạp trong cơ sở dữ liệu. Việc hiểu rõ và tận dụng tính năng này sẽ giúp bạn tối ưu hóa cấu trúc dữ liệu và mã nguồn của mình, đồng thời làm cho quá trình phát triển ứng dụng trở nên dễ dàng hơn.

Danh mục


  1. ThreeJS
  2. Ubuntu/Linux
  3. HTML/CSS
  4. Git
  5. Amazon Web Services
  6. Javascript
  7. Docker
  8. Laravel

Bài viết liên quan


Quản Lý Thời Gian Tự Động Trong Eloquent

Quản Lý Thời Gian Tự Động Trong Eloquent

01.08.2024
Author: ADMIN

# Timestamps

Mặc định, Eloquent yêu cầu hai cột created_atupdated_at tồn tại trên bảng cơ sở dữ liệu tương ứng với mô hình của bạn. Eloquent sẽ tự động thiết lập giá trị cho các cột này khi mô hình được tạo mới hoặc cập nhật.

Tuy nhiên, nếu bạn không muốn Eloquent tự động quản lý các cột thời gian này, bạn có thể cấu hình mô hình của bạn để bỏ qua việc tự động cập nhật các cột created_atupdated_at. Để làm điều này, bạn cần định nghĩa thuộc tính $timestamps trên mô hình của bạn với giá trị false.

Ví Dụ Cụ Thể

Mô Hình Mặc Định Với Cột Thời Gian

Khi bạn tạo một mô hình Eloquent mà không cấu hình thuộc tính $timestamps, Eloquent sẽ tự động quản lý các cột thời gian:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Eloquent tự động quản lý created_at và updated_at
}

Bỏ Qua Quản Lý Thời Gian

Nếu bạn không muốn Eloquent tự động quản lý created_atupdated_at, bạn có thể cấu hình mô hình của bạn như sau:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Tắt quản lý created_at và updated_at
    public $timestamps = false;
}

# Tùy Chỉnh Định Dạng Thời Gian

Nếu bạn cần tùy chỉnh định dạng của các timestamp trên mô hình Eloquent của bạn, bạn có thể thiết lập thuộc tính $dateFormat trên mô hình. Thuộc tính này xác định cách các thuộc tính ngày tháng được lưu trữ trong cơ sở dữ liệu cũng như định dạng của chúng khi mô hình được chuyển đổi thành mảng hoặc JSON.

Ví Dụ Cụ Thể

Giả sử bạn muốn thay đổi định dạng ngày tháng từ mặc định (Y-m-d H:i:s) thành định dạng khác, chẳng hạn như d/m/Y H:i:s, bạn có thể thực hiện điều này bằng cách cấu hình thuộc tính $dateFormat trong mô hình của bạn.

Mô Hình Với Định Dạng Tùy Chỉnh

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Đặt định dạng ngày tháng tùy chỉnh
    protected $dateFormat = 'd/m/Y H:i:s';
}

Cách Hoạt Động

  • Lưu Trữ Trong Cơ Sở Dữ Liệu: Khi bạn lưu một mô hình vào cơ sở dữ liệu, Eloquent sẽ sử dụng định dạng d/m/Y H:i:s để lưu trữ giá trị thời gian vào các cột created_atupdated_at.
  • Chuyển Đổi Thành Mảng hoặc JSON: Khi bạn chuyển đổi mô hình thành mảng hoặc JSON, giá trị của các thuộc tính ngày tháng sẽ được định dạng theo cách bạn đã chỉ định trong thuộc tính $dateFormat.

# Tùy Chỉnh Tên Cột Thời Gian Trong Eloquent

Nếu bạn cần tùy chỉnh tên của các cột được sử dụng để lưu trữ timestamp (created_atupdated_at), bạn có thể định nghĩa các hằng số CREATED_ATUPDATED_AT trên mô hình của bạn. Điều này cho phép bạn thay đổi tên các cột mặc định mà Eloquent sử dụng để lưu trữ thời gian tạo và cập nhật.

Ví Dụ Cụ Thể

Giả sử bạn có các cột trong bảng cơ sở dữ liệu với tên là created_onupdated_on thay vì created_atupdated_at. Bạn có thể cấu hình mô hình của bạn như sau:

Mô Hình Với Tên Cột Tùy Chỉnh

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Định nghĩa tên cột tùy chỉnh cho thời gian tạo và cập nhật
    const CREATED_AT = 'created_on';
    const UPDATED_AT = 'updated_on';
}

Cách Hoạt Động

  • Lưu Trữ Trong Cơ Sở Dữ Liệu: Eloquent sẽ sử dụng các tên cột tùy chỉnh (created_onupdated_on) thay vì các tên mặc định (created_atupdated_at) khi lưu trữ giá trị thời gian vào cơ sở dữ liệu.
  • Lấy Dữ Liệu: Khi bạn lấy dữ liệu từ cơ sở dữ liệu, Eloquent sẽ sử dụng các tên cột tùy chỉnh này để gán giá trị cho thuộc tính created_atupdated_at của mô hình.

# Không Cập Nhật updated_at

Nếu bạn muốn thực hiện các thao tác với mô hình mà không làm thay đổi giá trị của timestamp updated_at, bạn có thể sử dụng phương thức withoutTimestamps. Phương thức này cho phép bạn thực hiện các thao tác trên mô hình mà không ảnh hưởng đến giá trị của updated_at.

Ví Dụ Cụ Thể

Giả sử bạn có một mô hình Post và bạn muốn cập nhật một thuộc tính của mô hình mà không làm thay đổi timestamp updated_at, bạn có thể sử dụng withoutTimestamps để thực hiện điều này.

Cập Nhật Mô Hình Mà Không Cập Nhật updated_at

use App\Models\Post;

// Tìm mô hình cần cập nhật
$post = Post::find(1);

// Thực hiện cập nhật mà không làm thay đổi timestamp
$post->withoutTimestamps(function () use ($post) {
    // Cập nhật thuộc tính của mô hình
    $post->title = 'New Title';
    $post->save();
});
Các Mối Quan Hệ Trong Eloquent

Các Mối Quan Hệ Trong Eloquent

01.08.2024
Author: ADMIN

# Các Mối Quan Hệ Trong Eloquent

Eloquent cung cấp một hệ thống mạnh mẽ để quản lý các mối quan hệ giữa các mô hình trong cơ sở dữ liệu. Các mối quan hệ giúp bạn dễ dàng lấy dữ liệu liên quan từ các bảng khác nhau. Dưới đây là các loại mối quan hệ phổ biến trong Eloquent và cách sử dụng chúng:

1. Mối Quan Hệ Một-Một (One-to-One)

Một mối quan hệ một-một liên kết hai mô hình với nhau, với mỗi bản ghi trong bảng đầu tiên liên kết với một bản ghi trong bảng thứ hai.

Ví Dụ:

// Mô hình User
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

// Mô hình Profile
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Cấu Trúc Bảng:

  • users table: id, name
  • profiles table: id, user_id, bio

2. Mối Quan Hệ Một-Nhiều (One-to-Many)

Một mối quan hệ một-nhiều cho phép một bản ghi trong bảng đầu tiên liên kết với nhiều bản ghi trong bảng thứ hai.

Ví Dụ:

// Mô hình Post
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

// Mô hình Comment
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

Cấu Trúc Bảng:

  • posts table: id, title
  • comments table: id, post_id, content

3. Mối Quan Hệ Nhiều-Nhiều (Many-to-Many)

Mối quan hệ nhiều-nhiều cho phép nhiều bản ghi trong bảng đầu tiên liên kết với nhiều bản ghi trong bảng thứ hai thông qua bảng trung gian.

Ví Dụ:

// Mô hình Student
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    public function courses()
    {
        return $this->belongsToMany(Course::class);
    }
}

// Mô hình Course
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Course extends Model
{
    public function students()
    {
        return $this->belongsToMany(Student::class);
    }
}

Cấu Trúc Bảng:

  • students table: id, name
  • courses table: id, title
  • course_student table: student_id, course_id

4. Mối Quan Hệ Một-Một (Polymorphic)

Mối quan hệ polymorphic cho phép một mô hình liên kết với nhiều mô hình khác theo cách linh hoạt.

Ví Dụ:

// Mô hình Comment
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}

// Mô hình Post
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

// Mô hình Video
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Video extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

Cấu Trúc Bảng:

  • comments table: id, commentable_id, commentable_type, content
  • posts table: id, title
  • videos table: id, title

5. Mối Quan Hệ Một-Nhiều (Polymorphic)

 

Mối quan hệ một-nhiều polymorphic cho phép một mô hình liên kết với nhiều mô hình khác mà không cần phải tạo ra nhiều cột khóa ngoại. Điều này rất hữu ích khi bạn muốn một mô hình có thể liên kết với nhiều loại mô hình khác mà không cần tạo nhiều bảng trung gian.

Ví Dụ Cụ Thể

Giả sử bạn có một hệ thống mà người dùng có thể bình luận trên các bài viết (Post) và video (Video). Bạn có thể sử dụng mối quan hệ polymorphic để xử lý các bình luận mà không cần tạo bảng trung gian riêng cho mỗi loại mô hình.

Bước 1: Tạo Các Mô Hình và Cấu Trúc Bảng

  1. Tạo Model Comment
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Comment extends Model
    {
        /**
         * Thiết lập mối quan hệ polymorphic.
         */
        public function commentable()
        {
            return $this->morphTo();
        }
    }
    
  2. Tạo Model Post
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        /**
         * Thiết lập mối quan hệ một-nhiều polymorphic.
         */
        public function comments()
        {
            return $this->morphMany(Comment::class, 'commentable');
        }
    }
    
  3. Tạo Model Video
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Video extends Model
    {
        /**
         * Thiết lập mối quan hệ một-nhiều polymorphic.
         */
        public function comments()
        {
            return $this->morphMany(Comment::class, 'commentable');
        }
    }
    
  4. Tạo Cấu Trúc Bảng
    • Bảng comments

      Schema::create('comments', function (Blueprint $table) {
          $table->id();
          $table->text('content');
          $table->unsignedBigInteger('commentable_id');
          $table->string('commentable_type');
          $table->timestamps();
      });
      

       

      • commentable_id: ID của mô hình mà bình luận thuộc về.
      • commentable_type: Loại mô hình mà bình luận thuộc về (ví dụ: Post hoặc Video).
    • Bảng posts
      Schema::create('posts', function (Blueprint $table) {
          $table->id();
          $table->string('title');
          $table->timestamps();
      });
      
    • Bảng videos
      Schema::create('videos', function (Blueprint $table) {
          $table->id();
          $table->string('title');
          $table->timestamps();
      });
      

Bước 2: Sử Dụng Mối Quan Hệ

1. Thêm Bình Luận

use App\Models\Post;
use App\Models\Video;
use App\Models\Comment;

// Thêm bình luận cho một bài viết
$post = Post::find(1);
$post->comments()->create([
    'content' => 'Great post!',
]);

// Thêm bình luận cho một video
$video = Video::find(1);
$video->comments()->create([
    'content' => 'Amazing video!',
]);

2. Truy Xuất Bình Luận

// Truy xuất bình luận của một bài viết
$post = Post::find(1);
foreach ($post->comments as $comment) {
    echo $comment->content;
}

// Truy xuất bình luận của một video
$video = Video::find(1);
foreach ($video->comments as $comment) {
    echo $comment->content;
}

3. Lấy Mô Hình Từ Bình Luận

// Lấy mô hình mà bình luận thuộc về
$comment = Comment::find(1);
echo $comment->commentable_type; // Ví dụ: App\Models\Post hoặc App\Models\Video

6.Mối Quan Hệ Nhiều-Nhiều (Polymorphic)

Mối quan hệ nhiều-nhiều polymorphic cho phép một mô hình liên kết với nhiều mô hình khác và ngược lại thông qua một bảng trung gian duy nhất. Điều này cho phép mô hình liên kết với nhiều mô hình khác mà không cần phải tạo nhiều bảng trung gian riêng biệt.

Ví Dụ: Tagging trên Bài Viết và Video

Cấu Trúc và Mô Hình
  1. Tạo Mô Hình Tag

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Tag extends Model
    {
        /**
         * Thiết lập mối quan hệ nhiều-nhiều polymorphic.
         */
        public function taggable()
        {
            return $this->morphTo();
        }
    }
    
  2. Tạo Mô Hình Post
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        /**
         * Thiết lập mối quan hệ nhiều-nhiều polymorphic.
         */
        public function tags()
        {
            return $this->morphToMany(Tag::class, 'taggable');
        }
    }
    
  3. Tạo Mô Hình Video
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Video extends Model
    {
        /**
         * Thiết lập mối quan hệ nhiều-nhiều polymorphic.
         */
        public function tags()
        {
            return $this->morphToMany(Tag::class, 'taggable');
        }
    }
    
  4. Tạo Cấu Trúc Bảng
    Schema::create('tags', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
    Schema::create('taggables', function (Blueprint $table) {
        $table->unsignedBigInteger('tag_id');
        $table->unsignedBigInteger('taggable_id');
        $table->string('taggable_type');
        $table->timestamps();
    });
    
  5. Sử dụng
    // Thêm tag cho một bài viết
    $post = Post::find(1);
    $tag = Tag::find(1);
    $post->tags()->attach($tag);
    
    // Thêm tag cho một video
    $video = Video::find(1);
    $tag = Tag::find(2);
    $video->tags()->attach($tag);
    

Kết Luận

  • Một-Một (One-to-One): Liên kết mỗi bản ghi trong bảng đầu tiên với một bản ghi trong bảng thứ hai.
  • Một-Nhiều (One-to-Many): Liên kết một bản ghi trong bảng đầu tiên với nhiều bản ghi trong bảng thứ hai.
  • Nhiều-Nhiều (Many-to-Many): Liên kết nhiều bản ghi trong bảng đầu tiên với nhiều bản ghi trong bảng thứ hai thông qua bảng trung gian.
  • Polymorphic: Cho phép liên kết linh hoạt với nhiều mô hình khác.

Các mối quan hệ trong Eloquent giúp bạn dễ dàng quản lý và truy xuất dữ liệu liên quan trong ứng dụng của bạn, làm cho việc tương tác với cơ sở dữ liệu trở nên dễ dàng và trực quan hơn.

Basic Eloquent Model and MVC

Basic Eloquent Model and MVC

01.08.2024
Author: ADMIN

Trong Laravel, mô hình Eloquent cùng với kiến trúc MVC (Model-View-Controller) cung cấp một cách hiệu quả để xây dựng ứng dụng web. Dưới đây là cách hoạt động cơ bản của ba thành phần chính trong kiến trúc MVC:

1. Model (Mô Hình)

Model là thành phần đại diện cho dữ liệu của ứng dụng và thường tương tác với cơ sở dữ liệu. Trong Laravel, mô hình Eloquent được sử dụng để quản lý dữ liệu một cách dễ dàng và trực quan.

Tạo một Model:

Bạn có thể tạo một mô hình bằng cách sử dụng Artisan command:

php artisan make:model Post

Ngoài ra còn một số command tạo model khác, bạn có thể tham khảo bên dưới

# Tạo một model Flight cùng với một lớp factory. Lớp factory được sử dụng để tạo dữ liệu giả cho việc kiểm thử hoặc phát triển.
php artisan make:model Flight --factory
php artisan make:model Flight -f
 
# Tạo một model Flight cùng với một lớp seeder. Seeder được sử dụng để chèn dữ liệu mẫu vào cơ sở dữ liệu.
php artisan make:model Flight --seed
php artisan make:model Flight -s
 
# Tạo một model Flight cùng với một lớp controller. Controller được sử dụng để xử lý các yêu cầu HTTP và điều hướng đến các view hoặc thao tác với mô hình.
php artisan make:model Flight --controller
php artisan make:model Flight -c
 
# Tạo một model Flight, một lớp controller resource (controller với các phương thức chuẩn RESTful), và các lớp form request để xác thực dữ liệu đầu vào.
php artisan make:model Flight --controller --resource --requests
php artisan make:model Flight -crR
 
# Tạo một model Flight cùng với một lớp policy. Policy được sử dụng để xác định quyền truy cập cho các hành động trên mô hình.
php artisan make:model Flight --policy
 
# Tạo một model Flight, một migration (để tạo bảng trong cơ sở dữ liệu), một lớp factory, một lớp seeder, và một lớp controller. 
# Đây là cách nhanh chóng để tạo tất cả các thành phần cơ bản cho một mô hình.
php artisan make:model Flight -mfsc
 
# Tạo một model Flight cùng với tất cả các thành phần liên quan bao gồm migration, factory, seeder, policy, controller, và form request. 
# Đây là một cách tiện lợi để tạo tất cả các thành phần cơ bản và mở rộng cho một mô hình trong một lệnh duy nhất.
php artisan make:model Flight --all
 
# Tạo một model Member để sử dụng cho các bảng pivot trong các mối quan hệ nhiều-nhiều. 
# Pivot model là các mô hình đặc biệt dùng để lưu trữ các mối quan hệ giữa hai mô hình khác.
php artisan make:model Member --pivot
php artisan make:model Member -p

Định nghĩa Model:

Mô hình Post sẽ được lưu trữ trong thư mục app/Models. Ví dụ về một mô hình cơ bản:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // Tên bảng (nếu không theo quy ước tên bảng số nhiều)
    protected $table = 'posts';

    // Các thuộc tính có thể được gán đại chúng
    protected $fillable = ['title', 'content'];

    // set primary key
    protected $primaryKey = 'flight_id';

    /**
     * Cho biết ID của model có tự động tăng hay không.
     */
    public $incrementing = false;
}

Mô hình này đại diện cho bảng posts trong cơ sở dữ liệu và có thể thực hiện các thao tác như truy vấn, thêm, sửa, xóa dữ liệu.

2. Controller (Bộ điều khiển)

Controller là thành phần xử lý logic ứng dụng và giao tiếp giữa mô hình và view. Nó nhận các yêu cầu từ người dùng, thao tác với mô hình và trả về dữ liệu cho view.

Tạo một Controller:

Sử dụng Artisan command để tạo một controller mới:

php artisan make:controller PostController

Định nghĩa Controller:

Bên trong controller, bạn có thể định nghĩa các phương thức để xử lý yêu cầu từ người dùng:

namespace App\Http\Controllers;

use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        // Lấy tất cả các bài viết từ cơ sở dữ liệu
        $posts = Post::all();
        // Trả về view với dữ liệu bài viết
        return view('posts.index', compact('posts'));
    }

    public function show($id)
    {
        // Tìm bài viết theo ID
        $post = Post::findOrFail($id);
        // Trả về view với dữ liệu bài viết
        return view('posts.show', compact('post'));
    }

    public function store(Request $request)
    {
        // Xác thực và tạo bài viết mới
        $request->validate([
            'title' => 'required',
            'content' => 'required',
        ]);

        Post::create($request->all());
        return redirect()->route('posts.index');
    }
}

3. View (Giao diện)

View là phần của ứng dụng chịu trách nhiệm hiển thị dữ liệu cho người dùng. Trong Laravel, các view thường được lưu trữ trong thư mục resources/views và được viết bằng Blade, một engine template của Laravel.

Tạo View:

Tạo các file Blade trong thư mục resources/views/posts để hiển thị dữ liệu:

  • index.blade.php: Hiển thị danh sách tất cả các bài viết

    <!DOCTYPE html>
    <html>
    <head>
        <title>Danh sách bài viết</title>
    </head>
    <body>
        <h1>Danh sách bài viết</h1>
        <ul>
            @foreach($posts as $post)
                <li><a href="{{ route('posts.show', $post->id) }}">{{ $post->title }}</a></li>
            @endforeach
        </ul>
    </body>
    </html>
    
  • show.blade.php: Hiển thị chi tiết một bài viết
    <!DOCTYPE html>
    <html>
    <head>
        <title>{{ $post->title }}</title>
    </head>
    <body>
        <h1>{{ $post->title }}</h1>
        <p>{{ $post->content }}</p>
        <a href="{{ route('posts.index') }}">Trở lại danh sách</a>
    </body>
    </html>
    

Tổng Quan

  • Model (Mô Hình) quản lý dữ liệu và tương tác với cơ sở dữ liệu.
  • Controller (Bộ điều khiển) xử lý logic và điều hướng giữa mô hình và giao diện.
  • View (Giao diện) hiển thị dữ liệu cho người dùng.

Sử dụng kiến trúc MVC trong Laravel giúp phân chia rõ ràng giữa các phần của ứng dụng, làm cho việc phát triển và bảo trì dễ dàng hơn.

Eager Loading

Eager Loading

01.08.2024
Author: ADMIN

# Eager Loading

Eager loading là một kỹ thuật trong Eloquent ORM của Laravel để giảm số lượng truy vấn đến cơ sở dữ liệu bằng cách tải các quan hệ của model ngay lập tức khi bạn truy vấn model chính. Điều này giúp cải thiện hiệu suất ứng dụng bằng cách tránh vấn đề N+1 queries, nơi bạn thực hiện nhiều truy vấn không cần thiết khi tải các quan hệ.

Ví Dụ: Eager Loading với Mối Quan Hệ Một-Nhiều

Giả sử bạn có một model Post và mỗi bài viết có nhiều Comment. Khi bạn muốn lấy tất cả các bài viết cùng với các bình luận của chúng, bạn có thể sử dụng eager loading để giảm số lượng truy vấn SQL.

Model và Cấu Trúc Bảng
  1. Model Post

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        /**
         * Thiết lập mối quan hệ một-nhiều với Comment.
         */
        public function comments()
        {
            return $this->hasMany(Comment::class);
        }
    }
    

     

  2. Model Comment
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Comment extends Model
    {
        /**
         * Thiết lập mối quan hệ nhiều-một với Post.
         */
        public function post()
        {
            return $this->belongsTo(Post::class);
        }
    }
    
  3. Cấu Trúc Bảng
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
    
    Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('post_id');
        $table->text('content');
        $table->timestamps();
    
        $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
    });
    
  4. Sử Dụng Eager Loading
    4.1 Truy Vấn Bình Thường (Lazy Loading)
    // Lấy tất cả bài viết
    $posts = Post::all();
    
    // Truy xuất các bình luận của mỗi bài viết (N+1 queries)
    foreach ($posts as $post) {
        foreach ($post->comments as $comment) {
            // Xử lý bình luận
        }
    }
    

    4.2 Sử Dụng Eager Loading

    // Lấy tất cả bài viết cùng với các bình luận của chúng (1 query cho bài viết + 1 query cho bình luận)
    $posts = Post::with('comments')->get();
    
    // Truy xuất các bình luận của mỗi bài viết mà không thực hiện thêm truy vấn
    foreach ($posts as $post) {
        foreach ($post->comments as $comment) {
            // Xử lý bình luận
        }
    }
    
  5. Các Tùy Chọn Eager Loading

    5.1 Chỉ Định Các Quan Hệ Nâng Cao

    Bạn có thể eager load nhiều quan hệ hoặc nested quan hệ (quan hệ trong quan hệ) bằng cách chỉ định chúng trong phương thức with.

    // Eager load các quan hệ bình luận và user của mỗi bình luận
    $posts = Post::with('comments.user')->get();
    

    5.2 Sử Dụng withCount
    Bạn có thể sử dụng withCount để lấy số lượng các quan hệ mà không cần phải lấy dữ liệu chi tiết của quan hệ.

    // Lấy số lượng bình luận cho mỗi bài viết
    $posts = Post::withCount('comments')->get();
    
    foreach ($posts as $post) {
        echo $post->comments_count; // Số lượng bình luận
    }
    
    5.3 Eager Load Với Điều Kiện
    // Eager load bình luận với điều kiện chỉ lấy những bình luận mới nhất
    $posts = Post::with(['comments' => function ($query) {
        $query->where('created_at', '>', now()->subDays(7));
    }])->get();
    

# Nested Eager Loading morphTo Relationships

Khi làm việc với các mối quan hệ polymorphic trong Eloquent, bạn có thể cần thực hiện eager loading không chỉ cho các mối quan hệ polymorphic mà còn cho các mối quan hệ liên quan đến các model mà chúng liên kết đến. Đây được gọi là nested eager loading.

Mối Quan Hệ Polymorphic (morphTo) cho phép một model liên kết với nhiều model khác và không cần phải tạo nhiều cột khóa ngoại. Khi sử dụng eager loading với các mối quan hệ polymorphic, bạn có thể tải tất cả các dữ liệu cần thiết trong một truy vấn hiệu quả.

Ví Dụ: Nested Eager Loading với Mối Quan Hệ Polymorphic

Giả sử bạn có một hệ thống bình luận mà mỗi bình luận có thể thuộc về nhiều loại model khác nhau (như Post hoặc Video). Đồng thời, mỗi bình luận có thể được gán cho một người dùng (user). Dưới đây là cách bạn có thể thiết lập và thực hiện nested eager loading cho các mối quan hệ này.

Cấu Trúc và Model
  1. Model Comment

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Comment extends Model
    {
        /**
         * Thiết lập mối quan hệ polymorphic.
         */
        public function commentable()
        {
            return $this->morphTo();
        }
    
        /**
         * Thiết lập mối quan hệ nhiều-một với User.
         */
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }
    

     

  2. Model Post
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        /**
         * Thiết lập mối quan hệ một-nhiều polymorphic với Comment.
         */
        public function comments()
        {
            return $this->morphMany(Comment::class, 'commentable');
        }
    }
    
  3. Model Video
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Video extends Model
    {
        /**
         * Thiết lập mối quan hệ một-nhiều polymorphic với Comment.
         */
        public function comments()
        {
            return $this->morphMany(Comment::class, 'commentable');
        }
    }
    
  4. Model User
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
         * Thiết lập mối quan hệ một-nhiều với Comment.
         */
        public function comments()
        {
            return $this->hasMany(Comment::class);
        }
    }
    
  5. Cấu Trúc Bảng
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
    
    Schema::create('videos', function (Blueprint $table) {
        $table->id();
        $table->string('title');
        $table->timestamps();
    });
    
    Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('commentable_id');
        $table->string('commentable_type');
        $table->unsignedBigInteger('user_id');
        $table->text('content');
        $table->timestamps();
    
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
    
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
    
  6. Thực Hiện Nested Eager Loading
    // Lấy tất cả các bài viết cùng với bình luận của chúng, bình luận có người dùng và video hoặc bài viết liên quan
    $posts = Post::with(['comments.user', 'comments.commentable'])->get();
    
    foreach ($posts as $post) {
        foreach ($post->comments as $comment) {
            echo $comment->content; // Nội dung bình luận
            echo $comment->user->name; // Tên người dùng bình luận
            echo $comment->commentable->title; // Tiêu đề của video hoặc bài viết liên quan
        }
    }
    

    Giải Thích:

    • Post::with(['comments.user', 'comments.commentable'])->get();: Phương thức with được sử dụng để eager load các quan hệ comments và trong comments, eager load user (người dùng bình luận) và commentable (model mà bình luận thuộc về, có thể là Post hoặc Video).
    • Trong ví dụ này, khi bạn truy xuất các bài viết và bình luận, tất cả các dữ liệu liên quan đến bình luận và người dùng bình luận, cùng với model liên quan của bình luận (có thể là bài viết hoặc video) sẽ được tải ngay lập tức, giúp giảm số lượng truy vấn đến cơ sở dữ liệu.

Bài viết khác

Routing

Routing

01.08.2024
Author: ADMIN

# Basic Routing

1. Khái niệm về Route

Route trong Laravel là cách bạn định nghĩa URL cho ứng dụng của mình. Route giúp bạn chỉ định URL nào sẽ gọi đến Controller nào hoặc thực hiện hành động gì.

2. Định nghĩa Route Cơ Bản

Tất cả các route của Laravel được định nghĩa trong các file nằm trong thư mục routes. Các file này được tự động tải bởi App\Providers\RouteServiceProvider của ứng dụng của bạn. Có bốn file route chính:

  • web.php: Định nghĩa các route cho web application.
  • api.php: Định nghĩa các route cho API.
  • console.php: Định nghĩa các route cho console commands.
  • channels.php: Định nghĩa các route cho event broadcasting channels.

Định nghĩa route trong web.php

Dưới đây là một ví dụ đơn giản về cách định nghĩa một route trong file web.php:

Route::get('/', function () {
    return view('welcome');
});

Trong ví dụ trên:

  • Route::get('/'): Định nghĩa một route sử dụng phương thức GET cho URL /.
  • function () { return view('welcome'); }: Định nghĩa hành động sẽ thực hiện khi người dùng truy cập vào URL /. Ở đây, Laravel sẽ trả về view welcome.

3. Các Phương Thức Route

Laravel hỗ trợ nhiều phương thức HTTP khác nhau, bao gồm:

  • GET: Dùng để truy xuất dữ liệu từ server.
  • POST: Dùng để gửi dữ liệu lên server.
  • PUT: Dùng để cập nhật dữ liệu trên server.
  • PATCH: Dùng để cập nhật một phần tài nguyên trên server. Tương tự như PUT nhưng chỉ cập nhật các phần cụ thể của tài nguyên.
  • DELETE: Dùng để xóa dữ liệu từ server.
  • OPTIONS: Dùng để truy vấn các phương thức HTTP mà server hỗ trợ cho một URL cụ thể. Thường được sử dụng trong các ứng dụng RESTful API để kiểm tra các tùy chọn giao tiếp.

Ví dụ về các phương thức khác nhau:

Route::get('/products', function () {
    return 'Get all products';
});

Route::post('/products', function () {
    return 'Create a new product';
});

Route::put('/products/{id}', function ($id) {
    return 'Update the product with ID ' . $id;
});

Route::patch('/products/{id}', function ($id) {
    return 'Partially update the product with ID ' . $id;
});

Route::delete('/products/{id}', function ($id) {
    return 'Delete the product with ID ' . $id;
});

Route::options('/products', function () {
    return response()->json(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
});

4. Route với Tham Số

Bạn có thể định nghĩa route có tham số như sau:

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

Trong ví dụ này, {id} là một tham số động. Khi người dùng truy cập vào URL user/1, Laravel sẽ gán giá trị 1 vào biến $id và trả về User 1.

5. Route Groups

Bạn có thể nhóm các route lại với nhau bằng cách sử dụng Route::group. Điều này giúp bạn dễ dàng áp dụng middleware hoặc tiền tố URL cho một nhóm route.

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

    Route::get('/settings', function () {
        // Matches The "/admin/settings" URL
    });
});

Trong ví dụ trên, tất cả các route trong nhóm này sẽ có tiền tố admin.

6. Middleware

Middleware là các lớp trung gian mà HTTP request phải đi qua trước khi đến Controller. Bạn có thể áp dụng middleware cho route như sau:

Route::get('/profile', function () {
    // Only authenticated users may enter...
})->middleware('auth');

Trong ví dụ này, middleware auth sẽ kiểm tra xem người dùng có được xác thực hay không trước khi cho phép truy cập vào route /profile.

Laravel cung cấp hai nhóm middleware chính cho các file route:

  • web middleware group: Được áp dụng cho các route trong routes/web.php. Middleware nhóm này bao gồm các tính năng như:
    • Session state
    • CSRF protection
    • Cookie encryption
    • ...
  • api middleware group: Được áp dụng cho các route trong routes/api.php. Middleware nhóm này bao gồm các tính năng như:
    • Stateless (không trạng thái)
    • Token-based authentication
    • Rate limiting
    • ...

7. CSRF Protection

Hãy nhớ rằng, bất kỳ biểu mẫu HTML nào trỏ tới các route sử dụng phương thức POST, PUT, PATCH, hoặc DELETE được định nghĩa trong file route web cần phải bao gồm trường token CSRF. Nếu không, yêu cầu sẽ bị từ chối. Bạn có thể đọc thêm về bảo vệ CSRF trong tài liệu CSRF:

<form method="POST" action="/profile">
    @csrf
    <!-- Các trường input khác -->
    <button type="submit">Submit</button>
</form>

Việc bảo vệ CSRF rất quan trọng để ngăn chặn các tấn công giả mạo yêu cầu từ trang chéo, đảm bảo rằng các yêu cầu tới server đến từ nguồn đáng tin cậy.

8. Redirect Routes

Nếu bạn định nghĩa một route để chuyển hướng đến một URI khác, bạn có thể sử dụng phương thức Route::redirect. Phương thức này cung cấp một cách tắt thuận tiện để bạn không phải định nghĩa một route hoặc controller đầy đủ cho việc thực hiện chuyển hướng đơn giản.

Ví dụ:

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

Mặc định, Route::redirect sẽ trả về mã trạng thái 302. Mã trạng thái 302 cho biết rằng tài nguyên đã được di chuyển tạm thời đến một vị trí mới.

Tuỳ Chỉnh Mã Trạng Thái

Bạn có thể tuỳ chỉnh mã trạng thái bằng cách sử dụng tham số thứ ba tùy chọn:

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

Trong ví dụ này, mã trạng thái 301 được sử dụng để chỉ ra rằng tài nguyên đã được di chuyển vĩnh viễn đến một vị trí mới.

Sử Dụng Route::permanentRedirect

Hoặc, bạn có thể sử dụng phương thức Route::permanentRedirect để trả về mã trạng thái 301:

Route::permanentRedirect('/here', '/there');

9. The Route List

Lệnh Artisan route:list là một công cụ mạnh mẽ giúp bạn dễ dàng xem tất cả các route đã được định nghĩa trong ứng dụng của bạn. Dưới đây là các cách sử dụng lệnh route:list cùng với giải thích chi tiết:

Hiển Thị Danh Sách Các Route

Để xem tất cả các route được định nghĩa trong ứng dụng của bạn, bạn có thể sử dụng lệnh:

php artisan route:list

Lệnh này hiển thị một bảng tổng quan của tất cả các route trong ứng dụng, bao gồm các thông tin như phương thức HTTP, URI, tên route, và hành động (action) của route đó. Đây là cách nhanh chóng để bạn kiểm tra cấu hình các route hiện tại của ứng dụng.

Hiển Thị Middleware và Tên Các Nhóm Middleware

Mặc định, lệnh route:list không hiển thị các middleware gán cho mỗi route. Để hiển thị các middleware và tên các nhóm middleware, bạn có thể sử dụng tùy chọn -v:

php artisan route:list -v

Thêm -v (verbose) vào lệnh sẽ hiển thị thêm các thông tin về các middleware áp dụng cho từng route. Nếu bạn muốn mở rộng thêm thông tin về các nhóm middleware, bạn có thể sử dụng -vv:

php artisan route:list -vv

Tùy chọn -vv cung cấp một cái nhìn chi tiết hơn về các nhóm middleware và các middleware cá nhân được gán cho các route, giúp bạn thấy rõ hơn cách các route được xử lý.

Hiển Thị Các Route Bắt Đầu Với Một URI Cụ Thể

Để chỉ hiển thị các route bắt đầu với một URI cụ thể, bạn có thể sử dụng tùy chọn --path:

php artisan route:list --path=api

Thêm tùy chọn --path=api sẽ lọc các route và chỉ hiển thị các route có URI bắt đầu bằng /api. Đây là cách hữu ích để bạn chỉ xem các route liên quan đến API của bạn.

Ẩn Các Route Được Định Nghĩa Bởi Các Gói Thứ Ba

Để ẩn bất kỳ route nào được định nghĩa bởi các gói bên ngoài, bạn có thể sử dụng tùy chọn --except-vendor:

php artisan route:list --except-vendor

Tùy chọn --except-vendor sẽ loại bỏ các route đến từ các gói bên ngoài, giúp bạn tập trung vào các route được định nghĩa trong ứng dụng của bạn.

Chỉ Hiển Thị Các Route Được Định Nghĩa Bởi Các Gói Thứ Ba

Ngược lại, để chỉ hiển thị các route được định nghĩa bởi các gói bên ngoài, bạn có thể sử dụng tùy chọn --only-vendor:

php artisan route:list --only-vendor

Tùy chọn --only-vendor sẽ lọc các route và chỉ hiển thị các route đến từ các gói bên ngoài, giúp bạn xem xét các route của bên thứ ba mà không bị phân tâm bởi các route của ứng dụng của bạn.

Tóm Tắt Các Tùy Chọn Của route:list

  • php artisan route:list: Hiển thị danh sách tất cả các route.
  • php artisan route:list -v: Hiển thị danh sách route kèm theo thông tin về middleware và nhóm middleware.
  • php artisan route:list -vv: Hiển thị thông tin chi tiết về middleware và nhóm middleware.
  • php artisan route:list --path=api: Hiển thị các route có URI bắt đầu bằng /api.
  • php artisan route:list --except-vendor: Ẩn các route từ các gói bên ngoài.
  • php artisan route:list --only-vendor: Chỉ hiển thị các route từ các gói bên ngoài.

Tóm lại

Route là một phần không thể thiếu trong bất kỳ ứng dụng Laravel nào. Việc hiểu rõ và sử dụng thành thạo các route cơ bản sẽ giúp bạn xây dựng ứng dụng một cách hiệu quả và dễ dàng. Hy vọng bài viết này đã giúp bạn có cái nhìn tổng quan về hệ thống routing trong Laravel.

# Optional Parameters

Khi làm việc với các route trong Laravel, đôi khi bạn cần định nghĩa một tham số route mà không phải lúc nào cũng có mặt trong URI. Bạn có thể thực hiện điều này bằng cách đặt dấu ? sau tên tham số và cung cấp một giá trị mặc định cho biến tương ứng trong route. Dưới đây là cách làm việc với tham số route tùy chọn, cùng với các ví dụ và giải thích chi tiết.

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

1. Ràng Buộc Định Dạng Tham Số Route

Dưới đây là tổng hợp các cách sử dụng ràng buộc biểu thức chính quy cho tham số route trong Laravel:

// Ràng buộc tham số phải chỉ chứa các ký tự chữ cái
Route::get('/user/{name}', function (string $name) {
    // ...
})->where('name', '[A-Za-z]+');

// Ràng buộc tham số phải chỉ chứa các chữ số
Route::get('/user/{id}', function (string $id) {
    // ...
})->where('id', '[0-9]+');

// Ràng buộc nhiều tham số với các biểu thức chính quy khác nhau
Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

// Sử dụng các phương thức tiện ích để thêm ràng buộc
Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->whereNumber('id')->whereAlpha('name');

Route::get('/user/{name}', function (string $name) {
    // ...
})->whereAlphaNumeric('name');

Route::get('/user/{id}', function (string $id) {
    // ...
})->whereUuid('id');

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

Route::get('/category/{category}', function (string $category) {
    // ...
})->whereIn('category', ['movie', 'song', 'painting']);

// Ràng buộc toàn cục cho tham số route
public function boot(): void
{
    Route::pattern('id', '[0-9]+');
}

// Cho phép ký tự '/' trong giá trị tham số
Route::get('/search/{search}', function (string $search) {
    return $search;
})->where('search', '.*');

# Route Naming

Trong Laravel, bạn có thể đặt tên cho các route để tiện lợi hơn trong việc tạo URL hoặc chuyển hướng. Điều này giúp quản lý và tham chiếu đến các route dễ dàng hơn. Dưới đây là cách sử dụng route được đặt tên và các ví dụ cụ thể.

1. Đặt Tên Cho Route

Bạn có thể đặt tên cho một route bằng cách sử dụng phương thức name sau khi định nghĩa route.

Ví Dụ

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

Giải Thích

  • ->name('profile'): Đặt tên profile cho route /user/profile.

2. Đặt Tên Cho Route Trong Controller

Bạn cũng có thể đặt tên cho các route trỏ tới các action trong controller:

Ví Dụ

Route::get('/user/profile', [UserProfileController::class, 'show'])->name('profile');

Giải Thích

  • [UserProfileController::class, 'show']: Định nghĩa route trỏ tới phương thức show trong controller UserProfileController.
  • ->name('profile'): Đặt tên profile cho route này.

3. Tạo URL Từ Route Được Đặt Tên

Sau khi đã đặt tên cho một route, bạn có thể sử dụng tên của route để tạo URL hoặc chuyển hướng bằng các hàm trợ giúp của Laravel như routeredirect.

Tạo URL

$url = route('profile');
// Chuyển hướng
return redirect()->route('profile');
 
return to_route('profile');

Giải Thích

  • route('profile'): Tạo URL tới route có tên profile.
  • redirect()->route('profile'): Chuyển hướng tới route có tên profile.
  • to_route('profile'): Một cách khác để chuyển hướng tới route có tên profile.

4. Truyền Tham Số Cho Route Được Đặt Tên

Nếu route có các tham số, bạn có thể truyền các tham số này như một mảng đối số thứ hai cho hàm route.

Ví Dụ

Route::get('/user/{id}/profile', function (string $id) {
    // ...
})->name('profile');
 
$url = route('profile', ['id' => 1]);

Giải Thích

  • ['id' => 1]: Tham số id được truyền vào URL.

5. Thêm Tham Số Vào Query String

Nếu bạn truyền thêm các tham số vào mảng, các cặp key/value này sẽ tự động được thêm vào query string của URL.

Ví Dụ

Route::get('/user/{id}/profile', function (string $id) {
    // ...
})->name('profile');
 
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
 
// Kết quả: /user/1/profile?photos=yes

Giải Thích

  • ['id' => 1, 'photos' => 'yes']: Tham số photos được thêm vào query string của URL.

6. Thiết Lập Giá Trị Mặc Định Cho Tham Số URL

Bạn có thể thiết lập các giá trị mặc định cho tham số URL sử dụng phương thức URL::defaults.

7. Kiểm Tra Route Hiện Tại

Bạn có thể kiểm tra xem request hiện tại có được định tuyến tới một route cụ thể hay không bằng phương thức named trên một instance của Route. Điều này hữu ích khi làm việc với middleware.

Ví Dụ Trong Middleware

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
 
public function handle(Request $request, Closure $next): Response
{
    if ($request->route()->named('profile')) {
        // ...
    }
 
    return $next($request);
}

Giải Thích

  • $request->route()->named('profile'): Kiểm tra nếu route hiện tại có tên profile.

# Route Caching

Khi triển khai ứng dụng Laravel lên môi trường sản xuất, bạn nên tận dụng khả năng cache route của Laravel để tăng tốc độ xử lý. Việc sử dụng cache route sẽ giảm đáng kể thời gian cần thiết để đăng ký tất cả các route của ứng dụng. Dưới đây là cách tạo và quản lý cache route trong Laravel.

1. Tạo Route Cache

Để tạo cache cho các route, bạn sử dụng lệnh Artisan route:cache:

php artisan route:cache

Giải Thích

  • Lệnh php artisan route:cache: Tạo một file cache chứa tất cả các route của ứng dụng. Sau khi lệnh này được thực thi, file cache sẽ được tải lên mỗi khi có yêu cầu đến ứng dụng, giúp tăng tốc độ xử lý route.

2. Lưu Ý Khi Sử Dụng Route Cache

Sau khi chạy lệnh route:cache, file cache sẽ được tải mỗi khi có yêu cầu đến ứng dụng. Tuy nhiên, nếu bạn thêm hoặc thay đổi bất kỳ route nào, bạn cần tạo lại cache mới. Do đó, bạn chỉ nên chạy lệnh route:cache trong quá trình triển khai (deployment) của dự án.

3. Xóa Route Cache

Nếu bạn cần xóa cache route, bạn có thể sử dụng lệnh Artisan route:clear:

php artisan route:clear

Giải Thích

  • Lệnh php artisan route:clear: Xóa bỏ file cache route hiện tại. Điều này hữu ích khi bạn muốn cập nhật route mà không cần tạo cache mới ngay lập tức.

Quy Trình Sử Dụng Route Cache Trong Deployment

  1. Triển khai ứng dụng lên môi trường sản xuất.
  2. Chạy lệnh php artisan route:cache để tạo file cache cho route.
  3. Khi cần cập nhật hoặc thêm route mới, hãy chạy lệnh php artisan route:clear để xóa cache hiện tại và sau đó tạo lại cache bằng lệnh php artisan route:cache.

Ví Dụ Quy Trình Deployment

# Bước 1: Triển khai ứng dụng
# (Thực hiện các bước triển khai thông thường như kéo code mới, cài đặt dependency, v.v.)

# Bước 2: Tạo route cache
php artisan route:cache

# Sau khi thêm hoặc thay đổi route
# Bước 3: Xóa route cache hiện tại
php artisan route:clear

# Bước 4: Tạo lại route cache mới
php artisan route:cache

Tóm Tắt

Việc sử dụng cache route trong Laravel giúp cải thiện hiệu suất của ứng dụng khi triển khai lên môi trường sản xuất. Tuy nhiên, bạn cần nhớ rằng mỗi khi thay đổi hoặc thêm mới route, bạn phải xóa cache cũ và tạo lại cache mới. Điều này đảm bảo rằng ứng dụng của bạn luôn sử dụng các route mới nhất mà bạn đã định nghĩa.

# Tạo cache cho route
php artisan route:cache

# Xóa cache route hiện tại
php artisan route:clear

Bằng cách tuân thủ quy trình trên, bạn sẽ có thể tận dụng tối đa hiệu quả của tính năng route cache trong Laravel, giúp ứng dụng của bạn hoạt động nhanh hơn và hiệu quả hơn.

 

Blade Basics

Blade Basics

01.08.2024
Author: ADMIN

# Blade Basics

Blade là một công cụ tạo template (template engine) mạnh mẽ được tích hợp sẵn trong Laravel. Nó cho phép bạn sử dụng các cấu trúc điều khiển như if, for, while,... ngay trong các file template của bạn. Dưới đây là một số khái niệm cơ bản và ví dụ minh họa để bạn có thể bắt đầu sử dụng Blade.

1. Tạo Và Sử Dụng File Blade

Các file Blade có đuôi mở rộng là .blade.php. Ví dụ, bạn có thể tạo một file Blade cho trang chủ của ứng dụng như sau:

<!-- resources/views/home.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Home Page</title>
</head>
<body>
    <h1>Welcome to My Laravel Application</h1>
</body>
</html>

Để trả về view này từ một route, bạn có thể sử dụng phương thức view của Laravel:

Route::get('/', function () {
    return view('home');
});

2. Các Cấu Trúc Điều Khiển

If Statements

Blade hỗ trợ các cấu trúc điều khiển như if, elseif, else, và endif:

<!-- resources/views/home.blade.php -->

@if ($name == 'John')
    <p>Hello, John!</p>
@elseif ($name == 'Jane')
    <p>Hello, Jane!</p>
@else
    <p>Hello, Stranger!</p>
@endif

Loops

Blade cũng hỗ trợ các cấu trúc lặp như for, foreach, forelse, và while:

<!-- resources/views/home.blade.php -->

@foreach ($users as $user)
    <p>This is user {{ $user->name }}</p>
@endforeach

3. Echoing Data

Blade cung cấp cú pháp đơn giản để hiển thị dữ liệu từ các biến PHP:

<!-- resources/views/home.blade.php -->

<p>{{ $name }}</p>
<p>{{ $age }}</p>

Bạn cũng có thể sử dụng hàm @php để nhúng mã PHP trực tiếp vào file Blade:

<!-- resources/views/home.blade.php -->

@php
    $name = 'John';
@endphp

<p>{{ $name }}</p>

4. Escape HTML

Blade sẽ tự động escape các biến để bảo vệ ứng dụng của bạn khỏi các lỗ hổng XSS. Nếu bạn muốn hiển thị dữ liệu mà không escape, bạn có thể sử dụng cú pháp sau:

<!-- resources/views/home.blade.php -->

{!! $unescapedData !!}

5. Kế Thừa Layouts

Blade cung cấp cơ chế kế thừa layout giúp bạn tạo ra các template có cấu trúc lặp lại một cách dễ dàng.

Tạo Layout

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

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
</head>
<body>
    <div class="container">
        @yield('content')
    </div>
</body>
</html>

Sử Dụng Layout

<!-- resources/views/home.blade.php -->

@extends('layouts.app')

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

@section('content')
    <h1>Welcome to My Laravel Application</h1>
@endsection

6. Bao Gồm Các View Con (Including Sub-Views)

Bạn có thể chia nhỏ view thành các phần nhỏ hơn và bao gồm chúng vào view chính:

<!-- resources/views/includes/header.blade.php -->

<header>
    <h1>Header Content</h1>
</header>

<!-- resources/views/home.blade.php -->

@include('includes.header')
9 Tips about Blade

9 Tips about Blade

01.08.2024
Author: ADMIN

# 9 Tips about Blade

1. Sử dụng forelse thay vì foreach

Trong Laravel Blade, forelse là một cấu trúc vòng lặp hữu ích khi bạn muốn xử lý trường hợp một mảng là rỗng. Nó giúp bạn  lặp qua một mảng và cung cấp một cấu trúc điều kiện để hiển thị nội dung khi mảng rỗng.

ví dụ:

<!-- resources/views/users.blade.php -->

@foreach ($users as $user)
    <p>This is user {{ $user->name }}</p>
@endforeach

@if ($users->isEmpty())
    <p>No users found.</p>
@endif

// Replace

<!-- resources/views/users.blade.php -->

@forelse ($users as $user)
    <p>This is user {{ $user->name }}</p>
@empty
    <p>No users found.</p>
@endforelse

Giải Thích

  • @forelse ($users as $user): Nếu mảng $users không rỗng, vòng lặp này sẽ lặp qua từng phần tử trong mảng.
  • @empty: Nếu mảng $users rỗng, đoạn mã trong khối @empty sẽ được thực thi.
  • @endforelse: Kết thúc vòng lặp forelse.

2. Sử dụng @auth@guest

Laravel cung cấp các directive @auth@guest trong Blade để giúp bạn kiểm tra trạng thái xác thực của người dùng một cách dễ dàng. Đây là hai directive rất hữu ích khi bạn cần hiển thị nội dung khác nhau dựa trên việc người dùng đã đăng nhập hay chưa.

2.1. Directive @auth

Directive @auth được sử dụng để kiểm tra xem người dùng hiện tại có được xác thực hay không. Nếu người dùng đã đăng nhập, nội dung bên trong directive này sẽ được hiển thị.

Cú Pháp

@auth
    <!-- Nội dung dành cho người dùng đã đăng nhập -->
@endauth

Ví Dụ

<!-- resources/views/welcome.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome Page</title>
</head>
<body>
    <h1>Welcome to My Laravel Application</h1>
    
    @auth
        <p>Welcome back, {{ Auth::user()->name }}!</p>
        <a href="{{ route('logout') }}">Logout</a>
    @endauth
</body>
</html>

2.2. Directive @guest

Directive @guest được sử dụng để kiểm tra xem người dùng hiện tại có chưa được xác thực hay không. Nếu người dùng chưa đăng nhập, nội dung bên trong directive này sẽ được hiển thị.

Cú Pháp

@guest
    <!-- Nội dung dành cho người dùng chưa đăng nhập -->
@endguest

Ví Dụ

<!-- resources/views/welcome.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Welcome Page</title>
</head>
<body>
    <h1>Welcome to My Laravel Application</h1>
    
    @guest
        <p>Please <a href="{{ route('login') }}">login</a> to access more features.</p>
        <a href="{{ route('register') }}">Register</a>
    @endguest
</body>
</html>

3. Sử dụng auth()->user()

Trong các file Blade, bạn có thể sử dụng auth()->user() để hiển thị thông tin người dùng hiện tại.

<!-- resources/views/profile.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Profile Page</title>
</head>
<body>
    <h1>Profile</h1>
    
    @if(auth()->check())
        <p>Name: {{ auth()->user()->name }}</p>
        <p>Email: {{ auth()->user()->email }}</p>
    @else
        <p>Please <a href="{{ route('login') }}">login</a> to view your profile.</p>
    @endif
</body>
</html>

Các Phương Thức Hữu Ích Khác

  • auth()->check(): Kiểm tra xem có người dùng nào đã đăng nhập hay không.
  • auth()->id(): Lấy ID của người dùng đã đăng nhập.

4. Format Carbon Dates

Carbon cung cấp nhiều phương thức để định dạng ngày và giờ, bao gồm toFormattedDateString, diffForHumans, và nhiều hơn nữa.

<p>Created at: {{ $post->created_at->toFormattedDateString() }}</p>
<p>Created at: {{ $post->created_at->diffForHumans() }}</p>
<p>Created at: {{ $post->created_at->format('l, d F Y H:i') }}</p>

Bạn có thể tạo một custom Blade directive để định dạng ngày và giờ một cách nhất quán.

Tạo Custom Blade Directive

Trong AppServiceProvider, bạn có thể đăng ký một custom Blade directive.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
use Carbon\Carbon;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Blade::directive('datetime', function ($expression) {
            return "<?php echo ($expression)->format('d/m/Y H:i'); ?>";
        });
    }

    public function register()
    {
        //
    }
}

Sử Dụng Custom Blade Directive

<!-- resources/views/show.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Show Date</title>
</head>
<body>
    <h1>Show Date</h1>
    
    <p>Created at: @datetime($post->created_at)</p>
</body>
</html>

5. Route::view()

Trong Laravel, phương thức Route::view cung cấp một cách tiện lợi để định nghĩa các tuyến đường (route) mà không cần một controller. Nó rất hữu ích cho các trang tĩnh hoặc các trang có ít logic.

Cú Pháp Route::view

Cú pháp cơ bản của Route::view như sau:

Route::view($uri, $view, $data = []);
  • $uri: URL của tuyến đường.
  • $view: Tên của view sẽ được trả về.
  • $data: (Tùy chọn) Mảng dữ liệu sẽ được truyền tới view.

Ví Dụ

Dưới đây là một số ví dụ về cách sử dụng Route::view trong tệp routes/web.php.

1. Định Nghĩa Một Tuyến Đường Đơn Giản

Giả sử bạn có một view tĩnh tên là welcome.blade.php trong thư mục resources/views.

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

Khi người dùng truy cập vào URL /welcome, họ sẽ thấy nội dung của view welcome.blade.php.

2. Truyền Dữ Liệu Tới View

Bạn cũng có thể truyền dữ liệu tới view bằng cách sử dụng tham số thứ ba của Route::view.

Route::view('/about', 'about', ['name' => 'Laravel']);

Trong view about.blade.php, bạn có thể truy cập dữ liệu này như sau:

<!-- resources/views/about.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>About</title>
</head>
<body>
    <h1>About</h1>
    <p>This application is built with {{ $name }}.</p>
</body>
</html>

6. Blade Error Pages

Laravel cung cấp các trang lỗi mặc định cho các mã lỗi HTTP khác nhau, chẳng hạn như 404 (Not Found), 500 (Internal Server Error), v.v. Tuy nhiên, bạn có thể tùy chỉnh các trang lỗi này để phù hợp với giao diện và trải nghiệm người dùng của ứng dụng của mình.

Để tùy chỉnh các trang lỗi, Laravel cung cấp một cách dễ dàng để xuất bản các file view lỗi mặc định vào thư mục views của bạn bằng lệnh php artisan vendor:publish.

Bước 1: Xuất Bản Các Trang Lỗi

Bạn có thể sử dụng lệnh php artisan vendor:publish --tag=laravel-errors để xuất bản các trang lỗi mặc định vào thư mục resources/views/errors của dự án của bạn.

Lệnh

php artisan vendor:publish --tag=laravel-errors

Lệnh này sẽ tạo các file view lỗi trong thư mục resources/views/errors của dự án của bạn.

Bước 2: Tùy Chỉnh Các Trang Lỗi

Sau khi các file view lỗi đã được xuất bản, bạn có thể tùy chỉnh chúng theo ý muốn của mình. Mỗi file đại diện cho một mã lỗi HTTP cụ thể. Ví dụ, bạn sẽ có các file như 404.blade.php, 500.blade.php, v.v.

Ví Dụ Tùy Chỉnh Trang 404

<!-- resources/views/errors/404.blade.php -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Page Not Found</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            padding: 50px;
        }
        h1 {
            font-size: 50px;
        }
        p {
            font-size: 20px;
        }
        a {
            color: #3490dc;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <h1>404</h1>
    <p>Sorry, the page you are looking for could not be found.</p>
    <p><a href="{{ url('/') }}">Go to Homepage</a></p>
</body>
</html>

Bước 3: Kiểm Tra Các Trang Lỗi

Sau khi tùy chỉnh các trang lỗi, bạn có thể kiểm tra chúng bằng cách truy cập vào các URL không tồn tại hoặc gây ra các lỗi khác nhau trong ứng dụng của bạn. Ví dụ, truy cập một URL không tồn tại để kiểm tra trang 404.

Tóm Tắt

  • Xuất bản các trang lỗi: Sử dụng lệnh php artisan vendor:publish --tag=laravel-errors để xuất bản các file view lỗi mặc định.
  • Tùy chỉnh các trang lỗi: Chỉnh sửa các file trong resources/views/errors để phù hợp với giao diện của ứng dụng của bạn.
  • Kiểm tra các trang lỗi: Truy cập các URL không tồn tại hoặc gây ra các lỗi khác để xem các trang lỗi tùy chỉnh của bạn.

Việc tùy chỉnh các trang lỗi giúp bạn tạo ra một trải nghiệm người dùng nhất quán và chuyên nghiệp hơn, ngay cả khi có lỗi xảy ra trong ứng dụng của bạn.

7. Artisan view:clear

Trong Laravel, lệnh Artisan view:clear được sử dụng để xóa bộ nhớ cache của các file view đã được biên dịch. Đây là một lệnh hữu ích khi bạn thực hiện các thay đổi trong view và muốn chắc chắn rằng ứng dụng của bạn sẽ sử dụng các file view mới nhất mà không bị ảnh hưởng bởi các phiên bản đã được cache.

Cách Sử Dụng view:clear

Lệnh

Bạn có thể chạy lệnh này từ terminal bằng cách sử dụng:

php artisan view:clear

Kết Quả

Lệnh này sẽ xóa tất cả các file view đã được biên dịch và lưu trữ trong thư mục storage/framework/views. Sau khi lệnh được thực thi, Laravel sẽ biên dịch lại các file view khi chúng được yêu cầu lần tiếp theo.

Khi Nào Nên Sử Dụng view:clear

  • Khi Phát Triển: Nếu bạn thấy rằng các thay đổi bạn thực hiện trong view không được áp dụng, bạn có thể chạy lệnh này để xóa bộ nhớ cache và đảm bảo rằng các thay đổi sẽ được nhìn thấy.
  • Khi Triển Khai: Sau khi triển khai ứng dụng lên môi trường production, bạn có thể chạy lệnh này để xóa bộ nhớ cache cũ và buộc Laravel biên dịch lại các view với các thay đổi mới nhất.

8. Asset() helper

Trong Laravel, helper asset() được sử dụng để tạo URL tuyệt đối tới các tài nguyên công cộng (public assets) như hình ảnh, CSS, JavaScript, v.v. Helper này rất hữu ích để đảm bảo rằng các đường dẫn tới tài nguyên của bạn luôn chính xác, bất kể ứng dụng của bạn đang chạy trên môi trường nào.

asset($path, $secure = null)
  • $path: Đường dẫn tới tài nguyên tính từ thư mục public.
  • $secure: Tham số tùy chọn, nếu đặt là true, URL sẽ được tạo với HTTPS. Nếu không, HTTP sẽ được sử dụng.

9. Meta Title

Meta title là một phần quan trọng trong SEO và trải nghiệm người dùng, hiển thị tiêu đề của trang web trên trình duyệt và trong kết quả tìm kiếm. Trong Laravel Blade, bạn có thể dễ dàng thiết lập và tùy chỉnh meta title cho các trang web của mình.

Cách Thiết Lập Meta Title

Để thiết lập meta title trong Laravel Blade, bạn có thể sử dụng thẻ <title> trong phần <head> của HTML.

Sử Dụng @section và @yield

Nếu bạn sử dụng layout trong Laravel Blade, bạn có thể thiết lập meta title bằng cách sử dụng @section@yield.

Layout (layouts/app.blade.php)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
</head>
<body>
    <header>
        <h1>My Website</h1>
    </header>

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

View (home.blade.php)

@extends('layouts.app')

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

@section('content')
    <h2>Welcome to the Home Page</h2>
    <p>This is the home page of the website.</p>
@endsection

Sử Dụng @push và @stack

Một cách khác để thiết lập meta title là sử dụng @push@stack.

Layout (layouts/app.blade.php)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>@stack('title')</title>
</head>
<body>
    <header>
        <h1>My Website</h1>
    </header>

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

View (home.blade.php)

@extends('layouts.app')

@push('title')
    Home Page
@endpush

@section('content')
    <h2>Welcome to the Home Page</h2>
    <p>This is the home page of the website.</p>
@endsection
Hiển thị giá trị trong Blade

Hiển thị giá trị trong Blade

01.08.2024
Author: ADMIN

# Hiển Thị Biến Trong Blade

Trong Laravel Blade, việc hiển thị biến rất đơn giản và trực quan. Blade cung cấp cú pháp dễ đọc và sử dụng để nhúng các biến PHP vào trong HTML.

Cú Pháp Cơ Bản

Sử Dụng Cặp Dấu Ngoặc Nhanh {{ }}

Để hiển thị giá trị của một biến trong Blade, bạn chỉ cần sử dụng cặp dấu ngoặc nhanh {{ }}.

Ví Dụ

Giả sử bạn có một biến $name được truyền từ controller đến view:

public function show()
{
    $name = 'John Doe';
    return view('greeting', compact('name'));
}

Trong file view greeting.blade.php, bạn có thể hiển thị giá trị của biến $name như sau:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Greeting Page</title>
</head>
<body>
    <h1>Hello, {{ $name }}!</h1>
</body>
</html>

Escape HTML Đầu Vào

Khi sử dụng cặp dấu ngoặc nhanh {{ }}, Blade sẽ tự động escape (chuyển đổi các ký tự đặc biệt thành các thực thể HTML) để bảo vệ chống lại các cuộc tấn công XSS.

Ví Dụ

<?php $name = '<script>alert("XSS")</script>'; ?>

<h1>Hello, {{ $name }}!</h1>

Kết quả hiển thị sẽ là:

<h1>Hello, &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt;!</h1>

Hiển Thị Biến Mà Không Escape HTML

Nếu bạn muốn hiển thị giá trị của biến mà không escape HTML, bạn có thể sử dụng cú pháp {!! !!}.

<?php $name = '<strong>John Doe</strong>'; ?>

<h1>Hello, {!! $name !!}!</h1>

Kết quả hiển thị sẽ là:

<h1>Hello, <strong>John Doe</strong>!</h1>

Hiển Thị Các Giá Trị Mặc Định

Bạn có thể hiển thị các giá trị mặc định khi biến không tồn tại hoặc rỗng bằng cách sử dụng toán tử null coalescing ??.

Ví Dụ

<h1>Hello, {{ $name ?? 'Guest' }}!</h1>

Nếu biến $name không tồn tại hoặc có giá trị là null, chuỗi 'Guest' sẽ được hiển thị.

Hiển Thị Mảng và Đối Tượng

Bạn có thể truy cập và hiển thị các phần tử của mảng hoặc thuộc tính của đối tượng một cách dễ dàng.

Ví Dụ Mảng

<?php $user = ['name' => 'John Doe', 'email' => 'john@example.com']; ?>

<h1>Name: {{ $user['name'] }}</h1>
<p>Email: {{ $user['email'] }}</p>

Ví Dụ Đối Tượng

<?php $user = (object) ['name' => 'John Doe', 'email' => 'john@example.com']; ?>

<h1>Name: {{ $user->name }}</h1>
<p>Email: {{ $user->email }}</p>

Tóm Tắt

  • Cú pháp cơ bản: Sử dụng {{ $variable }} để hiển thị giá trị của biến và tự động escape HTML.
  • Không escape HTML: Sử dụng {!! $variable !!} để hiển thị giá trị của biến mà không escape HTML.
  • Giá trị mặc định: Sử dụng {{ $variable ?? 'default' }} để hiển thị giá trị mặc định khi biến không tồn tại hoặc rỗng.
  • Mảng và đối tượng: Truy cập và hiển thị các phần tử của mảng hoặc thuộc tính của đối tượng bằng cú pháp {{ $array['key'] }}{{ $object->property }}.

Việc sử dụng các cú pháp này giúp bạn dễ dàng và an toàn khi hiển thị dữ liệu trong các view Blade của Laravel.