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.
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.
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',
]);
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.
$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));
}
}
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"