Các Laravel route tips giúp bạn cải thiện routing

3652

Laravel router có một bộ API rất hữu dụng và hoàn thiện dành cho bạn khi mới bước chân vào Laravel. Những tip dưới đây không phải là quá mới hay bí ẩn, nhưng sẽ giúp ích rất nhiều khi bạn học Laravel 5.

Custom Namespaces

Như đã nói, nếu bạn muốn một nhóm routes sử dụng một namespace như AppHttpControllersAdmin, bạn có thể xác định namespace bằng cách dùng fluent routing API có trong Laravel 5.4:

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

Đây chính là cách sử dụng trong RouteServiceProvider tìm thấy trong mỗi Laravel project:

protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

Do file routes/web.php có namespace, Admin namespace cũng chỉ là tương đối.

Bạn có thể chạy console command sau để tạo các controller trên AppHttpControllersAdmin:

php artisan make:controller -r Admin/UsersController

Trong ví dụ routing trước, definition của chúng ta trong file routes/web.php trông thế này:

Route::namespace('Admin')
    ->prefix('admin')
    ->group(function () {
        Route::resource('users', 'UsersController');
    });

Route Macros

Router là macroable (Giải thích sơ qua: nó cho phép chúng ta thêm một phương thức hay có thể gọi là một macro, vào một class có sẵn. ), nghĩa là nếu bạn có một nhóm routes mà bạn muốn cung cấp thông qua một package hoặc các nhóm route được cấu hình sẵn có thể tái sử dụng, bạn có thể define một macro trên một service provider.

Ví dụ, bạn có các shopping route cho một shop thương mại điện tử mà bạn đóng nó thành một package, và cho phép user override hoặc customize vài thành phần của routes:

// Inside a service provider boot()

public function boot()
{
    Route::macro('shopRoutes', function ($prefix) {
        Route::group([
            'prefix' => $prefix,
            'middleware' => ['shopping'],
        ], function () {
            Route::get('products/{product}', 'ProductsController@show');
            // ...
        });
    });
}

Sau đó khách hàng có thể call macro trong app Laravel mới bên trong routes/web.php:

collect(config('languages'))->each(function ($language) {
    Route::shopRoutes($language);
});

Hoặc một implemention khác tương tự vậy:

Route::macro('shopRoutes', function ($languages) {
    Route::group([
        'prefix' => '/{language}',
        'middleware' => ['shopping'],
        'where' => ['language' => implode('|', $languages)],
    ], function () {
        Route::get('products/{product}', 'ProductsController@show');
        // ...
    });
});

Các ví dụ về macro rất đa dạng, nhưng bạn chỉ cần nắm cái ý tưởng là được. Tôi đề xuất rằng bạn chỉ nên sử dụng route macro nếu bạn gặp trường hợp như trên. Bạn sẽ biết khi nào là cần thiết!

Debug Routes

Nếu bạn đang tìm mọi cách để find route hoặc debug tất cả các route, command artisan route:list rất hữu ích:

artisan route:list
+--------+----------+----------+------+---------+--------------+
| Domain | Method   | URI      | Name | Action  | Middleware   |
+--------+----------+----------+------+---------+--------------+
|        | GET|HEAD | /        |      | Closure | web          |
|        | GET|HEAD | api/user |      | Closure | api,auth:api |
+--------+----------+----------+------+---------+--------------+

Command route:list giúp ích trong việc đọc tên route và các middleware đi kèm. Ngay sau đây là tip để đặt tên routes.

Đặt tên các Group Routes

Một quy tắc phổ biến trong Laravel đó là đặt tên route, cho phép bạn dễ dàng tham khảo tên route và tránh phức tạp hóa việc code các URI liên quan đến root trong các template của bạn. Trong một số app thì các URI khó code vẫn chấp nhận được, còn một số trường hợp khác, các route được đặt tên sẽ cho phép những cái như sau:

{{ route('admin.users.show', ['user' => $user]) }}
{{-- /admin/users/2 --}}

Khi bạn đang xác định một nhóm route, ví dụ như về admin, bạn cũng có thể gán một tiền tố (prefix) cho tên của route trong nhóm như sau:

Route::namespace('Admin')
    ->prefix('admin')
    ->name('admin.')
    ->group(function () {
        Route::resource('users', 'UsersController');
    });

Tên được gán tiền tố như trên sẽ tạo ra các tên route cho resource controller users như dưới đây:

  • admin.users.index
  • admin.users.store
  • admin.users.create
  • admin.users.show
  • admin.users.update
  • admin.users.destroy
  • admin.users.edit

Tham khảo thêm

Xem đầy đủ tài liệu routeresource controller section. Còn rất nhiều các hướng dẫn thực hiện ứng dụng thực tế dựa trên Laravel tại đây nhé. Hiện tại các việc làm IT lương cao liên quan đến Laravel cũng được các doanh nghiệp tuyển dụng rất nhiều.

  Laravel 5.6 đã lên sóng, và đây là những điểm mới nổi bật nhất!

TopDev via Laravel News