Prechádzať zdrojové kódy

Optimization & cleanup of package links functionality

Jordi Boggiano 13 rokov pred
rodič
commit
168e0038a4

+ 27 - 14
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -19,36 +19,49 @@ use Doctrine\ORM\EntityRepository;
  */
 class PackageRepository extends EntityRepository
 {
-    public function packageExists($package)
+    /**
+     * Lists all package names array(name => true)
+     *
+     * @var array
+     */
+    private $packageNames;
+
+    public function packageExists($name)
     {
-        return in_array($package, $this->getPackageNames());
+        $packages = $this->getPackageNames();
+        return isset($packages[$name]);
     }
 
     public function getPackageNames()
     {
-        $names = false;
+        if (null !== $this->packageNames) {
+            return $this->packageNames;
+        }
+
+        $names = null;
         $apc = extension_loaded('apc');
-        
-        //todo: move caching to some mature bundle, not apc
-        //use container to set caching key and ttl
+
+        // TODO use container to set caching key and ttl
         if ($apc) {
             $names = apc_fetch('packagist_package_names');
         }
 
-        if (false === $names) {
-            $names = array_map(function($value)
-                    {
-                        return $value['name'];
-                    }, $this->getEntityManager()
-                            ->createQuery("SELECT p.name FROM Packagist\WebBundle\Entity\Package p")
-                            ->getResult());
+        if (!is_array($names)) {
+            $names = array();
+
+            $query = $this->getEntityManager()
+                ->createQuery("SELECT p.name FROM Packagist\WebBundle\Entity\Package p");
+
+            foreach ($query->getScalarResult() as $package) {
+                $names[$package['name']] = true;
+            }
 
             if ($apc) {
                 apc_store('packagist_package_names', $names, 3600);
             }
         }
 
-        return $names;
+        return $this->packageNames = $names;
     }
 
     public function getStalePackages()

+ 3 - 5
src/Packagist/WebBundle/Resources/views/macros.html.twig

@@ -16,11 +16,9 @@
 {% endmacro %}
 
 {% macro packageLink(packageName) %}
-
-    {% if packageName is packagistPackageName and packageName is existingPackagistPackage %}
+    {%- if packageName is existing_package -%}
         <a href="{{ path('view_package', { 'name': packageName }) }}">{{ packageName }}</a>
-    {% else %}
+    {%- else -%}
         {{ packageName }}
-    {% endif %}
-
+    {%- endif -%}
 {% endmacro %}

+ 5 - 7
src/Packagist/WebBundle/Twig/PackagistExtension.php

@@ -19,8 +19,7 @@ class PackagistExtension extends \Twig_Extension
     public function getTests()
     {
         return array(
-            'packagistPackageName' => new \Twig_Test_Method($this, 'validPackageNameTest'),
-            'existingPackagistPackage' => new \Twig_Test_Method($this, 'packageExistsTest')
+            'existing_package' => new \Twig_Test_Method($this, 'packageExistsTest')
         );
     }
 
@@ -31,12 +30,11 @@ class PackagistExtension extends \Twig_Extension
 
     public function packageExistsTest($package)
     {
+        if (!preg_match('/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+/', $package)) {
+            return false;
+        }
+
         return $this->doctrine->getRepository('PackagistWebBundle:Package')
             ->packageExists($package);
     }
-
-    public function validPackageNameTest($package)
-    {
-        return preg_match('/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+/', $package);
-    }
 }