Ini Dia 20 Tips Mudah Laravel Yang Sangat Berguna - CRUDPRO

Ini Dia 20 Tips Mudah Laravel Yang Sangat Berguna

Ini Dia 20 Tips Mudah Laravel Yang Sangat Berguna

1. Menggunakan Bidang DATETIME Alih-alih Boolean

Di program Laravel Anda, terkadang Anda bisa menggunakan kolom DATETIME alih-alih boolean.

Misalkan, jika kita memiliki model Posting, bukannya mempunyai bidang boolean is_published, Anda bisa menggunakan bidang DATETIME namanya publish_at. Dengan menggunakan pendekatan ini, Anda masih bisa mengecek apa satu bidang diterbitkan (menggunakan sistem atau pengakses) dan memperoleh info tambahan untuk menyaksikan secara tepat kapan kiriman diterbitkan.

Anda kemungkinan membutuhkan tanggal yang pas di program Anda saat ini, tapi itu kemungkinan suatu hal yang hendak bermanfaat di fitur kedepan (seperti laporan).

Misalkan, kita bisa mengupdate model Post supaya kelihatan semacam ini:

class Post extends Model

{

    public function isPublished(): bool

    {

        return $this->published_at !== null;

    }

}

Ini memiliki arti jika kita saat ini bisa menggunakan $post->isPublished() untuk memperoleh nilai boolean. Dan, kita bisa menggunakan $post->published_at untuk memperoleh tanggal dan waktu publikasi posting itu.

Kerangka kerja Laravel sendiri sebetulnya memakai jenis pendekatan ini untuk hapus mode secara smooth and tuning bidang delete_at saat mode dihapus secara smooth.

2. Penamaan Kolom Tanggal dan Waktu

Akan berguna untuk menggunakan konvensi penamaan "action_at" untuk bidang DATETIME dan TIMESTAMP Anda. Ini membantu Anda mengenali secara instan jika bidang yang sedang Anda kerjakan adalah bidang waktu-waktu (dan kemungkinan contoh Karbon jika Anda telah mentransmisikannya).

Misalnya, alih-alih menggunakan bidang seperti:

  • publish_time
  • verified date
  • password_reset

Akan lebih bermanfaat untuk mengganti namanya menjadi:

  • publish_at
  • verified at
  • password reset at

3. Menggunakan Urutan Matriks di Pabrik

Anda dapat menggunakan MatrixSequence di pabrik model Anda untuk membuat data tambahan untuk pengujian Anda:

Misalnya, Anda dapat menjalankan kode berikut:

User::factory(4)

    ->state(

        new MatrixSequence(

            [['first_name' => 'John', 'last_name' => 'Jane']],

            [['first_name' => 'Alice', 'last_name' => 'Bob']],

        ),

    )

    ->create();

Menjalankan kode di atas dapat membuat 4 model Pengguna dengan bidang-bidang berikut:

  1. first_name: John, last_name: Alice
  2. first_name: John, last_name: Bob
  3. first_name: Jane, last_name: Alice
  4. first_name: Jane, last_name: Bob

4. Menggunakan 'kapan' di PendingRequest

Anda bisa menggunakan metode when pada kelas PendingRequest saat membuat permintaan menggunakan fasad Http.

Misalkan, katakanlah Anda memiliki kode berikut:

$http = Http::withBasicAuth($username, $password);

 

if (app()->environment('local')) {

    $http->withoutVerifying();

}

Jika Anda lebih suka menyimpan logic permintaan Anda dalam satu package dan tidak dipisahkan menggunakan pernyataan if, Anda dapat menulis ulang menggunakan when seperti ini:

$http = Http::withBasicAuth($username, $password)

    ->when(app()->environment('local'), function (PendingRequest $request) {

        $request->withoutVerifying();

    });

Tidak ada jawaban salah atau benar dengan menggunakan salah satunya dari pendekatan ini dan semua tergantung pada opsi pribadi mengenai bagaimana Anda lebih menyukai menulis kode Anda.

5. Menggunakan Instruksi Blade yang 'dicentang' dan 'dipilih'

