Intereting Posts
Как получить и отобразить самые большие значения из базы данных? mysql_fetch_array добавить все строки? Как я могу присоединиться к трем таблицам с помощью MYSQLi? заменить любой URL-адрес в строке текста, на интерактивные ссылки с php Какова цель дополнительных звездочек в комментариях php? Как я могу получить строку между двумя символами ? PHP доктрина 2.2 и кодифицирующий код 2.1 как получить противоположные результаты по запросу Laravel PHP mail: все электронные письма получены в папке SPAM Задайте значение переменной в одной функции и используйте в других функциях при вызове непосредственно из ссылки в codeigniter Невозможно заполнить выпадающий список цепочек с помощью Ajax и Javascript Aspect mock 'Go \ ParserReflection \ ReflectionFile' не найден Как перечислить все элементы во вложенной таблице в Laravel PHP отключает работу функции с помощью пути? jQuery ajax возвращает ошибку 404 при передаче URL в качестве почтовых данных

Laravel извлекает данные из REST API

Хорошо, поэтому у меня есть следующая ситуация:

Система, которую я создаю, – это получение данных из REST api и сохранение этих данных в базе данных. Мне интересно, как это можно реализовать и где такое поведение будет происходить в смысле структуры Laravels (контроллер, модель и т. Д.)? У Laravel есть встроенный механизм для извлечения данных из внешних источников?

Сначала вы должны сделать маршруты в своем 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'); }); 

Примечание. Если вы не требуете аутентификации для вызова API, вы можете удалить 'before' => 'auth.basic'

Здесь вы можете получить доступ к методам index, store, show, update and destroy с помощью вашего PagesController .

И запросы запроса будут,

 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 

Запрос командной строки CURL будет таким (здесь имя пользователя и пароль – admin ) и предполагает, что у вас есть файл .htaccess для удаления index.php из 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 

Затем у вас есть два контроллера с именем PagesController.php и UsersController.php в UsersController.php вашего app/controllers .

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 ); } } 

Затем у вас есть модель с именем « Page которая будет использовать таблицы с именами.

 <?php class Page extends Eloquent { } 

Вы можете использовать генераторы Laravel4 для создания этих ресурсов с помощью команды php artisan generator . Читайте здесь .

Таким образом, используя эту группировку маршрутов, вы можете использовать одно и то же приложение для запроса API и в качестве интерфейса.

Изменить: Buzz не обновлялся более года, рекомендуется использовать Guzzle , см . Ответ Мохаммеда Сейфера .


Я использовал пакет Buzz для выполнения запросов API.

Вы можете добавить этот пакет, добавив его в раздел require в файле composer.json .

 { require: { "kriswallsmith/buzz": "dev-master" } } 

Затем запустите composer update для composer update чтобы установить его.

Затем в Laravel вы можете обернуть его в класс (возможно, похожий на репозиторий класс), который обрабатывает запрос API и возвращает данные для вашего приложения.

 <?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 } } 

Примечание. Это псевдокод. Вам нужно будет создать класс, который будет работать для ваших нужд, и сделать какую-либо причудливую инъекцию или кодовую архитектуру, которая вам нужна / нужна.

Как отметил @Netbulae, вам может помочь репозиторий. Статья, которую он связал, – отличное место для начала. Единственная разница между статьей и тем, что будет делать ваш код, заключается в том, что вместо использования модели Eloquent для получения ваших данных из вашей базы данных вы делаете запрос API и преобразуете результат в набор массивов / объектов, которые могут применяться вашим приложением (По сути, только хранилище данных отличается, что является одним из преимуществ, связанного с классом репозитория, в первую очередь).

Мы можем использовать пакет Guzzle в Laravel, это HTTP-клиент PHP для отправки HTTP-запросов.

Вы можете установить Guzzle через композитор

 composer require guzzlehttp/guzzle:~6.0 

Или вы можете указать Guzzle как зависимость от существующего в вашем проекте композитора.json

 { "require": { "guzzlehttp/guzzle": "~6.0" } } 

Пример кода в laravel 5 с использованием Guzzle, как показано ниже,

 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); } 

Вы можете выбрать, что использовать:

  1. пропивать
  2. CURL
  3. file_get_contents:

     $json = json_decode(file_get_contents('http://host.com/api/v1/users/1'), true); 

Referrer

Попробуйте изучить внешние руководства API. Там вы найдете информацию о том, как получить информацию.

Тогда лучший план – построить интерфейс. Проверьте это: http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/

Это зависит от вас, как вы используете php для решения этой проблемы.