[Solr 4.7 avancé]: Intégration avec Symfony 2
Deux articles précédent ce nouvel article:
Un premier [Solr 4.7] : Installation, Configuration , Manipulation pour faire les premiers pas avec Solr 4.7; installation de Solr, déploiement sur Tomcat 7 ou avec Jetty, simples requêtes de sélection pour tester le bon fonctionnement.
Puis un autre article plus avancé, [solr 4.7 avancé]: Indexation consacré pour l’indexation avec Solr et la description de ses fichiers de configuration.
Pour ce nouveau poste, on va pouvoir communiquer entre une application Symfony 2 avec Solr et ainsi manipuler.
Pour aboutir, on utilisera un bundle NelmioSolarium, on mettra un service à l’aide de Dependency Injection, les résultats seront présentés avec un bundle KnpPaginator permettant de partager ces résultats sur plusieurs pages.
On suppose avoir indexé nos documents provenant de notre base (mysql pour notre exemple).
Si ce n’est pas le cas, vous pouvez trouver votre bonheur dans l’article précédent.
Solarium:
Solarium est une librairie cliente libre Solr, pour les applications PHP.
Pour suivre les caractéristiques incluses, voir Solarium features
Simple requête de sélection avec Solarium :
// include solarium library
$client = $this->get('solarium.client');
$select = $client->createSelect();
$select->setQuery(*:*);
$results = $client->select($select);
on peut utiliser $results dans un foreach pour afficher les resultats de la requête.
NelmioSolariumBundle:
Pour integrer le client Solr (Solarium) avec Symfony2, on utilisera le bundle NelmioSolarium, libre aussi, trouvé sur github : Github - NelmioSolariumBundle
app/AppKernel.php
$bundles = array(
…
// created bundle name
new Blogger\BlogBundle\BloggerBlogBundle(),
// solarium
new Nelmio\SolariumBundle\NelmioSolariumBundle(),
//Paginator
new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
);
BloggerBlogBundle est le nom du bundle créé pour notre application.
NelmioSolariumBundle désigne la librairie Solr à integrer.
KnpPaginatorBundle est un outil qui permet de mettre en disposition un paginateur lors de l’affichage du résultat de la requête.
app/config/config.yml
imports:
...
- { resource: tiers/nelmio_solarium.yml }
app/config/parameter.yml
parameters:
database_driver: pdo_mysql
database_host: 127.0.0.1
database_port: null
database_name: restofraisweb
database_user: root
database_password: root
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: fr
secret: ThisTokenIsNotSoSecretChangeIt
nelmio_solarium_host : 127.0.0.1
nelmio_solarium_port : 8080
nelmio_solarium_path : /restofraisweb
/src/Blogger/BlogBundle/Resources/config/services.xml
on déclare sorium en tant que service.
services.xml sera prit en compte avec les fichiers de config, et sera chargé par
BloggerBlogExtension.php
BloggerBlogExtension.php
<?xml version="1.0" ?>
<container ...>
<services>
<!-- Search Engine Manager-->
<service id="blogger_blog.search" class="%blogger_blog.search.class%" scope="request">
<argument type="service" id="request"/>
<argument type="service" id="solarium.client"/>
</service>
</services>
</container>
Dependency Injection (DI)
L'injection de dépendances (Dependency Injection) est un mécanisme qui permet d'implémenter le principe de l'inversion de contrôle. Il consiste à créer dynamiquement (injecter) les dépendances entre les différentes classes en s'appuyant sur une description (fichier de configuration ou métadonnées) ou de manière programmatique. Ainsi les dépendances entre composants logiciels ne sont plus exprimées dans le code de manière statique mais déterminées dynamiquement à l'exécution. [wikipedia.org]
src/Blogger/BlogBundle/DependencyInjection/BloggerBlogExtension.php
class BloggerBlogExtension extends Extension{
/**
* {@inheritDoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.xml');
}
}
src/Blogger/BlogBundle/Controller/Search.php
class SearchController extends Controller{
/**
* @Template
*/
public function blockSearchAction()
{
$request = $this->get('request');
$simpleSearch = $request->request->get('simple_search');
$form = $this->createForm(new BlockSearchType($request, $simpleSearch['keySearch']));
return array(
'form' => $form->createView(),
);
}
/**
* @Route("/search", name="search")
* @HttpMethod({"GET", "POST"})
* @Template
*/
public function executeSearchAction()
{
$request = $this->get('request');
$resultsPerPage = 5;
$solariumClient = $this->get('solarium.client');
$query = $this->get('blogger_blog.search')->makeSearchQuery();
$query->setRows($resultsPerPage);
$allResults = $solariumClient->select($query);
$totalResults = $allResults->getNumFound();
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
array($solariumClient, $query),
$request->query->get('page', 1)/*page number*/,
$resultsPerPage/*limit per page*/
);
return $this->render('BloggerBlogBundle:Search:search.html.twig', array(
'pagination' => $pagination,
'totalResults' => $totalResults,
));
}
}
Télécharger l'intégrité de l'application:
solr symfony integration
Bonjour,
RépondreSupprimerje pense que ce bundle est mieux :
https://github.com/floriansemm/SolrBundle
Merci pour le lien, à voir :)
Supprimerle fichier Search.php a comme author un autre personne !
RépondreSupprimerL'intégrité de l'application a télécharger est totalement loin de la description dans ce tutoriel, plus de détails ça sera mieux.
RépondreSupprimer