Controller Anda Melakukan Terlalu Banyak Kerja

Buka controller anda. Lihat kaedah store anda.

Adakah ia mempunyai 40 baris kod? Adakah ia bermula dengan blok pengesahan (validation) yang besar, diikuti dengan beberapa pernyataan if, kemudian logik perniagaan, dan akhirnya satu return?

Controller anda melakukan kerja yang bukan tugasnya.

Satu controller mempunyai satu peranan mudah. Ia menerima permintaan (request), memanggil servis untuk menyelesaikan masalah, dan mengembalikan respons. Anggaplah ia seperti seorang pelayan. Seorang pelayan menghantar makanan anda. Mereka tidak memasaknya.

Apabila anda meletakkan pengesahan, autorisasi, dan pemprosesan data di dalam controller, ia akan menjadi kucar-kacir. Anda akhirnya akan mendapat 'raksasa' 80 baris yang tidak mahu disentuh oleh sesiapa pun.

Laravel mempunyai penyelesaian terbina dalam: Form Requests.

Berhenti mengulang logik pengesahan dan autorisasi dalam setiap kaedah. Gunakan Single Responsibility Principle. Sebuah kelas sepatutnya hanya mempunyai satu sebab untuk berubah. Controller berubah apabila aliran permintaan berubah. Ia tidak sepatutnya berubah hanya kerana peraturan pengesahan berubah.

Jalankan arahan ini untuk mencipta kelas permintaan khusus: php artisan make:request StorePostRequest

Pindahkan logik anda ke dalam kelas baharu ini. Form Request mengendalikan tiga perkara utama:

• Authorization: Gunakan kaedah authorize untuk menentukan sama ada pengguna boleh melakukan sesuatu tindakan. Jika ia mengembalikan false, Laravel akan menghantar ralat 403 secara automatik.

• Validation: Gunakan kaedah rules untuk menentukan keperluan data anda.

• Data Preparation: Gunakan prepareForValidation untuk membersihkan atau mengubah data sebelum pengesahan dijalankan. Ini sangat sesuai untuk menjana slug atau menormalkan nombor telefon.

Sebaik sahaja anda memindahkan logik ini, controller anda akan mengecil. Ia mungkin kelihatan seperti ini:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

Itu sahaja. Dua baris.

Controller kekal ringkas kerana Laravel menjalankan pengesahan dan autorisasi sebelum kaedah tersebut bermula. Jika data salah, pengguna akan mendapat ralat dengan serta-merta.

Satu pesanan peringatan. Jangan gunakan Form Requests untuk segalanya. Jika anda mempunyai laluan (route) kecil dengan satu medan ringkas, kekalkan pengesahan secara inline. Gunakan Form Requests apabila logik semakin berkembang, berulang, atau melibatkan kebenaran (permissions).

Selain itu, jangan letakkan logik perniagaan di dalam Form Request. Pengiraan dan kemas kini pangkalan data sepatutnya berada dalam lapisan Service.

Cari controller anda yang paling kucar-kacir hari ini. Ekstrak pengesahan ke dalam Form Request. Lihat ia mengecil.

Apakah kaedah store terbesar yang pernah anda lihat? Beritahu saya di ruangan komen.

Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o