[TOC]
# 在session中存储数据
session组件提供面向对象的包装器来访问session数据。
使用此组件而不是原生session的原因:
* 您可以轻松地在同一域上的应用程序之间隔离session数据
* 拦截在您的应用程序中设置/获取session数据的位置
* 根据应用程序需要更改session适配器
## 启动Session
某些应用程序是session密集型的,几乎所有执行的操作都需要访问session数据。还有其他人随便访问session数据。感谢服务容器,我们可以确保只在明确需要时访问session:
```php
<?php
use Phalcon\Session\Adapter\Files as Session;
// Start the session the first time when some component request the session service
$di->setShared(
'session',
function () {
$session = new Session();
$session->start();
return $session;
}
);
```
## 工厂
使用`adapter`选项加载会话适配器类
```php
<?php
use Phalcon\Session\Factory;
$options = [
'uniqueId' => 'my-private-app',
'host' => '127.0.0.1',
'port' => 11211,
'persistent' => true,
'lifetime' => 3600,
'prefix' => 'my_',
'adapter' => 'memcache',
];
$session = Factory::load($options);
```
## 在Session中存储/获取数据
从控制器,视图或任何其他继承`Phalcon\Di\Injectable`的组件,您可以访问session服务并存储项目并按以下方式获取它们:
```php
<?php
use Phalcon\Mvc\Controller;
class UserController extends Controller
{
public function indexAction()
{
// Set a session variable
$this->session->set('user-name', 'Michael');
}
public function welcomeAction()
{
// Check if the variable is defined
if ($this->session->has('user-name')) {
// Retrieve its value
$name = $this->session->get('user-name');
}
}
}
```
## 删除/销毁Session
它也可以删除特定变量或销毁整个session:
```php
<?php
use Phalcon\Mvc\Controller;
class UserController extends Controller
{
public function removeAction()
{
// Remove a session variable
$this->session->remove('user-name');
}
public function logoutAction()
{
// Destroy the whole session
$this->session->destroy();
}
}
```
## 隔离应用程序之间的session数据
有时,用户可以在同一session中在同一服务器上使用同一应用程序两次。当然,如果我们在session中使用变量,我们希望每个应用程序都有单独的session数据(即使相同的代码和相同的变量名称)。要解决此问题,您可以为在特定应用程序中创建的每个session变量添加前缀:
```php
<?php
use Phalcon\Session\Adapter\Files as Session;
// Isolating the session data
$di->set(
'session',
function () {
// All variables created will prefixed with 'my-app-1'
$session = new Session(
[
'uniqueId' => 'my-app-1',
]
);
$session->start();
return $session;
}
);
```
不需要添加唯一ID。
## Session Bags
`Phalcon\Session\Bag` 是一个帮助将会话数据分离到`命名空间`的组件。通过这种方式工作,您可以轻松地在应用程序中创建会话变量组。只需在包中设置变量,它就会自动存储在会话中:
```php
<?php
use Phalcon\Session\Bag as SessionBag;
$user = new SessionBag('user');
$user->setDI($di);
$user->name = 'Kimbra Johnson';
$user->age = 22;
```
## 组件中的持久数据
继承 `Phalcon\Di\Injectable` 的控制器,组件和类可以注入`Phalcon\Session\Bag`。此类隔离每个类的变量。多亏了这一点,您可以以独立的方式在每个类中的请求之间保留数据。
```php
<?php
use Phalcon\Mvc\Controller;
class UserController extends Controller
{
public function indexAction()
{
// Create a persistent variable 'name'
$this->persistent->name = 'Laura';
}
public function welcomeAction()
{
if (isset($this->persistent->name)) {
echo 'Welcome, ', $this->persistent->name;
}
}
}
```
在一个组件中:
```php
<?php
use Phalcon\Mvc\User\Component;
class Security extends Component
{
public function auth()
{
// Create a persistent variable 'name'
$this->persistent->name = 'Laura';
}
public function getAuthName()
{
return $this->persistent->name;
}
}
```
添加到会话的数据(`$this->session`)在整个应用程序中都可用,而持久性(`$this->persistent`)只能在当前类的范围内访问。
## 实现自己的适配器
必须实现`Phalcon\Session\AdapterInterface` 接口才能创建自己的会话适配器或扩展现有会话适配器。
[Phalcon Incubator](https://github.com/phalcon/incubator/tree/master/Library/Phalcon/Session/Adapter) 中有更多适用于此组件的适配器
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持