PHP Framework for Learning

Process flow (1/5 All 5 patterns) | User registrationProcess flow Submenu

2017-11-25 release

2021-03-09 update


  • SeeCheckpoint | Object-Orientation← point

  • Account registration screen (User registration screen) http://mini-blog.localhost/account/signuplink Account registration, link New User registration
  • Seescreen  SeeTest Data
  • Not Login
  • index.php1require'../bootstrap.php'set autoloadSeeCheckpoint | ClassLoader← point
  • bootstrap2require'core/ClassLoader.php'
  • bootstrap2newClassLoader$loader = new ClassLoader()
  • bootstrap2$loader->registerDir(dirname(__FILE__).'/core')
  • ClassLoader (core)3registerDir'/core'
  • bootstrap2$loader->registerDir(dirname(__FILE__).'/models')
  • ClassLoader (core)3registerDir'/models'
  • bootstrap2$loader->register()
  • ClassLoader (core)3register
  • spl_autoload_registerClassLoader'loadClass'Relationship between loadClass and extends new↓
  • index.php1require'../MiniBlogApplication.php'
  • class MiniBlogApplication extends ApplicationApplication.php is not requiredafter executing loadClass, extends (same below)
  • ClassLoader (core)2loadClass'Application'
  • ClassLoader (core)3require'Application.php'
  • index.php1newMiniBlogApplication$app = new MiniBlogApplication(false)
  • Application (core)2__construct
  • Application (core)3setDebugMode
  • Application (core)3initialize
  • Application (core)4newRequestMiniBlogApplication->request = RequestRequest.php is not requiredafter executing loadClass, new (same below)
  • ClassLoader (core)5loadClass'Request'
  • ClassLoader (core)6require'Request.php'
  • Application (core)4newResponseMiniBlogApplication->response = Response
  • ClassLoader (core)5loadClass'Response'
  • ClassLoader (core)6require'Response.php'
  • Application (core)4newSessionMiniBlogApplication->session = Session
  • ClassLoader (core)5loadClass'Session'
  • ClassLoader (core)6require'Session.php'
  • Session (core)5__construct$sessionStarted false$sessionIdRegenerated false
  • session_start()$sessionStarted trueSeeCheckpoint | Session
  • Application (core)4newDbManagerMiniBlogApplication->db_manager = DbManager
  • ClassLoader (core)5loadClass'DbManager'
  • ClassLoader (core)6require'DbManager.php'
  • Application (core)4newRouter$this->registerRoutes()MiniBlogApplication->router = Router
  • ClassLoader (core)5loadClass'Router'
  • ClassLoader (core)6require'Router.php'
  • MiniBlogApplication7registerRoutes
  • Router (core)5__construct
  • Router (core)6compileRoutesSeeCheckpoint | Router← point
  • Application (core)3configure
  • MiniBlogApplication4configure
  • DbManager (core)5connect'master'$params['dsn'], $params['user'], $params['password'], $params['options']SeeCheckpoint | DbManager
  • $con = new PDO'mysql:dbname=mini_blog;host=localhost;charset=utf8', 'root', '', ''above $params
  • $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)Throw exception if error occurs in PDO
  • DbManager->connections['master'] = $con
  • index.php1run$app->run()
  • Application (core)2run
  • $params = $this->router->resolve($this->request->getPathInfo())details↓
  • Request (core)3getPathInfo'/account/signup'SeeCheckpoint | Request
  • Request (core)4getBaseUrl
  • Request (core)5getRequestUri
  • Request (core)4getRequestUri
  • Router (core)3resolve'account', 'signup'$params['controller'], $params['action']SeeCheckpoint | Router← point
  • Application (core)3runAction'account', 'signup'
  • Application (core)4findController!class_exists'AccountController'
  • ClassLoader (core)5loadClass'AccountController'require'AccountController.php'/core  /models
  • Application (core)5getControllerDir
  • MiniBlogApplication6getRootDir
  • Application (core)5require_once'AccountController.php'/controllersSeeCheckpoint | Application
  • class AccountController extends Controller
  • ClassLoader (core)6loadClass'Controller'
  • ClassLoader (core)7require'Controller.php'
  • return new $controller_class($this)new use variabledetails↓
  • Application (core)5new$controller_class = 'AccountController'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(AccountController)'account', 'signup''signupAction'
  • needsAuthentication($action) && isAuthenticated()denyNot Logindetails↓
  • $auth_actions = array('index', 'signout', 'follow') (AccountController.php line 10)
  • Controller (core)5needsAuthentication'signup'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 = AccountController->signupAction()
  • AccountController5signupActionAction start
  • Session (core)6isAuthenticated
  • Session (core)7get'_authenticated'falseNot Logintrue Login redirect('/account')
  • return $this->render(array(... $this->generateCsrfToken ...)details↓
  • Controller (core)6generateCsrfToken'account/signup''_token'User registration http://mini-blog.localhost/account/register checkCsrfTokenSeeCheckpoint | Controller
  • Session (core)7get'csrf_tokens/account/signup'SeeCheckpoint | Session
  • Session (core)7set'csrf_tokens/account/signup'
  • Controller (core)6render$layout = 'layout'$variables['user_name'], $variables['password'], $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)7renderaccount/signup$_layout = 'layout'execution1SeeCheckpoint | View (HTML structure)← point
  • extract(array_merge($this->defaults, $_variables))View->defaults['base_url']$_variables['_token']$_variables['user_name']$_variables['password']
  • View (core)8require'/views/account/signup.php'$base_url, $_token, $user_name, $password
  • View (core)9setLayoutVar'title', 'Account registration'
  • View (core)9'_token'hidden
  • View (core)9escape
  • View (signup.php)9renderaccount/inputs$_layout = falseexecution2render in signup.php
  • extract(array_merge($this->defaults, $_variables))$_variables['user_name']$_variables['password']
  • View (core)10require'/views/account/inputs.php'$user_name, $password
  • View (core)11escape
  • $content = ob_get_clean()output1inputs.php
  • View (signup.php)9renderreturn $contentexecution1
  • $content = ob_get_clean()output2signup.php + inputs.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'false
  • layout10echo $_contentsignup.php + inputs.phpoutput2
  • $content = ob_get_clean()output3layout.php + signup.php + inputs.php
  • View (core)8renderreturn $contentoutput3
  • }
  • View (core)7renderreturn $contentoutput3
  • Controller (core)6renderreturn View->render(...)
  • AccountController5signupActionreturn AccountController->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

  • User registration http://mini-blog.localhost/account/registerRegistration button
  • Seescreen  SeeTest Data
  • Register User ID: user4, 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'/account/register'SeeCheckpoint | Request
  • Request (core)4getBaseUrl
  • Request (core)5getRequestUri
  • Request (core)4getRequestUri
  • Router (core)3resolve'account', 'register'$params['controller'], $params['action']SeeCheckpoint | Router← point
  • Application (core)3runAction'account', 'register'
  • Application (core)4findController!class_exists'AccountController'
  • ClassLoader (core)5loadClass'AccountController'require'AccountController.php'/core  /models
  • Application (core)5getControllerDir
  • MiniBlogApplication6getRootDir
  • Application (core)5require_once'AccountController.php'/controllersSeeCheckpoint | Application
  • class AccountController extends Controller
  • ClassLoader (core)6loadClass'Controller'
  • ClassLoader (core)7require'Controller.php'
  • return new $controller_class($this)new use variabledetails↓
  • Application (core)5new$controller_class = 'AccountController'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(AccountController)'account', 'register''registerAction'
  • needsAuthentication($action) && isAuthenticated()denyNot Logindetails↓
  • $auth_actions = array('index', 'signout', 'follow') (AccountController.php line 10)
  • Controller (core)5needsAuthentication'register'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 = AccountController->registerAction()
  • AccountController5registerActionAction start
  • Session (core)6isAuthenticated
  • Session (core)7get'_authenticated'falseNot Logintrue Login redirect('/account')
  • Request (core)6isPosttruePOSTfalse Not POST forward404()
  • Request (core)6getPost'_token'Account registration screen (User registration screen) http://mini-blog.localhost/account/signup generateCsrfTokenSeeCheckpoint | Request
  • Controller (core)6checkCsrfToken'account/signup'trueTokenfalse None Token redirect('/account/signup')SeeCheckpoint | Controller
  • Session (core)7get'csrf_tokens/account/signup'SeeCheckpoint | Session
  • Session (core)7set'csrf_tokens/account/signup'
  • Request (core)6getPost'user4'$user_name
  • Request (core)6getPost'password'$password
  • $this->db_manager->get('User')->isUniqueUserName($user_name)details↓
  • 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']
  • UserRepository6isUniqueUserNamee'user4'$user_nametrueUniquefalse Not UniqueSeeTest DataSeeSQL
  • DbRepository (core)7fetch'user4'SeeCheckpoint | DbRepository
  • DbRepository (core)8execute
  • UserRepository6isUniqueUserName
  • No error startif (count($errors) === 0)
  • $this->db_manager->get('User')->insert(($user_name, $password)details↓
  • DbManager (core)6get'User'get('User') from the 2ndUserRepository
  • DbManager (core)6getreturn DbManager->repositories['User']
  • UserRepository6insert'user4', 'password'$user_name, $passwordSeeSQL
  • UserRepository7hashPassword'password'
  • DbRepository (core)7executeSeeCheckpoint | DbRepository
  • UserRepository6insert
  • Session (core)6setAuthenticatedtrue
  • Session (core)7set'_authenticated'trueLogin
  • Session (core)7regeneratetrueSession Fixation protection (change Login status)
  • Session (core)7regeneratesession_regenerate_id (true)New Session ID issued$sessionIdRegenerated trueSeeCheckpoint | Session
  • $user = $this->db_manager->get('User')->fetchByUserName($user_name)details↓
  • DbManager (core)6get'User'get('User') from the 2ndUserRepository
  • DbManager (core)6getreturn DbManager->repositories['User']
  • UserRepository6fetchByUserName'user4'$user_name'user4' 1recordSeeSQL
  • DbRepository (core)7fetchSeeCheckpoint | DbRepository
  • DbRepository (core)8execute
  • UserRepository6fetchByUserName
  • Session (core)6set'user'$user'user4' 1 record (Login user)
  • Controller (core)6redirect'/'
  • Request (core)7isSslfalse
  • Request (core)7getHost
  • Request (core)7getBaseUrl
  • Request (core)8getRequestUri
  • $urlhttp://mini-blog.localhost/
  • Response (core)7setStatusCode
  • Response (core)7setHttpHeader
  • Controller (core)6redirect
  • No error end
  • Error start
  • return $this->render(array(... $this->generateCsrfToken ...), ), 'signup')details↓
  • Controller (core)6generateCsrfToken'account/signup''_token'User registration http://mini-blog.localhost/account/register checkCsrfTokenSeeCheckpoint | Controller
  • Session (core)7get'csrf_tokens/account/signup'SeeCheckpoint | Session
  • Session (core)7set'csrf_tokens/account/signup'
  • Controller (core)6render$template = 'signup' (Error)$layout = 'layout'$variables['user_name'], $variables['password'], $variables['errors'], $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
  • $path = $this->controller_name . '/' . $templateaccount/signup
  • View (core)7renderaccount/signup$_layout = 'layout'$pathexecution1SeeCheckpoint | View (HTML structure)← point
  • extract(array_merge($this->defaults, $_variables))View->defaults['base_url']$_variables['_token']$_variables['errors']$_variables['user_name']$_variables['password']
  • View (core)8require'/views/account/signup.php'$base_url, $_token, $errors, $user_name, $password
  • View (core)9setLayoutVar'title', 'Account registration'
  • View (core)9'_token'hidden
  • View (core)9escape
  • View (signup.php)9rendererrors$_layout = falseexecution2 (Error)render in signup.php
  • extract(array_merge($this->defaults, $_variables))$_variables['errors']
  • View (core)10require'/views/errors.php'$errors
  • View (core)11escape
  • $content = ob_get_clean()output1errors.php
  • View (signup.php)9renderreturn $contentoutput1
  • View (signup.php)9renderaccount/inputs$_layout = falseexecution3render in signup.php
  • extract(array_merge($this->defaults, $_variables))$_variables['user_name']$_variables['password']
  • View (core)10require'/views/account/inputs.php'$user_name, $password
  • View (core)11escape
  • $content = ob_get_clean()output2inputs.php
  • View (signup.php)9renderreturn $contentoutput2
  • $content = ob_get_clean()output3signup.php + errors.php + inputs.php
  • if ($_layout) {$_layout = 'layout'
  • $content = $this->render($_layout, array_merge($this->layout_variables, array('_content' => $content,)))
  • View (core)8renderlayout$_layout = falseexecution4render 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'false
  • layout10echo $_contentsignup.php + errors.php + inputs.phpoutput3
  • $content = ob_get_clean()output4layout.php + signup.php + errors.php + inputs.php
  • View (core)8renderreturn $contentoutput4
  • }
  • View (core)7renderreturn $contentoutput4
  • Controller (core)6renderreturn View->render(...)
  • Error end
  • AccountController5registerActionreturn AccountController->...Action end

  • Controller (core)4runreturn $contentNo error $content: null
  • 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