Saat Anda membuat formulir di Blade, kemungkinan ada saatnya Anda ingin mencentang kotak saat berisi halaman atau pilihan yang dipilih dalam komponen tentukan. Untuk lakukan ini, Anda bisa menggunakan instruksi Blade @checked dan @selected.

Misalkan, jika kita ingin pilih kotak contreng bila pengguna aktif, kita bisa menggunakan pendekatan berikut ini:

<input type="checkbox"

        name="active"

        value="active"

        @checked($user->active) />

Demikian pula, kita juga bisa menggunakan pendekatan yang sama ini jika kita ingin memilih opsi dalam elemen pilih menggunakan direktif @selected:

<select name="version">

    @foreach ($product->versions as $version)

        <option value="{{ $version }}" @selected(old('version') == $version)>

            {{ $version }}

        </option>

    @endforeach

</select>

6. Menggunakan 'Mockery::on()' dalam pengujian PHPUnit

Saat menulis pengujian Anda di Laravel dan PHP, Anda kemungkinan ingin mengikuti kelas (seperti layanan atau tindakan). Dengan mock a class, Anda bisa menegaskan jika itu disebutkan sama seperti yang diharap dengan argumen yang tepat tapi tanpa menjalankan kode didalamnya. Ini dapat benar-benar bermanfaat untuk dilaksanakan saat mengetes controller Anda.

Kadang, Anda kemungkinan ingin membuat pengujian Anda sedikit ketat dan memperjelas jika model atau objek tertentu dilanjutkan ke metode. Untuk lakukan ini, Anda bisa Mockery::on().

Sebagai contoh dasar, silahkan kita mengambil controller ini. Sistem controller menyelesaikan perlakuan PublishPost, dengan tindakan yang menerima model Post. Kami selanjutnya kembalikan respons JSON sederhana.

app/Http/Controllers/PublishPostController

use App\Actions\PublishPost;

use App\Models\Post;

 

class PublishPostController extends Controller

{

    public function __invoke(Post $post, PublishPost $action): Response

    {

        $action->execute($post);

 

        return response()->json([

            'success' => true,

        ]);

    }

}

Dalam pengujian kami, kami bisa arrange our imitation saat sebelum kami melakukan panggilan HTTP kami. Dalam harapan tiruan, kita bisa mengatakan jika kita mengharapkan sistem eksekusi diundang sekali dan melalui model Post yang kita tentukan.

Jika persyaratan ini terpenuhi, pernyataan akan lolos dan kita akan tahu jika tindakan itu disebutkan sama seperti yang kita harap. Jika tidak, jika persyaratan tidak tercukupi, test akan gagal.

Maka pengetesan kami bisa terlihat semacam ini:

tests/Feature/PublishPostControllerTest

use App\Actions\PublishPost;

use App\Models\Post;

use Mockery;

use Mockery\MockInterface;

use Tests\TestCase;

 

class PublishPostControllerTest extends TestCase

{

    /** @test  */

    public function post_can_be_deleted(): void

    {

        $post = Post::factory()->create();

 

        $this->mock(PublishPost::class, function (MockInterface $mock) use ($post) {

            $mock->shouldReceive('execute')

                ->once()

                ->withArgs([

                    Mockery::on(fn (Post $arg): bool => $arg->is($post)),

                ]);

        });

 

        $this->post(route('post.publish', $post))

            ->assertOk()

            ->assertJson([

                'success' => true,

            ]);

    }

}

Jika Anda tertarik untuk membaca lebih lanjut mengenai pengetesan, Anda kemungkinan tertarik untuk membaca artikel Langkah Membuat Program Laravel Anda Lebih Bisa Dites.

7. Menggunakan getOrPut() dalam Koleksi

Ada sistem getOrPut bermanfaat yang bisa Anda gunakan di Koleksi Anda. Itu bisa dipakai untuk ambil poin (apabila sudah ada), atau menyelingkannya dan ambilnya bila tidak ada.

