ZendFramework 2 下安装zfc-user 、zfc-user-doctrine-orm、BjyAuthorize

简介:
zfc是ZendFramework 2 标准模块外提供的公共库,即 Zend Framework Common,包含了一些常用的功能块,例如 user、rabc 等功能。
zfc-user:zfc中的用户功能,提供了基于数据库的用户鉴权、用户登录、注销等基本的功能。
zfc-user-doctrine-orm:为 zfc-user 提供 doctrine orm 模式的模块,能够使用户功能通过指定的用户实体(Entity)进行持久化存储。
BjyAuthorize :为 zfc-user 提供基于角色-用户(Role-User)的用户、权限管理模块,支持指定  doctrine orm 的用户、角色实体(Entity)。开发者可以指定和扩展自己的 User 、Role 类。

一、安装zfc-user-doctrine-orm 、bjy-authorize模块

1、安装这两个模块前必须安装并配置好 Doctrine ORM,具体步骤参考:ZendFramework 2 下安装和配置 Doctrine 2 的步骤

2、安装模块库

zfc-user-doctrine-orm

php composer.phar require zf-commons/zfc-user-doctrine-orm 

bjy-authorize

php composer.phar require bjyoungblood/bjy-authorize:1.4.* 

(注:如果已经配置好全局使用composer,注意更改前段的命令)

二、配置模块

修改:config/application/application.config.php, 像下面这样:

'modules' => array(
    'DoctrineModule',
    'DoctrineORMModule',
    'ZfcBase',
    'ZfcUser',
    'ZfcUserDoctrineORM',,
    'BjyAuthorize',
    'Application',
),

三、配置数据库

有两种方法,推荐第二种:

第一种:在MySql中执行以下SQL:

(原文件链接: ZfcUser SQL schema )

SQL:

CREATE TABLE `user`
(
    `user_id`       INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `username`      VARCHAR(255) DEFAULT NULL UNIQUE,
    `email`         VARCHAR(255) DEFAULT NULL UNIQUE,
    `display_name`  VARCHAR(50) DEFAULT NULL,
    `password`      VARCHAR(128) NOT NULL,
    `state`         SMALLINT UNSIGNED
) ENGINE=InnoDB CHARSET="utf8";

第二种:使用 doctrine-module 来配置:

1、尝试输出 SQL

vendor/bin/doctrine-module orm:schema-tool:update --dump-sql 

如果是在win系统

vendorbindoctrine-module.bat orm:schema-tool:update --dump-sql 

提示:如果你希望使用不同的表结构或者用户实体,你可以在 zfcuser 的config 文件 中设置参数 enable_default_entities(后文会有提到) 。

2、执行 ORM 数据库同步

如果上一条命令能够正确的输出数据库SQL命令,那么久表示设置好了,执行下面的命令同步数据库:

vendor/bin/doctrine-module orm:schema-tool:update --force 

如果是在win系统

vendorbindoctrine-module.bat orm:schema-tool:update --force 

你现在可以使用路由 /user 路由来访问zfc-user模块了

四、配置 BjyAuthorize
1、复制 BjyAuthorize 模块目录 data 下的文件 User.php.dist, Role.php.dist 到你自己的模块的 Entity 目录下。并分别更名为 User.php, Role.php。
修改文件 User.php、Role.php 的命名空间 namespace 你的模块名Entity
修改 User.php 文件中的 Role 字段的注释 targetEntity=”你的模块名EntityRole”
修改 Role.php 文件中的 parent字段的注释 targetEntity=”你的模块名EntityRole”,