isUniqueUserName

SELECT COUNT(id) as count FROM user WHERE user_name = 'user4'
count 0

insert

INSERT INTO user(user_name, password, created_at)
    VALUES('user4', 'ee5281d035bd1bd7786301be4274a68b006ae916', '2017-11-01 00:00:00')
id user_name password created_at
4 user4 ee5281d035bd1bd7786301be4274a68b006ae916 2017-11-01 00:00:00

fetchByUserName

SELECT * FROM user WHERE user_name = 'user4'
id user_name password created_at
4 user4 ee5281d035bd1bd7786301be4274a68b006ae916 2017-11-01 00:00:00

Mini Blog Application

Account registration screen (User registration screen)

http://mini-blog.localhost/account/signup
Creation
procedure
class
Database
Routing MiniBlogApplication '/account/:action'
  => array('controller' => 'account')
Controller AccountController signupAction
View file account/signup.php
account/inputs.php (in account/signup.php)
AccountController   signupAction
function class method
Check Session isAuthenticated() Login status check
Data set Controller generateCsrfToken('account/signup') renderargument
Data get
Data output
Screen Controller redirect('/account') Account information (Logined error)
Controller render(...) Registration screen (not Login)

User registration

http://mini-blog.localhost/account/register
Creation
procedure
class
Database UserRepository isUniqueUserName
insert
  (hashPassword)
