public function upgrade() { if (!in_array('sfPropelPlugin', $this->configuration->getPlugins())) { if (file_exists($file = sfConfig::get('sf_config_dir') . '/propel.ini')) { $this->getFilesystem()->remove($file); } return; } if (file_exists($old = sfConfig::get('sf_lib_dir') . '/filter/base/BaseFormFilterPropel.class.php') && !file_exists($new = sfConfig::get('sf_lib_dir') . '/filter/BaseFormFilterPropel.class.php')) { $this->getFilesystem()->rename($old, $new); } if (file_exists($file = sfConfig::get('sf_config_dir') . '/propel.ini')) { // use phing to parse propel.ini sfPhing::startup(); $this->properties = new Properties(); $this->properties->load(new PhingFile($file)); $modified = $original = file_get_contents($file); $modified = $this->upgradePropelIni($modified, self::$removes, false); $modified = $this->upgradePropelIni($modified, self::$inserts, true); if ($original != $modified) { $this->logSection('propel', 'Upgrading ' . sfDebug::shortenFilePath($file)); file_put_contents($file, $modified); } } }
/** * Converts an array to HTML. * * @param string $id The identifier to use * @param array $values The array of values * * @return string An HTML string */ protected function formatArrayAsHtml($id, $values) { $id = ucfirst(strtolower($id)); return ' <h2>' . $id . ' ' . $this->getToggler('sfWebDebug' . $id) . '</h2> <div id="sfWebDebug' . $id . '" style="display: none"><pre>' . htmlspecialchars(sfYaml::dump(sfDebug::removeObjects($values)), ENT_QUOTES, sfConfig::get('sf_charset')) . '</pre></div> '; }
/** * Converts an array to HTML. * * @param string $id The identifier to use * @param array $values The array of values * * @return string An HTML string */ protected function formatArrayAsHtml($id, $values) { $id = ucfirst(strtolower($id)); return ' <h2>' . $id . ' <a href="#" onclick="sfWebDebugToggle(\'sfWebDebug' . $id . '\'); return false;"><img src="' . $this->webDebug->getOption('image_root_path') . '/toggle.gif" alt="Toggle details" /></a></h2> <div id="sfWebDebug' . $id . '" style="display: none"><pre>' . htmlspecialchars(sfYaml::dump(sfDebug::removeObjects($values)), ENT_QUOTES, sfConfig::get('sf_charset')) . '</pre></div> '; }
public function upgrade() { $specVersion = sfYaml::getSpecVersion(); $queue = array(); $success = true; $finder = sfFinder::type('file')->name('*.yml')->prune('vendor'); foreach ($finder->in(sfConfig::get('sf_root_dir')) as $file) { // attempt to upgrade booleans $original = file_get_contents($file); $upgraded = sfToolkit::pregtr($original, array('/^([^:]+: +)(?:on|y(?:es)?|\\+)(\\s*(#.*)?)$/im' => '\\1true\\2', '/^([^:]+: +)(?:off|no?|-)(\\s*(#.*)?)$/im' => '\\1false\\2')); try { sfYaml::setSpecVersion('1.1'); $yaml11 = sfYaml::load($original); sfYaml::setSpecVersion('1.2'); $yaml12 = sfYaml::load($upgraded); } catch (Exception $e) { // unable to load the YAML $yaml11 = 'foo'; $yaml12 = 'bar'; } if ($yaml11 == $yaml12) { if ($original != $upgraded) { $this->getFilesystem()->touch($file); file_put_contents($file, $upgraded); } } else { $this->logSection('yaml', 'Unable to upgrade ' . sfDebug::shortenFilePath($file), null, 'ERROR'); // force project to use YAML 1.1 spec if ('1.1' != $specVersion) { $specVersion = '1.1'; $class = sfClassManipulator::fromFile(sfConfig::get('sf_config_dir') . '/ProjectConfiguration.class.php'); $original = $class->getCode(); $modified = $class->wrapMethod('setup', 'sfYaml::setSpecVersion(\'1.1\');'); if ($original != $modified && $this->askConfirmation(array('Unable to convert YAML file:', sfDebug::shortenFilePath($file), '', 'Would you like to force YAML to be parsed with the 1.1 specification? (Y/n)'), 'QUESTION_LARGE')) { $this->logSection('yaml', 'Forcing YAML 1.1 spec'); $this->getFilesystem()->touch($class->getFile()); $class->save(); } else { $this->logBlock(array('Unable to either upgrade YAML files or force 1.1 spec.', '(see UPGRADE_TO_1_3 file for more information)'), 'ERROR_LARGE'); } } $success = false; } } if ($success && '1.1' == $specVersion) { $file = sfConfig::get('sf_config_dir') . '/ProjectConfiguration.class.php'; $original = file_get_contents($file); $modified = preg_replace('/^\\s*sfYaml::setSpecVersion\\(\'1\\.1\'\\);\\n/im', '', $original); if ($original != $modified) { $this->logSection('yaml', 'Removing setting of YAML 1.1 spec'); $this->getFilesystem()->touch($file); file_put_contents($file, $modified); } } }
public function getPanelContent() { $content = array(); if (sfConfig::get('sf_logging_enabled')) { $context = sfContext::getInstance(); $content['request'] = sfDebug::requestAsArray($context->getRequest()); $content['response'] = sfDebug::responseAsArray($context->getResponse()); $content['user'] = sfDebug::userAsArray($context->getUser()); $content['settings'] = sfDebug::settingsAsArray(); $content['globals'] = sfDebug::globalsAsArray(); $content['php'] = sfDebug::phpInfoAsArray(); $content['symfony'] = sfDebug::symfonyInfoAsArray(); } else { $content['Logging disabled'] = array(); } return $content; }
public function getPanelContent() { $config = array('debug' => sfConfig::get('sf_debug') ? 'on' : 'off', 'xdebug' => extension_loaded('xdebug') ? 'on' : 'off', 'logging' => sfConfig::get('sf_logging_enabled') ? 'on' : 'off', 'cache' => sfConfig::get('sf_cache') ? 'on' : 'off', 'compression' => sfConfig::get('sf_compressed') ? 'on' : 'off', 'tokenizer' => function_exists('token_get_all') ? 'on' : 'off', 'eaccelerator' => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable') ? 'on' : 'off', 'apc' => extension_loaded('apc') && ini_get('apc.enabled') ? 'on' : 'off', 'xcache' => extension_loaded('xcache') && ini_get('xcache.cacher') ? 'on' : 'off'); $html = '<ul id="sfWebDebugConfigSummary">'; foreach ($config as $key => $value) { $html .= '<li class="is' . $value . ($key == 'xcache' ? ' last' : '') . '">' . $key . '</li>'; } $html .= '</ul>'; $context = sfContext::getInstance(); $html .= $this->formatArrayAsHtml('request', sfDebug::requestAsArray($context->getRequest())); $html .= $this->formatArrayAsHtml('response', sfDebug::responseAsArray($context->getResponse())); $html .= $this->formatArrayAsHtml('user', sfDebug::userAsArray($context->getUser())); $html .= $this->formatArrayAsHtml('settings', sfDebug::settingsAsArray()); $html .= $this->formatArrayAsHtml('globals', sfDebug::globalsAsArray()); $html .= $this->formatArrayAsHtml('php', sfDebug::phpInfoAsArray()); $html .= $this->formatArrayAsHtml('symfony', sfDebug::symfonyInfoAsArray()); return $html; }
/** * Formats a file link. * * @param string $file A file path or class name * @param integer $line * @param string $text Text to use for the link * * @return string */ public function formatFileLink($file, $line = null, $text = null) { // this method is called a lot so we avoid calling class_exists() if ($file && !sfToolkit::isPathAbsolute($file)) { if (null === $text) { $text = $file; } // translate class to file name $r = new ReflectionClass($file); $file = $r->getFileName(); } $shortFile = sfDebug::shortenFilePath($file); if ($linkFormat = sfConfig::get('sf_file_link_format', ini_get('xdebug.file_link_format'))) { // return a link return sprintf( '<a href="%s" class="sfWebDebugFileLink" title="%s">%s</a>', htmlspecialchars(strtr($linkFormat, array('%f' => $file, '%l' => $line)), ENT_QUOTES, sfConfig::get('sf_charset')), htmlspecialchars($shortFile, ENT_QUOTES, sfConfig::get('sf_charset')), null === $text ? $shortFile : $text); } else if (null === $text) { // return the shortened file path return $shortFile; } else { // return the provided text with the shortened file path as a tooltip return sprintf('<span title="%s">%s</span>', $shortFile, $text); } }
/** * Returns the current configuration as HTML. * * @return string The current configuration as HTML */ protected function getCurrentConfigAsHtml() { $config = array('debug' => sfConfig::get('sf_debug') ? 'on' : 'off', 'xdebug' => extension_loaded('xdebug') ? 'on' : 'off', 'logging' => sfConfig::get('sf_logging_enabled') ? 'on' : 'off', 'cache' => sfConfig::get('sf_cache') ? 'on' : 'off', 'eaccelerator' => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable') ? 'on' : 'off', 'apc' => extension_loaded('apc') && ini_get('apc.enabled') ? 'on' : 'off', 'xcache' => extension_loaded('xcache') && ini_get('xcache.cacher') ? 'on' : 'off', 'compression' => sfConfig::get('sf_compressed') ? 'on' : 'off', 'syck' => extension_loaded('syck') ? 'on' : 'off'); $result = '<ul id="sfWebDebugConfigSummary">'; foreach ($config as $key => $value) { $result .= '<li class="is' . $value . '' . ($key == 'syck' ? ' last' : '') . '">' . $key . '</li>'; } $result .= '</ul>'; $context = sfContext::getInstance(); $result .= $this->formatArrayAsHtml('request', sfDebug::requestAsArray($context->getRequest())); $result .= $this->formatArrayAsHtml('response', sfDebug::responseAsArray($context->getResponse())); $result .= $this->formatArrayAsHtml('settings', sfDebug::settingsAsArray()); $result .= $this->formatArrayAsHtml('globals', sfDebug::globalsAsArray()); $result .= $this->formatArrayAsHtml('php', sfDebug::phpInfoAsArray()); return $result; }
/** * Prints the stack trace for this exception. * * @param Exception An Exception implementation instance */ public function printStackTrace($exception = null) { if (!$exception) { $exception = $this; } // don't print message if it is an sfStopException exception if (method_exists($exception, 'getName') && $exception->getName() == 'sfStopException') { if (!sfConfig::get('sf_test')) { exit(1); } return; } if (class_exists('sfMixer', false)) { foreach (sfMixer::getCallables('sfException:printStackTrace:printStackTrace') as $callable) { $ret = call_user_func($callable, $this, $exception); if ($ret) { if (!sfConfig::get('sf_test')) { exit(1); } return; } } } if (!sfConfig::get('sf_test')) { header('HTTP/1.0 500 Internal Server Error'); // clean current output buffer while (@ob_end_clean()) { } ob_start(sfConfig::get('sf_compressed') ? 'ob_gzhandler' : ''); } // send an error 500 if not in debug mode if (!sfConfig::get('sf_debug')) { error_log($exception->getMessage()); $file = sfConfig::get('sf_web_dir') . '/errors/error500.php'; include is_readable($file) ? $file : sfConfig::get('sf_symfony_data_dir') . '/web/errors/error500.php'; if (!sfConfig::get('sf_test')) { exit(1); } return; } $message = null !== $exception->getMessage() ? $exception->getMessage() : 'n/a'; $name = get_class($exception); $format = 0 == strncasecmp(PHP_SAPI, 'cli', 3) ? 'plain' : 'html'; $traces = $this->getTraces($exception, $format); // extract error reference from message $error_reference = ''; if (preg_match('/\\[(err\\d+)\\]/', $message, $matches)) { $error_reference = $matches[1]; } // dump main objects values $sf_settings = ''; $settingsTable = $requestTable = $responseTable = $globalsTable = ''; if (class_exists('sfContext', false) && sfContext::hasInstance()) { $context = sfContext::getInstance(); $settingsTable = $this->formatArrayAsHtml(sfDebug::settingsAsArray()); $requestTable = $this->formatArrayAsHtml(sfDebug::requestAsArray($context->getRequest())); $responseTable = $this->formatArrayAsHtml(sfDebug::responseAsArray($context->getResponse())); $globalsTable = $this->formatArrayAsHtml(sfDebug::globalsAsArray()); } include sfConfig::get('sf_symfony_data_dir') . '/data/exception.' . ($format == 'html' ? 'php' : 'txt'); // if test, do not exit if (!sfConfig::get('sf_test')) { exit(1); } }
/** * Gets the stack trace for this exception. */ protected static function outputStackTrace(Exception $exception) { $format = 'html'; $code = '500'; $text = 'Internal Server Error'; if (class_exists('sfContext', false) && sfContext::hasInstance() && is_object($request = sfContext::getInstance()->getRequest()) && is_object($response = sfContext::getInstance()->getResponse())) { $dispatcher = sfContext::getInstance()->getEventDispatcher(); if (sfConfig::get('sf_logging_enabled')) { $dispatcher->notify(new sfEvent($exception, 'application.log', array($exception->getMessage(), 'priority' => sfLogger::ERR))); } $event = $dispatcher->notifyUntil(new sfEvent($exception, 'application.throw_exception')); if ($event->isProcessed()) { return; } if ($response->getStatusCode() < 300) { // status code has already been sent, but is included here for the purpose of testing $response->setStatusCode(500); } $response->setContentType('text/html'); if (!sfConfig::get('sf_test')) { foreach ($response->getHttpHeaders() as $name => $value) { header($name . ': ' . $value); } } $code = $response->getStatusCode(); $text = $response->getStatusText(); $format = $request->getRequestFormat(); if (!$format) { $format = 'html'; } if ($mimeType = $request->getMimeType($format)) { $response->setContentType($mimeType); } } else { // a backward compatible default if (!sfConfig::get('sf_test')) { header('Content-Type: text/html; charset=' . sfConfig::get('sf_charset', 'utf-8')); } } // send an error 500 if not in debug mode if (!sfConfig::get('sf_debug')) { if ($template = self::getTemplatePathForError($format, false)) { include $template; return; } } $message = is_null($exception->getMessage()) ? 'n/a' : $exception->getMessage(); $name = get_class($exception); $traces = self::getTraces($exception, 'html' != $format || 0 == strncasecmp(PHP_SAPI, 'cli', 3) ? 'plain' : 'html'); // dump main objects values $sf_settings = ''; $settingsTable = $requestTable = $responseTable = $globalsTable = $userTable = ''; if (class_exists('sfContext', false) && sfContext::hasInstance()) { $context = sfContext::getInstance(); $settingsTable = self::formatArrayAsHtml(sfDebug::settingsAsArray()); $requestTable = self::formatArrayAsHtml(sfDebug::requestAsArray($context->getRequest())); $responseTable = self::formatArrayAsHtml(sfDebug::responseAsArray($context->getResponse())); $userTable = self::formatArrayAsHtml(sfDebug::userAsArray($context->getUser())); $globalsTable = self::formatArrayAsHtml(sfDebug::globalsAsArray()); } if ($response) { $response->sendHttpHeaders(); } if ($template = self::getTemplatePathForError($format, true)) { include $template; return; } }
protected function sendConfig() { $context = sfContext::getInstance(); $config = array('debug' => sfConfig::get('sf_debug') ? 'on' : 'off', 'xdebug' => extension_loaded('xdebug') ? 'on' : 'off', 'logging' => sfConfig::get('sf_logging_enabled') ? 'on' : 'off', 'cache' => sfConfig::get('sf_cache') ? 'on' : 'off', 'compression' => sfConfig::get('sf_compressed') ? 'on' : 'off', 'tokenizer' => function_exists('token_get_all') ? 'on' : 'off', 'eaccelerator' => extension_loaded('eaccelerator') && ini_get('eaccelerator.enable') ? 'on' : 'off', 'apc' => extension_loaded('apc') && ini_get('apc.enabled') ? 'on' : 'off', 'xcache' => extension_loaded('xcache') && ini_get('xcache.cacher') ? 'on' : 'off', 'request' => sfDebug::removeObjects(sfDebug::requestAsArray($context->getRequest())), 'response' => sfDebug::removeObjects(sfDebug::responseAsArray($context->getResponse())), 'user' => sfDebug::removeObjects(sfDebug::userAsArray($context->getUser())), 'settings' => sfDebug::removeObjects(sfDebug::settingsAsArray()), 'globals' => sfDebug::removeObjects(sfDebug::globalsAsArray()), 'php' => sfDebug::removeObjects(sfDebug::phpInfoAsArray()), 'symfony' => sfDebug::removeObjects(sfDebug::symfonyInfoAsArray())); $this->sfFire->dump('Config', $config); }
<?php /* * This file is part of the symfony package. * (c) 2004-2006 Fabien Potencier <*****@*****.**> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ require_once dirname(__FILE__) . '/../../bootstrap/unit.php'; $t = new lime_test(1); // ::removeObjects() $t->diag('::removeObjects()'); $objectArray = array('foo', 42, new sfDebug(), array('bar', 23, new lime_test(null))); $cleanedArray = array('foo', 42, 'sfDebug Object()', array('bar', 23, 'lime_test Object()')); $t->is_deeply(sfDebug::removeObjects($objectArray), $cleanedArray, '::removeObjects() converts objects to String representations using the class name');
public function getCurrentConfigAsArray() { $content = array(); $context = sfContext::getInstance(); $content['request'] = sfDebug::requestAsArray($context->getRequest()); $content['response'] = sfDebug::responseAsArray($context->getResponse()); // $content['user'] = sfDebug::userAsArray($context->getUser()); //not available in symfony 1.0 $content['settings'] = sfDebug::settingsAsArray(); $content['globals'] = sfDebug::globalsAsArray(); $content['php'] = sfDebug::phpInfoAsArray(); // $content['symfony'] = $this->myFormatArrayAsHtml(sfDebug::symfonyInfoAsArray()); not available in symfony 1.0 return $content; }
/** * Gets the stack trace for this exception. */ protected static function outputStackTrace($exception) { if (class_exists('sfContext', false) && sfContext::hasInstance()) { $dispatcher = sfContext::getInstance()->getEventDispatcher(); if (sfConfig::get('sf_logging_enabled')) { $dispatcher->notify(new sfEvent($exception, 'application.log', array($exception->getMessage(), 'priority' => sfLogger::ERR))); } $event = $dispatcher->notifyUntil(new sfEvent($exception, 'application.throw_exception')); if ($event->isProcessed()) { return; } } // send an error 500 if not in debug mode if (!sfConfig::get('sf_debug')) { $files = array(); // first check for app/project specific error page, can only do this if we have a context if (sfConfig::get('sf_app_config_dir')) { $files[] = sfConfig::get('sf_app_config_dir') . '/error_500.php'; } $files[] = sfConfig::get('sf_config_dir') . '/error_500.php'; $files[] = sfConfig::get('sf_web_dir') . '/errors/error500.php'; $files[] = dirname(__FILE__) . '/data/error500.php'; foreach ($files as $file) { if (is_readable($file)) { include $file; return; } } } $message = null !== $exception->getMessage() ? $exception->getMessage() : 'n/a'; $name = get_class($exception); $format = 0 == strncasecmp(PHP_SAPI, 'cli', 3) ? 'plain' : 'html'; $traces = self::getTraces($exception, $format); // dump main objects values $sf_settings = ''; $settingsTable = $requestTable = $responseTable = $globalsTable = $userTable = ''; if (class_exists('sfContext', false) && sfContext::hasInstance()) { $context = sfContext::getInstance(); $settingsTable = self::formatArrayAsHtml(sfDebug::settingsAsArray()); $requestTable = self::formatArrayAsHtml(sfDebug::requestAsArray($context->getRequest())); $responseTable = self::formatArrayAsHtml(sfDebug::responseAsArray($context->getResponse())); $userTable = self::formatArrayAsHtml(sfDebug::userAsArray($context->getUser())); $globalsTable = self::formatArrayAsHtml(sfDebug::globalsAsArray()); } include dirname(__FILE__) . '/data/exception.' . ($format == 'html' ? 'php' : 'txt'); }
/** * Shortens an action's template path. * * @param string $path * * @return string */ protected function shortenTemplatePath($path) { $path = realpath($path); // application module $sep = preg_quote(DIRECTORY_SEPARATOR); if (preg_match('#modules' . $sep . '(\\w+)' . $sep . 'templates' . $sep . '(.*)$#', $path, $match)) { return $match[1] . ' … ' . $match[2]; } return str_replace('SF_ROOT_DIR' . DIRECTORY_SEPARATOR, '', sfDebug::shortenFilePath($path)); }
/** * Returns an array of exception traces. * * @param Exception $exception An Exception implementation instance * @param string $format The trace format (txt or html) * * @return array An array of traces */ protected static function getTraces($exception, $format = 'txt') { $traceData = $exception->getTrace(); array_unshift($traceData, array('function' => '', 'file' => $exception->getFile() != null ? $exception->getFile() : null, 'line' => $exception->getLine() != null ? $exception->getLine() : null, 'args' => array())); $traces = array(); if ($format == 'html') { $lineFormat = 'at <strong>%s%s%s</strong>(%s)<br />in <em>%s</em> line %s <a href="#" onclick="toggle(\'%s\'); return false;">...</a><br /><ul class="code" id="%s" style="display: %s">%s</ul>'; } else { $lineFormat = 'at %s%s%s(%s) in %s line %s'; } for ($i = 0, $count = count($traceData); $i < $count; $i++) { $line = isset($traceData[$i]['line']) ? $traceData[$i]['line'] : null; $file = isset($traceData[$i]['file']) ? $traceData[$i]['file'] : null; $args = isset($traceData[$i]['args']) ? $traceData[$i]['args'] : array(); $traces[] = sprintf($lineFormat, isset($traceData[$i]['class']) ? $traceData[$i]['class'] : '', isset($traceData[$i]['type']) ? $traceData[$i]['type'] : '', $traceData[$i]['function'], self::formatArgs($args, false, $format), self::formatFile($file, $line, $format, null === $file ? 'n/a' : sfDebug::shortenFilePath($file)), null === $line ? 'n/a' : $line, 'trace_' . $i, 'trace_' . $i, $i == 0 ? 'block' : 'none', self::fileExcerpt($file, $line)); } return $traces; }
public function getCurrentConfigAsArray() { $content = array(); $context = sfContext::getInstance(); $content['request'] = sfDebug::requestAsArray($context->getRequest()); $content['response'] = sfDebug::responseAsArray($context->getResponse()); $content['user'] = sfDebug::userAsArray($context->getUser()); $content['settings'] = sfDebug::settingsAsArray(); $content['globals'] = sfDebug::globalsAsArray(); $content['php'] = sfDebug::phpInfoAsArray(); $content['symfony'] = sfDebug::symfonyInfoAsArray(); return $content; }