Ini dapat benar-benar bermanfaat saat membuat Koleksi dengan data dari berbagai sumber dan don't want to item duplikat di data Anda.

Misalkan, alih-alih menulis:

if (! $collection->has($key)) {

    $collection->put($key, $this->builtItem($data));

}

 

return $collection->get($key);

Anda dapat menggunakan metode getOrPut seperti:

return $collection->getOrPut($key, fn () => $this->buildItem($data));

8. Men-debug Permintaan HTTP

Saat membuat permintaan HTTP dari aplikasi Laravel Anda menggunakan fasad Http, Anda mungkin ingin membuang permintaan tersebut. Ini bisa sangat berguna untuk debugging dan saya menggunakannya sendiri selama pengembangan saat membuat dan memecahkan masalah permintaan ke API eksternal.

Untuk membuang data permintaan, Anda dapat menggunakan metode dump seperti:

Http::dump()->get($url);

Demikian juga, Anda dapat menggunakan metode dd untuk mati dan membuang permintaan seperti ini:

Http::dd()->get($url);

9. Replikasi Model

Di program Laravel Anda, Anda bisa menggandakan model memakai sistem replica(). Ini membuat benar-benar gampang untuk membuat salinan model.

Saya memakai peranan ini di blog saya sendiri untuk membikin salinan template posting blog umum yang saya pakai saat mengawali artikel baru.

Misalkan, Anda bisa menggandakan mode semacam ini:

$post = Post::find(123);

 

$copiedPost = $post->replicate();

 

$copiedPost->save();

Jika Anda ingin mengecualikan properti agar tidak disalin, Anda dapat meneruskan nama bidang sebagai larik ke dalam metode:

$post = Post::find(123);

 

$copiedPost = $post->replicate([

    'author_id',

]);

 

$copiedPost->save();

Selain itu, metode replikasi membuat model yang belum disimpan, sehingga Anda dapat menggabungkan metode model yang biasa. Misalnya, kita dapat menyalin model dan menambahkan " (copy)" di akhir judul sehingga kita dapat melihat bahwa model tersebut telah direplikasi.

$post = Post::find(123);

 

$copiedPost = $post->replicate([

    'author_id',

])->fill([

    'title' => $post->title.' (copy)',

]);

 

$copiedPost->save();

Penting untuk diingat jika model tidak diletakkan dalam database sesudah memakai sistem simulasi . Jadi, Anda harus pastikan Anda mempertahankannya memakai sistem simpan.

10. Menambah Panduan Pelengkapan Otomatis ke Perintah command-line utility

Saat Anda membuat perintah command-line utility di program Laravel, Anda bisa menggunakan sistem mengantisipasi untuk memberi panduan penuntasan otomatis untuk pengguna.

Misalkan, kita bisa mempunyai perintah yang mendapati pengguna memakai email mereka. Dalam perintah ini, kita bisa melanjutkan daftar email yang kemungkinan ke sistem mengantisipasi hingga diperlihatkan ke layar saat mereka mulai menulis, misalnya:

class TestCommand extends Command

{

    public function handle()

    {

        $email = $this->anticipate('Find user by email: ', [

            '[email protected]',

            '[email protected]',

        ]);

    }

}

Penting diingat jika pengguna masih bisa memasukkan jawaban yang tidak ada pada daftar antisipasi. Sistem mengantisipasi cuma dipakai untuk memberi panduan dan tidak untuk memvalidasi saran.

11. Menggunakan 'wasRecentlyCreated' pada Model

Di Laravel, kemungkinan ada kalanya Anda perlu mengecek apa model diambil dari database atau barusan dibuat dalam transisi hidup keinginan sekarang ini - seperti saat menggunakan sistem firstOrCreate.

Untuk melakukan ini, Anda bisa memakai bidang ->wasRecentlyCreated pada model semacam ini:

$user = User::firstOrCreate(

    ['email' => request('email')],

    ['name' => request('name')],

);

 

if ($user->wasRecentlyCreated) {

    // Your user was just created...

} else {

    // Your user already existed and was fetched from the database...

}