2、在你自己的模块配置文件添加以下配置:

 /* 部署 BjyAuthorize */
    'doctrine' => array(
        'driver' => array(
            // overriding zfc-user-doctrine-orm's config
            'zfcuser_entity' => array(
                'class' => 'DoctrineORMMappingDriverAnnotationDriver',
                'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity',
                ),
            ),

            'orm_default' => array(
                'drivers' => array(
                     __NAMESPACE__ . 'Entity' => 'zfcuser_entity'
                ),
            ),
        ),
    ),

    'zfcuser' => array(
        // telling ZfcUser to use our own class
        'user_entity_class'       => __NAMESPACE__.'EntityUser',
        // telling ZfcUserDoctrineORM to skip the entities it defines
        'enable_default_entities' => false,
    ),

    'bjyauthorize' => array(
        // Using the authentication identity provider, which basically reads the roles from the auth service's identity
        'identity_provider' => 'BjyAuthorizeProviderIdentityAuthenticationIdentityProvider',

        'role_providers'        => array(
            // using an object repository (entity repository) to load all roles into our ACL
            'BjyAuthorizeProviderRoleObjectRepositoryProvider' => array(
                'object_manager'    => 'doctrine.entitymanager.orm_default',
                'role_entity_class' => __NAMESPACE__.'EntityRole',
            ),
        ),
    )

3、同步数据库

vendor/bin/doctrine-module orm:schema-tool:update --force 

4、添加角色数据到数据库(根据需要修改)

INSERT INTO `role`
    (`id`, `parent_id`, `roleId`)
VALUES
    (1, NULL, 'guest'),
    (2, 1, 'user'),
    (3, 2, 'moderator'),
    (4, 3, 'administrator');

五、使用路由 /user 访问网站
注册和使用用户
如果需要调整用户的角色,需要手工调整数据表 user_role_linker

ZendFramework 2 下安装和配置 Doctrine 2 的步骤

一、确保 composer 正常

要确保 composer 能够正常的使用,如果因为GFW原因,可以尝试修改composer.json ,使用国内的镜像:


"repositories": [
{"type": "composer", "url": "http://packagist.phpcomposer.com"},
{"packagist": false}

二、添加模块依赖
直接上 composer 代码,以下配置内容加上了 zend-developer-tools、zftool、bj-profiler的模块依赖,这些模块配置很简单,官网上面都有,照着做就可以了。如果不需要,可以删除。


{
    "name": "Your project name",
    "description": "Your project description",
    "license": "BSD-3-Clause",
    "keywords": [
        ""
    ],
    "homepage": "Your project homepage",
    "require": {
        "php": ">=5.5",
        "zendframework/zendframework": "~2.5",
        "zendframework/zend-developer-tools": "dev-master",
        "zendframework/zftool": "dev-master",
        "bjyoungblood/bjy-profiler": "dev-master",
        "doctrine/doctrine-orm-module": "^0.9.1"
    },
    "repositories": [
        {"type": "composer", "url": "http://packagist.phpcomposer.com"},
        {"packagist": false}
    ]
}

三、修改 local.php 配置文件
如果没有local.php,就创建一个


$dbParams = array(
    'dbname' => 'dbname',
    'dbuser' => 'dbuser',
    'dbpass' => 'dbpass',
    'dbhost' => 'dbhost',
    'dbport' => 'dbport',
    // buffer_results - only for mysqli buffered queries, skip for others
    'options' => array(
        'buffer_results' => true
    )
);

return array(
    'dbParams'=>$dbParams,
    'doctrine' => array(
        'connection' => array(
            'orm_default' => array(
                'driverClass' => 'DoctrineDBALDriverPDOMySqlDriver',
                'params' => array(
                    'host' => $dbParams['dbhost'],
                    'port' => $dbParams['dbport'],
                    'user' => $dbParams['dbuser'],
                    'password' => $dbParams['dbpass'],
                    'dbname' => $dbParams['dbname'],
                    'charset' => 'UTF8'
                )
            )
        )
    )
);

四、修改模块配置文件
修改需要使用 Doctrine 的模块目录下的 config 子目录的配置文件 module.config.php,添加配置内容如下:

return array(
    /** 其他配置内容 **/
    /**
        * 部署 Doctrine
    */
    'doctrine' => array(
		'driver' => array(
		  __NAMESPACE__ . '_driver' => array(
			'class' => 'DoctrineORMMappingDriverAnnotationDriver',
			'cache' => 'array',
			'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity',  // Define path of entities
			)
		  ),
		  'orm_default' => array(
			'drivers' => array(
			  __NAMESPACE__ . 'Entity' => __NAMESPACE__ . '_driver'  // Define namespace of entities
			)
		  )
		)
	)
);