fetchByUserName
Routing MiniBlogApplication '/account/:action'
  => array('controller' => 'account')
Controller AccountController registerAction
View file
AccountController   registerAction
function class method
Check Session isAuthenticated() Login status check (start, not Login)
Request isPost POST check
Controller checkCsrfToken('account/signup', $token) Token check
UserRepository isUniqueUserName($user_name)
  user name duplication check ('user4', in Validation)
- Validation (error count)
Data set Session setAuthenticated(true) Logined (Registration)
Session set('user', $user) Login user ('user4' 1record) (Registration)
Controller generateCsrfToken('account/signup') renderargument (Validation error)
Data get Request getPost('_token') '117d0e6d9da8ec9e595110d7e517993901ee77ce'
getPost('user_name') 'user4'
getPost('password') 'password'
DbManager get('User') UserRepository
UserRepository fetchByUserName($user_name) 'user4' 1record
Data output UserRepository insert($user_name, $password) 'user4', 'password' (Registration)
Screen Controller redirect('/account') Account information (Logined error)
redirect('/account/signup') Registration screen (Token error)
redirect('/') Homepage (after Registration, 'user4' Home)
Controller forward404() 404 error screen (POST error)
Controller render(...) again Registration screen (Validation error)

Register User ID: user4, Password: password.

Account registration (User registration)