D'accord, j'ai donc une situation suivante:
Le système que je construis récupère des données à partir d'une API REST et enregistre ces données dans une base de données. (contrôleur, modèle, etc.)? Laravel possède-t-il un mécanisme intégré pour récupérer des données à partir de sources externes?
Vous devez d'abord créer des itinéraires dans votre app/routes.php
/*
API Routes
*/
Route::group(array('prefix' => 'api/v1', 'before' => 'auth.basic'), function()
{
Route::resource('pages', 'PagesController', array('only' => array('index', 'store', 'show', 'update', 'destroy')));
Route::resource('users', 'UsersController');
});
Remarque: Si aucune authentification n'est requise pour l'appel d'API, vous pouvez supprimer 'before' => 'auth.basic'
Ici, vous pouvez accéder à index, store, show, update and destroy
méthodes de votre PagesController
.
Et les URL de demande seront,
GET http://localhost/project/api/v1/pages // this will call index function
POST http://localhost/project/api/v1/pages // this will call store function
GET http://localhost/project/api/v1/pages/1 // this will call show method with 1 as arg
PUT http://localhost/project/api/v1/pages/1 // this will call update with 1 as arg
DELETE http://localhost/project/api/v1/pages/1 // this will call destroy with 1 as arg
La requête CURL en ligne de commande sera comme ceci (ici le nom d'utilisateur et le mot de passe sont admin
) et suppose que vous avez .htaccess
fichier à supprimer index.php
de l'url,
curl --user admin:admin localhost/project/api/v1/pages
curl --user admin:admin -d 'title=sample&slug=abc' localhost/project/api/v1/pages
curl --user admin:admin localhost/project/api/v1/pages/2
curl -i -X PUT --user admin:admin -d 'title=Updated Title' localhost/project/api/v1/pages/2
curl -i -X DELETE --user admin:admin localhost/project/api/v1/pages/1
Ensuite, vous avez deux contrôleurs nommés PagesController.php
et UsersController.php
dans votre app/controllers
dossier.
Le PagesController.php,
<?php
class PagesController extends BaseController {
/**
* Display a listing of the resource.
*
* @return Response
* curl --user admin:admin localhost/project/api/v1/pages
*/
public function index() {
$pages = Page::all();;
return Response::json(array(
'status' => 'success',
'pages' => $pages->toArray()),
200
);
}
/**
* Store a newly created resource in storage.
*
* @return Response
* curl --user admin:admin -d 'title=sample&slug=abc' localhost/project/api/v1/pages
*/
public function store() {
// add some validation also
$input = Input::all();
$page = new Page;
if ( $input['title'] ) {
$page->title =$input['title'];
}
if ( $input['slug'] ) {
$page->slug =$input['slug'];
}
$page->save();
return Response::json(array(
'error' => false,
'pages' => $page->toArray()),
200
);
}
/**
* Display the specified resource.
*
* @param int $id
* @return Response
* curl --user admin:admin localhost/project/api/v1/pages/2
*/
public function show($id) {
$page = Page::where('id', $id)
->take(1)
->get();
return Response::json(array(
'status' => 'success',
'pages' => $page->toArray()),
200
);
}
/**
* Update the specified resource in storage.
*
* @param int $id
* @return Response
* curl -i -X PUT --user admin:admin -d 'title=Updated Title' localhost/project/api/v1/pages/2
*/
public function update($id) {
$input = Input::all();
$page = Page::find($id);
if ( $input['title'] ) {
$page->title =$input['title'];
}
if ( $input['slug'] ) {
$page->slug =$input['slug'];
}
$page->save();
return Response::json(array(
'error' => false,
'message' => 'Page Updated'),
200
);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return Response
* curl -i -X DELETE --user admin:admin localhost/project/api/v1/pages/1
*/
public function destroy($id) {
$page = Page::find($id);
$page->delete();
return Response::json(array(
'error' => false,
'message' => 'Page Deleted'),
200
);
}
}
Ensuite, vous avez un modèle nommé Page
qui utilisera la table nommée pages
.
<?php
class Page extends Eloquent {
}
Vous pouvez utiliser les générateurs Laravel4 pour créer ces ressources à l'aide de php artisan generator
commande. Lisez ici .
Donc, en utilisant ce regroupement de routes, vous pouvez utiliser la même application pour faire une demande d'API et en tant que frontal.
Edit: Buzz n'a pas été mis à jour depuis plus d'un an, il est recommandé d'utiliser maintenant Guzzle =, voir Mohammed Safeer réponse.
J'ai utilisé package Buzz afin de faire des requêtes API.
Vous pouvez ajouter ce package en l'ajoutant à la section require
de votre composer.json
fichier.
{
require: {
"kriswallsmith/buzz": "dev-master"
}
}
Exécutez ensuite composer update
pour l'installer.
Ensuite, dans Laravel vous pouvez l'encapsuler dans une classe (peut-être une classe de type référentiel) qui gère la demande d'API et le retour des données à utiliser par votre application.
<?php namespace My\App\Service;
class SomeApi {
public function __construct($buzz)
{
$this->client = $buzz;
}
public function getAllWidgets()
{
$data = $this->client->get('http://api.example.com/all.json');
// Do things with data, etc etc
}
}
Remarque: il s'agit d'un pseudocode. Vous aurez besoin de créer une classe qui fonctionne pour vos besoins, et de faire toute injection de dépendance ou architecture de code que vous voulez/besoin.
Comme l'a souligné @Netbulae, un référentiel peut vous aider. Le article qu'il a lié est un excellent point de départ. La seule différence entre l'article et ce que fera votre code est qu'au lieu d'utiliser un modèle Eloquent pour obtenir vos données de votre base de données, vous effectuez une demande d'API et transformez le résultat en un ensemble de tableaux/objets que votre application peut utilisation (Essentiellement, seul le stockage des données est différent, ce qui est l'un des avantages de se soucier d'une classe de référentiel en premier lieu).
Nous pouvons utiliser le paquet Guzzle dans Laravel, c'est un client HTTP PHP pour envoyer des requêtes HTTP.
Vous pouvez installer Guzzle via le compositeur
composer require guzzlehttp/guzzle:~6.0
Ou vous pouvez spécifier Guzzle comme une dépendance dans le fichier composer.json existant de votre projet
{
"require": {
"guzzlehttp/guzzle": "~6.0"
}
}
Exemple de code dans laravel 5 utilisant Guzzle comme indiqué ci-dessous,
use GuzzleHttp\Client;
class yourController extends Controller {
public function saveApiData()
{
$client = new Client();
$res = $client->request('POST', 'https://url_to_the_api', [
'form_params' => [
'client_id' => 'test_id',
'secret' => 'test_secret',
]
]);
$result= $res->getBody();
dd($result);
}
Vous pouvez choisir quoi utiliser:
file_get_contents:
$json = json_decode(file_get_contents('http://Host.com/api/v1/users/1'), true);
Essayez de consulter les manuels de l'API externe. Vous y trouverez des informations sur la façon de récupérer des informations.
Ensuite, le meilleur plan est de construire une interface. Vérifiez ceci: http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/
C'est à vous de voir comment vous utilisez php pour résoudre ce problème.