Jordi Boggiano před 5 roky
rodič
revize
0da1eb396f

+ 20 - 3
src/Packagist/WebBundle/Controller/PackageController.php

@@ -259,19 +259,23 @@ class PackageController extends Controller
 
     /**
      * @Route(
-     *     "/providers/{name}",
+     *     "/providers/{name}.{_format}",
      *     name="view_providers",
-     *     requirements={"name"="[A-Za-z0-9/_.-]+?"},
+     *     requirements={"name"="[A-Za-z0-9/_.-]+?", "_format"="(json)"},
      *     defaults={"_format"="html"},
      *     methods={"GET"}
      * )
      */
-    public function viewProvidersAction($name)
+    public function viewProvidersAction(Request $req, $name)
     {
         /** @var PackageRepository $repo */
         $repo = $this->getDoctrine()->getRepository(Package::class);
         $providers = $repo->findProviders($name);
         if (!$providers) {
+            if ($req->getRequestFormat() === 'json') {
+                return new JsonResponse(['providers' => []]);
+            }
+
             return $this->redirect($this->generateUrl('search', array('q' => $name, 'reason' => 'package_not_found')));
         }
 
@@ -295,6 +299,19 @@ class PackageController extends Controller
             });
         } catch (ConnectionException $e) {}
 
+        if ($req->getRequestFormat() === 'json') {
+            foreach ($providers as $index => $package) {
+                $providers[$index] = [
+                    'name' => $package->getName(),
+                    'description' => $package->getDescription(),
+                    'type' => $package->getType(),
+                    'repository' => $package->getRepository(),
+                ];
+            }
+
+            return new JsonResponse(['providers' => $providers]);
+        }
+
         return $this->render('PackagistWebBundle:package:providers.html.twig', array(
             'name' => $name,
             'packages' => $providers,

+ 1 - 0
src/Packagist/WebBundle/Package/SymlinkDumper.php

@@ -360,6 +360,7 @@ class SymlinkDumper
             $this->rootFile['providers-url'] = $this->router->generate('home', []) . 'p/%package%$%hash%.json';
             $this->rootFile['metadata-url'] = $this->router->generate('home', []) . 'p2/%package%.json';
             $this->rootFile['search'] = $this->router->generate('search', ['_format' => 'json'], UrlGeneratorInterface::ABSOLUTE_URL) . '?q=%query%&type=%type%';
+            $this->rootFile['providers-api'] = str_replace('VND/PKG', '%package%', $this->router->generate('view_providers', ['name' => 'VND/PKG', '_format' => 'json'], UrlGeneratorInterface::ABSOLUTE_URL));
 
             if ($verbose) {
                 echo 'Dumping individual listings'.PHP_EOL;