在session中存储数据
最后更新于:2022-04-02 05:15:22
[TOC]
# 在session中存储数据
session组件提供面向对象的包装器来访问session数据。
使用此组件而不是原生session的原因:
* 您可以轻松地在同一域上的应用程序之间隔离session数据
* 拦截在您的应用程序中设置/获取session数据的位置
* 根据应用程序需要更改session适配器
## 启动Session
某些应用程序是session密集型的,几乎所有执行的操作都需要访问session数据。还有其他人随便访问session数据。感谢服务容器,我们可以确保只在明确需要时访问session:
```php
setShared(
'session',
function () {
$session = new Session();
$session->start();
return $session;
}
);
```
## 工厂
使用`adapter`选项加载会话适配器类
```php
'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
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
session->remove('user-name');
}
public function logoutAction()
{
// Destroy the whole session
$this->session->destroy();
}
}
```
## 隔离应用程序之间的session数据
有时,用户可以在同一session中在同一服务器上使用同一应用程序两次。当然,如果我们在session中使用变量,我们希望每个应用程序都有单独的session数据(即使相同的代码和相同的变量名称)。要解决此问题,您可以为在特定应用程序中创建的每个session变量添加前缀:
```php
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
setDI($di);
$user->name = 'Kimbra Johnson';
$user->age = 22;
```
## 组件中的持久数据
继承 `Phalcon\Di\Injectable` 的控制器,组件和类可以注入`Phalcon\Session\Bag`。此类隔离每个类的变量。多亏了这一点,您可以以独立的方式在每个类中的请求之间保留数据。
```php
persistent->name = 'Laura';
}
public function welcomeAction()
{
if (isset($this->persistent->name)) {
echo 'Welcome, ', $this->persistent->name;
}
}
}
```
在一个组件中:
```php
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) 中有更多适用于此组件的适配器
';