Kaynağa Gözat

improve string concatenation performance (can have an impact depends on the number of Admin)

Thomas Rabaix 11 yıl önce
ebeveyn
işleme
b25401b380
1 değiştirilmiş dosya ile 31 ekleme ve 8 silme
  1. 31 8
      Route/RouteCollection.php

+ 31 - 8
Route/RouteCollection.php

@@ -49,12 +49,12 @@ class RouteCollection
      */
     public function add($name, $pattern = null, array $defaults = array(), array $requirements = array(), array $options = array())
     {
-        $pattern    = sprintf('%s/%s', $this->baseRoutePattern, $pattern ?: $name);
+        $pattern    = $this->baseRoutePattern . '/'. ($pattern ?: $name);
         $code       = $this->getCode($name);
-        $routeName  = sprintf('%s_%s', $this->baseRouteName, $name);
+        $routeName  = $this->baseRouteName . '_' . $name;
 
         if (!isset($defaults['_controller'])) {
-            $defaults['_controller'] = sprintf('%s:%s', $this->baseControllerName, $this->actionify($code));
+            $defaults['_controller'] = $this->baseControllerName . ':' . $this->actionify($code);
         }
 
         if (!isset($defaults['_sonata_admin'])) {
@@ -63,7 +63,9 @@ class RouteCollection
 
         $defaults['_sonata_name'] = $routeName;
 
-        $this->elements[$this->getCode($name)] = new Route($pattern, $defaults, $requirements, $options);
+        $this->elements[$this->getCode($name)] = function() use ($pattern, $defaults, $requirements, $options) {
+            return new Route($pattern, $defaults, $requirements, $options);
+        };
 
         return $this;
     }
@@ -79,7 +81,7 @@ class RouteCollection
             return $name;
         }
 
-        return sprintf('%s.%s', $this->baseCodeRoute, $name);
+        return $this->baseCodeRoute . '.' . $name;
     }
 
     /**
@@ -96,11 +98,29 @@ class RouteCollection
         return $this;
     }
 
+    /**
+     * @param $element
+     *
+     * @return Route
+     */
+    private function resolve($element)
+    {
+        if (is_callable($element)) {
+            return call_user_func($element);
+        }
+
+        return $element;
+    }
+
     /**
      * @return array
      */
     public function getElements()
     {
+        foreach ($this->elements as $name => $element) {
+            $this->elements[$name] = $this->resolve($element);
+        }
+
         return $this->elements;
     }
 
@@ -124,7 +144,11 @@ class RouteCollection
     public function get($name)
     {
         if ($this->has($name)) {
-            return $this->elements[$this->getCode($name)];
+            $code = $this->getCode($name);
+
+            $this->elements[$code] = $this->resolve($this->elements[$code]);
+
+            return $this->elements[$code];
         }
 
         throw new \InvalidArgumentException(sprintf('Element "%s" does not exist.', $name));
@@ -188,7 +212,6 @@ class RouteCollection
     public function actionify($action)
     {
         if (($pos = strrpos($action, '.')) !== false) {
-
             $action = substr($action, $pos + 1);
         }
 
@@ -232,4 +255,4 @@ class RouteCollection
     {
         return $this->baseRoutePattern;
     }
-}
+}