上述配置指定了该模块的 雷竞技苹果下载地址 Entty 目录在模块目录下的 src/模块名称/Entity 目录下

Dortrine 2 命令行常用命令说明

使用前提是系统的php命令行模式可以正常使用,在项目目录下运行下面的命令

在 *nux 系统下
检查 vendor/bin/doctrine-module orm:validate-schema
创建 vendor/bin/doctrine-module orm:schema-tool:create
更新 vendor/bin/doctrine-module orm:schema-tool:update –force –dump-sql
强制 vendor/bin/doctrine-module orm:schema-tool:update –force –dump-sql

在 win 系统下
检查 .vendorbindoctrine-module.bat orm:validate-schema
创建 .vendorbindoctrine-module.bat orm:schema-tool:create
更新 .vendorbindoctrine-module.bat orm:schema-tool:update –force –dump-sql
强制 .vendorbindoctrine-module.bat orm:schema-tool:update –force –dump-sql

zend framework2 + Doctrine 中文乱码问题

终于成功在项目中安装 Doctrine 了,不过,却发现用 Doctrine 入库的中文都是乱码,虽然用 Doctrine 再次取出恢复正常,但是中感觉缺点什么。
检查数据表、文件都已经是 UTF8了,唯一可能出现问题的就是 Doctrine 连接的问题,找到 DoctrineDBALDriverPDOMySqlDriver 源代码(这是类路径,要搜索一下),发现:

    /**
     * Constructs the MySql PDO DSN.
     *
     * @param array $params
     *
     * @return string The DSN.
     */
    protected function constructPdoDsn(array $params)
    {
        $dsn = 'mysql:';
        if (isset($params['host']) && $params['host'] != '') {
            $dsn .= 'host=' . $params['host'] . ';';
        }
        if (isset($params['port'])) {
            $dsn .= 'port=' . $params['port'] . ';';
        }
        if (isset($params['dbname'])) {
            $dsn .= 'dbname=' . $params['dbname'] . ';';
        }
        if (isset($params['unix_socket'])) {
            $dsn .= 'unix_socket=' . $params['unix_socket'] . ';';
        }
        if (isset($params['charset'])) {
            $dsn .= 'charset=' . $params['charset'] . ';';
        }

        return $dsn;
    }

关键是:

$dsn .= 'charset=' . $params['charset'] . ';';

于是,到文件 doctrine.local.php 添加内容为:

<?php
return array(
    'doctrine' => array(
        'connection' => array(
            'orm_default' => array(
                'driverClass' => 'DoctrineDBALDriverPDOMySqlDriver',
                'params' => array(
                    'host' => 'localhost',
                    'port' => '',
                    'user' => 'yourusername',
                    'password' => 'yourpassword',
                    'dbname' => 'yourdbname',
                    'charset' => 'UTF8'
                )
            )
        )
    )
);

问题解决

解决 ZendFramework2 Doctrine 出现 MySql 不支持 enum 类型问题的方法

最近项目用 zendFramework 2 + Doctrine,composer 安装完毕后使用 vendor/bin/doctrine-module orm:validate-schema
命令出现以下错误:

  [DoctrineDBALDBALException]
  Unknown database type enum requested, DoctrineDBALPlatformsMySqlPlatform may not support i
  t.

网上找了很多都是解决在 Symfony 下的,没有发现在 zf2下如何解决,红杏(fanqiang)后终于找到一老外找到了解决办法:
在 Application 模块(默认模块)的 Module.php 文件添加以下内容:

class Module {
        public function onBootstrap(MvcEvent $e) {

......

        $em = $e->getApplication()->getServiceManager()->get('DoctrineORMEntityManager');
        $dbPlatform = $em->getConnection()->getDatabasePlatform();
        $dbPlatform->registerDoctrineTypeMapping('enum', 'string');


.....

}
}

原帖地址:http://foobar.lu/wp/2013/01/24/getting-enum-datatype-to-work-with-doctrine-2-in-zend-framework-2/

在unity3d中回调android的activity

