{"action":"created","comment":{"url":"https://api.github.com/repos/symfony/symfony/pulls/comments/39705685","id":39705685,"diff_hunk":"@@ -0,0 +1,433 @@\n+<?php\n+\n+/*\n+ * This file is part of the Symfony package.\n+ *\n+ * (c) Fabien Potencier <fabien@symfony.com>\n+ *\n+ * For the full copyright and license information, please view the LICENSE\n+ * file that was distributed with this source code.\n+ */\n+\n+namespace Symfony\\Bundle\\FrameworkBundle\\Routing;\n+\n+use Symfony\\Component\\Config\\Loader\\Loader;\n+use Symfony\\Component\\Config\\Resource\\ResourceInterface;\n+use Symfony\\Component\\Routing\\RouteCollection;\n+use Symfony\\Component\\Routing\\Route;\n+\n+/**\n+ * Helps add and import routes into a RouteCollection.\n+ *\n+ * @author Ryan Weaver <ryan@knpuniversity.com>\n+ */\n+class RouteCollectionBuilder\n+{\n+    private $loader;\n+\n+    /**\n+     * A mixture of different objects that hold routes.\n+     *\n+     * @var Route[]|RouteCollectionBuilder[]\n+     */\n+    private $routes = array();\n+\n+    private $defaults = array();\n+\n+    private $prefix;\n+\n+    private $host;\n+\n+    private $condition;\n+\n+    private $requirements = array();\n+\n+    private $options = array();\n+\n+    private $schemes;\n+\n+    private $methods;\n+\n+    private $resources = array();\n+\n+    private $controllerClass;\n+\n+    /**\n+     * @param Loader $loader\n+     */\n+    public function __construct(Loader $loader)\n+    {\n+        $this->loader = $loader;\n+    }\n+\n+    /**\n+     * Import an external routing resource, like a file.\n+     *\n+     * Returns a RouteCollectionBuilder so you can continue to tweak options on the routes.\n+     *\n+     * @param mixed  $resource\n+     * @param string $prefix\n+     * @param string $type\n+     *\n+     * @return RouteCollectionBuilder\n+     */\n+    public function import($resource, $prefix = null, $type = null)\n+    {\n+        /** @var RouteCollection $subCollection */\n+        $subCollection = $this->loader->import($resource, $type);\n+\n+        return $this->addRouteCollection($subCollection, $prefix);\n+    }\n+\n+    /**\n+     * Adds a route and returns it for future modification.\n+     *\n+     * @param string      $path       The route path\n+     * @param string      $controller The route controller string\n+     * @param string|null $name       The name to give this route\n+     *\n+     * @return Route\n+     */\n+    public function add($path, $controller, $name = null)\n+    {\n+        $route = new Route($path);\n+        $route->setDefault('_controller', $controller);\n+        $this->addRoute($route, $name);\n+\n+        return $route;\n+    }\n+\n+    /**\n+     * Returns a RouteCollectionBuilder that can be configured and then added with addBuilder().\n+     *\n+     * @param string $prefix A prefix to apply to all routes added to this collection\n+     *\n+     * @return RouteCollectionBuilder\n+     */\n+    public function createBuilder($prefix = null)\n+    {\n+        $builder = new self($this->loader);\n+        $builder->setPrefix($prefix);\n+\n+        return $builder;\n+    }\n+\n+    /**\n+     * Add a RouteCollectionBuilder.\n+     *\n+     * @param RouteCollectionBuilder $builder\n+     */\n+    public function addBuilder(RouteCollectionBuilder $builder)\n+    {\n+        $this->routes[] = $builder;\n+    }\n+\n+    /**\n+     * Adds a RouteCollection directly and returns those routes in a RouteCollectionBuilder.\n+     *\n+     * @param RouteCollection $collection\n+     * @param string|null     $prefix\n+     *\n+     * @return $this\n+     */\n+    public function addRouteCollection(RouteCollection $collection, $prefix = null)\n+    {\n+        // create a builder from the RouteCollection\n+        $builder = $this->createBuilder($prefix);\n+        foreach ($collection->all() as $name => $route) {\n+            $builder->addRoute($route, $name);\n+        }\n+\n+        foreach ($collection->getResources() as $resource) {\n+            $builder->addResource($resource);\n+        }\n+\n+        $this->addBuilder($builder);\n+\n+        return $builder;\n+    }\n+\n+    /**\n+     * Adds a Route object to the builder.\n+     *\n+     * @param Route       $route\n+     * @param string|null $name\n+     *\n+     * @return $this\n+     */\n+    public function addRoute(Route $route, $name = null)\n+    {\n+        if (null === $name) {\n+            // used as a flag to know which routes will need a name later\n+            $name = '_unnamed_route_'.spl_object_hash($route);\n+        }\n+\n+        $this->routes[$name] = $route;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets a prefix (e.g. /admin) to be used with all embedded routes.\n+     *\n+     * @param string $prefix\n+     *\n+     * @return $this\n+     */\n+    public function setPrefix($prefix)\n+    {\n+        $this->prefix = trim(trim($prefix), '/');\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets the host on all embedded routes (unless already set).\n+     *\n+     * @param string $pattern\n+     *\n+     * @return $this\n+     */\n+    public function setHost($pattern)\n+    {\n+        $this->host = $pattern;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets a condition on all embedded routes (unless already set).\n+     *\n+     * @param string $condition\n+     *\n+     * @return $this\n+     */\n+    public function setCondition($condition)\n+    {\n+        $this->condition = $condition;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets a default value that will be added to all embedded routes (unless that\n+     * default value is already set.\n+     *\n+     * @param string $key\n+     * @param mixed  $value\n+     *\n+     * @return $this\n+     */\n+    public function setDefault($key, $value)\n+    {\n+        $this->defaults[$key] = $value;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets a requirement that will be added to all embedded routes (unless that\n+     * requirement is already set.\n+     *\n+     * @param string $key\n+     * @param mixed  $regex\n+     *\n+     * @return $this\n+     */\n+    public function setRequirement($key, $regex)\n+    {\n+        $this->requirements[$key] = $regex;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets an opiton that will be added to all embedded routes (unless that\n+     * option is already set.\n+     *\n+     * @param string $key\n+     * @param mixed  $value\n+     *\n+     * @return $this\n+     */\n+    public function setOption($key, $value)\n+    {\n+        $this->options[$key] = $value;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets the schemes on all embedded routes (unless already set).\n+     *\n+     * @param array|string $schemes\n+     *\n+     * @return $this\n+     */\n+    public function setSchemes($schemes)\n+    {\n+        $this->schemes = $schemes;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Sets the methods on all embedded routes (unless already set).\n+     *\n+     * @param array|string $methods\n+     *\n+     * @return $this\n+     */\n+    public function setMethods($methods)\n+    {\n+        $this->methods = $methods;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Adds a resource for this collection.\n+     *\n+     * @return $this\n+     */\n+    public function addResource(ResourceInterface $resource)\n+    {\n+        $this->resources[] = $resource;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Set a controller class that all added embedded should use.\n+     *\n+     * With this, the controller for embedded routes can just be a method name.\n+     * If an embedded route has a full controller (e.g. class::methodName), the\n+     * controllerClass won't be applied to that route.\n+     *\n+     * @param string $controllerClass\n+     *\n+     * @return $this\n+     */\n+    public function setControllerClass($controllerClass)\n+    {\n+        if (!class_exists($controllerClass)) {\n+            throw new \\InvalidArgumentException(sprintf('The controller class \"%s\" does not exist.', $controllerClass));\n+        }\n+\n+        $this->controllerClass = $controllerClass;\n+\n+        return $this;\n+    }\n+\n+    /**\n+     * Creates the final ArrayCollection, returns it, and clears everything.\n+     *\n+     * @return RouteCollection\n+     */\n+    public function build()\n+    {\n+        $routeCollection = new RouteCollection();\n+\n+        foreach ($this->routes as $name => $route) {\n+            if ($route instanceof Route) {\n+                // auto-generate the route name if it's been marked\n+                if ('_unnamed_route_' === substr($name, 0, 15)) {\n+                    $name = $this->generateRouteName($route);\n+                }\n+\n+                $this->ensureRouteController($route);\n+\n+                $route->setDefaults(array_merge($this->defaults, $route->getDefaults()));\n+                $route->setRequirements(array_merge($this->requirements, $route->getRequirements()));\n+                $route->setOptions(array_merge($this->options, $route->getOptions()));\n+\n+                if (null !== $this->prefix) {\n+                    $route->setPath('/'.$this->prefix.$route->getPath());\n+                }\n+\n+                if (!$route->getHost()) {\n+                    $route->setHost($this->host);\n+                }\n+\n+                if (!$route->getCondition()) {\n+                    $route->setCondition($this->condition);\n+                }\n+\n+                if (!$route->getSchemes()) {\n+                    $route->setSchemes($this->schemes);\n+                }\n+\n+                if (!$route->getMethods()) {\n+                    $route->setMethods($this->methods);\n+                }\n+\n+                $routeCollection->add($name, $route);\n+            } else {\n+                /* @var self $route */\n+\n+                $subCollection = $route->build();\n+                $subCollection->addPrefix($this->prefix);\n+\n+                $routeCollection->addCollection($subCollection);\n+            }\n+        }\n+\n+        foreach ($this->resources as $resource) {\n+            $routeCollection->addResource($resource);\n+        }\n+\n+        return $routeCollection;\n+    }\n+\n+    /**\n+     * Attempts to safely prefix controllers with the controller class if necessary.\n+     *\n+     * @param Route $route\n+     */\n+    private function ensureRouteController(Route $route)\n+    {\n+        // only do work if there is a controller class set\n+        if (!$this->controllerClass) {\n+            return;\n+        }\n+\n+        $controller = $route->getDefault('_controller');\n+\n+        // only apply controller class to a (non-empty) string\n+        if (!is_string($controller) || !$controller) {","path":"src/Symfony/Bundle/FrameworkBundle/Routing/RouteCollectionBuilder.php","position":397,"original_position":397,"commit_id":"c87515a99ff26fa44b8542801ac706bc5ff6c746","original_commit_id":"c87515a99ff26fa44b8542801ac706bc5ff6c746","user":{"login":"weaverryan","id":121003,"avatar_url":"https://avatars.githubusercontent.com/u/121003?v=3","gravatar_id":"","url":"https://api.github.com/users/weaverryan","html_url":"https://github.com/weaverryan","followers_url":"https://api.github.com/users/weaverryan/followers","following_url":"https://api.github.com/users/weaverryan/following{/other_user}","gists_url":"https://api.github.com/users/weaverryan/gists{/gist_id}","starred_url":"https://api.github.com/users/weaverryan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/weaverryan/subscriptions","organizations_url":"https://api.github.com/users/weaverryan/orgs","repos_url":"https://api.github.com/users/weaverryan/repos","events_url":"https://api.github.com/users/weaverryan/events{/privacy}","received_events_url":"https://api.github.com/users/weaverryan/received_events","type":"User","site_admin":false},"body":"It's not quite the same thing - I'm also filtering for other things, like array()s","created_at":"2015-09-17T02:00:51Z","updated_at":"2015-09-17T02:00:51Z","html_url":"https://github.com/symfony/symfony/pull/15778#discussion_r39705685","pull_request_url":"https://api.github.com/repos/symfony/symfony/pulls/15778","_links":{"self":{"href":"https://api.github.com/repos/symfony/symfony/pulls/comments/39705685"},"html":{"href":"https://github.com/symfony/symfony/pull/15778#discussion_r39705685"},"pull_request":{"href":"https://api.github.com/repos/symfony/symfony/pulls/15778"}}},"pull_request":{"url":"https://api.github.com/repos/symfony/symfony/pulls/15778","id":44885644,"html_url":"https://github.com/symfony/symfony/pull/15778","diff_url":"https://github.com/symfony/symfony/pull/15778.diff","patch_url":"https://github.com/symfony/symfony/pull/15778.patch","issue_url":"https://api.github.com/repos/symfony/symfony/issues/15778","number":15778,"state":"open","locked":false,"title":"Fluid interface for building routes in PHP","user":{"login":"weaverryan","id":121003,"avatar_url":"https://avatars.githubusercontent.com/u/121003?v=3","gravatar_id":"","url":"https://api.github.com/users/weaverryan","html_url":"https://github.com/weaverryan","followers_url":"https://api.github.com/users/weaverryan/followers","following_url":"https://api.github.com/users/weaverryan/following{/other_user}","gists_url":"https://api.github.com/users/weaverryan/gists{/gist_id}","starred_url":"https://api.github.com/users/weaverryan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/weaverryan/subscriptions","organizations_url":"https://api.github.com/users/weaverryan/orgs","repos_url":"https://api.github.com/users/weaverryan/repos","events_url":"https://api.github.com/users/weaverryan/events{/privacy}","received_events_url":"https://api.github.com/users/weaverryan/received_events","type":"User","site_admin":false},"body":"| Q             | A\r\n| ------------- | ---\r\n| Bug fix?      | no\r\n| New feature?  | yes\r\n| BC breaks?    | no\r\n| Deprecations? | no\r\n| Tests pass?   | yes\r\n| Fixed tickets | n/a\r\n| License       | MIT\r\n| Doc PR        | not yet...\r\n\r\nThis - along with #15742 - attempts to making adding routes in PHP (via an actual class+method) not only possible, but also useful.\r\n\r\nThe two classes - `Route` and `RouteCollectionBuilder` are based off of Silex's `Controller` and `ControllerCollection`. The `RouteCollectionBuilder` is basically a `RouteCollection` that's able to import other resources. Here are the goals:\r\n\r\nA) Import routes easily\r\n\r\n```php\r\n$routes->import('routing.yml');\r\n```\r\n\r\nB) Fluid addition of routes into the collection \r\n\r\n```php\r\n$routes->add('/admin', 'AppBundle:Admin:index', 'admin_index')\r\n    ->setMethods(['GET']);\r\n```\r\n\r\nC) Ability to create routes with auto-generating names\r\n\r\nD) Ability to add a \"sub-collection\" (kind of like an import, without pointing to another file). Included is the ability to set the controller class:\r\n\r\n```php\r\n$blogRoutes = $routes->createBuilder('/blog')\r\n   ->setControllerClass('AppBundle\\Controller\\BlogController');\r\n$blogRoutes->add('/', 'indexAction');\r\n$blogRoutes->add('/{id}', 'editAction');\r\n$routes->addBuilder($blogRoutes);\r\n```\r\n\r\nE) The collection options can be set before or after the routes. With `RouteCollection`, if you set something - e.g. a prefix or a default - and THEN add more routes, those options are not passed to those routes. This is by design, but not ideal for building routes (e.g. in the previous code example, the controllerClass would not be applied using the opposite logic, since it's set before adding the routes).\r\n\r\nThanks!","created_at":"2015-09-14T01:16:49Z","updated_at":"2015-09-17T02:00:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6cd3cd4a7d2e0cfb97befa7c28a918563c2c92d4","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/symfony/symfony/pulls/15778/commits","review_comments_url":"https://api.github.com/repos/symfony/symfony/pulls/15778/comments","review_comment_url":"https://api.github.com/repos/symfony/symfony/pulls/comments{/number}","comments_url":"https://api.github.com/repos/symfony/symfony/issues/15778/comments","statuses_url":"https://api.github.com/repos/symfony/symfony/statuses/c87515a99ff26fa44b8542801ac706bc5ff6c746","head":{"label":"weaverryan:route_builder","ref":"route_builder","sha":"c87515a99ff26fa44b8542801ac706bc5ff6c746","user":{"login":"weaverryan","id":121003,"avatar_url":"https://avatars.githubusercontent.com/u/121003?v=3","gravatar_id":"","url":"https://api.github.com/users/weaverryan","html_url":"https://github.com/weaverryan","followers_url":"https://api.github.com/users/weaverryan/followers","following_url":"https://api.github.com/users/weaverryan/following{/other_user}","gists_url":"https://api.github.com/users/weaverryan/gists{/gist_id}","starred_url":"https://api.github.com/users/weaverryan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/weaverryan/subscriptions","organizations_url":"https://api.github.com/users/weaverryan/orgs","repos_url":"https://api.github.com/users/weaverryan/repos","events_url":"https://api.github.com/users/weaverryan/events{/privacy}","received_events_url":"https://api.github.com/users/weaverryan/received_events","type":"User","site_admin":false},"repo":{"id":21151556,"name":"symfony","full_name":"weaverryan/symfony","owner":{"login":"weaverryan","id":121003,"avatar_url":"https://avatars.githubusercontent.com/u/121003?v=3","gravatar_id":"","url":"https://api.github.com/users/weaverryan","html_url":"https://github.com/weaverryan","followers_url":"https://api.github.com/users/weaverryan/followers","following_url":"https://api.github.com/users/weaverryan/following{/other_user}","gists_url":"https://api.github.com/users/weaverryan/gists{/gist_id}","starred_url":"https://api.github.com/users/weaverryan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/weaverryan/subscriptions","organizations_url":"https://api.github.com/users/weaverryan/orgs","repos_url":"https://api.github.com/users/weaverryan/repos","events_url":"https://api.github.com/users/weaverryan/events{/privacy}","received_events_url":"https://api.github.com/users/weaverryan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/weaverryan/symfony","description":"The Symfony PHP framework","fork":true,"url":"https://api.github.com/repos/weaverryan/symfony","forks_url":"https://api.github.com/repos/weaverryan/symfony/forks","keys_url":"https://api.github.com/repos/weaverryan/symfony/keys{/key_id}","collaborators_url":"https://api.github.com/repos/weaverryan/symfony/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/weaverryan/symfony/teams","hooks_url":"https://api.github.com/repos/weaverryan/symfony/hooks","issue_events_url":"https://api.github.com/repos/weaverryan/symfony/issues/events{/number}","events_url":"https://api.github.com/repos/weaverryan/symfony/events","assignees_url":"https://api.github.com/repos/weaverryan/symfony/assignees{/user}","branches_url":"https://api.github.com/repos/weaverryan/symfony/branches{/branch}","tags_url":"https://api.github.com/repos/weaverryan/symfony/tags","blobs_url":"https://api.github.com/repos/weaverryan/symfony/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/weaverryan/symfony/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/weaverryan/symfony/git/refs{/sha}","trees_url":"https://api.github.com/repos/weaverryan/symfony/git/trees{/sha}","statuses_url":"https://api.github.com/repos/weaverryan/symfony/statuses/{sha}","languages_url":"https://api.github.com/repos/weaverryan/symfony/languages","stargazers_url":"https://api.github.com/repos/weaverryan/symfony/stargazers","contributors_url":"https://api.github.com/repos/weaverryan/symfony/contributors","subscribers_url":"https://api.github.com/repos/weaverryan/symfony/subscribers","subscription_url":"https://api.github.com/repos/weaverryan/symfony/subscription","commits_url":"https://api.github.com/repos/weaverryan/symfony/commits{/sha}","git_commits_url":"https://api.github.com/repos/weaverryan/symfony/git/commits{/sha}","comments_url":"https://api.github.com/repos/weaverryan/symfony/comments{/number}","issue_comment_url":"https://api.github.com/repos/weaverryan/symfony/issues/comments{/number}","contents_url":"https://api.github.com/repos/weaverryan/symfony/contents/{+path}","compare_url":"https://api.github.com/repos/weaverryan/symfony/compare/{base}...{head}","merges_url":"https://api.github.com/repos/weaverryan/symfony/merges","archive_url":"https://api.github.com/repos/weaverryan/symfony/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/weaverryan/symfony/downloads","issues_url":"https://api.github.com/repos/weaverryan/symfony/issues{/number}","pulls_url":"https://api.github.com/repos/weaverryan/symfony/pulls{/number}","milestones_url":"https://api.github.com/repos/weaverryan/symfony/milestones{/number}","notifications_url":"https://api.github.com/repos/weaverryan/symfony/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/weaverryan/symfony/labels{/name}","releases_url":"https://api.github.com/repos/weaverryan/symfony/releases{/id}","created_at":"2014-06-24T04:00:07Z","updated_at":"2015-06-28T12:37:42Z","pushed_at":"2015-09-17T01:36:45Z","git_url":"git://github.com/weaverryan/symfony.git","ssh_url":"git@github.com:weaverryan/symfony.git","clone_url":"https://github.com/weaverryan/symfony.git","svn_url":"https://github.com/weaverryan/symfony","homepage":"symfony.com","size":58646,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":4,"forks":0,"open_issues":4,"watchers":0,"default_branch":"master"}},"base":{"label":"symfony:2.8","ref":"2.8","sha":"0a5807bf47326a9b3f22603220fd8f8176cdc179","user":{"login":"symfony","id":143937,"avatar_url":"https://avatars.githubusercontent.com/u/143937?v=3","gravatar_id":"","url":"https://api.github.com/users/symfony","html_url":"https://github.com/symfony","followers_url":"https://api.github.com/users/symfony/followers","following_url":"https://api.github.com/users/symfony/following{/other_user}","gists_url":"https://api.github.com/users/symfony/gists{/gist_id}","starred_url":"https://api.github.com/users/symfony/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/symfony/subscriptions","organizations_url":"https://api.github.com/users/symfony/orgs","repos_url":"https://api.github.com/users/symfony/repos","events_url":"https://api.github.com/users/symfony/events{/privacy}","received_events_url":"https://api.github.com/users/symfony/received_events","type":"Organization","site_admin":false},"repo":{"id":458058,"name":"symfony","full_name":"symfony/symfony","owner":{"login":"symfony","id":143937,"avatar_url":"https://avatars.githubusercontent.com/u/143937?v=3","gravatar_id":"","url":"https://api.github.com/users/symfony","html_url":"https://github.com/symfony","followers_url":"https://api.github.com/users/symfony/followers","following_url":"https://api.github.com/users/symfony/following{/other_user}","gists_url":"https://api.github.com/users/symfony/gists{/gist_id}","starred_url":"https://api.github.com/users/symfony/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/symfony/subscriptions","organizations_url":"https://api.github.com/users/symfony/orgs","repos_url":"https://api.github.com/users/symfony/repos","events_url":"https://api.github.com/users/symfony/events{/privacy}","received_events_url":"https://api.github.com/users/symfony/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/symfony/symfony","description":"The Symfony PHP framework","fork":false,"url":"https://api.github.com/repos/symfony/symfony","forks_url":"https://api.github.com/repos/symfony/symfony/forks","keys_url":"https://api.github.com/repos/symfony/symfony/keys{/key_id}","collaborators_url":"https://api.github.com/repos/symfony/symfony/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/symfony/symfony/teams","hooks_url":"https://api.github.com/repos/symfony/symfony/hooks","issue_events_url":"https://api.github.com/repos/symfony/symfony/issues/events{/number}","events_url":"https://api.github.com/repos/symfony/symfony/events","assignees_url":"https://api.github.com/repos/symfony/symfony/assignees{/user}","branches_url":"https://api.github.com/repos/symfony/symfony/branches{/branch}","tags_url":"https://api.github.com/repos/symfony/symfony/tags","blobs_url":"https://api.github.com/repos/symfony/symfony/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/symfony/symfony/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/symfony/symfony/git/refs{/sha}","trees_url":"https://api.github.com/repos/symfony/symfony/git/trees{/sha}","statuses_url":"https://api.github.com/repos/symfony/symfony/statuses/{sha}","languages_url":"https://api.github.com/repos/symfony/symfony/languages","stargazers_url":"https://api.github.com/repos/symfony/symfony/stargazers","contributors_url":"https://api.github.com/repos/symfony/symfony/contributors","subscribers_url":"https://api.github.com/repos/symfony/symfony/subscribers","subscription_url":"https://api.github.com/repos/symfony/symfony/subscription","commits_url":"https://api.github.com/repos/symfony/symfony/commits{/sha}","git_commits_url":"https://api.github.com/repos/symfony/symfony/git/commits{/sha}","comments_url":"https://api.github.com/repos/symfony/symfony/comments{/number}","issue_comment_url":"https://api.github.com/repos/symfony/symfony/issues/comments{/number}","contents_url":"https://api.github.com/repos/symfony/symfony/contents/{+path}","compare_url":"https://api.github.com/repos/symfony/symfony/compare/{base}...{head}","merges_url":"https://api.github.com/repos/symfony/symfony/merges","archive_url":"https://api.github.com/repos/symfony/symfony/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/symfony/symfony/downloads","issues_url":"https://api.github.com/repos/symfony/symfony/issues{/number}","pulls_url":"https://api.github.com/repos/symfony/symfony/pulls{/number}","milestones_url":"https://api.github.com/repos/symfony/symfony/milestones{/number}","notifications_url":"https://api.github.com/repos/symfony/symfony/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/symfony/symfony/labels{/name}","releases_url":"https://api.github.com/repos/symfony/symfony/releases{/id}","created_at":"2010-01-04T14:21:21Z","updated_at":"2015-09-16T21:05:53Z","pushed_at":"2015-09-17T01:43:56Z","git_url":"git://github.com/symfony/symfony.git","ssh_url":"git@github.com:symfony/symfony.git","clone_url":"https://github.com/symfony/symfony.git","svn_url":"https://github.com/symfony/symfony","homepage":"symfony.com","size":241574,"stargazers_count":10791,"watchers_count":10791,"language":"PHP","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":4256,"mirror_url":null,"open_issues_count":926,"forks":4256,"open_issues":926,"watchers":10791,"default_branch":"2.8"}},"_links":{"self":{"href":"https://api.github.com/repos/symfony/symfony/pulls/15778"},"html":{"href":"https://github.com/symfony/symfony/pull/15778"},"issue":{"href":"https://api.github.com/repos/symfony/symfony/issues/15778"},"comments":{"href":"https://api.github.com/repos/symfony/symfony/issues/15778/comments"},"review_comments":{"href":"https://api.github.com/repos/symfony/symfony/pulls/15778/comments"},"review_comment":{"href":"https://api.github.com/repos/symfony/symfony/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/symfony/symfony/pulls/15778/commits"},"statuses":{"href":"https://api.github.com/repos/symfony/symfony/statuses/c87515a99ff26fa44b8542801ac706bc5ff6c746"}}}}