Process flow (3/5 All 5 patterns) | Contribution list and Contribution detailsProcess flow Submenu
2017-11-25 release
2021-03-09 update
- SeeCheckpoint | Object-Orientation← point
- Contribution list http://mini-blog.localhost/user/user1link user1
- Contribution list http://mini-blog.localhost/user/user2link user2
- Contribution list http://mini-blog.localhost/user/user3URL
- Seescreen SeeTest Data
- Login User ID: user1, Password: password
- index.php1require'../bootstrap.php'set autoloadit is omitted belowSeeAccount registration screen (User registration screen)
- index.php1require'../MiniBlogApplication.php'it is omitted below
- index.php1newMiniBlogApplication$app = new MiniBlogApplication(false)it is omitted below
- index.php1run$app->run()
- Application (core)2run
- $params = $this->router->resolve($this->request->getPathInfo())details↓
- Request (core)3getPathInfo'/user/user1''/user/user2''/user/user3'SeeCheckpoint | Request
- Request (core)4getBaseUrl
- Request (core)5getRequestUri
- Request (core)4getRequestUri
- Router (core)3resolve'status', 'user'$params['controller'], $params['action']SeeCheckpoint | Router← point $params['user_name']'user1''user2''user3'
- Application (core)3runAction'status', 'user'$params['user_name']'user1''user2''user3'
- Application (core)4findController!class_exists'StatusController'
- ClassLoader (core)5loadClass'StatusController'require'StatusController.php'/core /models
- Application (core)5getControllerDir
- MiniBlogApplication6getRootDir
- Application (core)5require_once'StatusController.php'/controllersSeeCheckpoint | Application
- class StatusController extends Controller
- ClassLoader (core)6loadClass'Controller'
- ClassLoader (core)7require'Controller.php'
- return new $controller_class($this)new use variabledetails↓
- Application (core)5new$controller_class = 'StatusController'MiniBlogApplication
- Controller (core)6__constructMiniBlogApplicationSeeCheckpoint | Controller
- Application (core)7getRequest
- Application (core)7getResponse
- Application (core)7getSession
- Application (core)7getDbManager
- $content = $controller->run($action, $params)details↓
- Controller (core)4run(StatusController)'status', 'user''userAction'$params['user_name']'user1''user2''user3'
- needsAuthentication($action) && isAuthenticated()denyNot Logindetails↓
- $auth_actions = array('index', 'post') (StatusController.php line 10)
- Controller (core)5needsAuthentication'user'falseLogin UnnecessaryisAuthenticated Untreated (Not check)
- Process start --- before Action start↘Process flow is almost the same except Controller and Actiononly Transition to Login, add Exception
- $content = $this->$action_method($params) variable functions$content = StatusController->userAction($params)
- StatusController5userActionAction startargument $params$params['user_name']'user1''user2''user3'
- $user = $this->db_manager->get('User')->fetchByUserName($params['user_name'])'user1', 'user2', 'user3' 1recorddetails↓
- DbManager (core)6get'User'get('User') 1stUserRepository
- DbManager (core)7getConnectionForRepository'User'DbManager->repository_connection_map['User']
- DbManager (core)8getConnection
- DbManager (core)8getConnectionreturn current(DbManager->connections)DbManager->connections['master'] = $con↙
- DbManager (core)7getConnectionForRepositoryreturn $con
- $repository = new $repository_class($con)new use variabledetails↓
- DbManager (core)7new$repository_class = 'UserRepository'$con
- ClassLoader (core)8loadClass'UserRepository'
- ClassLoader (core)9require'UserRepository.php'
- class UserRepository extends DbRepository
- ClassLoader (core)10loadClass'DbRepository'
- ClassLoader (core)11require'DbRepository.php'
- DbRepository (core)8__construct'$con'
- DbRepository (core)9setConnectionUserRepository->con = $con↗
- DbManager (core)6getDbManager->repositories['User']=>UserRepository
- DbManager (core)6getreturn DbManager->repositories['User']
- UserRepository6fetchByUserName($params['user_name'])SeeSQL
- DbRepository (core)7fetchSeeCheckpoint | DbRepository
- DbRepository (core)8execute
- StatusRepository6fetchByUserName
- if (!$user)No user forward404()
- $statuses = $this->db_manager->get('Status')->fetchAllByUserId($user['id'])status1-status2, status3-status4, status5details↓
- DbManager (core)6get'Status'get('Status') 1stStatusRepository
- DbManager (core)7getConnectionForRepository'Status'DbManager->repository_connection_map['Status']
- DbManager (core)8getConnection
- DbManager (core)8getConnectionreturn current(DbManager->connections)DbManager->connections['master'] = $con↙
- DbManager (core)7getConnectionForRepositoryreturn $con
- $repository = new $repository_class($con)new use variabledetails↓
- DbManager (core)7new$repository_class = 'StatusRepository'$con
- ClassLoader (core)8loadClass'StatusRepository'DbRepository loaded
- ClassLoader (core)9require'StatusRepository.php'
- DbRepository (core)8__construct'$con'
- DbRepository (core)9setConnectionStatusRepository->con = $con↗
- DbManager (core)6getDbManager->repositories['Status']=>StatusRepository
- DbManager (core)6getreturn DbManager->repositories['Status']
- StatusRepository6fetchAllByUserIdSeeSQL
- DbRepository (core)7fetchAllSeeCheckpoint | DbRepository
- DbRepository (core)8execute
- StatusRepository6fetchAllByUserId
- if ($this->session->isAuthenticated())Login
- Session (core)6isAuthenticated
- Session (core)7get'_authenticated'trueLogin
- Session (core)6get$my'user1' 1 record (Login user)
- Follow start
- 'user2' $following true'user3' $following false'user1' $following nullSeeTest Data
- $my['id']: 1, $user['id']: 2, 3
- if ($my['id'] !== $user['id']) {
- ↙$following = $this->db_manager->get('Following')->isFollowing($my['id'], $user['id'])
- }
- $following = $this->db_manager->get('Following')->isFollowing($my['id'], $user['id'])details↓
- DbManager (core)6get'Following'get('Following') 1stFollowingRepository
- DbManager (core)7getConnectionForRepository'Following'DbManager->repository_connection_map['Following']
- DbManager (core)8getConnection
- DbManager (core)8getConnectionreturn current(DbManager->connections)DbManager->connections['master'] = $con↙
- DbManager (core)7getConnectionForRepositoryreturn $con
- $repository = new $repository_class($con)new use variabledetails↓
- DbManager (core)7new$repository_class = 'FollowingRepository'$con
- ClassLoader (core)8loadClass'FollowingRepository'DbRepository loaded
- ClassLoader (core)9require'FollowingRepository.php'
- DbRepository (core)8__construct'$con'
- DbRepository (core)9setConnectionFollowingRepository->con = $con↗
- DbManager (core)6getDbManager->repositories['Following']=>FollowingRepository
- DbManager (core)6getreturn DbManager->repositories['Following']
- FollowingRepository6isFollowingSeeSQL
- DbRepository (core)7fetchSeeCheckpoint | DbRepository
- DbRepository (core)8execute
- FollowingRepository6isFollowing
- Follow end
- if ($this->session->isAuthenticated()) endLogin
- return $this->render(array(... $this->generateCsrfToken ...)$user$statuses$followingdetails↓
- Controller (core)6generateCsrfToken'account/follow''_token'Follow http://mini-blog.localhost/follow checkCsrfTokenSeeCheckpoint | Controller
- Session (core)7get'csrf_tokens/account/follow'SeeCheckpoint | Session
- Session (core)7set'csrf_tokens/account/follow'
- Controller (core)6render$layout = 'layout'$variables['user'], $variables['statuses'], $variables['following'], $variables['_token']
- Request (core)7getBaseUrl
- Request (core)8getRequestUri
- Controller (core)7newView
- ClassLoader (core)8loadClass'View'
- ClassLoader (core)9requireView.php'
- Application (core)8getViewDir
- MiniBlogApplication9getRootDir
- View (core)8__construct$base_dir, $defaults
- View (core)7renderstatus/user$_layout = 'layout'execution1SeeCheckpoint | View (HTML structure)← point
- extract(array_merge($this->defaults, $_variables))$_variables['user']$_variables['following']View->defaults['base_url']$_variables['_token']$_variables['statuses']
- View (core)8require'/views/status/user.php'$user, $following, $base_url, $_token, $statuses
- View (core)9setLayoutVar'title', 'user1' or 'user2' or 'user3'
- user.phpif (!is_null($following)):
- 'user2' $following true'user3' $following false'user1' $following nullSeeTest Data
- user.phpif ($following):
- 'user2' ' Following'
- user.phpelse:
- 'user3' 'Follow' button'user3' '_token' 'following_name'
- View (core)11'_token'hidden
- View (core)11'following_name'hidden
- View (core)11escape
- View (user.php)9renderstatus/status$_layout = falseexecution2 foreach (Contribution status1-status2, status3-status4, status5)render in user.php
- extract(array_merge($this->defaults, $_variables))View->defaults['base_url']$_variables['status']
- View (core)10require'/views/status/status.php'$base_url, $status
- View (core)11escape
- $content = ob_get_clean()output1status.php
- View (user.php)9renderreturn $contentoutput1
- $content = ob_get_clean()output2user.php + status.php
- if ($_layout) {$_layout = 'layout'
- $content = $this->render($_layout, array_merge($this->layout_variables, array('_content' => $content,)))
- View (core)8renderlayout$_layout = falseexecution3render in render
- extract(array_merge($this->defaults, $_variables))$_variables['title']View->defaults['base_url']View->defaults['session']$_variables['_content']
- View (core)9require'/views/layout.php'$title, $base_url, $session, $_content
- View (core)10escape
- Session (core)10isAuthenticated
- Session (core)11get'_authenticated'true
- layout10echo $_contentuser.php + status.phpoutput2
- $content = ob_get_clean()output3layout.php + user.php + status.php
- View (core)8renderreturn $contentoutput3
- }
- View (core)7renderreturn $contentoutput3
- Controller (core)6renderreturn View->render(...)
- StatusController5userActionreturn StatusController->render(...)Action end
- Controller (core)4runreturn $content
- Response (core)4setContentResponse->content = $content
- Application (core)3runAction
- Response (core)3sendecho Response->content
- Application (core)2run
- DbManager (core)2__destruct
- Contribution details http://mini-blog.localhost/user/user1/status/1link 2017-11-01 00:00:00
- Seescreen SeeTest Data
- Login User ID: user1, Password: password
- index.php1require'../bootstrap.php'set autoloadit is omitted belowSeeAccount registration screen (User registration screen)
- index.php1require'../MiniBlogApplication.php'it is omitted below
- index.php1newMiniBlogApplication$app = new MiniBlogApplication(false)it is omitted below
- index.php1run$app->run()
- Application (core)2run
- $params = $this->router->resolve($this->request->getPathInfo())details↓
- Request (core)3getPathInfo'/user/user1/status/1SeeCheckpoint | Request
- Request (core)4getBaseUrl
- Request (core)5getRequestUri
- Request (core)4getRequestUri
- Router (core)3resolve'status', 'show'$params['controller'], $params['action']SeeCheckpoint | Router← point$params['id']1$params['user_name']'user1'
- Application (core)3runAction'status', 'show'$params['id']1$params['user_name']'user1'
- Application (core)4findController!class_exists'StatusController'
- ClassLoader (core)5loadClass'StatusController'require'StatusController.php'/core /models
- Application (core)5getControllerDir
- MiniBlogApplication6getRootDir
- Application (core)5require_once'StatusController.php'/controllersSeeCheckpoint | Application
- class StatusController extends Controller
- ClassLoader (core)6loadClass'Controller'
- ClassLoader (core)7require'Controller.php'
- return new $controller_class($this)new use variabledetails↓
- Application (core)5new$controller_class = 'StatusController'MiniBlogApplication
- Controller (core)6__constructMiniBlogApplicationSeeCheckpoint | Controller
- Application (core)7getRequest
- Application (core)7getResponse
- Application (core)7getSession
- Application (core)7getDbManager
- $content = $controller->run($action, $params)details↓
- Controller (core)4run(StatusController)'status', 'show''showAction'$params['id']1$params['user_name']'user1'
- needsAuthentication($action) && isAuthenticated()denyNot Logindetails↓
- $auth_actions = array('index', 'post') (StatusController.php line 10)
- Controller (core)5needsAuthentication'show'falseLogin UnnecessaryisAuthenticated Untreated (Not check)
- Process start --- before Action start↘Process flow is almost the same except Controller and Actiononly Transition to Login, add Exception
- $content = $this->$action_method($params) variable functions$content = StatusController->showAction($params)
- StatusController5showActionAction startargument $params$params['id']1$params['user_name']'user1'
- $status = $this->db_manager->get('Status')->fetchByIdAndUserName($params['id'], $params['user_name'])details↓
- DbManager (core)6get'Status'get('Status') 1stStatusRepository
- DbManager (core)7getConnectionForRepository'Status'DbManager->repository_connection_map['Status']
- DbManager (core)8getConnection
- DbManager (core)8getConnectionreturn current(DbManager->connections)DbManager->connections['master'] = $con↙
- DbManager (core)7getConnectionForRepositoryreturn $con
- $repository = new $repository_class($con)new use variabledetails↓
- DbManager (core)7new$repository_class = 'StatusRepository'$con
- ClassLoader (core)8loadClass'StatusRepository'
- ClassLoader (core)9require'StatusRepository.php'
- class StatusRepository extends DbRepository
- ClassLoader (core)10loadClass'DbRepository'
- ClassLoader (core)11require'DbRepository.php'
- DbRepository (core)8__construct'$con'
- DbRepository (core)9setConnectionStatusRepository->con = $con↗
- DbManager (core)6getDbManager->repositories['Status']=>StatusRepository
- DbManager (core)6getreturn DbManager->repositories['Status']
- StatusRepository6fetchByIdAndUserName($params['id'], $params['user_name'])1, 'user1'SeeSQL
- DbRepository (core)7fetchSeeCheckpoint | DbRepository
- DbRepository (core)8execute
- Status Repository6fetchByIdAndUserName
- if (!$status)No Contribution details forward404()
- Controller (core)6render$layout = 'layout'$variables['status']
- Request (core)7getBaseUrl
- Request (core)8getRequestUri
- Controller (core)7newView
- ClassLoader (core)8loadClass'View'
- ClassLoader (core)9requireView.php'
- Application (core)8getViewDir
- MiniBlogApplication9getRootDir
- View (core)8__construct$base_dir, $defaults
- View (core)7renderstatus/show$_layout = 'layout'execution1SeeCheckpoint | View (HTML structure)← point
- extract(array_merge($this->defaults, $_variables))$_variables['status']
- View (core)8require'/views/status/show.php'$status
- View (core)9setLayoutVar'title', 'user1'
- View (show.php)9renderstatus/status$_layout = falseexecution2 (Contribution status1)render in show.php
- extract(array_merge($this->defaults, $_variables))View->defaults['base_url']$_variables['status']
- View (core)10require'/views/status/status.php'$base_url, $status
- View (core)11escape
- $content = ob_get_clean()output1status.php
- View (show.php)9renderreturn $contentoutput1
- $content = ob_get_clean()output2(show.php) + status.php
- if ($_layout) {$_layout = 'layout'
- $content = $this->render($_layout, array_merge($this->layout_variables, array('_content' => $content,)))
- View (core)8renderlayout$_layout = falseexecution3render in render
- extract(array_merge($this->defaults, $_variables))$_variables['title']View->defaults['base_url']View->defaults['session']$_variables['_content']
- View (core)9require'/views/layout.php'$title, $base_url, $session, $_content
- View (core)10escape
- Session (core)10isAuthenticated
- Session (core)11get'_authenticated'true
- layout10echo $_content(show.php) + status.phpoutput2
- $content = ob_get_clean()output3layout.php + (show.php) + status.php
- View (core)8renderreturn $contentoutput3
- }
- View (core)7renderreturn $contentoutput3
- Controller (core)6renderreturn View->render(...)
- StatusController5showActionreturn StatusController->render(...)Action end
- Controller (core)4runreturn $content
- Response (core)4setContentResponse->content = $content
- Application (core)3runAction
- Response (core)3sendecho Response->content
- Application (core)2run
- DbManager (core)2__destruct
note showing $this
e.g. $this->request → MiniBlogApplication->request
SQL
check SQL (phpMyAdmin, select SQL TAB) http://localhost/phpmyadmin/db_sql.php?db=mini_blog
fetchByUserName
SELECT * FROM user WHERE user_name = '
user1'
id | user_name | password | created_at |
---|---|---|---|
1 | user1 | ee5281d035bd1bd7786301be4274a68b006ae916 | 2017-11-01 00:00:00 |
SELECT * FROM user WHERE user_name = '
user2'
id | user_name | password | created_at |
---|---|---|---|
2 | user2 | ee5281d035bd1bd7786301be4274a68b006ae916 | 2017-11-01 00:00:00 |
SELECT * FROM user WHERE user_name = '
user3'
id | user_name | password | created_at |
---|---|---|---|
3 | user3 | ee5281d035bd1bd7786301be4274a68b006ae916 | 2017-11-01 00:00:00 |
fetchAllByUserId
SELECT a.*, u.user_name FROM status a LEFT JOIN user u ON a.user_id = u.id WHERE u.id =
1ORDER BY a.created_at DESC
a.id | a.user_id | a.body | a.created_at | u.user_name |
---|---|---|---|---|
1 | 1 | status1 user1 test1 | 2017-11-01 00:00:00 | user1 |
2 | 1 | status2 user1 test2 | 2017-11-01 00:00:00 | user1 |
SELECT a.*, u.user_name FROM status a LEFT JOIN user u ON a.user_id = u.id WHERE u.id =
2ORDER BY a.created_at DESC
a.id | a.user_id | a.body | a.created_at | u.user_name |
---|---|---|---|---|
3 | 2 | status3 user2 test3 | 2017-11-01 00:00:00 | user2 |
4 | 2 | status4 user2 test4 | 2017-11-01 00:00:00 | user2 |
SELECT a.*, u.user_name FROM status a LEFT JOIN user u ON a.user_id = u.id WHERE u.id =
3ORDER BY a.created_at DESC
a.id | a.user_id | a.body | a.created_at | u.user_name |
---|---|---|---|---|
5 | 3 | status5 user3 test5 | 2017-11-01 00:00:00 | user3 |
(reference) LEFT JOIN user u ON a.user_id = u.id
SELECT a.*, u.user_name, u.id
FROM status a
LEFT JOIN user u ON a.user_id = u.id
ORDER BY a.id
a.id | a.user_id | a.body | a.created_at | u.user_name | u.id |
---|---|---|---|---|---|
1 | 1 | status1 user1 test1 | 2017-11-01 00:00:00 | user1 | 1 |
2 | 1 | status2 user1 test2 | 2017-11-01 00:00:00 | user1 | 1 |
3 | 2 | status3 user2 test3 | 2017-11-01 00:00:00 | user2 | 2 |
4 | 2 | status4 user2 test4 | 2017-11-01 00:00:00 | user2 | 2 |
5 | 3 | status5 user3 test5 | 2017-11-01 00:00:00 | user3 | 3 |
isFollowing
SELECT COUNT(user_id) as count FROM following WHERE user_id =
1AND following_id =
2
count | 1 |
SELECT COUNT(user_id) as count FROM following WHERE user_id =
1AND following_id =
3
count | 0 |
(reference) following table
user_id | following_id |
---|---|
1 | 2 |
fetchByIdAndUserName
SELECT a.* , u.user_name FROM status a LEFT JOIN user u ON u.id = a.user_id WHERE a.id =
1AND u.user_name = '
user1'
a.id | a.user_id | a.body | a.created_at | u.user_name |
---|---|---|---|---|
1 | 1 | status1 user1 test1 | 2017-11-01 00:00:00 | user1 |
(reference) LEFT JOIN user u ON u.id = a.user_id
SELECT a.*, u.user_name, u.id
FROM status a
LEFT JOIN user u ON u.id = a.user_id
ORDER BY a.id
a.id | a.user_id | a.body | a.created_at | u.user_name | u.id |
---|---|---|---|---|---|
1 | 1 | status1 user1 test1 | 2017-11-01 00:00:00 | user1 | 1 |
2 | 1 | status2 user1 test2 | 2017-11-01 00:00:00 | user1 | 1 |
3 | 2 | status3 user2 test3 | 2017-11-01 00:00:00 | user2 | 2 |
4 | 2 | status4 user2 test4 | 2017-11-01 00:00:00 | user2 | 2 |
5 | 3 | status5 user3 test5 | 2017-11-01 00:00:00 | user3 | 3 |
Mini Blog Application
Contribution list
Creation procedure |
class | |
---|---|---|
Database | UserRepository StatusRepository FollowingRepository |
fetchByUserName fetchAllByUserId isFollowing |
Routing | MiniBlogApplication | '/user/:user_name' => array('controller' => 'status', 'action' => 'user') |
Controller | StatusController | userActionn |
View file | status/user.php status/status.php (in status/user.php) |
function | class | method |
---|---|---|
Check | - | if (!$user) No user |
Session | isAuthenticated() Login status check (Logined) | |
- | if ($my['id'] !== $user['id']) $my['id']: 1, $user['id']: 2, 3 (Login user, User) |
|
FollowingRepository | isFollowing($my['id'], $user['id']) $following 'user2' $following true 'user3' $following false 'user1' $following null (initial value) |
|
Data set | Controller | generateCsrfToken('account/follow') renderargument (Follow process 'user3') |
Data get | DbManager | get('User') UserRepository |
UserRepository | fetchByUserName($params['user_name']) $user 'user1', 'user2', 'user3' 1record |
|
DbManager | get('Status') StatusRepository | |
StatusRepository | fetchAllByUserId($user['id']) $statuses status1~status2, status3~status4, status5 |
|
Session | get('user') Login user ('user1' 1record) $my | |
DbManager | get('Following') FollowingRepository | |
Data output | ||
Screen | Controller | forward404() 404 error screen (No user) |
Controller | render(...) Contribution list |
Contribution details
Creation procedure |
class | |
---|---|---|
Database | StatusRepository | fetchByIdAndUserName |
Routing | MiniBlogApplication | '/user/:user_name/status/:id' => array('controller' => 'status', 'action' => 'show') |
Controller | StatusController | showActionn |
View file | status/show.php status/status.php (in status/show.php) |
function | class | method |
---|---|---|
Check | - | if (!$status) No Contribution details |
Data set | ||
Data get | DbManager | get('Status') StatusRepository |
StatusRepository | fetchByIdAndUserName($params['id'], $params['user_name']) status1 | |
Data output | ||
Screen | Controller | forward404() 404 error screen (No Contribution details) |
Controller | render(...) Contribution details |
Login User ID: user1, Password: password.