在unity3d中返回android的原生activity,按照网上的许多教程,互相调用方法基本都没什么问题了,但是在返回android的原生activity的时候,整个程序都会关闭,最后在 manifest 配置文件中加入线程名解决。先罗列代码:
第一步在unity3d 的c#中回调外壳activity的方法:

public void onBackClick(){
    AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    jo.Call("back","返回android");
}

第二部在外壳activiti中处理(我是新建了一个继承UnityPlayerNativeActivity的类)


public class WeivaUPNActivity extends UnityPlayerNativeActivity {

    public void back(String arg){
        Intent intent = new Intent();
        intent.setClass(WeivaUPNActivity.this, LoginOkActivity.class);
        startActivity(intent);
        WeivaUPNActivity.this.finish();

    }
}

视乎看起来没什么问题,但是UnityPlayer 被finish()后会把整个程序给exit,导致无法返回 LoginOkActivity 。如果不对UnityPlayer进行finish,可以返回LoginOkActivity,但是这程序无法退出,因为在退出的时候又会再次打开UnityPlayer。
谷歌了很多帖子,视乎很复杂,也考虑过回调时不finishi,而是把WeivaUPNActivity实例静态化后,在退出时在静态退出,但是感觉很麻烦。最后在一片老外的帖子发现一条线索,可以在manifest配置文件中设置不同的进程名,从而避免UnityPlayer finish时关闭整个程序:

            <activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:name="com.weiva.WeivaUPNActivity"<font color="#ff0000"> android:process=":Unity3D"</font>>
              <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
              <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" />
            </activity>

原帖地址:http://answers.unity3d.com/questions/587979/how-do-i-stop-munityplayerquit-closing-the-entire.html

zend framework 2 学习笔记:定义自己的日志,记录到数据库中

需求:定制自己的日志系统,本例假定指定存储到Mysql数据库当中。

通常的web我们可以 echo,或者IDE的debuger调试程序,但是有些特殊情况,例如php与android、unity3d等前端通讯时,传统方式并不方便,所以,需要把日志输出到其他地方便于查看。
* zf2中可以通过指定不同的 Zend/Log/Writer 来使用不同的日志记录方式。

下面开始动手了
为了便于在系统中重复使用,我将Logger放到 App 的 Service 中,以后只要在需要的时候,从 Service 中取出就可以用,如果完全没使用,也不会对速度有影响。

在文件 module/Application/Module.php 中:
头部引用包:

use ZendLogLogger;
use ZendLogWriterDb as WriterDb;

在 Module 类中,加入自定义 Service:

public function getServiceConfig(){
        return array(
            'factories'=>array(
                'WLogger' => function($sm){
                    $dbAdapter = $sm->get ( 'ZendDbAdapterAdapter' ); //需要指定你自己的数据库适配器
                    //对接数据表字段
                    $mapping = array(
                        'timestamp' => 'time',
                        'priority'  => 'type',
                        'message'   => 'message'
                    );
                    $writer = new WriterDb($dbAdapter, 'log_table', $mapping); // log_table 是你自己的日志数据表
                    //$writer = new ZendLogWriterDb($dbAdapter, 'log_table', $mapping); //这样会报错
                    $logger = new Logger();
                    $logger->addWriter($writer);
                    return $logger;
                }
            )
        );
    }

添加日志表到你的数据库中:

--
-- 表的结构 `log_table`
--

CREATE TABLE IF NOT EXISTS `log_table` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `type` varchar(255) DEFAULT NULL,
  `message` text,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='日志库' AUTO_INCREMENT=1 ;

如何使用?:

$logger = $this->getServiceLocator()->get('WLogger');
$logger->info('记录一条日志');

JQuery取得标签的 src 的相对路径和绝对路径

今天遇上一个怪异的问题,本来想通过JQuery改变图片地址的,但是老是取得Dom处理后的绝对路径地址,不利于处理,研究了半天,终于知道怎么处理了:

 $("img").each(function(i){
 alert("1:" + $(this).attr("src"));  //这种方式可以取得 html 中的 src 属性
 alert("2:" + this.src);                 //这种方式取得的是经过 Dom 补完的绝对路径
 });

可恶的Dom