After this separation, search engine may be registered once for visitor area (with one presenter) and once for admin area (with different presenter).
77 lines
2.2 KiB
PHP
77 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Handlers\Contracts\SearchHandler;
|
|
use App\Handlers\Contracts\SearchPresenterHandler;
|
|
use App\Handlers\Registrators\SearchEngineRegistrator;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests;
|
|
use Illuminate\Support\Facades\App;
|
|
use Illuminate\Support\Facades\Input;
|
|
use Symfony\Component\Process\Exception\InvalidArgumentException;
|
|
|
|
class Search extends Controller
|
|
{
|
|
/**
|
|
* Create form for searching
|
|
*
|
|
* @return $this|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
|
|
*/
|
|
public function getSearch()
|
|
{
|
|
$results = [];
|
|
$term = Input::get('search');
|
|
|
|
if (!is_null($term)) {
|
|
try {
|
|
$results = $this->performSearch($term);
|
|
} catch (InvalidArgumentException $e) {
|
|
// user entered empty string (or something like empty string)
|
|
return redirect()
|
|
->route('search')
|
|
->with('error', $e->getMessage());
|
|
}
|
|
}
|
|
|
|
return view('admin.search.page', ['search' => $term, 'results' => $results]);
|
|
}
|
|
|
|
/**
|
|
* Method used for performing search.
|
|
*
|
|
* This method iterates over all registered search engines and returns results for each engine apart.
|
|
*
|
|
* @param string $term search text
|
|
*
|
|
* @return array array of results. One item per each engine
|
|
*/
|
|
protected function performSearch($term)
|
|
{
|
|
$engines = App::make('registerSearchEngine')
|
|
->get(SearchEngineRegistrator::ADMIN);
|
|
|
|
$resultsParts = [];
|
|
foreach ($engines as $engine) {
|
|
/**
|
|
* @var SearchHandler $search
|
|
* @var SearchPresenterHandler $presenter
|
|
*/
|
|
|
|
list ($search, $presenter) = $engine;
|
|
|
|
// try to find given term
|
|
$results = $search->search($term);
|
|
|
|
// create result object
|
|
$resultsParts[$search->getId()] = [
|
|
'name' => $search->getName(),
|
|
'content' => $presenter->render($results),
|
|
'count' => count($results)
|
|
];
|
|
}
|
|
|
|
return $resultsParts;
|
|
}
|
|
}
|