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

処理の流れ (5/5 全5パターン) | フォロー処理の流れ サブメニュー

2017年11月25日 公開

2021年03月09日 更新


  • http://mini-blog.localhost/user/user3URL欄'フォローする' ボタン表示   動画 (YouTube)パーフェクトPHP をデバッグしました ('フォローする' ボタン を表示) 参照
  • チェックポイント | オブジェクト指向 参照← ポイント
  • フォロー処理 http://mini-blog.localhost/followフォローする ボタン
  • 画面 参照テストデータ 参照
  • ユーザ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'/follow'チェックポイント | Request 参照
  • Request (core)4getBaseUrl
  • Request (core)5getRequestUri
  • Request (core)4getRequestUri
  • Router (core)3resolve'account', 'follow'$params['controller'], $params['action']チェックポイント | Router 参照← ポイント
  • Application (core)3runAction'account', 'follow'
  • 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'/controllersチェックポイント | Application 参照
  • class AccountController extends Controller
  • ClassLoader (core)6loadClass'Controller'
  • ClassLoader (core)7require'Controller.php'
  • return new $controller_class($this)new 変数 使用詳細↓
  • Application (core)5new$controller_class = 'AccountController'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(AccountController)'account', 'follow''followAction'
  • needsAuthentication($action) && isAuthenticated()否定ログイン 無詳細↓
  • $auth_actions = array('index', 'signout', 'follow') (AccountController.php 10行目)
  • Controller (core)5needsAuthentication'follow'trueログイン必要
  • Session (core)5isAuthenticated
  • Session (core)6gettrue'_authenticated'ログイン中 否定 false
  • 処理の開始 ~ アクション開始↘ の直前まで処理の流れは コントローラアクション以外は ほぼ同じですログイン画面への遷移 のみ、例外処理が追加されます

  • $content = $this->$action_method($params) 可変関数$content = AccountController->followAction()
  • AccountController5followActionアクション開始
  • Request (core)6isPosttruePOSTfalse POSTでない forward404()
  • Request (core)6getPost'following_name'$following_name 'user3'
  • if (!$following_name)フォロー名 無 forward404()
  • Request (core)6getPost'_token'投稿一覧 http://mini-blog.localhost/user/user3 generateCsrfTokenチェックポイント | Request 参照
  • Controller (core)6checkCsrfToken'account/follow'trueトークン有false トークン無 redirect('/user/' . $following_name)チェックポイント | Controller 参照
  • Session (core)7get'csrf_tokens/account/follow'チェックポイント | Session 参照
  • Session (core)7set'csrf_tokens/account/follow'
  • $follow_user = $this->db_manager->get('User')->fetchByUserName($following_name)$following_name 'user3'$follow_user 'user3' 1レコード 詳細↓
  • DbManager (core)6get'User'get('User') 1回目UserRepository
  • 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 変数 使用詳細↓
  • 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$following_name 'user3'$follow_user 'user3' 1レコードテストデータ 参照SQL 参照
  • DbRepository (core)7fetch'user3'チェックポイント | DbRepository 参照
  • DbRepository (core)8execute
  • UserRepository6fetchByUserName
  • if (!$follow_user)フォロー 無 forward404()
  • Session (core)6get'user1' 1レコード (ログインユーザ)$user
  • $following_repository = $this->db_manager->get('Following')FollowingRepository詳細↓
  • DbManager (core)6get'Following'get('Following') 1回目FollowingRepository
  • 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 変数 使用詳細↓
  • DbManager (core)7new$repository_class = 'FollowingRepository'$con
  • ClassLoader (core)8loadClass'FollowingRepository'DbRepository ロード済
  • 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']
  • if ($user['id'] !== $follow_user['id'] && !$following_repository->isFollowing($user['id'], $follow_user['id'])詳細↓
  • $user['id']: 1, $follow_user['id']: 3テストデータ 参照
  • FollowingRepository6isFollowingfalse 否定trueSQL 参照
  • DbRepository (core)7fetchチェックポイント | DbRepository 参照
  • DbRepository (core)8execute
  • isFollowing (true: フォロー有, false: フォロー無) 否定true: フォロー無
  • FollowingRepository6isFollowing
  • $following_repository->insert($user['id'], $follow_user['id'])詳細↓
  • FollowingRepository6insert1, 3$user['id'], $follow_user['id']テストデータ 参照SQL 参照
  • DbRepository (core)7executeチェックポイント | DbRepository 参照
  • FollowingRepository6insert
  • Controller (core)6redirect'/account'
  • Request (core)7isSslfalse
  • Request (core)7getHost
  • Request (core)7getBaseUrl
  • Request (core)8getRequestUri
  • $urlhttp://mini-blog.localhost/account
  • Response (core)7setStatusCode
  • Response (core)7setHttpHeader
  • Controller (core)6redirect
  • AccountController5followActionreturn AccountController->...アクション終了

  • 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

fetchByUserName

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

isFollowing

SELECT COUNT(user_id) as count
    FROM following
    WHERE user_id = 1
        AND following_id = 3
count 0
(参考) followingテーブル
user_id following_id
1 2

insert

INSERT INTO following VALUES(1, 3)
user_id following_id
1 3

Mini Blog Application

フォロー処理

http://mini-blog.localhost/follow
作成手順 クラス
データベース UserRepository
FollowingRepository
FollowingRepository
fetchByUserName
isFollowing
insert
ルーティング MiniBlogApplication '/follow' =>
  array('controller' => 'account', 'action' => 'follow')
コントローラ AccountController followAction
ビューファイル
AccountController   followAction
機能 クラス メソッド
チェック Request isPost POST チェック
- if (!$following_name) フォロー名 無
Controller checkCsrfToken('account/follow', $token) トークン チェック
- if (!$follow_user) フォロー 無
- if ($user['id'] !== $follow_user['id'] 1, 3
FollowingRepository isFollowing($user['id'], $follow_user['id']) 1, 3
  (false 否定) true
データ設定
データ取得 Request 投稿一覧 http://mini-blog.localhost/user/user3
getPost('following_name') 'user3' (投稿一覧 $user['user_name'])
getPost('_token') '4b710f10e11206dd0e5ba2b23fea9c993b20a6c3'
DbManager get('User') UserRepository
UserRepository fetchByUserName($following_name) 'user3' 1レコード
Session get('user') ログインユーザ ('user1' 1レコード)
DbManager get('Following') FollowingRepository
データ出力 FollowingRepository insert($user['id'], $follow_user['id']) 1, 3
画面 Controller forward404() 404エラー画面
  (POST エラー, フォロー名 無 エラー, フォロー 無 エラー)
Controller redirect('/account') アカウント情報トップ (ログイン済 エラー)
redirect('/user/user3') 投稿一覧 (トークン エラー)
redirect('/account') アカウント情報トップ

ユーザID: user1、パスワード: password でログイン後、URL欄に http://mini-blog.localhost/user/user3 を入力すると
'フォローする' ボタンの画面が表示されます

フォロー

Page Top
Page Bottom