12. Mengubah Kunci untuk Pengikatan Model Rute

Di rute aplikasi Laravel Anda, Anda dapat mengubah kunci yang digunakan untuk menyelesaikan model menggunakan pengikatan model rute.

Misalnya, katakanlah Anda memiliki rute yang menerima slug postingan blog:

Route::get('blog/{slug}', [BlogController::class, 'show']);

Di controller kami, kami perlu mencoba secara manual dan menemukan posting blog di dalam metode controller seperti ini:

use App\Actions\PublishPost;

use App\Models\Post;

 

class BlogController extends Controller

{

    public function show($slug)

    {

        $post = Post::where('slug', $slug)->firstOrFail();

 

        return view('blog.show', [

            'post' => $post,

        ]);

    }

}

Namun, untuk menyederhanakan kode ini dan membersihkannya, kita dapat memperbarui parameter slug menjadi post:slug:

Route::get('blog/{post:slug}', [BlogController::class, 'show']);

Ini sekarang berarti bahwa kita sekarang dapat memperbarui metode controller kita untuk mengharapkan model Post dalam metode controller kita yang disebut post, dan Laravel akan secara otomatis menemukan model Post yang memiliki slug yang diteruskan di URL.

Ini berarti bahwa kita tidak perlu lagi menemukan model secara manual di controller kita dan kita dapat membiarkan Laravel menyelesaikannya untuk kita seperti ini:

use App\Actions\PublishPost;

use App\Models\Post;

 

class BlogController extends Controller

{

    public function show(Post $post)

    {

        return view('blog.show', [

            'post' => $post,

        ]);

    }

}

13. Menggunakan Injeksi Attachment

Akan berguna untuk menggunakan injeksi keterikatan dalam kode Laravel Anda. Ini memungkinkannya Anda untuk menyelesaikan dependensi Anda dari tempat setiap Anda coba dan membuat instance kelas baru. Ini bisa menolong Anda membuat code yang dapat lebih dipelihara dan dites dengan membuat beberapa hal seperti menghina lebih gampang digunakan.

Misalkan, dalam contoh ini, kami tidak menggunakan injeksi keterikatan dan cuma membuat kelas baru:

class MyController extends Controller

{

    public function __invoke()

    {

        $service = new MyService();

 

        $service->handle();

    }

}

Sekarang, kami telah menghapus baris pertama di dalam metode dan menambahkan MyService sebagai parameter metode lainnya. Laravel kemudian akan "inject" layanan untuk kita setiap kali metode ini dipanggil sehingga kita dapat menggunakannya:

class MyController extends Controller

{

    public function __invoke(MyService $service)

    {

        $service->handle();

    }

}

Kemungkinan ada juga saat saat Anda ada dalam kelas kode dan rupanya tanpa pemfaktoran ulang besar Anda tidak segera dapat memasukkan kelas Anda dengan meneruskannya sebagai argumen sistem tambahan. Dalam kasus ini, Anda bisa menggunakan fungsi pembantu penyelesaian yang disiapkan Laravel misalnya:

class MyClass

{

    public function execute()

    {

        $service = resolve(MyService::class);

 

        $service->handle();

    }

}

14. Memfilter Koleksi berdasarkan Jenis Kelas

Anda bisa memfilter Koleksi Laravel berdasarkan jenis kelas yang diberi menggunakan sistem whereInstanceOf. Ini berguna untuk dilaksanakan bila Anda membuat Koleksi dari berbagai sumber data (seperti hubungan polimorfik) dan perlu memfilternya ke kelas tertentu.

Misalkan, kita bisa memiliki Koleksi berikut dan memfilternya supaya cuma berisi kelas Pengguna:

$collection = collect([

    new User(),

    new User(),

    new User(),

    new Comment(),

]);

 

$filtered = $collection->whereInstanceOf(User::class)->all();

Metode whereInstanceOf juga menerima array kelas jika Anda ingin memfilter lebih dari satu kelas sekaligus. Misalnya, untuk memfilter Koleksi agar hanya berisi kelas Post dan Komentar, Anda dapat melakukannya seperti ini:

