{"action":"created","comment":{"url":"https://api.github.com/repos/joomla/joomla-cms/pulls/comments/103121828","pull_request_review_id":23898111,"id":103121828,"diff_hunk":"@@ -9,38 +9,112 @@\n namespace Joomla\\Cms\\Dispatcher;\n \n use Joomla\\Cms\\Controller\\Controller;\n+use Joomla\\Input\\Input;\n \n defined('_JEXEC') or die;\n \n /**\n- * Base class for a Joomla Dispatcher\n+ * Base class for a Joomla Component Dispatcher\n  *\n  * Dispatchers are responsible for checking ACL of a component if appropriate and\n  * choosing an appropriate controller (and if necessary, a task) and executing it.\n  *\n  * @since  __DEPLOY_VERSION__\n  */\n-abstract class Dispatcher implements DispatcherInterface\n+class Dispatcher implements DispatcherInterface\n {\n \t/**\n-\t * The JApplication instance\n+\t * An array contains all created dispatchers\n \t *\n-\t * @var     \\JApplicationCms\n+\t * @var array\n+\t */\n+\tprotected static $instances = array();\n+\n+\t/**\n+\t * The array store dispatcher/component config data\n+\t *\n+\t * @var array\n \t *\n \t * @since   __DEPLOY_VERSION__\n \t */\n-\tprivate $app;\n+\tprotected $config;\n+\n+\t/**\n+\t * The input object which will be passed to controller\n+\t *\n+\t * @var Input\n+\t *\n+\t * @since   __DEPLOY_VERSION__\n+\t */\n+\tprotected $input;\n+\n+\t/**\n+\t * Method to get a dispatcher instance for a component.\n+\t *\n+\t * @param   string  $option  The component\n+\t * @param   array   $config  An array of optional constructor options.\n+\t *\n+\t * @return  static\n+\t *\n+\t * @since   __DEPLOY_VERSION__\n+\t */\n+\tpublic static function getInstance($option, array $config = array())\n+\t{\n+\t\tif (!isset(self::$instances[$option]))\n+\t\t{\n+\t\t\t// Normalize component config data, populate default config data if needed\n+\t\t\t$config = self::normalizeConfig($option, $config);\n+\n+\t\t\t// Register component auto-loader\n+\t\t\t$autoLoader = include JPATH_LIBRARIES . '/vendor/autoload.php';\n+\t\t\t$autoLoader->setPsr4($config['frontend_namespace'] . '\\\\', JPATH_ROOT . '/components/' . $option);\n+\t\t\t$autoLoader->setPsr4($config['backend_namespace'] . '\\\\', JPATH_ADMINISTRATOR . '/components/' . $option);\n+\n+\t\t\t// If component has dispatcher class, use it. Otherwise, use default dispatcher\n+\t\t\t$class = $config['namespace'] . '\\\\Dispatcher\\\\Dispatcher';\n+\n+\t\t\tif (!class_exists($class))\n+\t\t\t{\n+\t\t\t\t$class = __CLASS__;\n+\t\t\t}\n+\n+\t\t\tself::$instances[$option] = new $class($config);\n+\t\t}\n+\n+\t\treturn self::$instances[$option];\n+\t}\n \n \t/**\n \t * Constructor for Dispatcher\n \t *\n-\t * @param   \\JApplicationCms  $app  The JApplication for the dispatcher\n+\t * @param   array  $config  An array of configuration issue\n \t *\n \t * @since   __DEPLOY_VERSION__\n \t */\n-\tpublic function __construct(\\JApplicationCms $app)\n+\tpublic function __construct(array $config = array())\n \t{\n-\t\t$this->app  = $app;\n+\t\t$this->config = $config;\n+\n+\t\tif (isset($config['input']))\n+\t\t{\n+\t\t\t$this->setInput($config['input']);\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\t$this->setInput(\\JFactory::getApplication()->input);","path":"libraries/src/Cms/Dispatcher/Dispatcher.php","position":104,"original_position":104,"commit_id":"08d8ba4dfeb95666ee0a5e67db97492aadf7be79","original_commit_id":"08d8ba4dfeb95666ee0a5e67db97492aadf7be79","user":{"login":"yvesh","id":897638,"avatar_url":"https://avatars.githubusercontent.com/u/897638?v=3","gravatar_id":"","url":"https://api.github.com/users/yvesh","html_url":"https://github.com/yvesh","followers_url":"https://api.github.com/users/yvesh/followers","following_url":"https://api.github.com/users/yvesh/following{/other_user}","gists_url":"https://api.github.com/users/yvesh/gists{/gist_id}","starred_url":"https://api.github.com/users/yvesh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yvesh/subscriptions","organizations_url":"https://api.github.com/users/yvesh/orgs","repos_url":"https://api.github.com/users/yvesh/repos","events_url":"https://api.github.com/users/yvesh/events{/privacy}","received_events_url":"https://api.github.com/users/yvesh/received_events","type":"User","site_admin":false},"body":"@wilsonge sure, but isn't it better when it's always forwarded to the dispatcher? The less coupling the better for me. ","created_at":"2017-02-26T23:57:27Z","updated_at":"2017-02-26T23:57:27Z","html_url":"https://github.com/joomla/joomla-cms/pull/14258#discussion_r103121828","pull_request_url":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258","_links":{"self":{"href":"https://api.github.com/repos/joomla/joomla-cms/pulls/comments/103121828"},"html":{"href":"https://github.com/joomla/joomla-cms/pull/14258#discussion_r103121828"},"pull_request":{"href":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258"}}},"pull_request":{"url":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258","id":108000020,"html_url":"https://github.com/joomla/joomla-cms/pull/14258","diff_url":"https://github.com/joomla/joomla-cms/pull/14258.diff","patch_url":"https://github.com/joomla/joomla-cms/pull/14258.patch","issue_url":"https://api.github.com/repos/joomla/joomla-cms/issues/14258","number":14258,"state":"open","locked":false,"title":"An alternative implementation for Component Dispatcher","user":{"login":"joomdonation","id":977664,"avatar_url":"https://avatars.githubusercontent.com/u/977664?v=3","gravatar_id":"","url":"https://api.github.com/users/joomdonation","html_url":"https://github.com/joomdonation","followers_url":"https://api.github.com/users/joomdonation/followers","following_url":"https://api.github.com/users/joomdonation/following{/other_user}","gists_url":"https://api.github.com/users/joomdonation/gists{/gist_id}","starred_url":"https://api.github.com/users/joomdonation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joomdonation/subscriptions","organizations_url":"https://api.github.com/users/joomdonation/orgs","repos_url":"https://api.github.com/users/joomdonation/repos","events_url":"https://api.github.com/users/joomdonation/events{/privacy}","received_events_url":"https://api.github.com/users/joomdonation/received_events","type":"User","site_admin":false},"body":"Pull Request for Issue # .\r\n\r\n### Summary of Changes\r\nThis PR proposes an alternative implementation of component dispatcher for Joomla 4. It is not for merging, I open it for discussing purpose only. With this implementation (and further works on MVC layer), we can support namespace + HMVC  for our extensions. See https://github.com/joomdonation/joomla-cms/tree/joomla-mvc/administrator/components/com_banners for a basic (already working) component.\r\n\r\n#### The component structure\r\n1. The component needs to be restructured so that all (or at least Models, Views, Controllers classes) will ve autoloaded with PSR-4 Autoloader:\r\n\r\n- Controller classes will be located inside administrator/components/com_mycom/Controller, components/com_mycom/Controller folders.\r\n- Model classes will be located inside administrator/components/com_mycom/Model, components/com_mycom/Model folders.\r\n- View classes will be located inside administrator/components/com_mycom/View, components/com_mycom/View folders.\r\n\r\n2. We need to avoid using JPATH_COMPONENT in component code\r\n\r\n3. We must not getting input directly from application object (JFactory::getApplication()->input) on our component/plugins. We need to find a way to pass it from controller to models/views (could it be property of Model/View class?)\r\n\r\n#### The Dispatcher concept\r\nIn an application (frontend or backend), there would be one instance of dispatcher object for a component. It is created in component entry https://github.com/joomdonation/joomla-cms/blob/joomla-mvc/administrator/components/com_banners/banners.php#L14\r\n\r\n```php\r\n\\Joomla\\Cms\\Dispatcher\\Dispatcher::getInstance('com_banners')->dispatch();\r\n```\r\nThe getInstance method accept two arguments:\r\n\r\n1. $option : It is the name of component being executed\r\n2. An optional array $config containing the technical config settings of a component. These config settings will be passed as config variables while creating controllers, Model, View. Table classes for the extension. Basic description of the some of config keys (more will be added while working further on MVC layer) can be found below, if one not passed, default value will be used:\r\n\r\n- component_namespace : For Joomla core, it should be something Joomla\\Content, Joomla\\Contact, Joomla\\Banners...\r\n- frontend_namespace: Namespace for frontend classes of component, it should be something like Joomla\\Content\\Site,  Joomla\\Contact\\Site\r\n- backend_namespace: Namespace for backend classes of component, it should be something like Joomla\\Content\\Admin,  Joomla\\Contact\\Admin\r\n- redirect: Whether we should redirect after component being executed. By default, it is Yes. For an HMVC call (for example, in a module used to display a view in component, it should set to No)\r\n- load_language : Should be false by default. Set it to Yes for an HMVC call\r\n- table_prefix: Prefix of database table name, for core extensions, it usually #__, for custom extensions, it usually be #__COMPONENTNAME_\r\n- template_path\r\n- db\r\n\r\nAfter calling dispatch method for first time, we can call it for second time, passing new input to executing new request of the same component. For example, the code below would get the cached dispatcher object, execute new request to display list of clients records..\r\n\r\n```php\r\n$dispatcher = \\Joomla\\Cms\\Dispatcher\\Dispatcher::getInstance('com_banners');\r\n$dispatcher->dispatch();\r\n\r\n// Passing new input to dispatcher and dispatch again\r\n$oldInput = $dispatcher->setInput(array('view' => 'clients'));\r\n$dispatcher->dispatch();\r\n\r\n// Restore old input\r\n$dispatcher->setInput($oldInput);\r\n```\r\n#### Support HMVC would be a nice thing\r\nIf we could support HMVC, that would be great. To display a view in an extension in a module or in a Joomla article..., instead of having to write code to get data, render it, we can simply call code something like this:\r\n\r\n```php\r\n$config = array(\r\n\t'input'         => array(\r\n\t\t'view'               => 'myview',\r\n\t\t'id'                 => '5',\r\n\t\t'other_request_data' => 'data',\r\n\t),\r\n\t'redirect'      => 'false',\r\n\t'load_language' => true\r\n);\r\n\r\n\\Joomla\\Cms\\Dispatcher\\Dispatcher::getInstance('com_mycom', $config);\r\n\t->dispatch();\r\n```\r\n\r\nI have done basic work to support this (of course, there are many improvements can be made to the changes it as I only spend litle time working on it until decision is made), if we with any chances, try to go with this direction, we will work further (and there are many questions I have need to be answered/discussed\r\n\r\n1. Change to Controller classes https://github.com/joomdonation/joomla-cms/commit/a9bd932089472fe74ebfee2fca4380042a552428\r\n\r\n2. Change to Model classes https://github.com/joomdonation/joomla-cms/commit/fa1092533697fb1dec6a13e4bc5c7d7c326ca276\r\n\r\n3. Change to View classes (only very small change for now) https://github.com/joomdonation/joomla-cms/commit/ec43627880443311623b58f63e2b3dba706c2d23","created_at":"2017-02-26T10:58:21Z","updated_at":"2017-02-26T23:57:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d15f237005440fba4146e1e3dc951027c48d8b0c","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258/commits","review_comments_url":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258/comments","review_comment_url":"https://api.github.com/repos/joomla/joomla-cms/pulls/comments{/number}","comments_url":"https://api.github.com/repos/joomla/joomla-cms/issues/14258/comments","statuses_url":"https://api.github.com/repos/joomla/joomla-cms/statuses/08d8ba4dfeb95666ee0a5e67db97492aadf7be79","head":{"label":"joomdonation:component-dispatcher","ref":"component-dispatcher","sha":"08d8ba4dfeb95666ee0a5e67db97492aadf7be79","user":{"login":"joomdonation","id":977664,"avatar_url":"https://avatars.githubusercontent.com/u/977664?v=3","gravatar_id":"","url":"https://api.github.com/users/joomdonation","html_url":"https://github.com/joomdonation","followers_url":"https://api.github.com/users/joomdonation/followers","following_url":"https://api.github.com/users/joomdonation/following{/other_user}","gists_url":"https://api.github.com/users/joomdonation/gists{/gist_id}","starred_url":"https://api.github.com/users/joomdonation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joomdonation/subscriptions","organizations_url":"https://api.github.com/users/joomdonation/orgs","repos_url":"https://api.github.com/users/joomdonation/repos","events_url":"https://api.github.com/users/joomdonation/events{/privacy}","received_events_url":"https://api.github.com/users/joomdonation/received_events","type":"User","site_admin":false},"repo":{"id":28589926,"name":"joomla-cms","full_name":"joomdonation/joomla-cms","owner":{"login":"joomdonation","id":977664,"avatar_url":"https://avatars.githubusercontent.com/u/977664?v=3","gravatar_id":"","url":"https://api.github.com/users/joomdonation","html_url":"https://github.com/joomdonation","followers_url":"https://api.github.com/users/joomdonation/followers","following_url":"https://api.github.com/users/joomdonation/following{/other_user}","gists_url":"https://api.github.com/users/joomdonation/gists{/gist_id}","starred_url":"https://api.github.com/users/joomdonation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joomdonation/subscriptions","organizations_url":"https://api.github.com/users/joomdonation/orgs","repos_url":"https://api.github.com/users/joomdonation/repos","events_url":"https://api.github.com/users/joomdonation/events{/privacy}","received_events_url":"https://api.github.com/users/joomdonation/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/joomdonation/joomla-cms","description":"Home of the Joomla! Content Management System","fork":true,"url":"https://api.github.com/repos/joomdonation/joomla-cms","forks_url":"https://api.github.com/repos/joomdonation/joomla-cms/forks","keys_url":"https://api.github.com/repos/joomdonation/joomla-cms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/joomdonation/joomla-cms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/joomdonation/joomla-cms/teams","hooks_url":"https://api.github.com/repos/joomdonation/joomla-cms/hooks","issue_events_url":"https://api.github.com/repos/joomdonation/joomla-cms/issues/events{/number}","events_url":"https://api.github.com/repos/joomdonation/joomla-cms/events","assignees_url":"https://api.github.com/repos/joomdonation/joomla-cms/assignees{/user}","branches_url":"https://api.github.com/repos/joomdonation/joomla-cms/branches{/branch}","tags_url":"https://api.github.com/repos/joomdonation/joomla-cms/tags","blobs_url":"https://api.github.com/repos/joomdonation/joomla-cms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/joomdonation/joomla-cms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/joomdonation/joomla-cms/git/refs{/sha}","trees_url":"https://api.github.com/repos/joomdonation/joomla-cms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/joomdonation/joomla-cms/statuses/{sha}","languages_url":"https://api.github.com/repos/joomdonation/joomla-cms/languages","stargazers_url":"https://api.github.com/repos/joomdonation/joomla-cms/stargazers","contributors_url":"https://api.github.com/repos/joomdonation/joomla-cms/contributors","subscribers_url":"https://api.github.com/repos/joomdonation/joomla-cms/subscribers","subscription_url":"https://api.github.com/repos/joomdonation/joomla-cms/subscription","commits_url":"https://api.github.com/repos/joomdonation/joomla-cms/commits{/sha}","git_commits_url":"https://api.github.com/repos/joomdonation/joomla-cms/git/commits{/sha}","comments_url":"https://api.github.com/repos/joomdonation/joomla-cms/comments{/number}","issue_comment_url":"https://api.github.com/repos/joomdonation/joomla-cms/issues/comments{/number}","contents_url":"https://api.github.com/repos/joomdonation/joomla-cms/contents/{+path}","compare_url":"https://api.github.com/repos/joomdonation/joomla-cms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/joomdonation/joomla-cms/merges","archive_url":"https://api.github.com/repos/joomdonation/joomla-cms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/joomdonation/joomla-cms/downloads","issues_url":"https://api.github.com/repos/joomdonation/joomla-cms/issues{/number}","pulls_url":"https://api.github.com/repos/joomdonation/joomla-cms/pulls{/number}","milestones_url":"https://api.github.com/repos/joomdonation/joomla-cms/milestones{/number}","notifications_url":"https://api.github.com/repos/joomdonation/joomla-cms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/joomdonation/joomla-cms/labels{/name}","releases_url":"https://api.github.com/repos/joomdonation/joomla-cms/releases{/id}","deployments_url":"https://api.github.com/repos/joomdonation/joomla-cms/deployments","created_at":"2014-12-29T11:23:48Z","updated_at":"2015-04-14T11:35:13Z","pushed_at":"2017-02-26T14:39:32Z","git_url":"git://github.com/joomdonation/joomla-cms.git","ssh_url":"git@github.com:joomdonation/joomla-cms.git","clone_url":"https://github.com/joomdonation/joomla-cms.git","svn_url":"https://github.com/joomdonation/joomla-cms","homepage":"http://joomla.org","size":183488,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"staging"}},"base":{"label":"joomla:4.0-dev","ref":"4.0-dev","sha":"fa80c814e83900bc8f75c23fbe2484d15c58ccdd","user":{"login":"joomla","id":751633,"avatar_url":"https://avatars.githubusercontent.com/u/751633?v=3","gravatar_id":"","url":"https://api.github.com/users/joomla","html_url":"https://github.com/joomla","followers_url":"https://api.github.com/users/joomla/followers","following_url":"https://api.github.com/users/joomla/following{/other_user}","gists_url":"https://api.github.com/users/joomla/gists{/gist_id}","starred_url":"https://api.github.com/users/joomla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joomla/subscriptions","organizations_url":"https://api.github.com/users/joomla/orgs","repos_url":"https://api.github.com/users/joomla/repos","events_url":"https://api.github.com/users/joomla/events{/privacy}","received_events_url":"https://api.github.com/users/joomla/received_events","type":"Organization","site_admin":false},"repo":{"id":2464908,"name":"joomla-cms","full_name":"joomla/joomla-cms","owner":{"login":"joomla","id":751633,"avatar_url":"https://avatars.githubusercontent.com/u/751633?v=3","gravatar_id":"","url":"https://api.github.com/users/joomla","html_url":"https://github.com/joomla","followers_url":"https://api.github.com/users/joomla/followers","following_url":"https://api.github.com/users/joomla/following{/other_user}","gists_url":"https://api.github.com/users/joomla/gists{/gist_id}","starred_url":"https://api.github.com/users/joomla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joomla/subscriptions","organizations_url":"https://api.github.com/users/joomla/orgs","repos_url":"https://api.github.com/users/joomla/repos","events_url":"https://api.github.com/users/joomla/events{/privacy}","received_events_url":"https://api.github.com/users/joomla/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/joomla/joomla-cms","description":"Home of the Joomla! Content Management System","fork":false,"url":"https://api.github.com/repos/joomla/joomla-cms","forks_url":"https://api.github.com/repos/joomla/joomla-cms/forks","keys_url":"https://api.github.com/repos/joomla/joomla-cms/keys{/key_id}","collaborators_url":"https://api.github.com/repos/joomla/joomla-cms/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/joomla/joomla-cms/teams","hooks_url":"https://api.github.com/repos/joomla/joomla-cms/hooks","issue_events_url":"https://api.github.com/repos/joomla/joomla-cms/issues/events{/number}","events_url":"https://api.github.com/repos/joomla/joomla-cms/events","assignees_url":"https://api.github.com/repos/joomla/joomla-cms/assignees{/user}","branches_url":"https://api.github.com/repos/joomla/joomla-cms/branches{/branch}","tags_url":"https://api.github.com/repos/joomla/joomla-cms/tags","blobs_url":"https://api.github.com/repos/joomla/joomla-cms/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/joomla/joomla-cms/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/joomla/joomla-cms/git/refs{/sha}","trees_url":"https://api.github.com/repos/joomla/joomla-cms/git/trees{/sha}","statuses_url":"https://api.github.com/repos/joomla/joomla-cms/statuses/{sha}","languages_url":"https://api.github.com/repos/joomla/joomla-cms/languages","stargazers_url":"https://api.github.com/repos/joomla/joomla-cms/stargazers","contributors_url":"https://api.github.com/repos/joomla/joomla-cms/contributors","subscribers_url":"https://api.github.com/repos/joomla/joomla-cms/subscribers","subscription_url":"https://api.github.com/repos/joomla/joomla-cms/subscription","commits_url":"https://api.github.com/repos/joomla/joomla-cms/commits{/sha}","git_commits_url":"https://api.github.com/repos/joomla/joomla-cms/git/commits{/sha}","comments_url":"https://api.github.com/repos/joomla/joomla-cms/comments{/number}","issue_comment_url":"https://api.github.com/repos/joomla/joomla-cms/issues/comments{/number}","contents_url":"https://api.github.com/repos/joomla/joomla-cms/contents/{+path}","compare_url":"https://api.github.com/repos/joomla/joomla-cms/compare/{base}...{head}","merges_url":"https://api.github.com/repos/joomla/joomla-cms/merges","archive_url":"https://api.github.com/repos/joomla/joomla-cms/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/joomla/joomla-cms/downloads","issues_url":"https://api.github.com/repos/joomla/joomla-cms/issues{/number}","pulls_url":"https://api.github.com/repos/joomla/joomla-cms/pulls{/number}","milestones_url":"https://api.github.com/repos/joomla/joomla-cms/milestones{/number}","notifications_url":"https://api.github.com/repos/joomla/joomla-cms/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/joomla/joomla-cms/labels{/name}","releases_url":"https://api.github.com/repos/joomla/joomla-cms/releases{/id}","deployments_url":"https://api.github.com/repos/joomla/joomla-cms/deployments","created_at":"2011-09-27T02:07:38Z","updated_at":"2017-02-26T13:43:18Z","pushed_at":"2017-02-26T23:25:02Z","git_url":"git://github.com/joomla/joomla-cms.git","ssh_url":"git@github.com:joomla/joomla-cms.git","clone_url":"https://github.com/joomla/joomla-cms.git","svn_url":"https://github.com/joomla/joomla-cms","homepage":"https://www.joomla.org","size":183135,"stargazers_count":2275,"watchers_count":2275,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2406,"mirror_url":null,"open_issues_count":658,"forks":2406,"open_issues":658,"watchers":2275,"default_branch":"staging"}},"_links":{"self":{"href":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258"},"html":{"href":"https://github.com/joomla/joomla-cms/pull/14258"},"issue":{"href":"https://api.github.com/repos/joomla/joomla-cms/issues/14258"},"comments":{"href":"https://api.github.com/repos/joomla/joomla-cms/issues/14258/comments"},"review_comments":{"href":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258/comments"},"review_comment":{"href":"https://api.github.com/repos/joomla/joomla-cms/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/joomla/joomla-cms/pulls/14258/commits"},"statuses":{"href":"https://api.github.com/repos/joomla/joomla-cms/statuses/08d8ba4dfeb95666ee0a5e67db97492aadf7be79"}}}}
{"actor":{"display_login":"yvesh"}}