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
* @return mixed
* ResourceController constructor.
*/
protected function getCurrentDatasetConfig($request) {
$datasetName = explode('.', $request->route()[1]['as'])[1];
return config('datasets.' . $datasetName);
public function __construct()
{
$this->middleware('dataset');
}
/**
@ -31,31 +30,45 @@ class ResourceController extends Controller
*/
protected function querySparql($request, $id)
{
$datasetConfig = $this->getCurrentDatasetConfig($request);
$client = new \EasyRdf_Sparql_Client($datasetConfig['endpoint']);
$resourceUri = str_replace('{id}', $id, $datasetConfig['resource_uri']);
$query = 'DESCRIBE <' . $resourceUri . '>';
$client = new \EasyRdf_Sparql_Client($request->datasetConfig['endpoint']);
$query = <<<EOT
CONSTRUCT {
<{$request->resourceUri}> ?p ?o .
?s ?ip <{$request->resourceUri}> .
}
WHERE {
<{$request->resourceUri}> ?p ?o .
?s ?ip <{$request->resourceUri}> .
}
EOT;
return $client->query($query);
}
/**
* @param Request $request
* @param $id
* @return \Illuminate\View\View
*/
public function html(Request $request, $id)
{
$graph = $this->querySparql($request, urldecode($id));
if ($graph->isEmpty()) {
abort(404);
}
$subject = key($graph->toRdfPhp());
$datasetConfig = $this->getCurrentDatasetConfig($request);
$dataUri = str_replace('{id}', $id, $datasetConfig['data_uri']);
return view('resource')->with([
'graph' => $graph,
'subject' => $subject,
'dataUri' => $dataUri,
'primaryTopic' => $request->resourceUri,
'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)
{
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([
'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')
@section('title')
About: {{ $graph->label($subject) ?? $graph->getLiteral($subject, 'schema:name') }}
About: {{ $graph->label($primaryTopic) ?? $graph->getLiteral($primaryTopic, 'schema:name') }}
@endsection
@section('content')
<section>
<h1>@yield('title')</h1>
<code class="h5">{{ $subject }}</code>
<code class="h5">{{ $primaryTopic }}</code>
<div class="float-right">
<div class="dropdown">
@ -33,40 +33,26 @@
<th>Value</th>
</tr>
</thead>
<tbody>
@foreach($graph->toRdfPhp() as $subject => $predicateObjects)
@foreach($predicateObjects as $predicate => $objects)
<tbody>
<tr>
<td>
<a href="{{ $predicate }}">{{ \EasyRdf_Namespace::shorten($predicate) ?? $predicate }}</a>
</td>
<td>
<ul>
@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
</ul>
</td>
</tr>
</tbody>
@endforeach
@if($subject === $primaryTopic)
@foreach($predicateObjects as $predicate => $objects)
@include('parts.row')
@endforeach
@break
@endif
@endforeach
@foreach($graph->toRdfPhp() as $subject => $predicateObjects)
@if($subject !== $primaryTopic)
@foreach($predicateObjects as $predicate => $objects)
@include('parts.row')
@endforeach
@endif
@endforeach
</tbody>
</table>
<script type="application/ld+json">
{!! $graph->serialise('jsonld') !!}
{!! $graph->serialise('jsonld') !!}
</script>
@endsection