Belajar Controller Pada Framework Laravel Terbaru
Assalamualaikum, Pada kesempatan ini kita akan mempelajari mengenai Controller pada framework laravel. Lalu apa tujuan dari adanya controller pada framework laravel? Contoller pada laravel berfungsi sebagai pemhubung antara model dengan view (tampilan). Tentunya ini sangat penting untuk kita pelajari karena controller laravel ini merupakan hal dasar yang harus kita pahami dan pelajari. Banyak hal, yang tentunya akan kita pelajari pada artikel ini mengenai Belajar controller pada framework laravel terbaru.
Jika teman- teman belum membaca artikel sebelumnya, silahkan kunjungi: Middleware Pada Framework Laravel
Lalu apa sajakah point- point yang akan kita bahas?, Silahkan teman- teman simak pembahasan dibawah ini:
- Perkenalan Controller Laravel
- Basic Controller
- Defining Controller
- Controller & Namespace
- Single Action Controller
- Controller Middleware
- Resource Controller
- Partial Resource Routes
- Nested Resources
- Naming Resources Routes
- Naming Resources Route Parameters
- Localizing Resource URIs
- Supplementing Resource Controllers
- Dependency Injection & Controllers
- Route Caching
Setelah teman- teman mengetahui point- point apa saja yang akan kita bahas pada artikel kali ini, tentunya teman- teman akan lebih mudah untuk berlajar serta memahaminya. Silahkan teman- teman simak pembahasan dibawah ini.
1. Perkenalan
Alih-alih mendefinisikan semua logika penanganan permintaan teman- teman sebagai Penutupan dalam file route, teman- teman mungkin ingin mengatur perilaku ini menggunakan class Controller. Pengontrol dapat mengelompokkan logika penanganan permintaan terkait ke dalam satu class. itu disimpan didalam direktori app/Http/Controllers.2. Basic Controller
# Menentukan Controllers
Di bawah ini merupan contoh dari class basic controller. Perhatikan bahwa controller dapat memperluas class basic controller yang disertakan dengan Laravel. Class basic menyediakan beberapa metode kenyamanan seperti metode middleware, yang dapat teman- teman gunakan untuk melampirkan middleware ke actions controller, untuk contoh penerapannya seperti dibawah ini:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\User;
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)]);
}
}
Teman- teman dapat menentukan route ke action controller ini seperti berikut:
Route::get('user/{id}', 'UserController@show');
Sekarang, ketika permintaan cocok dengan URL route yang ditentukan, metode show pada class UserController akan dieksekusi. Parameter route juga akan diteruskan ke metode.
Controller tidak required untuk extend base class. Namun, teman- teman tidak akan memiliki akses ke dalam fitur kenyamanan seperti metode middleware, validate, dan dispatch.
# Controllers & Namespaces
Sangat penting untuk dicatat bahwa teman- teman tidak perlu menentukan namespace pengontrol penuh ketika mendefinisikan route controller. Karena RouteServiceProvider dapat memuat file route teman- teman dalam grup rute yang berisi namespace, tentunya kita hanya menentukan bagian dari nama class yang muncul setelah bagian App\ Http\Controllers dari namespace.
Jika Teman- teman memilih untuk membuat sarang controller teman- teman lebih dalam ke direktori App\Http\Controllers, gunakan nama class yang spesifik relatif terhadap App\Http\Controllers root namespace. Jadi, jika class controller penuh kalian adalah App\Http\Controllers\Photos\ AdminController, Teman- teman harus mendaftarkan route ke controller seperti berikut ini:
Route::get('foo', 'Photos\AdminController@method');
# Single Action Controllers
Jika teman- teman ingin mendefinisikan pengontrol yang hanya menangani satu tindakan, teman- teman dapat menempatkan metode __invoke tunggal pada controller, contohnya seperti dibawah ini :
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\User;
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 single action controller, teman- teman tidak perlu menentukan metode:
Route::get('user/{id}', 'ShowProfile');
Teman- teman dapat membuat controller yang tidak dapat dimasuki dengan menggunakan opsi --invokable dari perintah make:controller Artisan:
php artisan make:controller ShowProfile --invokable
3. Controller Middleware
Middleware dapat ditugaskan kedalam route controller didalam file route kalian:
Route::get('profile', 'UserController@show')->middleware('auth');
Namun, lebih mudah untuk menentukan middleware dalam suatu konstruktor controller teman- teman. Menggunakan metode middleware dari konstruktor pengontrol kalian, teman- teman tentunya dapat dengan mudah menetapkan middleware untuk tindakan controller. Teman- teman bahkan dapat membatasi middleware hanya untuk metode tertentu pada class 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');
}
}
Pengendali juga memungkinkan teman- teman untuk mendaftar middleware menggunakan Penutupan. Ini memberikan kemudahan untuk mendefinisikan middleware untuk single controller tanpa mendefinisikan seluruh class middleware:
$this->middleware(function ($request, $next) {
// ...
return $next($request);
});
teman- teman dapat menetapkan middleware ke subset action controller; Namun, ini memungkinkan mengindikasikan pengontrol kalian tumbuh terlalu besar. Sebagai gantinya, pertimbangkan untuk memecah pengontrol menjadi beberapa, pengontrol yang lebih kecil lagi.
4. Resource Controllers
Routing sumber daya Laravel memberikan route "CRUD" khas ke dalam controller dengan satu baris kode. Misalnya, teman- teman mungkin ingin membuat controller yang menangani semua permintaan HTTP untuk "foto" yang disimpan oleh aplikasi yang teman- teman buat. Menggunakan perintah make:controller Artisan, tentunya kita dapat dengan cepat membuat controller seperti itu, contohnya seperti perintah berikut ini:
php artisan make:controller PhotoController --resource
Perintah ini akan menghasilkan pengontrol didalam directori app/Http/ Controllers/ PhotoController.php. Controller akan berisi metode untuk setiap operasi sumber daya yang tersedia.
Selanjutnya, teman- teman dapat mendaftarkan route yang masuk akal ke dalam controller:
Selanjutnya, teman- teman dapat mendaftarkan route yang masuk akal ke dalam controller:
Route::resource('photos', 'PhotoController');
Deklarasi route tunggal ini dapat menciptakan banyak route untuk menangani berbagai tindakan pada sumber daya. Controller yang dihasilkan sudah memiliki metode stubbed untuk masing-masing tindakan ini, termasuk catatan yang memberi tahu kalian tentang kata kerja HTTP dan URI yang tangani.
Teman- teman dapat mendaftarkan banyak controller sumber daya sekaligus dengan mengirimkan array ke metode sumber daya:
Teman- teman dapat mendaftarkan banyak controller sumber daya sekaligus dengan mengirimkan array ke metode sumber daya:
Route::resources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
Actions Handled By Resource Controller
Specifying The Resource Model
Jika teman- teman menggunakan pengikatan model route dan ingin metode controller sumber daya untuk mengetik-mengisyaratkan instance model, teman- teman dapat menggunakan opsi --model saat membuat controller, contoh penerapannya seperti dibawah ini:
Specifying The Resource Model
Jika teman- teman menggunakan pengikatan model route dan ingin metode controller sumber daya untuk mengetik-mengisyaratkan instance model, teman- teman dapat menggunakan opsi --model saat membuat controller, contoh penerapannya seperti dibawah ini:
php artisan make:controller PhotoController --resource --model=Photo
Spoofing Form Methods
Karena formulir HTML tidak dapat membuat permintaan PUT, PATCH, atau DELETE, teman- teman perlu menambahkan bidang _method tersembunyi untuk dapat memalsukan kata kerja HTTP ini. Arahan @method Blade dapat membuat bidang ini untuk kalian, contoh penerapannya seperti dibawah ini:
Karena formulir HTML tidak dapat membuat permintaan PUT, PATCH, atau DELETE, teman- teman perlu menambahkan bidang _method tersembunyi untuk dapat memalsukan kata kerja HTTP ini. Arahan @method Blade dapat membuat bidang ini untuk kalian, contoh penerapannya seperti dibawah ini:
<form action="/foo/bar" method="POST">
@method('PUT')
</form>
# Partial Resource Routes
Saat mendeklarasikan route sumber daya, teman- teman dapat menentukan subset tindakan 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 sumber daya yang akan dikonsumsi oleh API, teman- teman biasanya ingin mengecualikan route yang menyajikan template HTML seperti membuat dan mengedit. Untuk kenyamanan, teman- teman dapat menggunakan metode apiResource untuk secara otomatis mengecualikan dua route ini:
Saat mendeklarasikan route sumber daya yang akan dikonsumsi oleh API, teman- teman biasanya ingin mengecualikan route yang menyajikan template HTML seperti membuat dan mengedit. Untuk kenyamanan, teman- teman dapat menggunakan metode apiResource untuk secara otomatis mengecualikan dua route ini:
Route::apiResource('photos', 'PhotoController');
Teman- teman juga dapat mendaftarkan banyak pengontrol sumber daya API sekaligus dengan mengirimkan array ke metode apiResources:
Route::apiResources([
'photos' => 'PhotoController',
'posts' => 'PostController'
]);
Untuk dengan cepat menghasilkan suatu controller sumber daya API yang tidak menyertakan metode buat atau edit, gunakan --api saat menjalankan perintah make:controller:
php artisan make:controller API/PhotoController --api
#Nested Resources
Terkadang teman- teman mungkin perlu menentukan route ke sumber daya bersarang. Misalnya, sumber foto mungkin memiliki banyak komentar yang dapat dilampirkan pada foto tersebut. Untuk membuat sarang pengontrol sumber daya, gunakan notasi "titik" dalam deklarasi route yang teman- teman buat:Route::resource('photos.comments', 'PhotoCommentController');
Route ini tentunya akan mendaftarkan sumber daya bersarang yang dapat diakses dengan URI seperti berikut:
/photos/{photo}/comments/{comment}
Shallow Nesting
Seringkali, tidak sepenuhnya diperlukan untuk memiliki ID parent dan child dalam URI karena ID child sudah merupakan pengidentifikasi unik. Saat menggunakan pengidentifikasi unik seperti kunci primer penambahan-otomatis untuk mengidentifikasi model teman- teman pada segmen URI, teman- teman dapat memilih untuk menggunakan "sarang dangkal":
Route::resource('photos.comments', 'CommentController')->shallow();
Secara default, semua tindakan pengontrol sumber daya memiliki nama route; namun, teman- teman bisa mengganti nama-nama ini dengan mengirimkan array nama seperti berikut ini:
Route::resource('photos', 'PhotoController')->names([
'create' => 'photos.build'
]);
# Naming Resource Route Parameters
Secara default, Route::resource akan membuat parameter route untuk route sumber daya berdasarkan versi "tunggal" dari nama sumber daya. teman- teman dapat dengan mudah menimpanya pada basis per sumber daya dengan menggunakan metode parameter. Array yang diteruskan ke metode parameter harus berupa array asosiatif dari nama sumber daya serta nama parameter:
Route::resource('users', 'AdminUserController')->parameters([
'users' => 'admin_user'
]);
Contoh di atas menghasilkan URI berikut untuk rute pertunjukan sumber daya:
/users/{admin_user}
# Localizing Resource URIs
Secara default, Route :: resource akan membuat URI sumber daya menggunakan kata kerja bahasa Inggris. Jika teman- teman perlu melokalisasi kata kerja create dan edit, teman- teman dapat menggunakan metode Route::resourceVerbs. Ini dapat dilakukan dalam metode boot AppServiceProvider, berikut merupkan penerapannya:
use Illuminate\Support\Facades\Route;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Route::resourceVerbs([
'create' => 'crear',
'edit' => 'editar',
]);
}
Setelah kata kerja dikustomisasi, pendaftaran route sumber daya seperti Route::resource ('fotos', 'PhotoController') akan menghasilkan URI berikut:
/fotos/crear
/fotos/{foto}/editar
# Supplementing Resource Controllers
Jika teman- teman perlu menambahkan rute tambahan ke pengontrol sumber daya di luar rangkaian route sumber daya default, teman- teman harus menentukan route tersebut sebelum panggilan teman- teman ke Route::resource; jika tidak, route yang ditentukan oleh metode sumber daya dapat secara tidak sengaja didahulukan dari route tambahan:
Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
Ingatlah untuk menjaga controller tetap fokus. Jika teman- teman secara rutin membutuhkan metode di luar rangkaian tindakan sumber daya yang umum, pertimbangkan untuk membagi pengontrol teman- teman menjadi dua, pengontrol yang lebih kecil.
5. Dependency Injection & Controllers
Constructor Injection
Service container Laravel digunakan untuk menyelesaikan semua controller Laravel. Sebagai hasilnya, teman- teman dapat mengetik-petunjuk setiap dependensi yang mungkin dibutuhkan pengontrol dalam suatu konstruktornya. Ketergantungan yang dideklarasikan akan secara otomatis diselesaikan serta disuntikkan ke instance controller:
<?php
namespace App\Http\Controllers;
use App\Repositories\UserRepository;
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;
}
}
Teman- teman juga dapat mengetik-petunjuk kontrak Laravel. Jika container bisa mengatasinya, teman- teman bisa mengetik-isyarat itu. Bergantung pada aplikasi yang teman- teman buat, menyuntikkan dependensi ke dalam pengontrol mungkin dapat memberikan testability yang lebih baik.
Method Injection
Selain injeksi konstruktor, teman- teman juga dapat mengetikkan dependensi-petunjuk pada metode controller. Kasus penggunaan umum untuk injeksi metode adalah menyuntikkan suatu instance Illuminate\Http\Request ke metode controller:
Method Injection
Selain injeksi konstruktor, teman- teman juga dapat mengetikkan dependensi-petunjuk pada metode controller. Kasus penggunaan umum untuk injeksi metode adalah menyuntikkan suatu instance Illuminate\Http\Request ke metode controller:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$name = $request->name;
//
}
}
Jika metode controller kalian juga mengharapkan input dari parameter route, daftarkan argumen route kalian setelah dependensi yang lain. Misalnya, jika route teman- teman didefinisikan seperti itu:
Route::put('user/{id}', 'UserController@update');
Teman- teman masih dapat mengetikkan petunjuk Illuminate\Http\Request dan akses parameter id dengan mendefinisikan metode controller sebagai berikut:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* Update the given user.
*
* @param Request $request
* @param string $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
}
6. Route Caching
Route berdasarkan penutupan tidak bisa di-cache. Untuk menggunakan caching rute, teman- teman harus mengonversi route Penutupan ke kelas pengontrol.
Jika aplikasi yang teman- teman buat secara eksklusif menggunakan route berbasis pengontrol, teman- teman harus mengambil keuntungan dari cache route Laravel. Menggunakan cache route akan secara drastis mengurangi jumlah waktu yang diperlukan untuk mendaftarkan semua route aplikasi. Dalam beberapa kasus, pendaftaran route kalian mungkin bahkan hingga 100x lebih cepat. Untuk menghasilkan cache route, cukup jalankan rute:cache perintah Artisan seperti berikut:
php artisan route:cache
Setelah menjalankan perintah tersebut, maka file rute cache teman- teman akan dimuat pada setiap permintaan. Ingat, jika kalian menambahkan route baru apa pun, teman- teman perlu membuat cache route baru. Karena itu, teman- teman hanya harus menjalankan perintah route:cache selama penyebaran proyek.
Teman- teman dapat menggunakan rute:clear perintah untuk menghapus cache rute:
Teman- teman dapat menggunakan rute:clear perintah untuk menghapus cache rute:
php artisan route:clear
Mungkin sekian pembahasan yang dapat admin sampaikan mengenai controller pada framework laravel, mudah- mudahan artikel yang admin tulis dapat memberi pemahaman serta pengetahuan bagi bara pembaca.
Terimakasi telah berkunkung dan membaca artikel ini mengenai Belajar Controller Pada Framework Laravel Terbaru, Semoga bermanfaat -- Salam Success :)
By: Muhammad Rizal Supriadi