scriptotek / sru-client
Package for making Search/Retrieve via URL requests and parse the responses
Installs: 4 568
Dependents: 1
Suggesters: 0
Security: 0
Stars: 18
Watchers: 6
Forks: 3
Open Issues: 4
Requires
Requires (Dev)
- http-interop/http-factory-guzzle: ^1.0
- php-http/guzzle6-adapter: ^2.0
- php-http/mock-client: ^1.0
- phpunit/phpunit: ^8.0 || ^9.0
README
php-sru-client
Simple PHP package for making Search/Retrieve via URL (SRU) requests and returning QuiteSimpleXMLElement objects. The response object is an iterator, to support easy iteration over the results, abstracting away the process of making multiple requests.
If you prefer a simple text response, you might have a look at the php-sru-search package.
Install using Composer
Use Composer to install sru-client with a HTTP library such as Guzzle:
composer require scriptotek/sru-client php-http/guzzle6-adapter http-interop/http-factory-guzzle
We use HTTP discovery to discover HTTP client and HTTP factory implementations, so Guzzle can be swapped with any other PSR-17/PSR-18-compatible library.
Configuring the client
require_once('vendor/autoload.php'); use Scriptotek\Sru\Client as SruClient; $sru = new SruClient('http://bibsys-network.alma.exlibrisgroup.com/view/sru/47BIBSYS_NETWORK', [ 'schema' => 'marcxml', 'version' => '1.2', 'user-agent' => 'MyTool/0.1', ]);
Search and retrieve
To get all the records matching a given CQL query:
$records = $sru->all('alma.title="Hello world"'); foreach ($records as $record) { echo "Got record " . $record->position . " of " . $records->numberOfRecords() . "\n"; // processRecord($record->data); }
where $record
is an instance of Record and $record->data
is an instance of QuiteSimpleXMLElement.
The all()
method takes care of continuation for you under the hood for you;
the Records generator
continues to fetch records until the result set is depleted. A default batch size of 10 is used,
but you can give any number supported by the server as a second argument to the all()
method.
If you query for some identifier, you can use the convenience method first()
:
$record = $sru->first('alma.isbn="0415919118"');
The result is a Record
object, or null
if not found.
Use explain to get information about servers
$urls = array( 'http://sru.bibsys.no/search/biblio', 'http://lx2.loc.gov:210/LCDB', 'http://services.d-nb.de/sru/zdb', 'http://api.libris.kb.se/sru/libris', ); foreach ($urls as $url) { $sru = new SruClient($url, [ 'version' => '1.1', 'user-agent' => 'MyTool/0.1' ]); try { $response = $sru->explain(); } catch (\Scriptotek\Sru\Exceptions\SruErrorException $e) { print 'ERROR: ' . $e->getMessage() . "\n"; continue; } printf("Host: %s:%d\n", $response->host, $response->port); printf(" Database: %s\n", $response->database->identifier); printf(" %s\n", $response->database->title); printf(" %s\n", $response->database->description); print " Indexes:\n"; foreach ($response->indexes as $idx) { printf(" - %s: %s\n", $idx->title, implode(' / ', $idx->maps)); } }
Laravel 5 integration
Add the service provider to the 'providers'
array in config/app.php
:
Scriptotek\Sru\Providers\SruServiceProvider::class,
Optionally, add the facade to the 'aliases'
array in the same file:
'SruClient' => Scriptotek\Sru\Facades\SruClient::class,
To create the configuration file config/sru.php
:
$ php artisan vendor:publish --provider="Scriptotek\Sru\Providers\SruServiceProvider"