パーフェクトPHP デバッグ (フレームワーク サンプルコード)

処理の流れ (2/5 全5パターン) | ホームページと投稿処理の流れ サブメニュー

2017年11月25日 公開

2021年03月09日 更新


  • チェックポイント | オブジェクト指向 参照← ポイント
  • ホームページ http://mini-blog.localhost/ログイン直後, リンク ホーム
  • 画面 参照テストデータ 参照
  • ユーザID: user1、パスワード: password でログイン
  • index.php1require'../bootstrap.php'オートロード 設定以下 省略アカウント登録画面 (ユーザ登録画面) 参照
  • index.php1require'../MiniBlogApplication.php'以下 省略
  • index.php1newMiniBlogApplication$app = new MiniBlogApplication(false)以下 省略
  • index.php1run$app->run()
  • Application (core)2run
  • $params = $this->router->resolve($this->request->getPathInfo())詳細↓
  • Request (core)3getPathInfo''チェックポイント | Request 参照
  • Request (core)4getBaseUrl
  • Request (core)5getRequestUri
  • Request (core)4getRequestUri
  • Router (core)3resolve'status', 'index'$params['controller'], $params['action']チェックポイント | Router 参照← ポイント
  • Application (core)3runAction'status', 'index'
  • 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'/controllersチェックポイント | Application 参照
  • class StatusController extends Controller
  • ClassLoader (core)6loadClass'Controller'
  • ClassLoader (core)7require'Controller.php'
  • return new $controller_class($this)new 変数 使用詳細↓
  • Application (core)5new$controller_class = 'StatusController'MiniBlogApplication
  • Controller (core)6__constructMiniBlogApplicationチェックポイント | Controller 参照
  • Application (core)7getRequest
  • Application (core)7getResponse
  • Application (core)7getSession
  • Application (core)7getDbManager
  • $content = $controller->run($action, $params)詳細↓
  • Controller (core)4run(StatusController)'status', 'index''indexAction'
  • needsAuthentication($action) && isAuthenticated()否定ログイン 無詳細↓
  • $auth_actions = array('index', 'post' ) (StatusController.php 10行目)
  • Controller (core)5needsAuthentication'index'trueログイン必要
  • Session (core)5isAuthenticated
  • Session (core)6get'_authenticated'trueログイン中 否定 false
  • 処理の開始 ~ アクション開始↘ の直前まで処理の流れは コントローラアクション以外は ほぼ同じですログイン画面への遷移 のみ、例外処理が追加されます

  • $content = $this->$action_method($params) 可変関数$content = StatusController->indexAction()
  • StatusController5indexActionアクション開始
  • Session (core)6get'user''user1' 1レコード (ログインユーザ)$user
  • $statuses = $this->db_manager->get('Status')->fetchAllPersonalArchivesByUserId($user['id'])詳細↓
  • DbManager (core)6get'Status'get('Status') 1回目StatusRepository
  • 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 変数 使用詳細↓
  • 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']
  • StatusRepository6fetchAllPersonalArchivesByUserId$user['id'] 1'user1' (2件), 'user2' (2件)フォロー 'user2'テストデータ 参照SQL 参照
  • DbRepository (core)7fetchAllチェックポイント | DbRepository 参照
  • DbRepository (core)8execute
  • Status Repository6fetchAllPersonalArchivesByUserId
  • return $this->render(array(... $this->generateCsrfToken ...)$statuses詳細↓
  • Controller (core)6generateCsrfToken'status/post''_token'投稿 http://mini-blog.localhost/status/post checkCsrfTokenチェックポイント | Controller 参照
  • Session (core)7get'csrf_tokens/status/post'チェックポイント | Session 参照
  • Session (core)7set'csrf_tokens/status/post'
  • Controller (core)6render$layout = 'layout'$variables['statuses'], $variables['body'], $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/index$_layout = 'layout'実行順1チェックポイント | View (HTML構成) 参照← ポイント
  • extract(array_merge($this->defaults, $_variables))View->defaults['base_url']$_variables['_token']$_variables['body']$_variables['statuses']
  • View (core)8require'/views/status/index.php'$base_url, $_token, $body, $statuses
  • View (core)9setLayoutVar'title', 'ホーム'
  • View (core)9'_token'hidden
  • View (core)9escape
  • View (index.php)9renderstatus/status$_layout = false実行順2 foreach (投稿 status1~status4)render in index.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()出力順1 複数回status.php
  • View (index.php)9renderreturn $content出力順1 複数回
  • $content = ob_get_clean()出力順2index.php + status.php 複数回
  • if ($_layout) {$_layout = 'layout'
  • $content = $this->render($_layout, array_merge($this->layout_variables, array('_content' => $content,)))
  • View (core)8renderlayout$_layout = false実行順3render 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 $_contentindex.php + status.php 複数回出力順2
  • $content = ob_get_clean()出力順3layout.php + index.php + status.php 複数回
  • View (core)8renderreturn $content出力順3
  • }
  • View (core)7renderreturn $content出力順3
  • Controller (core)6renderreturn View->render(...)
  • StatusController5indexActionreturn StatusController->render(...)アクション終了

  • Controller (core)4runreturn $content
  • Response (core)4setContentResponse->content = $content
  • Application (core)3runAction
  • Response (core)3sendecho Response->content
  • Application (core)2run
  • DbManager (core)2__destruct

  • 投稿 http://mini-blog.localhost/status/post発言 ボタン
  • 画面 参照テストデータ 参照
  • ユーザID: user1、パスワード: password でログイン
  • index.php1require'../bootstrap.php'オートロード 設定以下 省略アカウント登録画面 (ユーザ登録画面) 参照
  • index.php1require'../MiniBlogApplication.php'以下 省略
  • index.php1newMiniBlogApplication$app = new MiniBlogApplication(false)以下 省略
  • index.php1run$app->run()
  • Application (core)2run
  • $params = $this->router->resolve($this->request->getPathInfo())詳細↓
  • Request (core)3getPathInfo'/status/post'チェックポイント | Request 参照
  • Request (core)4getBaseUrl
  • Request (core)5getRequestUri
  • Request (core)4getRequestUri
  • Router (core)3resolve'status', 'post'$params['controller'], $params['action']チェックポイント | Router 参照← ポイント
  • Application (core)3runAction'status', 'post'
  • 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'/controllersチェックポイント | Application 参照
  • class StatusController extends Controller
  • ClassLoader (core)6loadClass'Controller'
  • ClassLoader (core)7require'Controller.php'
  • return new $controller_class($this)new 変数 使用詳細↓
  • Application (core)5new$controller_class = 'StatusController'MiniBlogApplication
  • Controller (core)6__constructMiniBlogApplicationチェックポイント | Controller 参照
  • Application (core)7getRequest
  • Application (core)7getResponse
  • Application (core)7getSession
  • Application (core)7getDbManager
  • $content = $controller->run($action, $params)詳細↓
  • Controller (core)4run(StatusController)'status', 'post''postAction'
  • needsAuthentication($action) && isAuthenticated()否定ログイン 無詳細↓
  • $auth_actions = array('index', 'post') (StatusController.php 10行目)
  • Controller (core)5needsAuthentication'post'trueログイン必要
  • Session (core)5isAuthenticated
  • Session (core)6get'_authenticated'trueログイン中 否定 false
  • 処理の開始 ~ アクション開始↘ の直前まで処理の流れは コントローラアクション以外は ほぼ同じですログイン画面への遷移 のみ、例外処理が追加されます

  • $content = $this->$action_method($params) 可変関数$content = StatusController->postAction()
  • StatusController5postActionアクション開始
  • Request (core)6isPosttruePOSTfalse POSTでない forward404()
  • Request (core)6getPost'_token'ホームページ http://mini-blog.localhost/ generateCsrfTokenチェックポイント | Request 参照
  • Controller (core)6checkCsrfToken'status/post'trueトークン有false トークン無 redirect('/')チェックポイント | Controller 参照
  • Session (core)7get'csrf_tokens/status/post'チェックポイント | Session 参照
  • Session (core)7set'csrf_tokens/status/post'
  • Request (core)6getPost$_POST['body']'status6 user1 テスト6'$body
  • エラー無 開始if (count($errors) === 0)
  • Session (core)6get'user''user1' 1レコード (ログインユーザ)$user
  • $this->db_manager->get('Status')->insert($user['id'], $body)詳細↓
  • DbManager (core)6get'Status'get('Status') 1回目StatusRepository
  • 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 変数 使用詳細↓
  • 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']
  • StatusRepository6insert'user1' 'status6 user1 テスト6'$user['id'], $bodySQL 参照
  • DbRepository (core)7executeチェックポイント | DbRepository 参照
  • StatusRepository6insert
  • 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
  • エラー無 終了エラー有 省略
  • StatusController5postActionreturn StatusController->...アクション終了

  • Controller (core)4runreturn $contentエラー無の時 $content: null
  • Response (core)4setContentResponse->content = $content
  • Application (core)3runAction
  • Response (core)3sendecho Response->content
  • Application (core)2run
  • DbManager (core)2__destruct

$this の表示
$this->request  →  MiniBlogApplication->request



SQL

SQL チェック (phpMyAdmin, SQL タブ 選択)  http://localhost/phpmyadmin/db_sql.php?db=mini_blog

fetchAllPersonalArchivesByUserId

SELECT a.*, u.user_name
FROM status a
    LEFT JOIN user u ON a.user_id = u.id
    LEFT JOIN following f ON f.following_id = a.user_id
        AND f.user_id = 1
    WHERE f.user_id = 1 OR u.id = 1
    ORDER BY a.created_at DESC
a.id a.user_id a.body a.created_at u.user_name
1 1 status1 user1 テスト1 2017-11-01 00:00:00 user1
2 1 status2 user1 テスト2 2017-11-01 00:00:00 user1
3 2 status3 user2 テスト3 2017-11-01 00:00:00 user2
4 2 status4 user2 テスト4 2017-11-01 00:00:00 user2
(参考) LEFT JOIN user u ON a.user_id = u.id
SELECT a.*, 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.id
1 1 status1 user1 テスト1 2017-11-01 00:00:00 1
2 1 status2 user1 テスト2 2017-11-01 00:00:00 1
3 2 status3 user2 テスト3 2017-11-01 00:00:00 2
4 2 status4 user2 テスト4 2017-11-01 00:00:00 2
5 3 status5 user3 テスト5 2017-11-01 00:00:00 3
(参考) LEFT JOIN following f ON f.following_id = a.user_id AND f.user_id = 1
SELECT a.*, f.following_id, f.user_id
FROM status a
    LEFT JOIN following f ON f.following_id = a.user_id
        AND f.user_id = 1
    ORDER BY a.id
a.id a.user_id a.body a.created_at f.following_id f.user_id
1 1 status1 user1 テスト1 2017-11-01 00:00:00 NULL NULL
2 1 status2 user1 テスト2 2017-11-01 00:00:00 NULL NULL
3 2 status3 user2 テスト3 2017-11-01 00:00:00 2 1
4 2 status4 user2 テスト4 2017-11-01 00:00:00 2 1
5 3 status5 user3 テスト5 2017-11-01 00:00:00 NULL NULL

insert

INSERT INTO status(user_id, body, created_at)
    VALUES(1, 'status6 user1 テスト6', '2017-11-01 00:00:00')
a.id a.user_id a.body a.created_at
6 1 status6 user1 テスト6 2017-11-01 00:00:00

Mini Blog Application

ホームページ

http://mini-blog.localhost/
作成手順 クラス
データベース StatusRepository fetchAllPersonalArchivesByUserId
ルーティング MiniBlogApplication '/'
  => array('controller' => 'status', 'action' => 'index')
コントローラ StatusController indexAction
ビューファイル status/index.php
status/status.php (in status/index.php)
StatusController   indexAction
機能 クラス メソッド
チェック
データ設定 Controller generateCsrfToken('status/post') render引数
データ取得 Session get('user') ログインユーザ ('user1' 1レコード)
DbManager get('Status') StatusRepository
StatusRepository fetchAllPersonalArchivesByUserId($user['id']) 'user1' (2件), 'user2' (2件)
データ出力
画面 Controller render(...) 投稿

投稿

http://mini-blog.localhost/status/post
作成手順 クラス
データベース StatusRepository insert
fetchAllPersonalArchivesByUserId
ルーティング MiniBlogApplication '/status/post'
  => array('controller' => 'status', 'action' => 'post')
コントローラ StatusController postAction
ビューファイル
StatusController   postAction
機能 クラス メソッド
チェック Request isPost POST チェック
Controller checkCsrfToken('status/post', $token) トークン チェック
- バリデーション (エラー カウント)
データ設定 Controller generateCsrfToken('status/post') render引数 (バリデーション エラー)
データ取得 Request getPost('_token') '62138aa5b21213242eee2135892b9589609cc9d6'
getPost('body') 'status6 user1 テスト6'
Session get('user') ログインユーザ ('user1' 1レコード)
DbManager get('Status') StatusRepository
StatusRepository fetchAllPersonalArchivesByUserId($user['id']) 'user1' (2件), 'user2' (2件)
データ出力 StatusRepository insert($user['id'], $body) 1, 'status6 user1 テスト6'
画面 Controller forward404() 404エラー画面 (POST エラー)
Controller redirect('/') ホームページ (トークン エラー)
redirect('/') ホームページ (投稿 正常)
Controller render(...) 再度 投稿 (バリデーション エラー)

ユーザID: user1、パスワード: password でログイン

ホームページ

投稿

Page Top
Page Bottom