Browse Source

Redirect to package directly if there is a direct match in query param

Jordi Boggiano 5 years ago
parent
commit
6b79f26dac
1 changed files with 21 additions and 1 deletions
  1. 21 1
      src/Packagist/WebBundle/Controller/WebController.php

+ 21 - 1
src/Packagist/WebBundle/Controller/WebController.php

@@ -14,6 +14,7 @@ namespace Packagist\WebBundle\Controller;
 
 use Packagist\WebBundle\Form\Model\SearchQuery;
 use Packagist\WebBundle\Form\Type\SearchQueryType;
+use Packagist\WebBundle\Entity\Package;
 use Predis\Connection\ConnectionException;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
@@ -31,8 +32,12 @@ class WebController extends Controller
      * @Template()
      * @Route("/", name="home")
      */
-    public function indexAction()
+    public function indexAction(Request $req)
     {
+        if ($resp = $this->checkForQueryMatch($req)) {
+            return $resp;
+        }
+
         return array('page' => 'home');
     }
 
@@ -56,12 +61,27 @@ class WebController extends Controller
         ));
     }
 
+    private function checkForQueryMatch(Request $req)
+    {
+        $q = $req->query->get('query');
+        if ($q) {
+            $package = $this->getDoctrine()->getRepository(Package::class)->findOneByName($q);
+            if ($package) {
+                return $this->redirectToRoute('view_package', ['name' => $package->getName()]);
+            }
+        }
+    }
+
     /**
      * @Route("/search/", name="search.ajax", methods={"GET"})
      * @Route("/search.{_format}", requirements={"_format"="(html|json)"}, name="search", defaults={"_format"="html"}, methods={"GET"})
      */
     public function searchAction(Request $req)
     {
+        if ($resp = $this->checkForQueryMatch($req)) {
+            return $resp;
+        }
+
         if ($req->getRequestFormat() !== 'json') {
             return $this->render('PackagistWebBundle:web:search.html.twig', [
                 'packages' => [],