2013-08-20 41 views
23

Có ai biết cách nào trong Laravel 4 kết hợp 2 dòng này thành một không?Cách định tuyến GET và POST cho cùng một mẫu trong Laravel?

Route::get('login', '[email protected]'); 
Route::post('login', '[email protected]'); 

Vì vậy, thay vì phải viết cả bạn chỉ phải viết một vì cả hai sử dụng phương pháp 'cùng' của họ mà còn là URL vẫn như site.com/login thay vì chuyển hướng sang site.com/auth/login?

tôi tò mò vì tôi nhớ CI có cái gì đó như là nơi mà các URL vẫn giữ nguyên và bộ điều khiển không bao giờ hiển thị:

$route['(method1|method2)'] = 'controller/$1'; 

Trả lời

7

Bạn có thể thử như sau:

Route::controller('login','AuthController'); 

Sau đó, trong bạn AuthController class thực hiện các phương pháp:

public function getIndex(); 
public function postIndex(); 

Nó sẽ làm việc;)

+3

Lưu ý từ tương lai: [bộ điều khiển ngầm không được sử dụng trong Laravel 5.2 và sẽ bị xóa trong tương lai] (http://benjaminkohl.com/post/implicit-controller-routing-is-deprecated-in-laravel-5-2). – jojonas

16

Bạn có thể kết hợp tất cả các động từ HTTP cho một tuyến đường sử dụng:

Route::any('login', '[email protected]'); 

Điều này sẽ khớp với cả hai động từ HTTP GETPOST HTTP. Và nó cũng sẽ khớp với PUT, PATCH & DELETE.

+0

Làm cách nào bạn kiểm tra xem động từ là 'GET' hay 'POST'? – enchance

+0

Bạn luôn có thể sử dụng '$ _SERVER ['REQUEST_METHOD'] === 'POST'', nhưng tôi sẽ không khuyên bạn nên kết hợp trong một hành động hai logic ... ý tưởng với bộ điều khiển là ** tách logic ** trong kết hợp với mẫu Nhận-Chuyển hướng-Nhận. Mất 2 hoặc 3 phút để đọc chủ đề cụ thể này: https://github.com/laravel/laravel/pull/1517. –

+0

@enchance, bạn có thể kiểm tra là nó 'GET' hoặc 'POST' với: ' if (Yêu cầu :: isMethod (' bài ')) ' ' {' ' // ... ' '} ' – Sid

0

Phải, tôi đang trả lời bằng điện thoại di động của mình và vì vậy tôi chưa thử nghiệm (nếu tôi nhớ chính xác, nó cũng không có trong tài liệu). Ở đây đi:

Route::match('(GET|POST)', 'login', 
    '[email protected]' 
); 

Điều đó cần thực hiện thủ thuật. Nếu không, thì Taylor đã lấy nó ra khỏi lõi; điều đó có nghĩa là không ai sử dụng nó.

3
Route::match(array('GET', 'POST', 'PUT'), "/", array(
    'uses' => '[email protected]', 
    'as' => 'index' 
)); 
35

Các tài liệu nói ...

Route::match(array('GET', 'POST'), '/', function() 
{ 
    return 'Hello World'; 
}); 

nguồn: http://laravel.com/docs/routing

+1

Câu trả lời này chính xác hơn. –

+1

Nó phải là câu trả lời đúng. – felipsmartins

+2

Tôi xin lỗi nhưng làm thế nào điều này nhận được rất nhiều upvotes? Có, nó giải thích cách bạn sử dụng cả GET và POST nhưng không nói gì về cách gọi các phương thức khác nhau tùy thuộc vào loại yêu cầu. – lennard

6
Route::any('login', '[email protected]'); 

và trong điều khiển:

if (Request::isMethod('post')) 
{ 
// ... this is POST method 
} 
if (Request::isMethod('get')) 
{ 
// ... this is GET method 
} 
... 
+0

Đây là câu trả lời hay hơn. Cảm ơn – kikuyu1

12

Xem mã dưới đây.

Route::match(array('GET','POST'),'login', '[email protected]'); 
+0

Câu trả lời duy nhất để trả lời đúng câu hỏi. – myol

1

Trong laravel 5.1 này có thể đạt được bởi bộ điều khiển ngầm. thấy những gì tôi tìm thấy từ các tài liệu laravel

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

Tiếp theo, chỉ cần thêm phương pháp để điều khiển của bạn. Tên phương thức nên bắt đầu bằng động từ HTTP mà chúng phản hồi theo sau là phiên bản tiêu đề của URI:

<?php 

namespace App\Http\Controllers; 

class UserController extends Controller 
{ 
    /** 
    * Responds to requests to GET /users 
    */ 
    public function getIndex() 
    { 
     // 
    } 

    /** 
    * Responds to requests to GET /users/show/1 
    */ 
    public function getShow($id) 
    { 
     // 
    } 

    /** 
    * Responds to requests to GET /users/admin-profile 
    */ 
    public function getAdminProfile() 
    { 
     // 
    } 

    /** 
    * Responds to requests to POST /users/profile 
    */ 
    public function postProfile() 
    { 
     // 
    } 
}