2015-08-07 13 views
9

Mobil uygulamalar için web ve api için bir Laravel 5.1 uygulaması yapmak istiyorum. Json'u api isteği için döndürmek ve web tarayıcısı için görüntülemek istiyorum. Şu anda farklı rotaları ve farklı kontrol cihazları kurdum. Bu yaklaşımda kodu tekrar ediyorum. Bu mimariyi tasarlamanın en iyi yaklaşımı nedir bilmiyorum. Ayrıca, web tarayıcısı için angular.js'yi kullanmanızı öneren birkaç benzer konudan geçtim.Web istemcisi ve yerel mobil uygulamalar için laravel 5.1 uygulaması nasıl tasarlanır

// web controller 
Route::resource('product', 'ProductController'); 

// api controller 
Route::group(['prefix' => 'api'], function() { 
    Route::resource('product', 'APIProductController'); 
}); 
+0

Buranın laravelde uygulanabilir olduğunu bilmiyorum, fakat verilen amaç için Rubyonrails'de gruplar/ad alanları oluşturabiliriz. Bu http://laravel-tricks.com/tricks/route-group-namespacing kontrol edin –

cevap

1

Tek yön content negotiation yaklaşımını kullanmak olacaktır. Üstbilgiyi Accept: application/json geçirip ardından uygulamanız json biçimlendirilmiş yanıtı döndürürdü. Ancak bazı proxy sunucuları içerik anlaşmasına uymaz, ardından uygulamanız bozulur (Drupal'ın neden içerik anlaşmasını düşürdüğünü daha fazla okuyabilirsiniz. here).

Route::get('/api/product', ['as' => 'product', function(){ 
    return App::make('ProductController')->index('json'); 
}]); 

public function index($format) { 
    // Your controller code 

    if ($format == 'json') { 
     // return JSON 
    } 

    // return HTML 
} 

Veya URI doğrudan ayrıştırmak ve eğer görebilirsiniz: /api/product?format=json

Ayrıca Sen /api aramalardan değişken geçirebilirsiniz:

başka olasılık tu örneğin, istenen biçimi dönmek için bazı GET değişken kullanın edilir /API ile başlar (önerilmez). Seçeneklerim içerik müzakeresi veya format GET değişkeni olurdu.

+0

Peki, bu şekilde kesmek olabilir, ama daha iyi bir mimariyi tasarlamaya odaklanarak mümkün olduğunca düzgün bir şekilde yapmak istiyorum – Ashish

+0

Deneme dingo/api düzgün ve kimlik doğrulama yöntemlerinin çoğunu sürümleri destekler. – astroanu

2

Sen 2 temel yaklaşım olabilir:

  • ayrı yolları ve denetleyicileri tutun, ama bir hizmete tüm ortak kontrolörün kodunu taşıyın. Bu, muhtemelen en temiz ve en esnek çözümdür, çünkü API ve web yöntemlerini gelecekte bağımsız olarak güncellemeyi çok kolaylaştırır.
  • Ya da api ve web isteklerini aynı denetleyiciye yönlendirebilir, İstek nesnesini içine aktarabilir ve ardından bazı istek özelliklerine göre hangi yanıtın döndürüleceğine karar verebilirsiniz, json veya html. 2 yaklaşım için

örneğin şöyle yapabilirsiniz:

// web controller 
Route::resource('product', 'ProductController'); 

// api controller 
Route::group(['prefix' => 'api'], function() { 
    Route::resource('product', 'ProductController'); 
}); 

// and in the ProductController you have 
public function index(Request $request) 
{ 
    // do some stuff... 

    if ($request->segment(1) === 'api') { // route prefix was api 
     // return json 
    } else { 
     // return the view 
    } 
} 

Ayrıca Accept: başlığına kontrol etmek $ request-> wantsJson() yöntemini kullanabilir veya özel bir GET geçebileceği @Bogdan Kuštan tarafından önerildiği gibi, yanıt formatını tanımlamak için tüm API çağrıları ile değişken (ör. ?_format=json) json olmalıdır. IMHO, URL'leriniz üzerinde zaten bir api öneki kullanıyorsanız, bunu kontrol etmek için daha güvenilir ve daha temizdir.

+0

Teşekkürler @ivanhoe. Ben orada ortak mantığı hareket ettirerek, depo tasarım deseni kullanıyorum. Denetleyicide, arabirime ipucu ve ortak yöntemlere erişme yazın. – Ashish

İlgili konular