2016-03-16 14 views
11

Ho già pagine Web di Laravel in cui è possibile aggiungere/aggiornare/eliminare/leggere i record dal database MySQL. La versione di Laravel è 5.2.15Interazione dell'app Android con i metodi di azione di Laravel

Ora, devo integrare Database con App Android. Per farlo devo pubblicare e leggere Json Data.

Qui la domanda è: dovrei avere 2 metodi di azione pubblica? In primo luogo per la pagina web che mostrerà i record sulla pagina web e la seconda restituirà i dati JSON in Android.

Intendevo, quando restituisco i dati a webPage..Io dovrò scrivere il codice seguente.

return View("View-Path", array("Data" => $Data)); 

ma in caso di App Android, dovrò richiedere Json Data.

Si prega di suggerire il giusto approccio.

+0

Non ho dimestichezza con laravel ma ho creato 2 app per Android che eseguono il seeding con webservice (php). La mia scelta è webservice grazie a 2 app diverse che utilizzano 2 tipi di dati diversi dallo stesso pool di dati. (Mysql per app Web, xml per app Android) – HddnTHA

+0

la tua app è solo online o può funzionare anche offline? –

+0

funzionerà solo online. – Pankaj

risposta

2

Si dovrebbe sviluppare un API semplice per accedere ai dati di APP da un client Android:

Itinerari

Prima di tutto è necessario creare alcuni percorsi specifici per l'API attraverso la quale servirai i dati in formato JSON

autenticazione

Le rotte dell'API devono gestire l'autenticazione in un modo diverso rispetto a quello che stai facendo ora: non puoi utilizzare il classico approccio basato sulla sessione. Invece devi usare un approccio base o token. Hai diverse alternative, questi sono alcuni dei più utilizzati (dalle più semplici, per il più complicato)

Laravel HTTP Basic Authentication

Laravel Json Web Token Authentication

Laravel OAUTH2

dati Acess

Una volta impostati i percorsi e l'autenticazione, devi servire i tuoi dati tramite le rotte API. Poiché utilizzi gli stessi dati nelle rotte APP e nelle rotte API, puoi racchiudere la logica della creazione e del recupero dei dati nei servizi e utilizzare i servizi per ottenere i dati sia nelle rotte APP che nelle rotte API.

Utilizzando diversi controller per API e App percorsi, si dispone:

//APP Controller method for route: www.app.com/app-route/users 
public function getUsers() 
{ 
    //wrap the logic to build the data inside the service 
    $service = App::make('your_service'); 

    //once is ready, get the built data from the service 
    $data = $service->getData(); 

    return View("View-Path", array("Data" => $data)); 
} 

//API Controller method for route: www.app.com/api/users 
public function getUsers() 
{ 
    //use the same service to build and get the data you need 
    $service = App::make('your_service'); 

    $data = $service->getData(); 

    return response()->json($data); 
} 

In questo modo è possibile:

  • costruzione dei dati Incapsula e retrieveng nel settore dei servizi, in modo che don' t hanno la necessità di duplicare il codice per il recupero dei dati tra le rotte APP e API

  • Sono diversi c ontroller per accedere alle rotte APP o API; in modo da poter ottenere i dati, trasformarlo come avete bisogno e servono a entrambi i punti di vista o client API

Informazioni sulla classe di servizio

Per quanto riguarda la classe di servizio ho già detto, potrebbe essere semplicemente una o più classi wrapper che usi sia nei controller API e APP per creare e ottenere i dati senza codice di ripetizione. La struttura di tali classi dipende da come funziona la tua app.

Per esempio supponiamo che devi calcolare alcuni dati per il progetto di ogni utente, conservarlo in una variabile e poi inviarlo al viev:

public function getUsers($request) 
{ 
    $user = Users::with('projects')->find($request->user_id)->get(); 

    $data = []; 
    foreach ($user->projects as $p) 
    { 
     //compute some data you need and store it in $data; 
    } 

    return View("View-Path", array("Data" => $data)); 
} 

Ora, se vuole fare la stessa cosa nel API controller, è necessario ripetere questo codice per ottenere i progetti e creare i dati. Per evitare questo, si potrebbe 'avvolgere' l'accesso ai dati in una classe di servizio, e utilizzare la stessa classe di regolatori boh:

La classe di servizio

public class UserDataBuilder 
{ 
    protected $user; 

    public function setUser(Authenticatable $user) 
    { 
     $this->user = $user; 
    } 

    public function getData() 
    { 

     $user = Users::with('projects')->find($this-user->id)->get(); 

     $data = []; 
     foreach ($user->projects as $p) 
     { 
      //compute some data you need and store it in $data; 
     } 

     return $data; 
    } 

} 

e utilizzare la stessa classe in entrambe le API Controller APP:

//APP controller: get the data and pass to the view 
public function getUsers($request) 
{   
    $service = App::make(UserDataBuilder::class); 
    $service->setUser(User::find($request->user_id)->get()); 

    return View("View-Path", array("Data" => $service->getData()); 
} 

//API controller: get the data and convert to JSON 
public function getUsers($request) 
{  
    $service = App::make(UserDataBuilder::class); 
    $service->setUser(User::find(1)->get()); 

    return response()->json($data); 
} 
+0

Avete qualche link che spiega esaurientemente su '$ service = App :: make ('your_service');'? Avete qualche link che spiega l'utilizzo della creazione e l'invio di token dal sito Web e da Android all'API? – Pankaj

+0

@PankajGarg: '$ servizio' è una classe generica di alto livello che dovresti creare per avvolgere il recupero dei dati per un'azione determinata: non esiste alcun collegamento su di esso, poiché dovresti crearlo in base alla tua architettura. Non ho alcun link specifico per l'autenticazione token, ma puoi facilmente trovare informazioni cercando su google. Oppure, una volta che hai una domanda più specifica, cerca o chiedi allo stack overflow – Moppo

+0

Devo sviluppare un'API all'interno dello stesso progetto o di un altro progetto? – Pankaj

0

Per Android è necessario scrivere un servizio Web separato.

+2

Puoi descriverlo in maggiori dettagli con un esempio? Sembra più un commento. – Pankaj

0

È possibile utilizzare un metodo per farlo. Esempio

public function someMethod(Request $request){ 

    $Data = ['laravel','is','awesome']; 

    // If the request has the content type is json return a json response 
    // So you android request will be true for this request 
    // else return data to webpage 
    if($request->isJson()){ 
     return response()->json($Data); 
    } 

    return View("View-Path", array("Data" => $Data)); 

} 
+0

qui il problema è che tutti i miei URL sono protetti tramite auth Middleware e la maggior parte di essi ha anche l'autorizzazione dell'amministratore Middleware implementata in modo tale che quando invierò la richiesta utilizzando una particolare Route ... Avrò solo la Pagina di accesso. – Pankaj

+0

Creare un altro gruppo di route con un prefisso e un middleware API ma punta alla stessa risorsa – oseintow

+0

In ogni metodo, restituisco View with Data, ma nel mio caso, devo solo restituire 'json'. Quindi, come posso fare un uso comune dei dati? – Pankaj