Wed Dec 2019 1 year ago

Pengenalan Controller dan Contoh Penggunaanya Pada Laravel 5.8

#Definisi Controller

Alih-alih mendefinisikan semua logika penanganan permintaan Anda sebagai Penutup dalam file route, Anda mungkin ingin mengatur perilaku ini menggunakan kelas Controller. Controller dapat mengelompokkan logika penanganan permintaan terkait ke dalam satu kelas. Controller disimpan dalam direktori. app/Http/Controllers

 

#Basic Controllers

 

Mendefinisikan Controller

Di bawah ini adalah contoh dari kelas controller dasar. Perhatikan bahwa controller memperluas kelas controller dasar yang disertakan dengan Laravel. Kelas dasar menyediakan beberapa metode keamanan seperti middleware metode, yang dapat digunakan untuk melampirkan middleware ke tindakan controller :

<?php

namespace AppHttpControllers;

use AppUser;
use AppHttpControllersController;

class UserController extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function show($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

Anda dapat menentukan route ke tindakan controller seperti ini:

Route::get('user/{id}', 'UserController@show');

Sekarang, ketika permintaan cocok dengan URI route yang ditentukan, show metode di UserController kelas akan dieksekusi. Parameter route juga akan diteruskan ke metode.

 

Controllers & Namespaces

Sangat penting untuk dicatat bahwa kita tidak perlu menentukan namespace pengontrol penuh ketika mendefinisikan route controller. Karena RouteServiceProvider memuat file route Anda dalam grup route yang berisi namespace, kami hanya menentukan bagian dari nama kelas yang muncul setelah bagian namespace. AppHttpControllers

Jika Anda memilih untuk membuat kumpulan controller Anda lebih dalam ke direktori, gunakan nama kelas spesifik relatif ke root namespace. Jadi, jika kelas full controller Anda, Anda harus mendaftarkan route ke controller seperti:AppHttpControllersAppHttpControllersAppHttpControllersPhotosAdminController

Route::get('foo', 'PhotosAdminController@method');

 

Single Action Controllers

Jika Anda ingin mendefinisikan controller yang hanya menangani satu tindakan, Anda dapat menempatkan __invoke metode tunggal pada pengontrol:

<?php

namespace AppHttpControllers;

use AppUser;
use AppHttpControllersController;

class ShowProfile extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function __invoke($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

Saat mendaftarkan route untuk controller aksi tunggal, Anda tidak perlu menentukan metode:

Route::get('user/{id}', 'ShowProfile');

Anda dapat membuat controller yang tidak dapat diperbaiki dengan menggunakan --invokable opsi perintah Artisan: make:controller

php artisan make:controller ShowProfile --invokable 

 

Controller Middleware

Middleware dapat ditugaskan ke route controller di file route Anda:

Route::get('profile', 'UserController@show')->middleware('auth');

Namun, lebih mudah untuk menentukan middleware dalam konstruktor controller Anda. Menggunakan middleware metode dari konstruktor controller Anda, Anda dapat dengan mudah menetapkan middleware ke tindakan controller. Anda bahkan dapat membatasi middleware hanya metode tertentu pada kelas controller:

class UserController extends Controller
{
    /**
     * Instantiate a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log')->only('index');

        $this->middleware('subscribed')->except('store');
    }
}

controller juga memungkinkan Anda untuk mendaftar middleware menggunakan Penutupan. Ini memberikan cara mudah untuk mendefinisikan middleware untuk pengontrol tunggal tanpa mendefinisikan seluruh kelas middleware:

$this->middleware(function ($request, $next) {
    // ...

    return $next($request);
});

 

Resource Controllers

Resource routing laravel memberikan route "CRUD" yang khas ke controller dengan satu baris kode. Misalnya, Anda mungkin ingin membuat pengontrol yang menangani semua permintaan HTTP untuk "foto" yang disimpan oleh aplikasi Anda. Menggunakan perintah Artisan, kita dapat dengan cepat membuat pengontrol seperti itu: make:controller

php artisan make:controller PhotoController --resource

Perintah ini akan menghasilkan di controller . Controller akan berisi metode untuk setiap operasi resourcing yang tersedia. app/Http/Controllers/PhotoController.php

Selanjutnya, Anda dapat mendaftarkan route yang banyak akal ke controller:

Route::resource('photos', 'PhotoController');

Deklarasi route tunggal ini menciptakan banyak route untuk menangani berbagai tindakan pada resourcing. Controller yang dihasilkan sudah memiliki metode stubbed untuk masing-masing tindakan ini, termasuk catatan yang memberi tahu Anda tentang kata kerja HTTP dan URI yang mereka tangani.

Anda dapat mendaftarkan banyak controller resourcing sekaligus dengan mengirimkan array ke metode resources:

Route::resources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
]);

 

 

Actions Handled By Resource Controller

Verb URI Action Route Name
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

 

Menentukan Resourcing Mode

Jika Anda menggunakan pengikatan model route dan ingin metode controller resourcing untuk mengetik-petunjuk contoh model, Anda dapat menggunakan --model opsi saat membuat controller:

php artisan make:controller PhotoController --resource --model=Photo

 

Metode Formulir Spoofing

Karena formulir HTML tidak dapat membuat permintaan PUT,, PATCH atau DELETE, Anda perlu menambahkan _method bidang tersembunyi untuk memalsukan kata kerja HTTP ini. The @method Pisau direktif dapat membuat field ini untuk Anda:

<form action="/foo/bar" method="POST">
    @method('PUT')
</form>

 

 

#Partial Resource Routes

Saat mendeklarasikan route resourcing, Anda dapat menentukan tindakan subset yang harus ditangani pengendali alih-alih set lengkap tindakan default:

Route::resource('photos', 'PhotoController')->only([
    'index', 'show'
]);

Route::resource('photos', 'PhotoController')->except([
    'create', 'store', 'update', 'destroy'
]);

 

API Resource Routes

Saat mendeklarasikan route resource yang akan diguanakan oleh API, Anda biasanya ingin mengecualikan route yang menyajikan template HTML seperti create dan edit. Untuk kenyamanan, Anda dapat menggunakan apiResource metode ini untuk secara otomatis mengecualikan dua route ini:

Route::apiResource('photos', 'PhotoController');

Anda dapat mendaftarkan banyak controller sumber daya API sekaligus dengan mengirimkan array ke apiResources metode:

Route::apiResources([
    'photos' => 'PhotoController',
    'posts' => 'PostController'
]);

Untuk dengan cepat menghasilkan controller resource API yang tidak menyertakan create atau edit metode, gunakan --api sakelar saat menjalankan perintah: make:controller

php artisan make:controller API/PhotoController --api

 

Penamaan Resource Route

Secara default, semua tindakan controller resource memiliki nama route; namun, Anda dapat mengganti nama-nama ini dengan mengirimkan names array dengan opsi Anda:

Route::resource('photos', 'PhotoController')->names([
    'create' => 'photos.build'
]);

 

Penamaan Parameter Resource Route

Secara default, akan membuat parameter route untuk route sumber daya Anda berdasarkan versi "tunggal" dari nama resource. Anda dapat dengan mudah menimpa ini berdasarkan resource dengan menggunakan metode ini. Array yang diteruskan ke metode harus berupa array asosiatif dari nama resource dan nama parameter:Route::resourceparametersparameters

Route::resource('users', 'AdminUserController')->parameters([
    'users' => 'admin_user'
]);

Contoh di atas menghasilkan URI berikut untuk route sumber daya show:

/users/{admin_user}

 

Localizing Resource URIs

Secara default, akan membuat resource URI menggunakan kata kerja bahasa Inggris. Jika Anda perlu melokalkan dan kata kerja tindakan, Anda dapat menggunakan metode ini. Ini dapat dilakukan dengan metode Anda :Route::resourcecreateeditRoute::resourceVerbsbootAppServiceProvider

use IlluminateSupportFacadesRoute;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Route::resourceVerbs([
        'create' => 'crear',
        'edit' => 'editar',
    ]);
}

Setelah kata kerja dikustomisasi, pendaftaran resource route seperti akan menghasilkan URI berikut: Route::resource('fotos', 'PhotoController')

/fotos/crear

/fotos/{foto}/editar

 

Supplementing Resource Controllers

Jika Anda perlu menambahkan route tambahan ke rersource controller di luar rangkaian resource route default, Anda harus menentukan route tersebut sebelum panggilan Anda ; jika tidak, route yang ditentukan oleh metode ini dapat secara tidak sengaja didahulukan dari route tambahan Anda: Route::resourceresource

Route::get('photos/popular', 'PhotoController@method');

Route::resource('photos', 'PhotoController');

 

 

Depedency Injenction & Controllers

Constructor Injection

Service container Laravel digunakan untuk menyelesaikan semua controller Laravel. Sebagai hasilnya, Anda dapat mengetik-petunjuk setiap dependensi yang mungkin diperlukan controller dalam konstruktornya. Ketergantungan yang dideklarasikan akan secara otomatis diselesaikan dan disuntikkan ke instance controller:

<?php

namespace AppHttpControllers;

use AppRepositoriesUserRepository;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * Create a new controller instance.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        $this->users = $users;
    }
}

Anda juga dapat mengetik-petunjuk Laravel contract . Jika container bisa mengatasinya, Anda bisa mengetik-isyarat itu. Bergantung pada aplikasi Anda, menyuntikkan dependensi Anda ke dalam pengontrol Anda mungkin memberikan testability yang lebih baik.

Method Injection

Selain contructor injection, Anda juga dapat mengetik dependensi-petunjuk pada controller's method Anda. Penggunaan umum untuk controller's method adalah menyuntikkan instance ke dalam method controller Anda: IlluminateHttpRequest

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    /**
     * Store a new user.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        $name = $request->name;

        //
    }
}

Jika controller method Anda juga mengharapkan input dari parameter route, daftarkan argumen route Anda setelah dependensi Anda yang lain. Misalnya, jika route Anda didefinisikan seperti itu:

Route::put('user/{id}', 'UserController@update');

Anda masih dapat mengetikkan petunjuk dan mengakses parameter Anda dengan mendefinisikan controller method Anda sebagai berikut: IlluminateHttpRequestid

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;

class UserController extends Controller
{
    /**
     * Update the given user.
     *
     * @param  Request  $request
     * @param  string  $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
        //
    }
}

 

Route Caching

 

Jika aplikasi Anda secara eksklusif menggunakan controller berbasis route, Anda harus memanfaatkan cache route Laravel. Menggunakan cache route akan secara drastis mengurangi jumlah waktu yang diperlukan untuk mendaftarkan semua route aplikasi Anda. Dalam beberapa kasus, pendaftaran route Anda mungkin bahkan hingga 100x lebih cepat. Untuk menghasilkan cache route, cukup jalankan perintah Artisan: route:cache

php artisan route:cache

Setelah menjalankan perintah ini, file rute cache Anda akan dimuat pada setiap permintaan. Ingat, jika Anda menambahkan route baru apa pun, Anda perlu membuat cache route baru. Karena itu, Anda hanya harus menjalankan perintah selama penyebaran proyek Anda. route:cache

Anda dapat menggunakan perintah untuk menghapus cache rute:route:clear

php artisan route:clear

 

belajar laravel tutorial laravel laravel controller larave