Những Tips & Tricks cần biết cho Laravel Sernior

Laravel là một open-source PHP được thiết kế để giúp phát triển các ứng dụng web dễ dàng hơn và nhanh hơn thông qua các tính năng được tích hợp sẵn.

Trong bài viết này chúng ta sẽ tìm hiểu các tip và trict phổ biến hay dùng trong các dự án thực tế mà các senior cần phải biết.

Tip 1. Single Action Controllers (Một controller chi viết 1 action)

Nếu bạn muốn tạo một controller chỉ chứa 1 action duy nhất thì bạn có thể sử dụng phương thức __invoke() và thâm chí bạn có thể tạo "invokable" controller.

namespace App\Http\Controllers;
use App\Post;
use App\Http\Controllers\Controller;
class GetPostController extends Controller
{
  public function __invoke($id)
  {
     return view('post', ['post' =>   Post::findOrFail($id)]);
  }
}

Routes:

Route::get('user/{id}', 'ShowProfile');

Artisan command tạo tự động controller:

php artisan make:controller GetPostController --invokable

Tip 2. Unsigned Integer

Khi set foreign key trong migrations thay vì sử dụng integer() thì nên để  unsignedInteger() hoặc nteger()->unsigned() nếu không thì bạn có thể gặp lỗi SQL.

Schema::create('posts',  function (Blueprint $table) {

              $table->unsignedInteger('user_id');

              $table->foreign('user_id')->references('id')->on('users');

              // ...

});

Bạn cũng có thể sử dụng unsignedBigInteger() nếu kiểu dữ liệu tương ứng là bigInteger()

Tip 5. Raw DB Queries: havingRaw()

Bạn có thể sử dụng truy vấn RAW DB nhiều nới khác nhau thông qua hàmhavingRaw() sau groupBy()

Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();

Tip 7. Eloquent where date methods

Trong Eloquent check điều kiện cùng các functions whereDay()whereMonth()whereYear(), whereDate() and whereTime().

$products = Product::whereDate('created_at', '2021-01-31')->get();

$products = Product::whereMonth('created_at', '14')->get();

$products = Product::whereDay('created_at', '21')->get();

$products = Product::whereYear('created_at', date('Y'))->get();

$products = Product::whereTime('created_at', '=', '17:14:58')->get();

Tip 8. Route group within a group

Trong Routes bạn có thể đặt group route trong group và chỉ định cho nó 1 midleware cho group đó

Route::group(['prefix' => 'account', 'as' => 'account.'], function() {

Route::get('login', 'AccountController@login');

Route::get('register', 'AccountController@register');

Route::group(['middleware' => 'auth'], function() {

Route::get('edit', 'AccountController@edit');

});

});

Tip 9. Increments and decrements

Nếu bạn có thể auto tăng 1 hay nhiều giá trị số nào đó trong cột khi bạn có thể dùng increment hoặc decrements cùng với hàm find như hình dưới

Post::find($post_id)->increment('post_views');

User::find($user_id)->increment('views', 20);

Tip 10. Does view file exist? (Kiểm tra file view có tồn tại hay không)

Bạn có thể có tồn tại view hay không trước khi load nó ra

if (view()->exists('news.page')) {

// Load the view

}

Tip 11. No timestamp columns

Nếu table của bạn không chứa 2 trường timestamp created_at and updated_at, thì bạn xác định rõ trong Eloquent model không sử dụng chúng.

class Post extends Model

{

public $timestamps = false;

}

Tip 13. Eloquent has() deeper

Bạn có thể dùng hàm Eloquent has() để truy vấn đến nhiều cấp

// Author -> hasMany(Book::class);

// Book -> hasMany(Rating::class);

$authors = Author::has('books.ratings')->get();

Tip 14. Database migrations column types ( Kiểu dữ liệu đặc biệt trong migration )

$table->geometry('positions');

$table->ipAddress('visitor');

$table->macAddress('device');

$table->point('position');

$table->uuid('id');

Link tham khảo: https://laravel.com/docs/master/migrations#creating-columns

Tip 16. Default Timestamp

Tạo giá trị mặc định của Timestamp

$table->timestamp('created_at')->useCurrent();

$table->timestamp('updated_at')->useCurrent();

Tip 18. Soft-deletes: multiple restore

Khi đang sử dụng soft-deletes, Bạn có thể restore multiple rows trên 1 câu lệnh.

Post::withTrashed()->where('author_id', 1)->restore();