File indexing completed on 2024-12-22 05:33:09
0001 <?php 0002 /** @noinspection PhpUnused */ 0003 /** @noinspection PhpIncludeInspection */ 0004 0005 /** 0006 * Flooer Framework 0007 * 0008 * LICENSE: BSD License (2 Clause) 0009 * 0010 * @category Flooer 0011 * @package Flooer_Application 0012 * @subpackage Dispatch 0013 * @author Akira Ohgaki <akiraohgaki@gmail.com> 0014 * @copyright Akira Ohgaki 0015 * @license https://opensource.org/licenses/BSD-2-Clause BSD License (2 Clause) 0016 * @link https://github.com/akiraohgaki/flooer 0017 */ 0018 0019 require_once 'Flooer/Filter.php'; 0020 require_once 'Flooer/Controller.php'; 0021 0022 /** 0023 * Usage 0024 * 0025 * $dispatch = new Flooer_Application_Dispatch($application); 0026 * $dispatch->setBaseDir('../application/controllers'); 0027 * $dispatch->dispatch(); 0028 */ 0029 0030 /** 0031 * Dispatcher class of application 0032 * 0033 * @category Flooer 0034 * @package Flooer_Application 0035 * @subpackage Dispatch 0036 * @author Akira Ohgaki <akiraohgaki@gmail.com> 0037 */ 0038 class Flooer_Application_Dispatch 0039 { 0040 0041 /** 0042 * Application environment object 0043 * 0044 * @var Flooer_Application 0045 */ 0046 protected $_application = null; 0047 0048 /** 0049 * Configuration options 0050 * 0051 * @var array 0052 */ 0053 protected $_config = array( 0054 'limitMethod' => true, 0055 'filterInput' => true, 0056 'filterOutput' => true, 0057 'sendResponse' => true, 0058 'renderView' => true, 0059 'renderErrorPage' => true, 0060 'writeLog' => true, 0061 'allowedMethod' => 'GET, POST, PUT, DELETE', 0062 'baseDir' => null, 0063 'defaultController' => 'Index', 0064 'defaultAction' => 'Index', 0065 'errorController' => 'Error', 0066 'errorAction' => 'Error', 0067 'errorMethod' => 'catch', 0068 'layoutView' => 'layout', 0069 'controllerFileSuffix' => '.php', 0070 'viewFileSuffix' => '.html', 0071 'controllerConfig' => array(), 0072 ); 0073 0074 /** 0075 * Dispatch status 0076 * 0077 * @var bool 0078 */ 0079 protected $_status = false; 0080 0081 /** 0082 * Constructor 0083 * 0084 * @param Flooer_Application &$application 0085 * @param array $config 0086 * 0087 * @return void 0088 */ 0089 public function __construct(Flooer_Application &$application, array $config = null) 0090 { 0091 ob_start(); 0092 $this->_application =& $application; 0093 if ($config) { 0094 $this->_config = $config + $this->_config; 0095 } 0096 } 0097 0098 /** 0099 * Destructor 0100 * 0101 * @return void 0102 */ 0103 public function __destruct() 0104 { 0105 if (ob_get_level()) { 0106 ob_end_flush(); 0107 } 0108 } 0109 0110 /** 0111 * Dispatch to a page script or an action controller 0112 * 0113 * Flooer Framework have an additional support to PUT, DELETE 0114 * and more methods but those HTTP methods are not supported 0115 * on a lot of web browsers, so Flooer Framework accept the 0116 * request method emulation on POST method 0117 * with 'X-HTTP-Method-Override' request header 0118 * or 'method' request parameter. 0119 * 0120 * @param string $filename 0121 * 0122 * @return void 0123 * @throws Flooer_Exception 0124 */ 0125 public function dispatch($filename = null) 0126 { 0127 if ($this->_status) { 0128 trigger_error( 0129 'Dispatch is already running', E_USER_NOTICE 0130 ); 0131 } 0132 $this->_status = true; 0133 // Request method check 0134 if ($this->_config['limitMethod']) { 0135 $this->limitMethod(); 0136 } 0137 // Input filtering 0138 if ($this->_config['filterInput']) { 0139 $this->filterInput(); 0140 } 0141 // Dispatch to a page script 0142 if ($filename) { 0143 // Render the page script 0144 try { 0145 $this->renderPage($filename); 0146 } // Error handling 0147 catch (Flooer_Exception $exception) { 0148 $this->_application->setResource('exception', $exception); 0149 if ($this->_config['writeLog'] && $this->_application->getResource('log') && $this->_application->getResource('log') instanceof Flooer_Log) { 0150 $this->writeLog(); 0151 } 0152 if ($this->_config['renderErrorPage']) { 0153 $this->renderErrorPage(); 0154 } 0155 } 0156 } // Dispatch to an action controller 0157 else { 0158 // Detect a meta-parameters 0159 if ($this->_application->getResource('request')->controller) { 0160 $controller = $this->_application->getResource('request')->controller; 0161 } else { 0162 $controller = $this->_config['defaultController']; 0163 } 0164 if ($this->_application->getResource('request')->action) { 0165 $action = $this->_application->getResource('request')->action; 0166 } else { 0167 $action = $this->_config['defaultAction']; 0168 } 0169 if ($this->_application->getResource('request')->getMethod() == 'POST') { 0170 if ($this->_application->getResource('request')->method) { 0171 $method = $this->_application->getResource('request')->method; 0172 } else { 0173 $method = $this->_application->getResource('request')->getMethod(true); 0174 } 0175 } else { 0176 $method = $this->_application->getResource('request')->getMethod(); 0177 } 0178 // Execute the action and render the view 0179 try { 0180 $this->executeAction($controller, $action, $method); 0181 if ($this->_config['renderView'] && $this->_application->getResource('view') && $this->_application->getResource('view') instanceof Flooer_View) { 0182 $this->renderView($controller, $action); 0183 } 0184 } // Error handling 0185 catch (Flooer_Exception $exception) { 0186 $this->_application->setResource('exception', $exception); 0187 if ($this->_config['writeLog'] && $this->_application->getResource('log') && $this->_application->getResource('log') instanceof Flooer_Log) { 0188 $this->writeLog(); 0189 } 0190 // Execute the error action and render the view 0191 try { 0192 $this->executeAction( 0193 $this->_config['errorController'], $this->_config['errorAction'], $this->_config['errorMethod'] 0194 ); 0195 if ($this->_config['renderView'] && $this->_application->getResource('view') && $this->_application->getResource('view') instanceof Flooer_View) { 0196 $this->renderView( 0197 $this->_config['errorController'], $this->_config['errorAction'] 0198 ); 0199 } 0200 } // If error happened again, render a default error page 0201 catch (Flooer_Exception $exception) { 0202 $this->_application->setResource('exception', $exception); 0203 if ($this->_config['writeLog'] && $this->_application->getResource('log') && $this->_application->getResource('log') instanceof Flooer_Log) { 0204 $this->writeLog(); 0205 } 0206 if ($this->_config['renderErrorPage']) { 0207 $this->renderErrorPage(); 0208 } 0209 } 0210 } 0211 } 0212 // Output filtering 0213 if ($this->_config['filterOutput']) { 0214 $this->filterOutput(); 0215 } 0216 // Send a response 0217 if ($this->_config['sendResponse']) { 0218 $this->sendResponse(); 0219 } 0220 } 0221 0222 /** 0223 * Request limits to an allowed request method 0224 * 0225 * @return void 0226 */ 0227 public function limitMethod() 0228 { 0229 if ($this->_application->getResource('request')->getMethod() == 'HEAD') { 0230 $this->_application->getResource('response')->setBody(''); 0231 $this->_application->getResource('response')->send(); 0232 exit; 0233 } else { 0234 if ($this->_application->getResource('request')->getMethod() == 'OPTIONS') { 0235 $this->_application->getResource('response')->setHeader( 0236 'Allow', $this->_config['allowedMethod'] 0237 ); 0238 $this->_application->getResource('response')->setBody( 0239 'Allow: ' . $this->_config['allowedMethod'] 0240 ); 0241 $this->_application->getResource('response')->send(); 0242 exit; 0243 } else { 0244 if (!in_array( 0245 $this->_application->getResource('request') 0246 ->getMethod(true), explode(',', str_replace(' ', '', $this->_config['allowedMethod'])) 0247 )) { 0248 $this->_application->getResource('response')->setStatus(405); 0249 $this->_application->getResource('response')->setBody( 0250 'Method Not Allowed' 0251 ); 0252 $this->_application->getResource('response')->send(); 0253 exit; 0254 } 0255 } 0256 } 0257 } 0258 0259 /** 0260 * Input filtering 0261 * 0262 * @return void 0263 */ 0264 public function filterInput() 0265 { 0266 $filter = new Flooer_Filter( 0267 array( 0268 'convertEncoding' => $this->_application->getConfig('mbstringSupport'), 0269 'convertNewline' => true, 0270 'stripNull' => true, 0271 'stripSlashes' => $this->_application->getConfig('magicQuotesSupport'), 0272 'trimWhitespace' => true, 0273 'encoding' => $this->_application->getConfig('encoding'), 0274 'newline' => $this->_application->getConfig('newline'), 0275 ) 0276 ); 0277 $request = $this->_application->getResource('request'); 0278 $filter->filter($request); 0279 $this->_application->setResource('request', $request); 0280 if ($this->_application->getResource('cookie') && $this->_application->getResource('cookie') instanceof Flooer_Http_Cookie) { 0281 $cookie = $this->_application->getResource('cookie'); 0282 $filter->filter($cookie); 0283 $this->_application->setResource('cookie', $cookie); 0284 } 0285 if ($this->_application->getResource('server') && $this->_application->getResource('server') instanceof Flooer_Http_Server) { 0286 $server = $this->_application->getResource('server'); 0287 $filter->filter($server); 0288 $this->_application->setResource('server', $server); 0289 } 0290 } 0291 0292 /** 0293 * Render a page 0294 * 0295 * @param string $filename 0296 * 0297 * @return void 0298 * @throws Flooer_Exception 0299 */ 0300 public function renderPage($filename) 0301 { 0302 if (is_file($filename)) { 0303 try { 0304 ob_start(); 0305 include $filename; 0306 $this->_application->getResource('response')->setBody(ob_get_contents()); 0307 ob_end_clean(); 0308 if (!$this->_application->getResource('response')->getHeader('Content-Type')) { 0309 $type = $this->_application->getResource('response')->detectContentType($filename); 0310 if ($type) { 0311 $this->_application->getResource('response')->setHeader( 0312 'Content-Type', $type 0313 ); 0314 } 0315 } 0316 } catch (Flooer_Exception $exception) { 0317 ob_clean(); 0318 $this->_application->getResource('response')->setStatus(500); 0319 throw $exception; 0320 } catch (Exception $exception) { 0321 ob_clean(); 0322 $this->_application->getResource('response')->setStatus(500); 0323 throw new Flooer_Exception( 0324 $exception->getMessage(), $exception->getCode(), $exception->getFile(), $exception->getLine() 0325 ); 0326 } 0327 0328 return; 0329 } 0330 $this->_application->getResource('response')->setStatus(404); 0331 $message = "Page script file ($filename) not found"; 0332 if (in_array($this->_application->getConfig('environment'), array('production', 'staging'))) { 0333 $message = 'Not Found'; 0334 } 0335 throw new Flooer_Exception( 0336 $message, LOG_NOTICE 0337 ); 0338 } 0339 0340 /** 0341 * Write a log and/or send an email notification 0342 * 0343 * @return void 0344 */ 0345 public function writeLog() 0346 { 0347 $message = $this->_application->getResource('exception')->getMessage(); 0348 $code = $this->_application->getResource('exception')->getCode(); 0349 $file = $this->_application->getResource('exception')->getFile(); 0350 $line = $this->_application->getResource('exception')->getLine(); 0351 $uri = $this->_application->getResource('request')->getUri(); 0352 $this->_application->getResource('log')->log( 0353 "$message; $file($line); $uri", $code 0354 ); 0355 } 0356 0357 /** 0358 * Render a default error page 0359 * 0360 * @return void 0361 * @throws Flooer_Exception 0362 * @throws Flooer_Exception 0363 */ 0364 public function renderErrorPage() 0365 { 0366 $this->renderPage( 0367 dirname(__FILE__) . '/pages/error.phtml' 0368 ); 0369 } 0370 0371 /** 0372 * Execute an action 0373 * 0374 * @param string $controller 0375 * @param string $action 0376 * @param string $method 0377 * 0378 * @return void 0379 * @throws Flooer_Exception 0380 */ 0381 public function executeAction($controller, $action, $method) 0382 { 0383 $previousException = null; 0384 if ($this->_application->getResource('exception') && $this->_application->getResource('exception') instanceof Flooer_Exception) { 0385 $previousException = $this->_application->getResource('exception'); 0386 } 0387 $controller = ucfirst(strtolower($controller)); 0388 $controller = str_replace('controller', 'Controller', $controller); 0389 $action = ucfirst(strtolower($action)); 0390 $method = strtolower($method); 0391 if (is_file( 0392 $this->_config['baseDir'] . '/' . $controller . $this->_config['controllerFileSuffix'] 0393 )) { 0394 include_once $this- >_config['baseDir'] . '/' . $controller . $this- >_config['controllerFileSuffix']; 0395 if (class_exists($controller, false)) { 0396 $controllerInstance = new $controller($this->_config['controllerConfig']); 0397 if ($controllerInstance instanceof Flooer_Controller) { 0398 if (method_exists($controllerInstance, $method . $action)) { 0399 foreach ($this->_application->getResources() as $key => $value) { 0400 // A resources should be an object. 0401 $controllerInstance->$key = $value; 0402 } 0403 try { 0404 $controllerInstance->execute($method . $action); 0405 } catch (Flooer_Exception $exception) { 0406 ob_clean(); 0407 if (!$this->_application->getResource('response')->getStatus()) { 0408 $this->_application->getResource('response')->setStatus(500); 0409 } 0410 throw $exception; 0411 } catch (Exception $exception) { 0412 ob_clean(); 0413 if (!$this->_application->getResource('response')->getStatus()) { 0414 $this->_application->getResource('response')->setStatus(500); 0415 } 0416 throw new Flooer_Exception( 0417 $exception->getMessage(), $exception->getCode(), $exception->getFile(), $exception->getLine() 0418 ); 0419 } 0420 0421 return; 0422 } 0423 $this->_application->getResource('response')->setStatus(404); 0424 $message = "Unknown action ($action)"; 0425 if (in_array($this->_application->getConfig('environment'), array('production', 'staging'))) { 0426 $message = 'Not Found'; 0427 } 0428 throw new Flooer_Exception( 0429 $message, LOG_NOTICE, null, null, $previousException 0430 ); 0431 } 0432 $this->_application->getResource('response')->setStatus(500); 0433 $message = "Invalid controller ($controller)"; 0434 if (in_array($this->_application->getConfig('environment'), array('production', 'staging'))) { 0435 $message = 'Internal Server Error'; 0436 } 0437 throw new Flooer_Exception( 0438 $message, LOG_ERR, null, null, $previousException 0439 ); 0440 } 0441 $this->_application->getResource('response')->setStatus(500); 0442 $message = "Invalid controller ($controller)"; 0443 if (in_array($this->_application->getConfig('environment'), array('production', 'staging'))) { 0444 $message = 'Internal Server Error'; 0445 } 0446 throw new Flooer_Exception( 0447 $message, LOG_ERR, null, null, $previousException 0448 ); 0449 } 0450 $this->_application->getResource('response')->setStatus(404); 0451 $message = "Unknown controller ($controller)"; 0452 if (in_array($this->_application->getConfig('environment'), array('production', 'staging'))) { 0453 $message = 'Not Found'; 0454 } 0455 throw new Flooer_Exception( 0456 $message, LOG_NOTICE, null, null, $previousException 0457 ); 0458 } 0459 0460 /** 0461 * Render a view 0462 * 0463 * @param string $controller 0464 * @param string $action 0465 * 0466 * @return void 0467 * @throws Flooer_Exception 0468 */ 0469 public function renderView($controller, $action) 0470 { 0471 $controller = strtolower($controller); 0472 $action = strtolower($action); 0473 $file = $this->_application->getResource('view')->getFile(); 0474 if (!$file) { 0475 if (is_file( 0476 $this->_application->getResource('view') 0477 ->getBaseDir() . '/' . $this->_config['layoutView'] . $this->_config['viewFileSuffix'] 0478 )) { 0479 $file = $this->_config['layoutView'] . $this->_config['viewFileSuffix']; 0480 } else { 0481 if (is_file( 0482 $this->_application->getResource('view') 0483 ->getBaseDir() . '/' . $controller . $this->_config['viewFileSuffix'] 0484 )) { 0485 $file = $controller . $this->_config['viewFileSuffix']; 0486 } else { 0487 $file = $controller . '/' . $action . $this->_config['viewFileSuffix']; 0488 } 0489 } 0490 } 0491 if (is_file( 0492 $this->_application->getResource('view')->getBaseDir() . '/' . $file 0493 )) { 0494 try { 0495 $this->_application->getResource('response')->setBody( 0496 $this->_application->getResource('view')->render($file) 0497 ); 0498 if (!$this->_application->getResource('response')->getHeader('Content-Type')) { 0499 $type = $this->_application->getResource('response')->detectContentType($file); 0500 if ($type) { 0501 $this->_application->getResource('response')->setHeader( 0502 'Content-Type', $type 0503 ); 0504 } 0505 } 0506 } catch (Flooer_Exception $exception) { 0507 ob_clean(); 0508 $this->_application->getResource('response')->setStatus(500); 0509 throw $exception; 0510 } catch (Exception $exception) { 0511 ob_clean(); 0512 $this->_application->getResource('response')->setStatus(500); 0513 throw new Flooer_Exception( 0514 $exception->getMessage(), $exception->getCode(), $exception->getFile(), $exception->getLine() 0515 ); 0516 } 0517 0518 return; 0519 } 0520 $this->_application->getResource('response')->setStatus(404); 0521 $message = 'View script file (' . $this->_application->getResource('view') 0522 ->getBaseDir() . '/' . $file . ') not found'; 0523 if (in_array($this->_application->getConfig('environment'), array('production', 'staging'))) { 0524 $message = 'Not Found'; 0525 } 0526 throw new Flooer_Exception( 0527 $message, LOG_NOTICE 0528 ); 0529 } 0530 0531 /** 0532 * Output filtering 0533 * 0534 * @return void 0535 */ 0536 public function filterOutput() 0537 { 0538 $filter = new Flooer_Filter( 0539 array( 0540 'convertEncoding' => $this->_application->getConfig('mbstringSupport'), 0541 'convertNewline' => true, 0542 'stripNull' => true, 0543 'stripSlashes' => false, 0544 'trimWhitespace' => true, 0545 'encoding' => $this->_application->getConfig('encoding'), 0546 'newline' => $this->_application->getConfig('newline'), 0547 ) 0548 ); 0549 $body = $this->_application->getResource('response')->getBody(); 0550 $filter->filter($body); 0551 $this->_application->getResource('response')->setBody($body); 0552 } 0553 0554 /** 0555 * Send a response 0556 * 0557 * @return void 0558 */ 0559 public function sendResponse() 0560 { 0561 $this->_application->getResource('response')->send(); 0562 } 0563 0564 /** 0565 * Get an application environment object 0566 * 0567 * @return Flooer_Application 0568 */ 0569 public function getApplication() 0570 { 0571 return $this->_application; 0572 } 0573 0574 /** 0575 * Set an executable flag for limitMethod() 0576 * 0577 * @param bool $bool 0578 * 0579 * @return void 0580 */ 0581 public function setLimitMethod($bool) 0582 { 0583 $this->_config['limitMethod'] = $bool; 0584 } 0585 0586 /** 0587 * Get an executable flag for limitMethod() 0588 * 0589 * @return bool 0590 */ 0591 public function getLimitMethod() 0592 { 0593 return $this->_config['limitMethod']; 0594 } 0595 0596 /** 0597 * Set an executable flag for filterInput() 0598 * 0599 * @param bool $bool 0600 * 0601 * @return void 0602 */ 0603 public function setFilterInput($bool) 0604 { 0605 $this->_config['filterInput'] = $bool; 0606 } 0607 0608 /** 0609 * Get an executable flag for filterInput() 0610 * 0611 * @return bool 0612 */ 0613 public function getFilterInput() 0614 { 0615 return $this->_config['filterInput']; 0616 } 0617 0618 /** 0619 * Set an executable flag for filterOutput() 0620 * 0621 * @param bool $bool 0622 * 0623 * @return void 0624 */ 0625 public function setFilterOutput($bool) 0626 { 0627 $this->_config['filterOutput'] = $bool; 0628 } 0629 0630 /** 0631 * Get an executable flag for filterOutput() 0632 * 0633 * @return bool 0634 */ 0635 public function getFilterOutput() 0636 { 0637 return $this->_config['filterOutput']; 0638 } 0639 0640 /** 0641 * Set an executable flag for sendResponse() 0642 * 0643 * @param bool $bool 0644 * 0645 * @return void 0646 */ 0647 public function setSendResponse($bool) 0648 { 0649 $this->_config['sendResponse'] = $bool; 0650 } 0651 0652 /** 0653 * Get an executable flag for sendResponse() 0654 * 0655 * @return bool 0656 */ 0657 public function getSendResponse() 0658 { 0659 return $this->_config['sendResponse']; 0660 } 0661 0662 /** 0663 * Set an executable flag for renderView() 0664 * 0665 * @param bool $bool 0666 * 0667 * @return void 0668 */ 0669 public function setRenderView($bool) 0670 { 0671 $this->_config['renderView'] = $bool; 0672 } 0673 0674 /** 0675 * Get an executable flag for renderView() 0676 * 0677 * @return bool 0678 */ 0679 public function getRenderView() 0680 { 0681 return $this->_config['renderView']; 0682 } 0683 0684 /** 0685 * Set an executable flag for renderErrorPage() 0686 * 0687 * @param bool $bool 0688 * 0689 * @return void 0690 */ 0691 public function setRenderErrorPage($bool) 0692 { 0693 $this->_config['renderErrorPage'] = $bool; 0694 } 0695 0696 /** 0697 * Get an executable flag for renderErrorPage() 0698 * 0699 * @return bool 0700 */ 0701 public function getRenderErrorPage() 0702 { 0703 return $this->_config['renderErrorPage']; 0704 } 0705 0706 /** 0707 * Set an executable flag for writeLog() 0708 * 0709 * @param bool $bool 0710 * 0711 * @return void 0712 */ 0713 public function setWriteLog($bool) 0714 { 0715 $this->_config['writeLog'] = $bool; 0716 } 0717 0718 /** 0719 * Get an executable flag for writeLog() 0720 * 0721 * @return bool 0722 */ 0723 public function getWriteLog() 0724 { 0725 return $this->_config['writeLog']; 0726 } 0727 0728 /** 0729 * Set an allowed method 0730 * 0731 * @param string $allowedMethod Comma-separated list 0732 * 0733 * @return void 0734 */ 0735 public function setAllowedMethod($allowedMethod) 0736 { 0737 $this->_config['allowedMethod'] = $allowedMethod; 0738 } 0739 0740 /** 0741 * Get an allowed method 0742 * 0743 * @return string 0744 */ 0745 public function getAllowedMethod() 0746 { 0747 return $this->_config['allowedMethod']; 0748 } 0749 0750 /** 0751 * Set the path of a base directory 0752 * 0753 * @param string $path 0754 * 0755 * @return void 0756 */ 0757 public function setBaseDir($path) 0758 { 0759 $this->_config['baseDir'] = $path; 0760 } 0761 0762 /** 0763 * Get the path of a base directory 0764 * 0765 * @return string 0766 */ 0767 public function getBaseDir() 0768 { 0769 return $this->_config['baseDir']; 0770 } 0771 0772 /** 0773 * Set a default controller name 0774 * 0775 * @param string $controller 0776 * 0777 * @return void 0778 */ 0779 public function setDefaultController($controller) 0780 { 0781 $this->_config['defaultController'] = $controller; 0782 } 0783 0784 /** 0785 * Get a default controller name 0786 * 0787 * @return string 0788 */ 0789 public function getDefaultController() 0790 { 0791 return $this->_config['defaultController']; 0792 } 0793 0794 /** 0795 * Set a default action name 0796 * 0797 * @param string $action 0798 * 0799 * @return void 0800 */ 0801 public function setDefaultAction($action) 0802 { 0803 $this->_config['defaultAction'] = $action; 0804 } 0805 0806 /** 0807 * Get a default action name 0808 * 0809 * @return string 0810 */ 0811 public function getDefaultAction() 0812 { 0813 return $this->_config['defaultAction']; 0814 } 0815 0816 /** 0817 * Set an error controller name 0818 * 0819 * @param string $controller 0820 * 0821 * @return void 0822 */ 0823 public function setErrorController($controller) 0824 { 0825 $this->_config['errorController'] = $controller; 0826 } 0827 0828 /** 0829 * Get an error controller name 0830 * 0831 * @return string 0832 */ 0833 public function getErrorController() 0834 { 0835 return $this->_config['errorController']; 0836 } 0837 0838 /** 0839 * Set an error action name 0840 * 0841 * @param string $action 0842 * 0843 * @return void 0844 */ 0845 public function setErrorAction($action) 0846 { 0847 $this->_config['errorAction'] = $action; 0848 } 0849 0850 /** 0851 * Get an error action name 0852 * 0853 * @return string 0854 */ 0855 public function getErrorAction() 0856 { 0857 return $this->_config['errorAction']; 0858 } 0859 0860 /** 0861 * Set an error method name 0862 * 0863 * @param string $method 0864 * 0865 * @return void 0866 */ 0867 public function setErrorMethod($method) 0868 { 0869 $this->_config['errorMethod'] = $method; 0870 } 0871 0872 /** 0873 * Get an error method name 0874 * 0875 * @return string 0876 */ 0877 public function getErrorMethod() 0878 { 0879 return $this->_config['errorMethod']; 0880 } 0881 0882 /** 0883 * Set a view name for layout 0884 * 0885 * @param string $layout 0886 * 0887 * @return void 0888 */ 0889 public function setLayoutView($layout) 0890 { 0891 $this->_config['layoutView'] = $layout; 0892 } 0893 0894 /** 0895 * Get a view name for layout 0896 * 0897 * @return string 0898 */ 0899 public function getLayoutView() 0900 { 0901 return $this->_config['layoutView']; 0902 } 0903 0904 /** 0905 * Set a controller file suffix 0906 * 0907 * @param string $suffix 0908 * 0909 * @return void 0910 */ 0911 public function setControllerFileSuffix($suffix) 0912 { 0913 $this->_config['controllerFileSuffix'] = $suffix; 0914 } 0915 0916 /** 0917 * Get a controller file suffix 0918 * 0919 * @return string 0920 */ 0921 public function getControllerFileSuffix() 0922 { 0923 return $this->_config['controllerFileSuffix']; 0924 } 0925 0926 /** 0927 * Set a view file suffix 0928 * 0929 * @param string $suffix 0930 * 0931 * @return void 0932 */ 0933 public function setViewFileSuffix($suffix) 0934 { 0935 $this->_config['viewFileSuffix'] = $suffix; 0936 } 0937 0938 /** 0939 * Get a view file suffix 0940 * 0941 * @return string 0942 */ 0943 public function getViewFileSuffix() 0944 { 0945 return $this->_config['viewFileSuffix']; 0946 } 0947 0948 /** 0949 * Set a configuration options for a controller class 0950 * 0951 * @param array $config 0952 * 0953 * @return void 0954 */ 0955 public function setControllerConfig(array $config) 0956 { 0957 $this->_config['controllerConfig'] = $config; 0958 } 0959 0960 /** 0961 * Get a configuration options for a controller class 0962 * 0963 * @return array 0964 */ 0965 public function getControllerConfig() 0966 { 0967 return $this->_config['controllerConfig']; 0968 } 0969 0970 }