$filtered = $collection->whereInstanceOf([Post::class, Comment::class])->all();

15. Menentukan logic URL Sementara Khusus

Anda bisa menyesuaikan cara pembuatan URL sementara untuk disk penyimpanan tertentu. Ini bermanfaat bila Anda mempunyai controller yang memungkinkannya Anda mengunduh file yang disimpan lewat disk yang umumnya tidak memberikan dukungan URL sebentar.

Untuk menggunakan fungsionalitas ini, pertama kali Anda harus register logic (umumnya di penyedia layanan) menggunakan sistem buildTemporaryUrlsUsing.

Misalkan, berikut contoh bagaimana kami bisa mendaftar beberapa logic khusus untuk membuat URL sementara untuk disk penyimpanan lokal:

public function boot()

{

    Storage::disk('local')->buildTemporaryUrlsUsing(function ($path, $expiration, $options) {

        return URL::temporarySignedRoute(

            'files.download',

            $expiration,

            array_merge($options, ['path' => $path]),

        );

    });

}

Setelah logic didaftarkan, Anda kemudian dapat menggunakan fungsionalitas ini melalui metode temporaryUrl seperti:

$tempUrl = Storage::disk('local')->temporaryUrl('file.jpg', now()->addMinutes(5));

16. Memvalidasi Alamat MAC

Ada aturan mac_address yang berguna yang tersedia di Laravel yang dapat Anda gunakan untuk memvalidasi apakah suatu field adalah alamat MAC yang valid.

Misalnya, validasi berikut akan lolos karena nilainya adalah alamat MAC yang valid:

Validator::make([

    'device_mac' => '00:1A:C2:7B:00:47'

], [

    'device_mac' => 'mac_address',

])->passes();

Tetapi validasi berikut akan gagal karena nilainya bukan alamat MAC yang valid:

Validator::make([

    'device_mac' => 'invalid-mac-address'

], [

    'device_mac' => 'mac_address',

])->passes();

17. Mengenkripsi Bidang dalam Basis Data

Anda bisa simpan kolom model dalam pola terenkripsi di database Anda menggunakan gips terenkripsi. Ini dapat bermanfaat jika Anda simpan data pribadi di database Anda yang membutuhkan beberapa bentuk pelindungan jika terjadi pelanggaran database.

Misalkan, untuk mengenkripsi my_encrypted_field pada model User, Anda bisa mengupdate model Anda semacam ini:

class User extends Authenticatable

{

    protected $casts = [

        'my_encrypted_field' => 'encrypted',

    ];

}

Anda masih bisa menggunakan lapangan seperti biasa. Misalnya, untuk mengupdate nilai yang disimpan di my_encrypted_field, kita masih bisa menggunakan metode update seperti biasa:

$user->update(['my_encrypted_field' => 'hello123']);

vJika Anda sekarang melihat di database, Anda tidak akan melihat hello123 di bidang my_encrypted_field pengguna. Sebaliknya, Anda akan melihat versi terenkripsinya.

Namun, Anda masih dapat menggunakan nilai asli dalam kode Anda tanpa perlu melakukan perubahan apa pun:

$result = $user->my_encrypted_field;

 

// $result is equal to: "hello123"

Penting untuk dikenang jika enkripsi menggunakan APP_KEY program, maka bila ini dikompromikan dalam pelanggaran atau diganti, bidang terenkripsi yang disimpan dalam database bisa didekripsi.

18. Memindahkan logic ke Sistem

Dalam kode Anda, bukannya langsung mengecek bidang dalam syarat Anda, kadang mengalihkan logic ke sistem bisa membantu.

Ini bisa membantu meningkatkan keterbacaan dan jaga kode Anda KERING jika Anda perlu menggunakan kembali logic yang serupa (atau bila logic berbeda di periode kedepan).

Misalkan, katakanlah kita ingin mengecek apa pengguna disepakati. Kode kita kemungkinan terlihat semacam ini:

if ($user->approved === Approval::APPROVED) {

  // Do something...

}

