07/09/2018, 08:33

Tìm hiểu Laravel từ số 0 (P7)

Tiếp nối phần 6 đã nói về Form validation, Formrequest, Error message, Scope và View Partial, trong phần 7 này tôi sẽ tiếp tục đề cập một số vấn đề sau : Helper Flash message Named route Restful resource controller Lần này tôi sẽ thêm vào chức năng xoá article và thông qua đó cũng sẽ ...

Tiếp nối phần 6 đã nói về Form validation, Formrequest, Error message, Scope và View Partial, trong phần 7 này tôi sẽ tiếp tục đề cập một số vấn đề sau :

  • Helper
  • Flash message
  • Named route
  • Restful resource controller

Lần này tôi sẽ thêm vào chức năng xoá article và thông qua đó cũng sẽ có nói luôn về Helper. Cái đầu tiên là cần thêm vào những route sau với phương thức delete trog routes.php

Route::delete('articles/{id}', 'ArticlesController@destroy');

Kế đến sẽ đi thêm vào Controller phương thức destroy với nội dung nhận vào tham số $id vừa khai báo trong route.

// app/Http/Controllers/ArticlesController.php
    public function destroy($id) {
        $article = Article::findOrFail($id);
        $article->delete();
        return redirect('articles');
    }

Để gọi được phương thức xoá ta cần đặt nút xoá trên View, tôi ở đây sẽ dùng phương thức DELETE của Form.

// resoruces/views/articles/show.blade.php 
@extends('layout')
@section('content')
    // Giản lược code ở đây
    {!! Form::open(['method' => 'DELETE', 'url' => ['articles', $article->id]]) !!}
        {!! Form::submit('Delete', ['class' => 'btn btn-danger']) !!}
    {!! Form::close() !!}
@stop

Đến đây tôi muốn đề cập đến khái niệm HELPER, mục đích dùng nó là sẽ refactor chia lại phần tạo Form mà dùng phương thức DELETE ở trên. Tôi sẽ thêm file helper.php với nội dung chưa một hàm là delete_form sinh ra thẻ Form rồi trả về.

<?php
// app/Http/helper.php
function delete_form($urlParams, $label = 'Delete')
{
    $form = Form::open(['method' => 'DELETE', 'url' => $urlParams]);
    $form .= Form::submit($label, ['class' => 'btn btn-danger']);
    $form .= Form::close();
 
    return $form;
}

Để có hiệu lực tôi sẽ cần chỉnh file composer.json để Laravel thực hiện Autoload helper.php.

{
    ...
    "autoload": {
        "classmap": [
            "database"
        ],
        "psr-4": {
            "App": "app/"
        },
        "files": ["app/Http/helper.php"]    <-- thêm đoạn này
    },
    ...
}

Nhưng sau đó phải thực hiện command dưới đây thì việc autoload mới thực sự được thiết lập :

composer dump-autoload

Lại tiếp tục chỉnh show.blade.php. Thay vì đoạn code tạo Form được nhét vào Blade thì ta chỉ cần 1 dòng ngắn ngọn là code đã sáng sủa hơn rất nhiều. Ngoài ra thì bằng việc đưa ra Helper, bất kì chỗ nào cần Delete thì bạn đều đã có thể tái sử dụng được rồi. Cool !

// resoruces/views/articles/show.blade.php
@extends('layout')
@section('content')
    // Giản lược code ở đây
     {!! delete_form(['articles', $article->id]) !!} 
@stop

Xong phần xoá, bạn hãy thử chạy xem. Kết quả bạn sẽ được chuyển về trang list nhưng chẳng hề có thông báo nào được hiển thị ra, như thế đối với code normal thì bạn thấy thiếu thiếu mất messageđể cho user biết xử lý là có thành công hay không. Giờ tiếp theo tôi sẽ đi đến dùng Flash message để làm việc này.

Đầu tiên sẽ phải sửa phương thức destroy của ArticlesController.php một chút :

// app/Http/Controllers/ArticlesController.php 
    ...
    public function destroy($id) {
        $article = Article::findOrFail($id);
 
        $article->delete();
        Session::flash('flash_message', 'Deleted article successfully.');  // dòng thêm vào 
        return redirect('articles');
    }
    ...

Ở đây tôi dùng đến facade là Session để access vào session và bằng phương thức flash tôi thêm vào nội dung báo ra màn hình. Khái niệm Flash mang ý nghĩa nó chỉ có hiệu lực một thời điểm nhất thời và chỉ có hiệu lực với request tiếp sau.

Đương nhiên cần đến View thì dòng thông báo đó mới có thể ra đến màn hình cho user, tôi sẽ đi sửa Layout. Đơn giản chỉ cần thêm vào code check xem trong Session có key nào tên là flash_messgae thì sẽ hiển thị nó ra. Dùng thêm class của Boostrap sẽ làm cho message có sắc hơn             </div>
            
            <div class=

0