2015-07-23 29 views
8

Tôi đang phát triển một API bằng cách sử dụng Laravel để sử dụng với một ứng dụng di động và có một số vấn đề với tuyến đường mô hình ràng buộc trên các tuyến đường lồng nhau. Ứng dụng sẽ có một db sqlite độc ​​lập sẽ đồng bộ hóa hành trình của khách hàng với máy chủ trung tâm khi mạng khả dụng. Vì lý do đó, PK trong ứng dụng không thể được sử dụng để truy cập vào các bản ghi trên máy chủ trung tâm. Mỗi người dùng sẽ có một tên người dùng độc đáo này sẽ được lưu trữ trên máy chủ trung tâm trong một bảng với các cột sau:Laravel lồng nhau mô hình tuyến đường ràng buộc

  • user_id
  • tên

Bảng cuộc hành trình sau đó sẽ có các cột sau:

  • j ourney_id
  • user_id
  • user_journey_id

nơi user_journey_id sẽ là PK của hồ sơ hành trình trên thiết bị của khách hàng. Ý tưởng là khách hàng có thể truy cập api bằng một cái gì đó như: http://example.com/api/client/UNIQUE_USERNAME/journey/1234 để truy xuất hành trình từ máy chủ trung tâm.

tôi có các thiết lập nguồn sau:

Route::resource('client','ClientController'); 
Route::resource('client.journey','JourneyController'); 

và có mô hình tuyến đường thiết lập ràng buộc thành công cho khách hàng như sau:

$router->bind('client', function($value, $route) { 
    return \App\Client::where('username', '=', $value)->firstOrFail(); 
}); 

Tôi đang gặp một chút rắc rối với việc thiết lập các mô hình lồng nhau ràng buộc khi tôi yêu cầu khách hàng username kết hợp với user_journey_id để truy lục hành trình chính xác. Có cách nào để làm điều này với mô hình tuyến đường ràng buộc?
Hoặc nên điều này chỉ được thực hiện trong bộ điều khiển với một số như:

public function show(Client $client, $user_journey_id) 
{ 
    ... // have logic here to get the journey. 

Đây là cách tôi làm điều đó hiện nhưng mô hình tuyến đường liên kết chắc chắn sẽ làm cho nó một chút dễ dàng hơn.

+0

Thay vì sử dụng tên người dùng, bạn không thể chỉ sử dụng user_id để bạn không phải lồng ghép mô hình? – Billy

Trả lời

0

Tôi nghĩ rằng cách tiếp cận của bạn không tốt và bạn sẽ kết thúc bằng cách sử dụng bộ điều khiển riêng cho điều này, vì bạn có thể cần phải thêm một lớp auth trong tương lai hoặc một chức năng khác.

Có tên người dùng là URL không tốt vì nó có thể là chuỗi có các ký tự đặc biệt sẽ được mã hóa URL, sau đó được giải mã, do đó dễ bị lỗi. Tôi muốn đề nghị sử dụng các id vì nó là một API.

Tài nguyên sẽ gọi một phương thức cụ thể cho từng hành động được yêu cầu, tôi khuyên bạn nên sử dụng các phương pháp đó.

2

Ràng buộc nhiều tham số URL vào mô hình chắc chắn có thể có trong Laravel, như là mô hình liên kết lồng nhau lồng nhau.Một báo trước là bạn cần xác định các tuyến riêng rẽ cho các tuyến đường cụ thể này, thay vì sử dụng các trình điều khiển tài nguyên của Laravel như bạn đã sử dụng trong ví dụ của mình.

Để đăng ký một con đường với nhiều hơn một mô hình liên kết bạn sẽ cần phải làm một cái gì đó như thế này:

Định nghĩa đường:

Route::get('/api/client/{user}/journey/{journey}', [ 
    'as' => 'client.journey', 
    'uses' => '[email protected]' 
]); 

Các định nghĩa ràng buộc:

$router->bind('user', function($value, $route) { 
    return \App\Client::where('username', '=', $value)->firstOrFail(); 
}); 

$router->bind('journey', function($value, $route) { 
    return \App\Journey::where('user_journey_id', '=', $value)->firstOrFail(); 
}); 

Sau đó, bạn sẽ thấy rằng cả hai mô hình đang được giải quyết và được tiêm vào phương thức hành động trong lớp điều khiển:

public function show(User $user, Journey $journey) 
{ 
    //do whatever you need to do here... 

Hạn chế thực sự duy nhất của phương pháp này là bạn phải định nghĩa các tuyến bằng tay thay vì sử dụng các bộ điều khiển tài nguyên tiện dụng của Laravel. Tất nhiên, bạn có thể thực hiện một số hợp lý của riêng bạn để làm cho các loại tuyến đường này dễ dàng hơn cho bạn để xác định.

Các vấn đề liên quan