#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:AppHttpControllers
AppHttpControllers
AppHttpControllersPhotosAdminController
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::resource
parameters
parameters
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::resource
create
edit
Route::resourceVerbs
boot
AppServiceProvider
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::resource
resource
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: IlluminateHttpRequest
id
<?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