Laravel - Route :: resource vs Route :: controller

144

Saya membaca dokumen di situs web Laravel, Stack Overflow, dan Google tetapi masih tidak memahami perbedaan antara Route::resourcedan Route::controller.

Salah satu jawaban mengatakan Route :: resource adalah untuk crud. Akan tetapi, dengan Route :: controller kita dapat melakukan hal yang sama seperti Route :: resource dan kita hanya dapat menentukan tindakan yang diperlukan.

Mereka tampak seperti saudara kandung:

Route::controller('post','PostController');
Route::resource('post','PostController');

Bagaimana kita bisa memilih apa yang akan digunakan? Apakah praktik yang baik itu?

Sonique
sumber
12
Hanya catatan untuk pengguna Laravel 5.2, sementara pengontrol implisit sudah tidak digunakan lagi.
Roy

Jawaban:

296

Pengontrol Sumber Daya RESTful

Sebuah tenang pengontrol sumber daya set up beberapa rute default untuk Anda dan bahkan nama-nama mereka.

Route::resource('users', 'UsersController');

Memberi Anda rute bernama ini:

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

Dan Anda akan mengatur pengontrol Anda seperti ini (tindakan = metode)

class UsersController extends BaseController {

    public function index() {}

    public function show($id) {}

    public function store() {}

}

Anda juga dapat memilih tindakan apa yang disertakan atau dikecualikan seperti ini:

Route::resource('users', 'UsersController', [
    'only' => ['index', 'show']
]);

Route::resource('monkeys', 'MonkeysController', [
    'except' => ['edit', 'create']
]);

Dokumentasi RESTful Resource Controller


Pengontrol implisit

Sebuah kontroler implisit lebih fleksibel. Anda akan dialihkan ke metode pengontrol Anda berdasarkan jenis dan nama permintaan HTTP. Namun, Anda tidak memiliki nama rute yang ditentukan untuk Anda dan itu akan menangkap semua subfolder untuk rute yang sama.

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

Akan mengarahkan Anda untuk menyiapkan pengontrol dengan semacam skema penamaan RESTful:

class UserController extends BaseController {

    public function getIndex()
    {
        // GET request to index
    }

    public function getShow($id)
    {
        // get request to 'users/show/{id}'
    }

    public function postStore()
    {
        // POST request to 'users/store'
    }

}

Dokumentasi Pengontrol Implisit


Ini adalah praktik yang baik untuk menggunakan apa yang Anda butuhkan, sesuai preferensi Anda. Saya pribadi tidak menyukai pengontrol implisit , karena dapat berantakan, tidak memberikan nama, dan dapat membingungkan saat digunakan php artisan routes. Saya biasanya menggunakan pengontrol RESTful Resource dalam kombinasi dengan rute eksplisit.

ryanwinchester
sumber
1
Jika kita menggunakan beberapa rute Sumber Daya (mungkin indeks, tampilkan) mengapa tidak menggunakan rute statis Route :: get (...)? Saya pikir itu tidak lebih baik tidak lebih buruk daripada menggunakan array ('only' => array ('index', 'show'). Dan metode apa yang digunakan untuk kontroler RESTFull ketika kita meminta sesuatu seperti 'user / 123', getIndex () berfungsi untuk 'user /' tetapi dengan user / 123 saya mendapatkan error NotFoundHttpException (mencoba nama berbeda getView dan lainnya, hanya berfungsi saat dideklarasikan sebagai Controller @ getView)?
Sonique
Dapatkah seseorang menjelaskan untuk apa 'resource.edit' itu? Ini adalah metode GET, jadi saya berasumsi bahwa ini seharusnya memberikan informasi lengkap tentang sumber daya, bukan hanya informasi terbatas melalui 'resource.show'?
Anthony
1
@Anthony - resource.editmenampilkan tampilan edit, pada dasarnya, formulir untuk mengedit sumber daya yang ada.
ryanwinchester
@fungku Itu menarik .. jadi maksudmu resource.edit sebenarnya akan mengembalikan HTML daripada JSON?
Anthony
2
@Anthony Umumnya, (dan sejauh yang saya tahu) ya. resource.editdan resource.createbiasanya untuk UI ... menampilkan tampilan dengan bentuk HTML. Formulir tersebut akan PUT / POST ke resource.updatedan resource.storemasing - masing. Jika Anda tidak melakukan itu, maka Anda dapat mengabaikannya dan menyingkirkan metode edit () dan create () di pengontrol Anda.
ryanwinchester
3

Untuk metode pengontrol rute kita harus mendefinisikan hanya satu rute. Dalam metode get atau post kita harus mendefinisikan rute secara terpisah.

Dan metode sumber daya digunakan untuk membuat beberapa rute untuk menangani berbagai tindakan Restful.

Berikut dokumentasi Laravel tentang ini.

Ahmad Sharif
sumber