Subversion Repositories SmartDukaan

Rev

Blame | Last modification | View Log | RSS feed

<?php
/**
 * built-in Server Shell
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 *
 * Licensed under The MIT License
 * For full copyright and license information, please see the LICENSE.txt
 * Redistributions of files must retain the above copyright notice.
 *
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
 * @link          http://cakephp.org CakePHP(tm) Project
 * @since         CakePHP(tm) v 2.3.0
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
 */

App::uses('AppShell', 'Console/Command');

/**
 * built-in Server Shell
 *
 * @package       Cake.Console.Command
 */
class ServerShell extends AppShell {

/**
 * Default ServerHost
 */
        const DEFAULT_HOST = 'localhost';

/**
 * Default ListenPort
 */
        const DEFAULT_PORT = 80;

/**
 * server host
 *
 * @var string
 */
        protected $_host = null;

/**
 * listen port
 *
 * @var string
 */
        protected $_port = null;

/**
 * document root
 *
 * @var string
 */
        protected $_documentRoot = null;

/**
 * Override initialize of the Shell
 *
 * @return void
 */
        public function initialize() {
                $this->_host = self::DEFAULT_HOST;
                $this->_port = self::DEFAULT_PORT;
                $this->_documentRoot = WWW_ROOT;
        }

/**
 * Starts up the Shell and displays the welcome message.
 * Allows for checking and configuring prior to command or main execution
 *
 * Override this method if you want to remove the welcome information,
 * or otherwise modify the pre-command flow.
 *
 * @return void
 * @link http://book.cakephp.org/2.0/en/console-and-shells.html#Shell::startup
 */
        public function startup() {
                if (!empty($this->params['host'])) {
                        $this->_host = $this->params['host'];
                }
                if (!empty($this->params['port'])) {
                        $this->_port = $this->params['port'];
                }
                if (!empty($this->params['document_root'])) {
                        $this->_documentRoot = $this->params['document_root'];
                }

                // for windows
                if (substr($this->_documentRoot, -1, 1) == DIRECTORY_SEPARATOR) {
                        $this->_documentRoot = substr($this->_documentRoot, 0, strlen($this->_documentRoot) - 1);
                }
                if (preg_match("/^([a-z]:)[\\\]+(.+)$/i", $this->_documentRoot, $m)) {
                        $this->_documentRoot = $m[1] . '\\' . $m[2];
                }

                parent::startup();
        }

/**
 * Displays a header for the shell
 *
 * @return void
 */
        protected function _welcome() {
                $this->out();
                $this->out(__d('cake_console', '<info>Welcome to CakePHP %s Console</info>', 'v' . Configure::version()));
                $this->hr();
                $this->out(__d('cake_console', 'App : %s', APP_DIR));
                $this->out(__d('cake_console', 'Path: %s', APP));
                $this->out(__d('cake_console', 'DocumentRoot: %s', $this->_documentRoot));
                $this->hr();
        }

/**
 * Override main() to handle action
 *
 * @return void
 */
        public function main() {
                if (version_compare(PHP_VERSION, '5.4.0') < 0) {
                        $this->out(__d('cake_console', '<warning>This command is available on %s or above</warning>', 'PHP5.4'));
                        return;
                }

                $command = sprintf("php -S %s:%d -t %s %s",
                        $this->_host,
                        $this->_port,
                        escapeshellarg($this->_documentRoot),
                        escapeshellarg($this->_documentRoot . '/index.php')
                );

                $port = ($this->_port == self::DEFAULT_PORT) ? '' : ':' . $this->_port;
                $this->out(__d('cake_console', 'built-in server is running in http://%s%s/', $this->_host, $port));
                system($command);
        }

/**
 * Get and configure the optionparser.
 *
 * @return ConsoleOptionParser
 */
        public function getOptionParser() {
                $parser = parent::getOptionParser();

                $parser->addOption('host', array(
                        'short' => 'H',
                        'help' => __d('cake_console', 'ServerHost')
                ));
                $parser->addOption('port', array(
                        'short' => 'p',
                        'help' => __d('cake_console', 'ListenPort')
                ));
                $parser->addOption('document_root', array(
                        'short' => 'd',
                        'help' => __d('cake_console', 'DocumentRoot')
                ));

                $parser->description(array(
                        __d('cake_console', 'PHP Built-in Server for CakePHP'),
                        __d('cake_console', '<warning>[WARN] Don\'t use this at the production environment</warning>'),
                ));

                return $parser;
        }
}