Improve view and query for describing resource

This commit is contained in:
Babibubebon 2020-01-22 02:21:48 +09:00
parent 3394884640
commit d4aaf6ae00
5 changed files with 118 additions and 47 deletions

View file

@ -16,12 +16,11 @@ class ResourceController extends Controller
]; ];
/** /**
* @param Request $request * ResourceController constructor.
* @return mixed
*/ */
protected function getCurrentDatasetConfig($request) { public function __construct()
$datasetName = explode('.', $request->route()[1]['as'])[1]; {
return config('datasets.' . $datasetName); $this->middleware('dataset');
} }
/** /**
@ -31,31 +30,45 @@ class ResourceController extends Controller
*/ */
protected function querySparql($request, $id) protected function querySparql($request, $id)
{ {
$datasetConfig = $this->getCurrentDatasetConfig($request); $client = new \EasyRdf_Sparql_Client($request->datasetConfig['endpoint']);
$client = new \EasyRdf_Sparql_Client($datasetConfig['endpoint']); $query = <<<EOT
CONSTRUCT {
$resourceUri = str_replace('{id}', $id, $datasetConfig['resource_uri']); <{$request->resourceUri}> ?p ?o .
$query = 'DESCRIBE <' . $resourceUri . '>'; ?s ?ip <{$request->resourceUri}> .
}
WHERE {
<{$request->resourceUri}> ?p ?o .
?s ?ip <{$request->resourceUri}> .
}
EOT;
return $client->query($query); return $client->query($query);
} }
/**
* @param Request $request
* @param $id
* @return \Illuminate\View\View
*/
public function html(Request $request, $id) public function html(Request $request, $id)
{ {
$graph = $this->querySparql($request, urldecode($id)); $graph = $this->querySparql($request, urldecode($id));
if ($graph->isEmpty()) { if ($graph->isEmpty()) {
abort(404); abort(404);
} }
$subject = key($graph->toRdfPhp());
$datasetConfig = $this->getCurrentDatasetConfig($request);
$dataUri = str_replace('{id}', $id, $datasetConfig['data_uri']);
return view('resource')->with([ return view('resource')->with([
'graph' => $graph, 'graph' => $graph,
'subject' => $subject, 'primaryTopic' => $request->resourceUri,
'dataUri' => $dataUri, 'dataUri' => $request->dataUri,
]); ]);
} }
/**
* @param Request $request
* @param $id
* @param $ext
* @return \Illuminate\Http\Response|\Laravel\Lumen\Http\ResponseFactory
*/
public function data(Request $request, $id, $ext) public function data(Request $request, $id, $ext)
{ {
if (!in_array($ext, $this->acceptableFileExtensions)) { if (!in_array($ext, $this->acceptableFileExtensions)) {

View file

@ -0,0 +1,37 @@
<?php
namespace App\Http\Middleware;
use Closure;
class DatasetMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!$request->route()) {
return $next($request);
}
$datasetName = explode('.', $request->route()[1]['as'])[1];
$currentDatasetConfig = config('datasets.' . $datasetName);
$id = $request->route('id');
$resourceUri = str_replace('{id}', $id, $currentDatasetConfig['resource_uri']);
$dataUri = str_replace('{id}', $id, $currentDatasetConfig['data_uri']);
$request->merge([
'datasetConfig' => $currentDatasetConfig,
'resourceUri' => $resourceUri,
'dataUri' => $dataUri,
]);
return $next($request);
}
}

View file

@ -72,6 +72,7 @@ $app->singleton(
$app->routeMiddleware([ $app->routeMiddleware([
'content_negotiation' => App\Http\Middleware\ContentNegotiatorMiddleware::class, 'content_negotiation' => App\Http\Middleware\ContentNegotiatorMiddleware::class,
'dataset' => App\Http\Middleware\DatasetMiddleware::class,
]); ]);
/* /*

View file

@ -0,0 +1,34 @@
<tr>
<td>
@if($subject !== $primaryTopic)
is
@endif
<a href="{{ $predicate }}">{{ \EasyRdf_Namespace::shorten($predicate) ?? $predicate }}</a>
@if($subject !== $primaryTopic)
of
@endif
</td>
<td>
<ul>
@if($subject === $primaryTopic)
@foreach($objects as $object)
<li>
@if($object['type'] === 'uri')
<a href="{{ $object['value'] }}">{{ $object['value'] }}</a>
@elseif($object['type'] === 'literal')
{{ $object['value'] }}
@if(isset($object['lang']))
<small>{{ '@'.$object['lang'] }}</small>
@endif
@if(isset($object['datatype']))
<small>^^{{ \EasyRdf_Namespace::shorten($object['datatype']) ?? $object['datatype'] }}</small>
@endif
@endif
</li>
@endforeach
@else
<a href="{{ $subject }}">{{ $subject }}</a>
@endif
</ul>
</td>
</tr>

View file

@ -1,12 +1,12 @@
@extends('base') @extends('base')
@section('title') @section('title')
About: {{ $graph->label($subject) ?? $graph->getLiteral($subject, 'schema:name') }} About: {{ $graph->label($primaryTopic) ?? $graph->getLiteral($primaryTopic, 'schema:name') }}
@endsection @endsection
@section('content') @section('content')
<section> <section>
<h1>@yield('title')</h1> <h1>@yield('title')</h1>
<code class="h5">{{ $subject }}</code> <code class="h5">{{ $primaryTopic }}</code>
<div class="float-right"> <div class="float-right">
<div class="dropdown"> <div class="dropdown">
@ -33,37 +33,23 @@
<th>Value</th> <th>Value</th>
</tr> </tr>
</thead> </thead>
@foreach($graph->toRdfPhp() as $subject => $predicateObjects)
@foreach($predicateObjects as $predicate => $objects)
<tbody> <tbody>
<tr> @foreach($graph->toRdfPhp() as $subject => $predicateObjects)
<td> @if($subject === $primaryTopic)
<a href="{{ $predicate }}">{{ \EasyRdf_Namespace::shorten($predicate) ?? $predicate }}</a> @foreach($predicateObjects as $predicate => $objects)
</td> @include('parts.row')
<td> @endforeach
<ul> @break
@foreach($objects as $object) @endif
<li> @endforeach
@if($object['type'] === 'uri') @foreach($graph->toRdfPhp() as $subject => $predicateObjects)
<a href="{{ $object['value'] }}">{{ $object['value'] }}</a> @if($subject !== $primaryTopic)
@elseif($object['type'] === 'literal') @foreach($predicateObjects as $predicate => $objects)
{{ $object['value'] }} @include('parts.row')
@if(isset($object['lang'])) @endforeach
<small>{{ '@'.$object['lang'] }}</small> @endif
@endif
@if(isset($object['datatype']))
<small>^^{{ \EasyRdf_Namespace::shorten($object['datatype']) ?? $object['datatype'] }}</small>
@endif
@endif
</li>
@endforeach @endforeach
</ul>
</td>
</tr>
</tbody> </tbody>
@endforeach
@endforeach
</table> </table>
<script type="application/ld+json"> <script type="application/ld+json">