فهرست منبع

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

Thomas Rabaix 11 سال پیش
والد
کامیت
b25401b380
1فایلهای تغییر یافته به همراه31 افزوده شده و 8 حذف شده
  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;
     }
-}
+}