Book-Chinese-MasterPerlToday

 view release on metacpan or  search on metacpan

lib/Book/Chinese/MasterPerlToday/Catalyst.pod  view on Meta::CPAN

=head3 Session

我们所说的 Session 指的是 L<Catalyst::Plugin::Session>

Session 分为两个部分

=over 4

=item * State

State 一般推荐只有 L<Catalyst::Plugin::Session::State::Cookie>, URI State 不太安全

=item * Store

Store 有很多种,你可以存到 DBI (DBIC) 里也可以存到 Memcached 或 FastMmap

=back

永久登录可以参阅 L<Catalyst::Plugin::Session::DynamicExpiry>, 该模块通过每次都更改 cookie 的 Expire 日期来获得长时间的储存。

坦白说,该 Session 模块并不是很好。因为统一的 API 接口缺陷,你不能通过一个 user_id 来删除该用户的 session 数据。Session 模块的过期数据清理也需要自己做。

但是整体来说,还是做到了应该需要做到的。

最后,我们以 L<Catalyst::Plugin::Session::State::Cookie> + L<Catalyst::Plugin::Session::Store::DBIC> 为例,讲述一点内部知识。

=over 4

=item * sessionid

第一步,我们将在用户调用 $c->session 或 $c->sessionid 或其他的时候,通过 C<get_session_id> 来获得 sessionid

在 State::Cookie 里,get_session_id 仅仅是查询 $c->request->cookies->{$cookie_name};

=item * session

在得到 sessionid 之后,我们将在用户调用 $c->session 或 ->flash 的时候,通过 C<get_session_data> 来获得 session 的数据。同时,我们通过 L<Object::Signature> 来得到 session 数据的一个当前 signature

get_session_data 函数在 L<Catalyst::Plugin::Session::Store::Delegate>, 它将通过 C<session_store_delegate_key_to_accessor> 来调用得到 session("session:$sid"), expires("expires:$sid")

=item * request

上述流程当在调用 $c->session 时发生,如果不调用就不会通过 Store 得到 session 数据。

lib/Book/Chinese/MasterPerlToday/DBIx-Class.pod  view on Meta::CPAN

=back

另一种获取方式是使用

    resultset('Errors')->search( { cond => 'bla' } )->slice(0);

它将使用 LIMIT/OFFSET 直接得到一条数据。

=item * 复杂的 search

建议阅读 L<DBIx::Class::Manual::Cookbook> 和 L<SQL::Abstract>

    resultset('XXX')->search( {
        requestor => 'inna',
        worker => ['nwiger', 'rcwe', 'sfz'],
        status => { '!=', 'completed' }
    } );
    # SQL:
    # FROM xxx WHERE
    #   ( requestor = ? ) AND ( status != ? )
    #   AND ( worker = ? OR worker = ? OR worker = ? )



( run in 0.448 second using v1.01-cache-2.11-cpan-e9199f4ba4c )