{"action":"created","comment":{"url":"https://api.github.com/repos/symfony/symfony/pulls/comments/27343633","id":27343633,"diff_hunk":"@@ -165,22 +223,65 @@ public function configureOptions(OptionsResolver $resolver)\n             return $em;\n         };\n \n+        // Invoke the query builder closure so that we can cache choice lists\n+        // for equal query builders\n+        $queryBuilderNormalizer = function (Options $options, $queryBuilder) {\n+            if (is_callable($queryBuilder)) {\n+                $queryBuilder = call_user_func($queryBuilder, $options['em']->getRepository($options['class']));\n+\n+                if (!$queryBuilder instanceof QueryBuilder) {\n+                    throw new UnexpectedTypeException($queryBuilder, 'Doctrine\\ORM\\QueryBuilder');\n+                }\n+            }\n+\n+            return $queryBuilder;\n+        };\n+\n+        // Set the \"id_reader\" option via the normalizer. This option is not\n+        // supposed to be set by the user.\n+        $idReaderNormalizer = function (Options $options) use (&$idReaders) {\n+            $hash = CachingFactoryDecorator::generateHash(array(\n+                $options['em'],\n+                $options['class'],\n+            ));\n+\n+            // The ID reader is a utility that is needed to read the object IDs\n+            // when generating the field values. The callback generating the\n+            // field values has no access to the object manager or the class\n+            // of the field, so we store that information in the reader.\n+            // The reader is cached so that two choice lists for the same class\n+            // (and hence with the same reader) can successfully be cached.\n+            if (!isset($idReaders[$hash])) {\n+                $classMetadata = $options['em']->getClassMetadata($options['class']);\n+                $idReaders[$hash] = new IdReader($options['em'], $classMetadata);\n+            }\n+\n+            return $idReaders[$hash];\n+        };\n+\n         $resolver->setDefaults(array(\n             'em' => null,\n-            'property' => null,\n+            'property' => null, // deprecated, use \"choice_label\"","path":"src/Symfony/Bridge/Doctrine/Form/Type/DoctrineType.php","position":302,"original_position":302,"commit_id":"91550c9e44cd8ec9e4f52f6ca80ec8ee94f44b7c","original_commit_id":"91550c9e44cd8ec9e4f52f6ca80ec8ee94f44b7c","user":{"login":"webmozart","id":176399,"avatar_url":"https://avatars.githubusercontent.com/u/176399?v=3","gravatar_id":"","url":"https://api.github.com/users/webmozart","html_url":"https://github.com/webmozart","followers_url":"https://api.github.com/users/webmozart/followers","following_url":"https://api.github.com/users/webmozart/following{/other_user}","gists_url":"https://api.github.com/users/webmozart/gists{/gist_id}","starred_url":"https://api.github.com/users/webmozart/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/webmozart/subscriptions","organizations_url":"https://api.github.com/users/webmozart/orgs","repos_url":"https://api.github.com/users/webmozart/repos","events_url":"https://api.github.com/users/webmozart/events{/privacy}","received_events_url":"https://api.github.com/users/webmozart/received_events","type":"User","site_admin":false},"body":"added","created_at":"2015-03-28T09:31:36Z","updated_at":"2015-03-28T09:31:36Z","html_url":"https://github.com/symfony/symfony/pull/14050#discussion_r27343633","pull_request_url":"https://api.github.com/repos/symfony/symfony/pulls/14050","_links":{"self":{"href":"https://api.github.com/repos/symfony/symfony/pulls/comments/27343633"},"html":{"href":"https://github.com/symfony/symfony/pull/14050#discussion_r27343633"},"pull_request":{"href":"https://api.github.com/repos/symfony/symfony/pulls/14050"}}},"pull_request":{"url":"https://api.github.com/repos/symfony/symfony/pulls/14050","id":31905759,"html_url":"https://github.com/symfony/symfony/pull/14050","diff_url":"https://github.com/symfony/symfony/pull/14050.diff","patch_url":"https://github.com/symfony/symfony/pull/14050.patch","issue_url":"https://api.github.com/repos/symfony/symfony/issues/14050","number":14050,"state":"open","locked":false,"title":"[Form] Refactored choice lists to support dynamic label, value, index and attribute generation","user":{"login":"webmozart","id":176399,"avatar_url":"https://avatars.githubusercontent.com/u/176399?v=3","gravatar_id":"","url":"https://api.github.com/users/webmozart","html_url":"https://github.com/webmozart","followers_url":"https://api.github.com/users/webmozart/followers","following_url":"https://api.github.com/users/webmozart/following{/other_user}","gists_url":"https://api.github.com/users/webmozart/gists{/gist_id}","starred_url":"https://api.github.com/users/webmozart/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/webmozart/subscriptions","organizations_url":"https://api.github.com/users/webmozart/orgs","repos_url":"https://api.github.com/users/webmozart/repos","events_url":"https://api.github.com/users/webmozart/events{/privacy}","received_events_url":"https://api.github.com/users/webmozart/received_events","type":"User","site_admin":false},"body":"This is a rebase of #12148 on the 2.7 branch.\r\n\r\n| Q             | A\r\n| ------------- | ---\r\n| Bug fix?      | no\r\n| New feature?  | yes\r\n| BC breaks?    | yes\r\n| Deprecations? | yes\r\n| Tests pass?   | yes\r\n| Fixed tickets | #4067, #5494, #3836, #8658, #12148\r\n| License       | MIT\r\n| Doc PR        | TODO\r\n\r\nI implemented the additional options \"choice_label\", \"choice_name\", \"choice_value\", \"choice_attr\", \"group_by\" and \"choices_as_values\" for ChoiceType. Additionally the \"preferred_choices\" option was updated to accept callables and property paths.\r\n\r\nThe \"choices_as_values\" option will be removed in Symfony 3.0, where the choices will be passed in the values of the \"choices\" option by default. The reason for that is that, right now, choices are limited to strings and integers (i.e. valid array keys). When we flip the array, we remove that limitation. Since choice labels are always strings, we can also always use them as array keys:\r\n\r\n```php\r\n// Not possible currently, but possible with \"flip_choices\"\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n));\r\n```\r\n\r\nAll the features described here obviously also apply to subtypes of \"choice\", such as \"entity\".\r\n\r\n**choice_label**\r\n\r\nReturns the label for each choice. Can be a callable (which receives the choice as first and the key of the \"choices\" array as second argument) or a property path.\r\n\r\nIf `null`, the keys of the \"choices\" array are used as labels.\r\n\r\n```php\r\n// callable\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'yes' => true,\r\n        'no' => false,\r\n        'maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_label' => function ($choice, $key) {\r\n        return 'form.choice.'.$key;\r\n    },\r\n));\r\n\r\n// property path\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        Status::getInstance(Status::YES),\r\n        Status::getInstance(Status::NO),\r\n        Status::getInstance(Status::MAYBE),\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_label' => 'displayName',\r\n));\r\n```\r\n\r\n**choice_name**\r\n\r\nReturns the form name for each choice. That name is used as name of the checkbox/radio form for this choice. It is also used as index of the choice views in the template. Can be a callable (like for \"choice_label\") or a property path.\r\n\r\nThe generated names must be valid form names, i.e. contain alpha-numeric symbols, underscores, hyphens and colons only. They must start with an alpha-numeric symbol or an underscore.\r\n\r\nIf `null`, an incrementing integer is used as name.\r\n\r\n```php\r\n// callable\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_name' => function ($choice, $key) {\r\n        // use the labels as names\r\n        return strtolower($key);\r\n    },\r\n));\r\n\r\n// property path\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => Status::getInstance(Status::YES),\r\n        'No' => Status::getInstance(Status::NO),\r\n        'Maybe' => Status::getInstance(Status::MAYBE),\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_name' => 'value',\r\n));\r\n```\r\n\r\n**choice_value**\r\n\r\nReturns the string value for each choice. This value is displayed in the \"value\" attributes and submitted in the POST/PUT requests. Can be a callable (like for \"choice_label\") or a property path.\r\n\r\nIf `null`, an incrementing integer is used as value.\r\n\r\n```php\r\n// callable\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_value' => function ($choice, $key) {\r\n        if (null === $choice) {\r\n            return 'null';\r\n        }\r\n        \r\n        if (true === $choice) {\r\n            return 'true';\r\n        }\r\n        \r\n        return 'false';\r\n    },\r\n));\r\n\r\n// property path\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => Status::getInstance(Status::YES),\r\n        'No' => Status::getInstance(Status::NO),\r\n        'Maybe' => Status::getInstance(Status::MAYBE),\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_value' => 'value',\r\n));\r\n```\r\n\r\n**choice_attr**\r\n\r\nReturns the additional HTML attributes for choices. Can be an array, a callable (like for \"choice_label\") or a property path.\r\nIf an array, the key of the \"choices\" array must be used as keys.\r\n\r\n```php\r\n// array\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_attr' => array(\r\n        'Maybe' => array('class' => 'greyed-out'),\r\n    ),\r\n));\r\n\r\n// callable\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_attr' => function ($choice, $key) {\r\n        if (null === $choice) {\r\n            return array('class' => 'greyed-out');\r\n        }\r\n    },\r\n));\r\n\r\n// property path\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => Status::getInstance(Status::YES),\r\n        'No' => Status::getInstance(Status::NO),\r\n        'Maybe' => Status::getInstance(Status::MAYBE),\r\n    ),\r\n    'choices_as_values' => true,\r\n    'choice_value' => 'htmlAttributes',\r\n));\r\n```\r\n\r\n**group_by**\r\n\r\nReturns the grouping used for the choices. Can be an array/Traversable, a callable (like for \"choice_label\") or a property path.\r\n\r\nThe return values of the callable/property path are used as group labels. If `null` is returned, a choice is not grouped.\r\n\r\nIf `null`, the structure of the \"choices\" array is used to construct the groups.\r\n\r\n```php\r\n// default\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Decided' => array(\r\n            'Yes' => true,\r\n            'No' => false,\r\n        ),\r\n        'Undecided' => array(\r\n            'Maybe' => null,\r\n        ),\r\n    ),\r\n    'choices_as_values' => true,\r\n));\r\n\r\n// callable\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'group_by' => function ($choice, $key) {\r\n        if (null === $choice) {\r\n            return 'Undecided';\r\n        }\r\n        \r\n        return 'Decided';\r\n    },\r\n));\r\n\r\n// property path\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => Status::getInstance(Status::YES),\r\n        'No' => Status::getInstance(Status::NO),\r\n        'Maybe' => Status::getInstance(Status::MAYBE),\r\n    ),\r\n    'choices_as_values' => true,\r\n    'group_by' => 'type',\r\n));\r\n```\r\n\r\n**preferred_choices**\r\n\r\nReturns the preferred choices. Can be an array/Traversable, a callable (like for \"choice_label\") or a property path.\r\n\r\n```php\r\n// array\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'preferred_choices' => array(true),\r\n));\r\n\r\n// callable\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => true,\r\n        'No' => false,\r\n        'Maybe' => null,\r\n    ),\r\n    'choices_as_values' => true,\r\n    'preferred_choices' => function ($choice, $key) {\r\n        return true === $choice;\r\n    },\r\n));\r\n\r\n// property path\r\n$builder->add('attending', 'choice', array(\r\n    'choices' => array(\r\n        'Yes' => Status::getInstance(Status::YES),\r\n        'No' => Status::getInstance(Status::NO),\r\n        'Maybe' => Status::getInstance(Status::MAYBE),\r\n    ),\r\n    'choices_as_values' => true,\r\n    'preferred_choices' => 'preferred',\r\n));\r\n```\r\n\r\n**Technical Changes**\r\n\r\nTo properly implement all this, the old `ChoiceListInterface` class was deprecated and replaced by a new, slimmer one. The creation of choice views is now separated from choice lists. Hence a lot of logic is not executed anymore when processing (but not displaying) a form.\r\n\r\nInternally, a `ChoiceListFactoryInterface` implementation is used to construct choice lists and choice views. Two decorators exist for this class:\r\n\r\n* `CachingFactoryDecorator`: caches choice lists/views so that multiple fields displaying the same choices (e.g. in collection fields) use the same choice list/view\r\n* `PropertyAccessDecorator`: adds support for property paths to a factory\r\n\r\n**BC Breaks**\r\n\r\nThe option \"choice_list\" of ChoiceType now contains a `Symfony\\Component\\Form\\ChoiceList\\ChoiceListInterface` instance, which is a super-type of the deprecated `ChoiceListInterface`.\r\n\r\n**Todos**\r\n\r\n- [ ] Adapt CHANGELOGs\r\n- [ ] Adapt UPGRADE files\r\n- [ ] symfony/symfony-docs issue/PR","created_at":"2015-03-25T09:39:40Z","updated_at":"2015-03-28T09:31:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"cf7e9dca475a4743cf64ecd0f5a27f8ee18175f3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/symfony/symfony/pulls/14050/commits","review_comments_url":"https://api.github.com/repos/symfony/symfony/pulls/14050/comments","review_comment_url":"https://api.github.com/repos/symfony/symfony/pulls/comments{/number}","comments_url":"https://api.github.com/repos/symfony/symfony/issues/14050/comments","statuses_url":"https://api.github.com/repos/symfony/symfony/statuses/91550c9e44cd8ec9e4f52f6ca80ec8ee94f44b7c","head":{"label":"webmozart:issue4067","ref":"issue4067","sha":"91550c9e44cd8ec9e4f52f6ca80ec8ee94f44b7c","user":{"login":"webmozart","id":176399,"avatar_url":"https://avatars.githubusercontent.com/u/176399?v=3","gravatar_id":"","url":"https://api.github.com/users/webmozart","html_url":"https://github.com/webmozart","followers_url":"https://api.github.com/users/webmozart/followers","following_url":"https://api.github.com/users/webmozart/following{/other_user}","gists_url":"https://api.github.com/users/webmozart/gists{/gist_id}","starred_url":"https://api.github.com/users/webmozart/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/webmozart/subscriptions","organizations_url":"https://api.github.com/users/webmozart/orgs","repos_url":"https://api.github.com/users/webmozart/repos","events_url":"https://api.github.com/users/webmozart/events{/privacy}","received_events_url":"https://api.github.com/users/webmozart/received_events","type":"User","site_admin":false},"repo":{"id":1402087,"name":"symfony","full_name":"webmozart/symfony","owner":{"login":"webmozart","id":176399,"avatar_url":"https://avatars.githubusercontent.com/u/176399?v=3","gravatar_id":"","url":"https://api.github.com/users/webmozart","html_url":"https://github.com/webmozart","followers_url":"https://api.github.com/users/webmozart/followers","following_url":"https://api.github.com/users/webmozart/following{/other_user}","gists_url":"https://api.github.com/users/webmozart/gists{/gist_id}","starred_url":"https://api.github.com/users/webmozart/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/webmozart/subscriptions","organizations_url":"https://api.github.com/users/webmozart/orgs","repos_url":"https://api.github.com/users/webmozart/repos","events_url":"https://api.github.com/users/webmozart/events{/privacy}","received_events_url":"https://api.github.com/users/webmozart/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/webmozart/symfony","description":"The Symfony2 PHP framework (PHP 5.3 only -- not yet stable) -- documentation for master is at http://docs.symfony-reloaded.org/master/","fork":true,"url":"https://api.github.com/repos/webmozart/symfony","forks_url":"https://api.github.com/repos/webmozart/symfony/forks","keys_url":"https://api.github.com/repos/webmozart/symfony/keys{/key_id}","collaborators_url":"https://api.github.com/repos/webmozart/symfony/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/webmozart/symfony/teams","hooks_url":"https://api.github.com/repos/webmozart/symfony/hooks","issue_events_url":"https://api.github.com/repos/webmozart/symfony/issues/events{/number}","events_url":"https://api.github.com/repos/webmozart/symfony/events","assignees_url":"https://api.github.com/repos/webmozart/symfony/assignees{/user}","branches_url":"https://api.github.com/repos/webmozart/symfony/branches{/branch}","tags_url":"https://api.github.com/repos/webmozart/symfony/tags","blobs_url":"https://api.github.com/repos/webmozart/symfony/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/webmozart/symfony/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/webmozart/symfony/git/refs{/sha}","trees_url":"https://api.github.com/repos/webmozart/symfony/git/trees{/sha}","statuses_url":"https://api.github.com/repos/webmozart/symfony/statuses/{sha}","languages_url":"https://api.github.com/repos/webmozart/symfony/languages","stargazers_url":"https://api.github.com/repos/webmozart/symfony/stargazers","contributors_url":"https://api.github.com/repos/webmozart/symfony/contributors","subscribers_url":"https://api.github.com/repos/webmozart/symfony/subscribers","subscription_url":"https://api.github.com/repos/webmozart/symfony/subscription","commits_url":"https://api.github.com/repos/webmozart/symfony/commits{/sha}","git_commits_url":"https://api.github.com/repos/webmozart/symfony/git/commits{/sha}","comments_url":"https://api.github.com/repos/webmozart/symfony/comments{/number}","issue_comment_url":"https://api.github.com/repos/webmozart/symfony/issues/comments{/number}","contents_url":"https://api.github.com/repos/webmozart/symfony/contents/{+path}","compare_url":"https://api.github.com/repos/webmozart/symfony/compare/{base}...{head}","merges_url":"https://api.github.com/repos/webmozart/symfony/merges","archive_url":"https://api.github.com/repos/webmozart/symfony/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/webmozart/symfony/downloads","issues_url":"https://api.github.com/repos/webmozart/symfony/issues{/number}","pulls_url":"https://api.github.com/repos/webmozart/symfony/pulls{/number}","milestones_url":"https://api.github.com/repos/webmozart/symfony/milestones{/number}","notifications_url":"https://api.github.com/repos/webmozart/symfony/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/webmozart/symfony/labels{/name}","releases_url":"https://api.github.com/repos/webmozart/symfony/releases{/id}","created_at":"2011-02-23T12:20:24Z","updated_at":"2015-03-24T16:26:52Z","pushed_at":"2015-03-26T13:56:35Z","git_url":"git://github.com/webmozart/symfony.git","ssh_url":"git@github.com:webmozart/symfony.git","clone_url":"https://github.com/webmozart/symfony.git","svn_url":"https://github.com/webmozart/symfony","homepage":"http://www.symfony-reloaded.org/","size":56987,"stargazers_count":14,"watchers_count":14,"language":"PHP","has_issues":false,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":14,"default_branch":"master"}},"base":{"label":"symfony:2.7","ref":"2.7","sha":"433f640247f02a723a6f5404b3c092426a01a680","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-03-28T08:26:48Z","pushed_at":"2015-03-28T02:30:46Z","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":211858,"stargazers_count":9903,"watchers_count":9903,"language":"PHP","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":3877,"mirror_url":null,"open_issues_count":778,"forks":3877,"open_issues":778,"watchers":9903,"default_branch":"2.7"}},"_links":{"self":{"href":"https://api.github.com/repos/symfony/symfony/pulls/14050"},"html":{"href":"https://github.com/symfony/symfony/pull/14050"},"issue":{"href":"https://api.github.com/repos/symfony/symfony/issues/14050"},"comments":{"href":"https://api.github.com/repos/symfony/symfony/issues/14050/comments"},"review_comments":{"href":"https://api.github.com/repos/symfony/symfony/pulls/14050/comments"},"review_comment":{"href":"https://api.github.com/repos/symfony/symfony/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/symfony/symfony/pulls/14050/commits"},"statuses":{"href":"https://api.github.com/repos/symfony/symfony/statuses/91550c9e44cd8ec9e4f52f6ca80ec8ee94f44b7c"}}}}