Cara Menggunakan Enum Di Laravel Routing - CRUDPRO

Cara Menggunakan Enum Di Laravel Routing

Cara Menggunakan Enum Di Laravel Routing

Hello Guys. Hari ini saya telah mempersiapkan artikel singkat mengenai langkah menggunakan Enum di Laravel Routing.

Pertama saya dapat mereferensikan Anda membaca catatan singkat mengenai itu di dokumentasi.

namespace App\Enums;

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}
use App\Enums\Category;
use Illuminate\Support\Facades\Route;

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

Ini langkah yang buruk karena pengembang professional tidak menulis logika pengontrol di file rute.

Bagaimana cara menerapkan enum pada pengontrol?

Pada awalnya, saya dapat merekomendasikan untuk memeriksa repositori saya dan mencoba memahami code dan logika bisnis ini. Semua perubahan yang dicatat di bawah ini dilakukan di sini.

Aplikasi kami mempunyai jenis laporan yang beda. Sepanjang Peninjauan Code, seseorang memberi komentar code saya "Kenapa Anda mengganti jenis laporan jadi enum?" Merupakan ide baik untuk membuat artikel mengenai itu.

Code sebelum perubahan:

public function generateReportListOfEmployees(
    int $departmentId,
    string $reportType,
    DepartmentReportService $departmentReportService
): JsonResponse {
    $reportData = $departmentReportService->generateReport($departmentId, $reportType);
    return new JsonResponse($reportData, Response::HTTP_CREATED);
}

Mari buat kelas enum ReportType:


?php
namespace App\Enums;

enum ReportType: string
{
    case LIST = 'list';
    case SALARY = 'salary';
    case ROLE = 'role';
}

Saya ingin menggunakan enum dengan cara ini:

public function generateReportListOfEmployees(
    int $departmentId,
    ReportType $reportType,
    DepartmentReportService $departmentReportService
): JsonResponse {
    $reportData = $departmentReportService->generateReport($departmentId, $reportType);
    return new JsonResponse($reportData, Response::HTTP_CREATED);
}

Itu tidak bekerja.

Expected response status code [400] but received 500.
Failed asserting that 400 is identical to 500.

The following exception occurred during the last request:

Illuminate\Contracts\Container\BindingResolutionException: Target [App\Enums\ReportType] is not instantiable.

Hei, Taylor Otwell Jika Anda membacanya, di Laravel versi selanjutnya. Saya ingin Pengontrol harus memberikan dukungan type enum :)

Saya harus menggunakannya dengan cara lain:

public function generateReportListOfEmployees(
    int $departmentId,
    string $reportType,
    DepartmentReportService $departmentReportService
): JsonResponse {
    $reportType = ReportType::tryFrom($reportType);
    if (!$reportType) {
        return new JsonResponse(['message' => "Report Type not found"], Response::HTTP_BAD_REQUEST);
    }
    $reportData = $departmentReportService->generateReport($departmentId, $reportType);
    return new JsonResponse($reportData, Response::HTTP_CREATED);
}

Saya mencoba menimpa nilai $reportType dari faktor param sistem ini. Jika nilai Report Tipe ialah null, maka kembalikan tanggapan Report not found. , saya menulis test untuk situasi ini:

public function testDepartmentReportTypeNotFoundSuccess(): void
{
    $department = Department::factory()->create();


    Employee::factory(2)->create(
        [
            'department_id' => $department->id
        ]
    );

    $type = 'blabla';

    $response = $this->post("/api/departments/report/{$department->id}/{$type}");

    $response->assertStatus(Response::HTTP_BAD_REQUEST);

    $response->assertJsonFragment(
        [
            'message' => "Report Type not found"
        ]
    );
}

Semoga artikel ini dapat bermanfaat untuk anda. Terima kasih :)