Namun, permasalahan utama dengan pendekatan ini adalah jika kita menggunakannya di beberapa tempat di basis kode, akan susah untuk memperbarui bila logicnya perlu diganti.

Maka kita dapat memindahkan logic ke sistem (seperti isApproved) pada mode User. Saat ini, kita bisa memanggil sistem itu bukannya mengecek bidang langsung.

Misalkan, model kita saat ini kemungkinan terlihat semacam ini:

app/Models/User.php

class User extends Model

{

    public function isApproved(): bool

    {

        return $this->approved === Approval::APPROVED;

    }

}

Ini berarti bahwa kita kemudian dapat menggunakan metode seperti itu dalam kode kita seperti ini:

if ($user->isApproved()) {

    // Do something...

}

19. Menggunakan Opsi Mode Perawatan Berbeda

Laravel menyediakan beberapa opsi maintenance mode yang sangat berguna untuk digunakan.

Untuk memasukkan aplikasi Anda ke maintenance mode, Anda dapat menjalankan perintah berikut:

php command-line utility down

Anda kemungkinan ingin me-refresh halaman maintenance dalam interval yang diputuskan hingga pemakai Anda tak perlu me-refresh dengan manual saat situs dicadangkan. Anda bisa lakukan ini memakai pilihan --refresh dan melewati waktu dalam perhitungan detik, misalnya:

php command-line utility down --refresh=30

Anda kemungkinan ingin memberi diri Anda sendiri akses ke program saat dalam maintenance models untuk pengguna Anda. Untuk lakukan ini, Anda bisa menggunakan pilihan --secret dan meneruskan rahasia.

Misalkan, kami bisa menyetel rahasia kami ke-rahasia-Anda di sini. Ini memiliki arti jika Anda kemudian mengarahkan ke your-app-domain.com/your-secret-here, Anda akan dikasih akses dan bisa melihat program yang lain seperti umumnya. Anda bisa aktifkan maintenance models menggunakan rahasia semacam ini:

php command-line utility down --secret="your-secret-here"

Jika Anda tidak ingin menggunakan halaman maintenance 503 default yang disediakan oleh Laravel, Anda dapat menentukan sendiri menggunakan opsi --render. Misalnya, kita mungkin ingin menggunakan resources/views/errors/maintenance.blade.php seperti ini:

php command-line utility down --render="errors/maintenance.blade.php"

20. Menggunakan Properti Readonly

Di PHP 8.1, Anda dapat menggunakan "properti readonly". Ini sangat berguna untuk membuat DTO (objek transfer data) lebih kecil dan lebih mudah dibaca tanpa mengambil yang tidak perlu.

Sebagai contoh, mari kita lihat bagaimana tampilan DTO tanpa properti readonly:

class StoreUserDTO

{

    public function __construct(

        private string $name,

        private string $email,

        private string $password,

    ) {

        //

    }

 

    public function getName(): string

    {

        return $this->name;

    }

 

    public function getEmail(): string

    {

        return $this->email;

    }

 

    public function getPassword(): string

    {

        return $this->password;

    }

}

Sekarang, mari kita lihat DTO yang sama menggunakan properti readonly sebagai gantinya:

class StoreUserDTO

{

    public function __construct(

        public readonly string $name,

        public readonly string $email,

        public readonly string $password,

    ) {

        //

    }

}

Saya berpikir Anda akan sepakat jika pilihan kedua memakai bidang readonly terlihat lebih bersih serta lebih gampang dimengerti secara sekilas.

Kesimpulan

Semoga postingan ini mengajarkan Anda minimal satu panduan atau trik baru yang bisa Anda pakai dalam program Laravel Anda.

Jika posting ini membantu Anda, saya ingin mendengarnya. Demikian pula, bila Anda mempunyai feedback untuk meningkatkan posting ini.

Jika Anda berminat untuk memperoleh pembaruan setiap saya menerbitkan posting baru, tidak boleh ragu untuk mendaftarkan ke buletin saya berikut ini.

Tetaplah membuat beberapa hal yang luar biasa!