Ousland
侠客
侠客
  • UID67
  • 粉丝10
  • 关注0
  • 发帖数38
  • 社区居民
  • 阅读:3129
  • 回复:0

第九周作业 2014-09-11 崔景宇

楼主#
更多 发布于:2014-09-11 22:01
学习Yii 或 Larval 框架之一,掌握基本用法,并在框架中找出4个以上设计模式的实际应用。
作业提交内容:实现设计模式的代码位置和使用方法简述。



YII:
首先 下载并 在windows下安装
CLI   yiic下简易部署:
命令 :根目录/framework/yiic webapp 需要创建的应用目录


命令会触发 yiic.bat  关联上yiic.php
等效于
php 根目录/framework/yiic.php webapp 需要创建的应用目录


该命令使用了 设计模式的 命令模式
代码位置 为
/ framework / cli / commands / WebAppCommand.php
public function run($args)
    {
        $vcs=false;
        if(isset($args[1]))
        {
            if($args[1]!='git' && $args[1]!='hg')
                $this->usageError('Unsupported VCS specified. Currently only git and hg supported.');
            $vcs=$args[1];
        }
        if(!isset($args[0]))
            $this->usageError('the Web application location is not specified.');
        $path=strtr($args[0],'/\\',DIRECTORY_SEPARATOR);
        if(strpos($path,DIRECTORY_SEPARATOR)===false)
            $path='.'.DIRECTORY_SEPARATOR.$path;
        if(basename($path)=='..')
            $path.=DIRECTORY_SEPARATOR.'.';
        $dir=rtrim(realpath(dirname($path)),'\\/');
        if($dir===false || !is_dir($dir))
            $this->usageError("The directory '$path' is not valid. Please make sure the parent directory exists.");
        if(basename($path)==='.')
            $this->_rootPath=$path=$dir;
        else
            $this->_rootPath=$path=$dir.DIRECTORY_SEPARATOR.basename($path);
        if($this->confirm("Create a Web application under '$path'?"))
        {
            $sourceDir=$this->getSourceDir();
            if($sourceDir===false)
                die("\nUnable to locate the source directory.\n");
            $ignoreFiles=array();
            $renameMap=array();
            switch($vcs)
            {
                case 'git':
                    $renameMap=array('git-gitignore'=>'.gitignore','git-gitkeep'=>'.gitkeep'); // move with rename git files
                    $ignoreFiles=array('hg-hgignore','hg-hgkeep'); // ignore only hg files
                    break;
                case 'hg':
                    $renameMap=array('hg-hgignore'=>'.hgignore','hg-hgkeep'=>'.hgkeep'); // move with rename hg files
                    $ignoreFiles=array('git-gitignore','git-gitkeep'); // ignore only git files
                    break;
                default:
                    // no files for renaming
                    $ignoreFiles=array('git-gitignore','git-gitkeep','hg-hgignore','hg-hgkeep'); // ignore both git and hg files
                    break;
            }
            $list=$this->buildFileList($sourceDir,$path,'',$ignoreFiles,$renameMap);
            $this->addFileModificationCallbacks($list);
            $this->copyFiles($list);
            $this->setPermissions($path);
            echo "\nYour application has been created successfully under {$path}.\n";
        }
    }

其继承与抽象类 / framework / console / CConsoleCommand.php;


同时该抽象类的 构造方法类 使用了观察者模式


public function __construct($name,$runner)
    {
        $this->_name=$name;
        $this->_runner=$runner;
        $this->attachBehaviors($this->behaviors());
    }


具体方法在其父类的  / framework / base /CComponent.php
public function attachBehaviors($behaviors)
{
    foreach($behaviors as $name=>$behavior)
        $this->attachBehavior($name,$behavior);
}



 }
public function attachBehavior($name,$behavior)
    {
        if(!($behavior instanceof IBehavior))
            $behavior=Yii::createComponent($behavior);
        $behavior->setEnabled(true);
        $behavior->attach($this);
        return $this->_m[$name]=$behavior;
    }







其中 Yii::createComponent() 应该是一个工厂模式
/ framework / YiiBase.php

public static function createComponent($config)
    {
        if(is_string($config))
        {
            $type=$config;
            $config=array();
        }
        elseif(isset($config['class']))
        {
            $type=$config['class'];
            unset($config['class']);
        }
        else
            throw new CException(Yii::t('yii','Object configuration must be an array containing a "class" element.'));
  
        if(!class_exists($type,false))
            $type=Yii::import($type,true);
  
        if(($n=func_num_args())>1)
        {
            $args=func_get_args();
            if($n===2)
                $object=new $type($args[1]);
            elseif($n===3)
                $object=new $type($args[1],$args[2]);
            elseif($n===4)
                $object=new $type($args[1],$args[2],$args[3]);
            else
            {
                unset($args[0]);
                $class=new ReflectionClass($type);
                // Note: ReflectionClass::newInstanceArgs() is available for PHP 5.1.3+
                // $object=$class->newInstanceArgs($args);
                $object=call_user_func_array(array($class,'newInstance'),$args);
            }
        }
        else
            $object=new $type;
  
        foreach($config as $key=>$value)
            $object->$key=$value;
  
        return $object;
    }



此处先找到这里. 能牵扯出太多模式了.

使用命令创建一个应用/framework/yiic webapp /test
运行在test下的.index.php里
require_once($yii);
Yii::createWebApplication($config)->run();
Yii::app();
app()方法应该是单例模式吧?/ framework / YiiBase.php
public static function app()
    {
        return self::$_app;
    }


创建一个动作 并使用mysql做一次简单的查询:
1:配置mysql
test/protected/config/main.php
'db'=>array(
    'connectionString' => 'mysql:host=localhost;dbname=demo',
    'emulatePrepare' => true,
    'username' => 'root',
    'password' => 'admin',
    'charset' => 'utf8',
),
2:创建一个控制器,并加一个动作
test/controllers/testController.php

public function actionDemo() {
//这里应该是 设计模式 的 链式模式
    $user = Yii::app()->db->createCommand() 
        ->select('id, username, email') 
        ->from('tbl_user') 
        ->where('id=:id', array(':id'=>1)) 
        ->queryRow();
    var_dump( $user ); 
    echo "sadasdad";
 
}
根据我当前的路由模式 访问

http://localhost/yii/demos/test/index.php?r=test/demo;
喜欢0

返回顶部