lodfe/app/Http/Controllers/ResourceController.php

88 lines
2 KiB
PHP
Raw Normal View History

2020-01-19 21:24:54 +09:00
<?php
namespace App\Http\Controllers;
2020-01-20 01:09:35 +09:00
use App\Http\Middleware\ContentNegotiatorMiddleware;
2020-01-19 21:24:54 +09:00
use Illuminate\Http\Request;
class ResourceController extends Controller
{
protected $acceptableFileExtensions = [
'.json',
'.jsonld',
'.nt',
'.rdf',
'.ttl',
];
/**
* ResourceController constructor.
2020-01-19 21:24:54 +09:00
*/
public function __construct()
{
$this->middleware('dataset');
2020-01-19 21:24:54 +09:00
}
/**
* @param $request
* @return \EasyRdf_Graph
*/
2020-01-23 16:19:21 +09:00
protected function querySparql($request)
2020-01-19 21:24:54 +09:00
{
$client = new \EasyRdf_Sparql_Client($request->datasetConfig['endpoint']);
$query = <<<EOT
CONSTRUCT {
<{$request->resourceUri}> ?p ?o .
?s ?ip <{$request->resourceUri}> .
}
WHERE {
<{$request->resourceUri}> ?p ?o .
2020-01-22 02:46:28 +09:00
OPTIONAL { ?s ?ip <{$request->resourceUri}> . }
}
EOT;
2020-01-19 21:24:54 +09:00
return $client->query($query);
}
/**
* @param Request $request
* @param $id
* @return \Illuminate\View\View
*/
2020-01-19 21:24:54 +09:00
public function html(Request $request, $id)
{
2020-01-23 16:19:21 +09:00
$graph = $this->querySparql($request);
2020-01-20 11:54:13 +09:00
if ($graph->isEmpty()) {
abort(404);
}
2020-01-19 21:24:54 +09:00
return view('resource')->with([
'graph' => $graph,
'primaryTopic' => $request->resourceUri,
'dataUri' => $request->dataUri,
2020-01-19 21:24:54 +09:00
]);
}
/**
* @param Request $request
* @param $id
* @param $ext
* @return \Illuminate\Http\Response|\Laravel\Lumen\Http\ResponseFactory
*/
2020-01-19 21:24:54 +09:00
public function data(Request $request, $id, $ext)
{
if (!in_array($ext, $this->acceptableFileExtensions)) {
abort(400);
}
2020-01-23 16:19:21 +09:00
$graph = $this->querySparql($request);
2020-01-19 21:24:54 +09:00
try {
$data = $graph->serialise(substr($ext, 1));
} catch (\EasyRdf_Exception $e) {
abort(400);
}
2020-01-20 01:09:35 +09:00
$type = ContentNegotiatorMiddleware::mimetypeFromExtension($ext);
return response($data)
->header('Content-Type', $type);
2020-01-19 21:24:54 +09:00
}
}