标签归档:kohana

Kohana 3.1 cache config bug解决办法

今天用到了kohana 3.1自带的cache并且使用memcache引擎,但是一直发现写不进缓存,开始以为自己的缓存配置有问题查了半天,没有找到解决办法,后来把缓存服务器换成本地实际可用的服务器,还是不能写入,这样就开始怀疑是程序的问题,自己手动写了一个缓存写入的代码

$mem = new Memcache;
$mem->connect("127.0.0.1", 10000);
//Memcache::set方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间。
$mem->set('test1', '123', 0, 60);
//Memcache::add方法的作用和Memcache::set方法类似,区别是如果 Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。
$mem->add('test2', '123', 0, 60);
//Memcache::get方法的作用是获取一个key值,Memcache::get方法有一个参数,表示key。
$mem->get('test'); //输出为'123'
//Memcache::replace 方法的作用是对一个已有的key进行覆写操作,Memcache::replace方法有四个参数,作用和Memcache::set方法的相同。
$mem->replace('test', '456', 0, 60);

发现是可用,就开始查kohana自带的驱动文件,一步一步跟踪后发现,是配置文件的问题,系统没有把app里的config合并到system,google了下,发现也有朋友遇到过这样的问题,把cache.php文件用如下写法即可:

<?php defined('SYSPATH') or die('No direct script access.');
return array
(
    'memcache' => array
    (
        'driver' => 'memcache',
        'default_expire' => 3600,
        'compression' => FALSE, // Use Zlib compression (can cause issues with integers)
        'servers' => array
        (
            'local' => array (
                'host' => 'localhost', // Memcache Server
                'port' => 11211, // Memcache port number
                'persistent' => FALSE, // Persistent connection
                'weight' => 1,
                'timeout' => 1,
                'retry_interval' => 15,
                'status' => TRUE,
            ),
        ),
        'instant_death' => TRUE, // Take server offline immediately on first fail (no retry)
    ),
    'memcachetag' => array
    (
        'driver' => 'memcachetag',
        'default_expire' => 3600,
        'compression' => FALSE, // Use Zlib compression (can cause issues with integers)
        'servers' => array (
            'local' => array(
                'host' => 'localhost', // Memcache Server
                'port' => 11211, // Memcache port number
                'persistent' => FALSE, // Persistent connection
                'weight' => 1,
                'timeout' => 1,
                'retry_interval' => 15,
                'status' => TRUE,
            ),
        ),
        'instant_death' => TRUE,
    ),
    'apc' => array
    (
        'driver' => 'apc',
        'default_expire' => 3600,
    ),
    'wincache' => array
    (
        'driver' => 'wincache',
        'default_expire' => 3600,
    ),
    'sqlite' => array
    (
        'driver' => 'sqlite',
        'default_expire' => 3600,
        'database' => APPPATH . 'cache/kohana-cache.sql3',
        'schema' => 'CREATE TABLE caches(id VARCHAR(127) PRIMARY KEY, tags VARCHAR(255), expiration INTEGER, cache TEXT)',
    ),
    'eaccelerator' => array
    (
        'driver' => 'eaccelerator',
    ),
    'xcache' => array
    (
        'driver' => 'xcache',
        'default_expire' => 3600,
    ),
    'file' => array
    (
        'driver' => 'file',
        'cache_dir' => APPPATH . 'cache',
        'default_expire' => 3600,
    )
);

Kohana3.0与3.1版本ORM的Validation差异

今天用Kohana 3.1版本在开发的过程中发现Model中的验证不能使用,仔细看过代码才发现两版本中的验证方法有了区别

kohana 3.0中的验证如下:

/**
 * 验证规则(在模型中以成员出现)
 * @var array
 */
protected $_rules = array(
    'name' => array(
        'not_empty' => NULL
    ),
    'display' => array(
        'numeric' => NULL
    )
);

使用如下:

$user = ORM::factory('user', 1);
$user->name = 'Joe';
$user->values($_POST);
if ($user->check()) {
    $user->save();
} else {
    $errors = $user->validate()->errors();
}

Kohana 3.1中的验证规则要以方法形式出现,如下:

/**
 * 验证规则
 * @return array
 */
public function rules ()
{
    return array(
        'name' => array(
            array('not_empty'),
            array('min_length', array(':value', 4)),
            array('max_length', array(':value', 5))
        ),
        'password' => array(
            array('not_empty'),
        ),
        'email' => array(
            array('not_empty'),
            array('min_length', array(':value', 4)),
            array('max_length', array(':value', 127)),
            array('email')
        ),
    );
}

在验证的时候也不能直接使用$model->check(),要使用$admin_model->validation()->check()

 

HMVC in Kohana:请求工厂模式及应用举例

在Kohana3.0开始引入了一个很强大的功能就是在请求流程中任意调用其他请求。这种MVC分层结构利于你组织一个复杂的客户端和充分利用面向对象的强大功能。
一个最佳的分层结构:

降低项目之间的依赖性

鼓励重用代码,组件和模块

增加可扩展性,减轻可维护性

在客户端使用HMVC分层结构的用途

模块化界面元素或部件

应用和菜单控制

服务器交互

可重复使用的应用流

HMVC基础

一个很容易理解HMVC的方法是就像AJAX没有额外的服务器调用。例如,你用AJAX的动作显示一个用户列表。你可以在其他控制器重用那个动作,而不是重复写这个方法。
Request Factory

可以通过Kohana的Request::factory()的方法实现HMVC。使用Request factory你可以在认识时间请求过程中随意充分执行一个Kohana request。
Request::factory()方法接受RouteURI作为参数,并可以结合Kohana强大的路由功能你创建的任意应用程序。

在控制器中使用Request Factory

下面的例子为你展示如何在其他控制器使内部使用Request Factory。
虽然不能全部突出HMVC的强大功能,它可以为你展示如何将分开的两个请求布局到一个层。

<?php
class Controller_Static extends Controller
{
    /**
     * The following action loads page.
     * A sub request is called to load a dynamic menu
     */
    public function action_page ()
    {
        $page_name = Request::instance()->param('page');

        $this->request->response =
                View::factory('page/' . $page_name)
                ->bind('menu', $menu);

        $menu = Request::factory('static/menu')->execute()->response;
    }

    public function action_menu ()
    {
        $page_name = Request::instance()->param('page');

        $this->request->response = View::factory('page/menu')
                ->bind('links', $links);

        $links = Kohana::config('menu')->$page_name;
    }
}

在一个视图中使用Request Factory

另一个使用Request Factory的有效方式是从一个视图中调用请求。在下面的例子里我们通过从视图中调用动态菜单和动态页脚代替控制器。

<h1>< ?php echo $page_title ?></h1>

< ?php echo Request::factory('page/menu')->execute()->response ?>

<div id="container">
    < ?php echo $content ?>
</div>

< ?php echo Request::factory('page/menu')->execute()->response ?>

以上使用的是3.0的调用方法。response已经单独封装出去,只能通过方法来调用,不能作为一个成员。 3.1版本后去除了request的单例方法,全部使用工厂方法来调用,request中还做了其他的修改。 这种设计让我想到部分系统里的widget设计,其次目得都很明确,把可重用的业务能够封装起来,保证重用性。尤其是在VIEW里调用的话就成下图: 还有部分系统中widget只是作为一个展示的部件,这个根据不同的系统设计其实都会存在利弊,就看如何来利用了。 不过kohana中的这种机制为widget的设计带来了很多便利;