{"action":"opened","number":24445,"pull_request":{"url":"https://api.github.com/repos/laravel/framework/pulls/24445","id":192486531,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkyNDg2NTMx","html_url":"https://github.com/laravel/framework/pull/24445","diff_url":"https://github.com/laravel/framework/pull/24445.diff","patch_url":"https://github.com/laravel/framework/pull/24445.patch","issue_url":"https://api.github.com/repos/laravel/framework/issues/24445","number":24445,"state":"open","locked":false,"title":"[5.7] Feature: Add Initialization Events to Eloquent","user":{"login":"ralphschindler","id":76674,"node_id":"MDQ6VXNlcjc2Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/76674?v=4","gravatar_id":"","url":"https://api.github.com/users/ralphschindler","html_url":"https://github.com/ralphschindler","followers_url":"https://api.github.com/users/ralphschindler/followers","following_url":"https://api.github.com/users/ralphschindler/following{/other_user}","gists_url":"https://api.github.com/users/ralphschindler/gists{/gist_id}","starred_url":"https://api.github.com/users/ralphschindler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ralphschindler/subscriptions","organizations_url":"https://api.github.com/users/ralphschindler/orgs","repos_url":"https://api.github.com/users/ralphschindler/repos","events_url":"https://api.github.com/users/ralphschindler/events{/privacy}","received_events_url":"https://api.github.com/users/ralphschindler/received_events","type":"User","site_admin":false},"body":"There are a couple of areas in eloquent that still make it difficult to write extensions that can handle complex attributes.  (By \"complex attributes\", I mean non-natively-known attribute types that can be expressed as objects until serialization, like how datetime objects are handled). Take for example there were an attribute of type `Coordinate`, and one wishes to be able to achieve the following workflow:\r\n\r\n```php\r\nclass Coordinate {} // assume exists as a 3rd party value object\r\nclass Place extends Model { uses 3rdParty/HasGeoTrait; ...} // assume this kind of model\r\n\r\n$place = Place::find(1234);\r\n$place->coordinate->setLatLong(30.01, -90.10);\r\n\r\n// or\r\n\r\n$place = new Place;\r\n$place->coordinate->setLatLong(30.01, -90.10);\r\n```\r\n\r\nWhile the former can be setup by a 3rd party trait by hooking into the `retrieved` eloquent event, the latter cannot because there is no event fired early enough to setup an attribute with a value object for the `coordinate`. (To fully understand the example, `saving` would serialize the value object to be put into the database and `saved` would restore the value object to further interaction.)\r\n\r\nThus, I am proposing that the base eloquent model introduce 2 new events that will fire at construction time: `initializing` (pre fill()) and `initialized` (post fill()).\r\n\r\nThis will give 3rd party traits the opportunity to do some initialization on eloquent models whether they were retrieved or newly instantiated (thus they will not have to instruct consumers to override the constructor.)","created_at":"2018-06-04T18:09:14Z","updated_at":"2018-06-04T18:09:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/laravel/framework/pulls/24445/commits","review_comments_url":"https://api.github.com/repos/laravel/framework/pulls/24445/comments","review_comment_url":"https://api.github.com/repos/laravel/framework/pulls/comments{/number}","comments_url":"https://api.github.com/repos/laravel/framework/issues/24445/comments","statuses_url":"https://api.github.com/repos/laravel/framework/statuses/9b761d1d13e3b1ee505f925edbef46e23fb70ebf","head":{"label":"ralphschindler:eloquent-init-event","ref":"eloquent-init-event","sha":"9b761d1d13e3b1ee505f925edbef46e23fb70ebf","user":{"login":"ralphschindler","id":76674,"node_id":"MDQ6VXNlcjc2Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/76674?v=4","gravatar_id":"","url":"https://api.github.com/users/ralphschindler","html_url":"https://github.com/ralphschindler","followers_url":"https://api.github.com/users/ralphschindler/followers","following_url":"https://api.github.com/users/ralphschindler/following{/other_user}","gists_url":"https://api.github.com/users/ralphschindler/gists{/gist_id}","starred_url":"https://api.github.com/users/ralphschindler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ralphschindler/subscriptions","organizations_url":"https://api.github.com/users/ralphschindler/orgs","repos_url":"https://api.github.com/users/ralphschindler/repos","events_url":"https://api.github.com/users/ralphschindler/events{/privacy}","received_events_url":"https://api.github.com/users/ralphschindler/received_events","type":"User","site_admin":false},"repo":{"id":65099015,"node_id":"MDEwOlJlcG9zaXRvcnk2NTA5OTAxNQ==","name":"laravel-framework","full_name":"ralphschindler/laravel-framework","owner":{"login":"ralphschindler","id":76674,"node_id":"MDQ6VXNlcjc2Njc0","avatar_url":"https://avatars2.githubusercontent.com/u/76674?v=4","gravatar_id":"","url":"https://api.github.com/users/ralphschindler","html_url":"https://github.com/ralphschindler","followers_url":"https://api.github.com/users/ralphschindler/followers","following_url":"https://api.github.com/users/ralphschindler/following{/other_user}","gists_url":"https://api.github.com/users/ralphschindler/gists{/gist_id}","starred_url":"https://api.github.com/users/ralphschindler/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ralphschindler/subscriptions","organizations_url":"https://api.github.com/users/ralphschindler/orgs","repos_url":"https://api.github.com/users/ralphschindler/repos","events_url":"https://api.github.com/users/ralphschindler/events{/privacy}","received_events_url":"https://api.github.com/users/ralphschindler/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ralphschindler/laravel-framework","description":null,"fork":true,"url":"https://api.github.com/repos/ralphschindler/laravel-framework","forks_url":"https://api.github.com/repos/ralphschindler/laravel-framework/forks","keys_url":"https://api.github.com/repos/ralphschindler/laravel-framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ralphschindler/laravel-framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ralphschindler/laravel-framework/teams","hooks_url":"https://api.github.com/repos/ralphschindler/laravel-framework/hooks","issue_events_url":"https://api.github.com/repos/ralphschindler/laravel-framework/issues/events{/number}","events_url":"https://api.github.com/repos/ralphschindler/laravel-framework/events","assignees_url":"https://api.github.com/repos/ralphschindler/laravel-framework/assignees{/user}","branches_url":"https://api.github.com/repos/ralphschindler/laravel-framework/branches{/branch}","tags_url":"https://api.github.com/repos/ralphschindler/laravel-framework/tags","blobs_url":"https://api.github.com/repos/ralphschindler/laravel-framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ralphschindler/laravel-framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ralphschindler/laravel-framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/ralphschindler/laravel-framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ralphschindler/laravel-framework/statuses/{sha}","languages_url":"https://api.github.com/repos/ralphschindler/laravel-framework/languages","stargazers_url":"https://api.github.com/repos/ralphschindler/laravel-framework/stargazers","contributors_url":"https://api.github.com/repos/ralphschindler/laravel-framework/contributors","subscribers_url":"https://api.github.com/repos/ralphschindler/laravel-framework/subscribers","subscription_url":"https://api.github.com/repos/ralphschindler/laravel-framework/subscription","commits_url":"https://api.github.com/repos/ralphschindler/laravel-framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/ralphschindler/laravel-framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/ralphschindler/laravel-framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/ralphschindler/laravel-framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/ralphschindler/laravel-framework/contents/{+path}","compare_url":"https://api.github.com/repos/ralphschindler/laravel-framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ralphschindler/laravel-framework/merges","archive_url":"https://api.github.com/repos/ralphschindler/laravel-framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ralphschindler/laravel-framework/downloads","issues_url":"https://api.github.com/repos/ralphschindler/laravel-framework/issues{/number}","pulls_url":"https://api.github.com/repos/ralphschindler/laravel-framework/pulls{/number}","milestones_url":"https://api.github.com/repos/ralphschindler/laravel-framework/milestones{/number}","notifications_url":"https://api.github.com/repos/ralphschindler/laravel-framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ralphschindler/laravel-framework/labels{/name}","releases_url":"https://api.github.com/repos/ralphschindler/laravel-framework/releases{/id}","deployments_url":"https://api.github.com/repos/ralphschindler/laravel-framework/deployments","created_at":"2016-08-06T19:40:12Z","updated_at":"2016-08-06T19:47:23Z","pushed_at":"2018-06-04T18:03:59Z","git_url":"git://github.com/ralphschindler/laravel-framework.git","ssh_url":"git@github.com:ralphschindler/laravel-framework.git","clone_url":"https://github.com/ralphschindler/laravel-framework.git","svn_url":"https://github.com/ralphschindler/laravel-framework","homepage":"http://laravel.com","size":33707,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"5.2"}},"base":{"label":"laravel:master","ref":"master","sha":"07758cd4b5ea2ecb56a224613886ce98c0102be0","user":{"login":"laravel","id":958072,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk1ODA3Mg==","avatar_url":"https://avatars3.githubusercontent.com/u/958072?v=4","gravatar_id":"","url":"https://api.github.com/users/laravel","html_url":"https://github.com/laravel","followers_url":"https://api.github.com/users/laravel/followers","following_url":"https://api.github.com/users/laravel/following{/other_user}","gists_url":"https://api.github.com/users/laravel/gists{/gist_id}","starred_url":"https://api.github.com/users/laravel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laravel/subscriptions","organizations_url":"https://api.github.com/users/laravel/orgs","repos_url":"https://api.github.com/users/laravel/repos","events_url":"https://api.github.com/users/laravel/events{/privacy}","received_events_url":"https://api.github.com/users/laravel/received_events","type":"Organization","site_admin":false},"repo":{"id":7548986,"node_id":"MDEwOlJlcG9zaXRvcnk3NTQ4OTg2","name":"framework","full_name":"laravel/framework","owner":{"login":"laravel","id":958072,"node_id":"MDEyOk9yZ2FuaXphdGlvbjk1ODA3Mg==","avatar_url":"https://avatars3.githubusercontent.com/u/958072?v=4","gravatar_id":"","url":"https://api.github.com/users/laravel","html_url":"https://github.com/laravel","followers_url":"https://api.github.com/users/laravel/followers","following_url":"https://api.github.com/users/laravel/following{/other_user}","gists_url":"https://api.github.com/users/laravel/gists{/gist_id}","starred_url":"https://api.github.com/users/laravel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laravel/subscriptions","organizations_url":"https://api.github.com/users/laravel/orgs","repos_url":"https://api.github.com/users/laravel/repos","events_url":"https://api.github.com/users/laravel/events{/privacy}","received_events_url":"https://api.github.com/users/laravel/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/laravel/framework","description":null,"fork":false,"url":"https://api.github.com/repos/laravel/framework","forks_url":"https://api.github.com/repos/laravel/framework/forks","keys_url":"https://api.github.com/repos/laravel/framework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/laravel/framework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/laravel/framework/teams","hooks_url":"https://api.github.com/repos/laravel/framework/hooks","issue_events_url":"https://api.github.com/repos/laravel/framework/issues/events{/number}","events_url":"https://api.github.com/repos/laravel/framework/events","assignees_url":"https://api.github.com/repos/laravel/framework/assignees{/user}","branches_url":"https://api.github.com/repos/laravel/framework/branches{/branch}","tags_url":"https://api.github.com/repos/laravel/framework/tags","blobs_url":"https://api.github.com/repos/laravel/framework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/laravel/framework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/laravel/framework/git/refs{/sha}","trees_url":"https://api.github.com/repos/laravel/framework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/laravel/framework/statuses/{sha}","languages_url":"https://api.github.com/repos/laravel/framework/languages","stargazers_url":"https://api.github.com/repos/laravel/framework/stargazers","contributors_url":"https://api.github.com/repos/laravel/framework/contributors","subscribers_url":"https://api.github.com/repos/laravel/framework/subscribers","subscription_url":"https://api.github.com/repos/laravel/framework/subscription","commits_url":"https://api.github.com/repos/laravel/framework/commits{/sha}","git_commits_url":"https://api.github.com/repos/laravel/framework/git/commits{/sha}","comments_url":"https://api.github.com/repos/laravel/framework/comments{/number}","issue_comment_url":"https://api.github.com/repos/laravel/framework/issues/comments{/number}","contents_url":"https://api.github.com/repos/laravel/framework/contents/{+path}","compare_url":"https://api.github.com/repos/laravel/framework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/laravel/framework/merges","archive_url":"https://api.github.com/repos/laravel/framework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/laravel/framework/downloads","issues_url":"https://api.github.com/repos/laravel/framework/issues{/number}","pulls_url":"https://api.github.com/repos/laravel/framework/pulls{/number}","milestones_url":"https://api.github.com/repos/laravel/framework/milestones{/number}","notifications_url":"https://api.github.com/repos/laravel/framework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/laravel/framework/labels{/name}","releases_url":"https://api.github.com/repos/laravel/framework/releases{/id}","deployments_url":"https://api.github.com/repos/laravel/framework/deployments","created_at":"2013-01-10T21:27:28Z","updated_at":"2018-06-04T16:17:49Z","pushed_at":"2018-06-04T16:14:44Z","git_url":"git://github.com/laravel/framework.git","ssh_url":"git@github.com:laravel/framework.git","clone_url":"https://github.com/laravel/framework.git","svn_url":"https://github.com/laravel/framework","homepage":"http://laravel.com","size":33843,"stargazers_count":12515,"watchers_count":12515,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":5453,"mirror_url":null,"archived":false,"open_issues_count":156,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":5453,"open_issues":156,"watchers":12515,"default_branch":"5.6"}},"_links":{"self":{"href":"https://api.github.com/repos/laravel/framework/pulls/24445"},"html":{"href":"https://github.com/laravel/framework/pull/24445"},"issue":{"href":"https://api.github.com/repos/laravel/framework/issues/24445"},"comments":{"href":"https://api.github.com/repos/laravel/framework/issues/24445/comments"},"review_comments":{"href":"https://api.github.com/repos/laravel/framework/pulls/24445/comments"},"review_comment":{"href":"https://api.github.com/repos/laravel/framework/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/laravel/framework/pulls/24445/commits"},"statuses":{"href":"https://api.github.com/repos/laravel/framework/statuses/9b761d1d13e3b1ee505f925edbef46e23fb70ebf"}},"author_association":"CONTRIBUTOR","merged":false,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"maintainer_can_modify":true,"commits":1,"additions":23,"deletions":0,"changed_files":2}}
{"actor":{"display_login":"ralphschindler"}}