コントロールアーキテクチャスクリプトで例外/エラーメッセージ処理を修正するのを手伝ってくれますか?
-
04-10-2019 - |
質問
コントロールアーキテクチャスクリプトで例外/エラーメッセージ処理を修正するのを手伝ってくれますか?
まず、実際のスクリプトを投稿させてください...
注:コードのインデントの一部は少しオフですが、修正方法は不確かです。謝罪します。
class FrontController extends ActionController {
//Declaring variable(s)
private static $instance;
protected $controller;
//Class construct method
public function __construct() {}
//Starts new instance of this class with a singleton pattern
public static function getInstance() {
if(!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function dispatch($throwExceptions = false) {
/* Checks for the GET variables $module and $action, and, if present,
* strips them down with a regular expression function with a white
* list of allowed characters, removing anything that is not a letter,
* number, underscore or hyphen.
*/
$regex = '/[^-_A-z0-9]+/';
$module = isset($_GET['module']) ? preg_replace($regex, '', $_GET['module']) : 'home';
$action = isset($_GET['action']) ? preg_replace($regex, '', $_GET['action']) : 'frontpage';
/* Generates Actions class filename (example: HomeActions) and path to
* that class (example: home/HomeActions.php), checks if $file is a
* valid file, and then, if so, requires that file.
*/
$class = ucfirst($module) . 'Actions';
$file = $this->pageDir . '/' . $module . '/' . $class . '.php';
if (!is_file($file)) {
throw new FrontControllerException('Page not found!');
}
require_once $file;
/* Creates a new instance of the Actions class (example: $controller
* = new HomeActions();), and passes the registry variable to the
* ActionController class.
*/
$controller = new $class();
$controller->setRegistry($this->registry);
try {
//Trys the setModule method in the ActionController class
$controller->setModule($module);
/* The ActionController dispatchAction method checks if the method
* exists, then runs the displayView function in the
* ActionController class.
*/
$controller->dispatchAction($action);
}
catch(Exception $error) {
/* An exception has occurred, and will be displayed if
* $throwExceptions is set to true.
*/
if($throwExceptions) {
echo $error->errorMessage($error); //Full exception echoed
} else {
echo $error->errorMessage(null); //Simple error messaged echoed
}
}
}
}
abstract class ActionController {
//Declaring variable(s)
protected $registry;
protected $module;
protected $registryItems = array();
//Class construct method
public function __construct(){}
public function setRegistry($registry) {
//Sets the registry object
$this->registry = $registry;
/* Once the registry is loaded, the controller root directory path is
* set from the registry. This path is needed for the controller
* classes to work properly.
*/
$this->setPageDir();
}
//Sets the controller root directory from the value stored in the registry
public function setPageDir() {
$this->pageDir = $this->registry->get('pageDir');
}
//Sets the module
public function setModule($module) {
$this->module = $module;
}
//Gets the module
public function getModule() {
return $this->module;
}
/* Checks for actionMethod in the Actions class (example: doFrontpage()
* within home/HomeActions.php) with the method_exists function and, if
* present, the actionMethod and displayView functions are executed.
*/
public function dispatchAction($action) {
$actionMethod = 'do' . ucfirst($action);
if (!method_exists($this, $actionMethod)) {
throw new FrontControllerException('Page not found!');
}
$this->$actionMethod();
$this->displayView($action);
}
public function displayView($action) {
if (!is_file($this->pageDir . '/' . $this->getModule() . '/' . $action . 'View.php')) {
throw new FrontControllerException('Page not found!');
}
//Sets $this->actionView to the path of the action View file
$this->actionView = $this->pageDir . '/' . $this->getModule() . '/' . $action . 'View.php';
//Sets path of the action View file into the registry
$this->registry->set('actionView', $this->actionView);
//Includes template file within which the action View file is included
require_once $this->pageDir . '/default.tpl';
}
}
class Registry {
//Declaring variables
private $store;
//Class constructor
public function __construct() {}
//Sets registry variable
public function set($label, $object) {
$this->store[$label] = $object;
}
//Gets registry variable
public function get($label) {
if(isset($this->store[$label])) {
return $this->store[$label];
}
return false;
}
//Adds outside array of registry values to $this->store array
public function addRegistryArray($registryItems) {
foreach ($registryItems as $key => $value) {
$this->set($key, $value);
}
}
//Returns registry array
public function getRegistryArray() {
return $this->store;
}
}
class FrontControllerException extends Exception {
public function errorMessage($error) {
//If throwExceptions is true, then the full exception is returned.
$errorMessage = isset($error) ? $error : $this->getMessage();
return $errorMessage;
}
}
さて、問題...存在しないモジュールでURLを入力した場合(次の例「BLAH」)...
http://example.com/index.php?module=blah&action=frontpage
...私は単にエラーメッセージ「ページが見つかりません!」を取得しません。しかし、次のエラーメッセージ...
Fatal error: Uncaught exception 'FrontControllerException' with message 'Page not found!' in /web/example.com/library/php/ControlArchitecture.php:45 Stack trace: #0 /web/example.com/index.php(30): FrontController->dispatch(false) #1 {main} thrown in /web/example.com/library/php/ControlArchitecture.php on line 45
単に「ページが見つからない!」を取得しない理由に関するアイデアメッセージ(猛攻撃の例外の代わりに)?この動作を修正する方法に関するアイデアはありますか?
再度、感謝します!
解決
エラーメッセージは実際にそれをすべて示しています。
ウェザー FrontController->dispatch()
メソッド引数はです true
また false
とにかく例外がスローされます..(いくつかがある場合 フレームワークマジック 続けて、お知らせください どれの 使用しているフレームワーク)
だから、あなたがそれを呼んでいる例外をキャッチしていることを確認してください:
/* ... */
try {
FrontController->dispatch(false);
} catch (Exception $ex) {
echo "Eception caught: " . $ex.getMessage();
}
/* ... */
アップデート:
ここ PHPの例外とそれらをキャッチする方法について読むことができます。
存在しないモジュールの問題について:
$regex = '/[^-_A-z0-9]+/';
$module = isset($_GET['module']) ? preg_replace($regex, '', $_GET['module']) : 'home';
$action = isset($_GET['action']) ? preg_replace($regex, '', $_GET['action']) : 'frontpage';
$class = ucfirst($module) . 'Actions';
$file = $this->pageDir . '/' . $module . '/' . $class . '.php';
if (!is_file($file)) {
throw new FrontControllerException('Page not found!');
}
IF-Statement
この場合、blahactions.phpが存在するかどうかのモジュールファイル(pattern:moduleations.php)が存在するかどうかのみをチェックします。例外をスローしたら、あなたの電話はキャンセルされ、 しない なれ 処理 もう。 (これは、それが引き続きチェックされないことを意味します Action
パラメーター)
存在しない行動問題について:
投稿されたコードから私が理解していること、フォローする方法:
public function dispatchAction($action) {
$actionMethod = 'do' . ucfirst($action);
if (!method_exists($this, $actionMethod)) {
throw new FrontControllerException('Page not found!');
}
$this->$actionMethod();
$this->displayView($action);
}
この場合、必要なアクション(パターン:DOSOMHINTS)を呼び出します。DofRontPageは、コードが事前に例外をスローするため、呼び出されません。
存在しないアクションを呼び出すことは、未処理の例外を投げません。 handled
Module Checkの直後にFrontController-> Dispatch()メソッドで:
try {
//Trys the setModule method in the ActionController class
$controller->setModule($module);
/* The ActionController dispatchAction method checks if the method
* exists, then runs the displayView function in the
* ActionController class.
*/
$controller->dispatchAction($action);
}
catch(Exception $error) {
/* An exception has occurred, and will be displayed if
* $throwExceptions is set to true.
*/
if($throwExceptions) {
echo $error->errorMessage($error); //Full exception echoed
} else {
echo $error->errorMessage(null); //Simple error messaged echoed
}
}