Skip to content

Latest commit

 

History

History
202 lines (139 loc) · 10.3 KB

controllers.md

File metadata and controls

202 lines (139 loc) · 10.3 KB

Controllers

Controller Dasar

Daripada mendefinisikan semua logika tingkat-rute Anda dalam sebuah file routes.php, Anda mungkin ingin mengatur perilaku ini menggunakan class-class Controller. Controller dapat mengelompokkan logika rute terkait ke dalam sebuah Class, serta mengambil keuntungan dari fitur yang lebih canggih seperti dependency injection otomatis.

Controller biasanya disimpan dalam direktori app/controllers, dan direktori ini secara asali terdaftar dalam opsi classMap pada file composer.json Anda.

Berikut adalah contoh sebuah class controller dasar

class UserController extends BaseController {

	/**
	 * Menampilkan profil dari user yang diberikan.
	 */
	public function showProfile($id)
	{
		$user = User::find($id);

		return View::make('user.profile', array('user' => $user));
	}

}

Semua controller harus meng-extend class BaseController. Class BaseController juga disimpan dalam direktori app/controllers, dan dapat digunakan sebagai tempat untuk meletakkan shared controller logic (logika yang sama yang digunakan pada beberapa controller). Class BaseController meng-extend class Controller dari framework. Sekarang, Kita dapat membuat rute ke controller ini dengan cara:

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

Jika Anda memilih untuk membuat controller bertingkat atau mengatur controller menggunakan namespace PHP, cukup menggunakan nama kelas yang memenuhi syarat ketika menentukan rute:

Route::get('foo', 'Namespace\FooController@method');

Anda juga dapat memberi nama pada rute controller:

Route::get('foo', array('uses' => 'FooController@method', 'as' => 'name'));

Untuk menghasilkan URL ke action dari sebuah controller, Anda dapat menggunakan metode URL::action:

$url = URL::action('FooController@method');

Anda dapat mengakses nama action dari controller yang dijalankan menggunakan metode currentRouteAction:

$action = Route::currentRouteAction();

Controller Filters

Filters dapat ditentukan pada rute controller yang mirip dengan rute "biasa":

Route::get('profile', array('before' => 'auth',
			'uses' => 'UserController@showProfile'));

Namun, anda juga dapat menentukan filters dari dalam controller:

class UserController extends BaseController {

	/**
	 * Instantiate a new UserController instance.
	 */
	public function __construct()
	{
		$this->beforeFilter('auth');

		$this->beforeFilter('csrf', array('on' => 'post'));

		$this->afterFilter('log', array('only' =>
							array('fooAction', 'barAction')));
	}

}

Anda juga dapat menentukan filter controller dalam satu baris menggunakan sebuah Closure:

class UserController extends BaseController {

	/**
	 * Instantiate a new UserController instance.
	 */
	public function __construct()
	{
		$this->beforeFilter(function()
		{
			//
		});
	}

}

Controller RESTful

Laravel memungkinkan Anda untuk dengan mudah mendefinisikan sebuah rute tunggal untuk menangani setiap action dalam controller menggunakan konvensi penamaan REST sederhana. Pertama, tentukan rute menggunakan metode Route::controller:

Mendefinisikan sebuah Controller RESTful

Route::controller('users', 'UserController');

Metode controller menerima dua argumen. Yang pertama adalah basis URI yang ditangani oleh controller, sedangkan yang kedua adalah nama class dari controller. Selanjutnya, tambahkan saja metode untuk controller, diawali dengan kata kerja HTTP yang mereka tanggapi:

class UserController extends BaseController {

	public function getIndex()
	{
		//
	}

	public function postProfile()
	{
		//
	}

}

Metode index akan merespon root URI yang ditangani oleh controller, yang, dalam hal ini, adalah users.

Jika action controller Anda berisi beberapa kata, Anda dapat mengakses action menggunakan sintaks "dash" di URI. Misalnya, action controller berikut pada UserController akan merespon URI users/admin-profile:

public function getAdminProfile() {}

Controller Resource

Controller Resource mempermudah untuk membangun controller RESTful di sekitar sumber daya. Sebagai contoh, Anda mungkin ingin membuat controller yang mengelola "Foto" yang disimpan oleh aplikasi Anda. Menggunakan perintah controller:create melalui CLI Artisan dan metode Route::resource, kita dapat dengan cepat membuat controller tersebut.

Untuk membuat controller melalui command line, eksekusi perintah berikut:

php artisan controller:make PhotoController

Sekarang kita dapat mendaftarkan rute resourceful ke controller tersebut:

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

Deklarasi rute tunggal ini menciptakan beberapa rute untuk menangani berbagai action-action REST pada resource photo. Demikian juga, controller yang dihasilkan sudah akan memiliki metode-metode terkait untuk masing-masing action ini dengan catatan yang memberitahukan Anda tentang URI dan kata kerja apa saja yang mereka menangani.

Action-action yang Ditangani oleh Resource Controller

Verb Path Action Route Name
GET /resource index resource.index
GET /resource/create create resource.create
POST /resource store resource.store
GET /resource/{id} show resource.show
GET /resource/{id}/edit edit resource.edit
PUT/PATCH /resource/{id} update resource.update
DELETE /resource/{id} destroy resource.destroy

Terkadang Anda mungkin hanya perlu untuk menangani subset action dari resource:

php artisan controller:make PhotoController --only=index,show

php artisan controller:make PhotoController --except=index

Dan, Anda juga dapat menentukan subset dari action untuk menangani rute:

Route::resource('photo', 'PhotoController',
				array('only' => array('index', 'show')));

Route::resource('photo', 'PhotoController',
				array('except' => array('create', 'store', 'update', 'delete')));

Menangani Metode-Metode yang Hilang

Sebuah metode catch-all dapat didefinisikan yang nantinya akan dipanggil ketika tidak ada metode lain yang cocok ditemukan pada controller yang diberikan. Metode ini harus dinamai missingMethod, dan menerima parameter bertipe array sebagai satu-satunya argumen:

Defining A Catch-All Method

public function missingMethod($parameters)
{
	//
}