我试图在请求之间松散地维护持久数据。显然,数据库是维护数据的最佳方式,但在这种情况下,确切的正确性非常不重要。
我在我的一个控制器中使用静态变量,但似乎每次请求都会重置。 laravel是否会在每次请求时重新加载条款?
示例代码:
class HomeController extends BaseController {
public static $test = 0;
public function getIndex() {
LogHelper::info("TEST: " . HomeController::$test);
HomeController::$test = HomeController::$test + 1;
return View::make('layouts.home.index');
}
}
每次请求时都会记录0。有没有办法在不使用数据库的情况下维护持久变量?
编辑:我需要将变量作为所有用户/会话之间的共享。就像一个点击计数器。
答案 0 :(得分:3)
是的,Laravel不会在请求之间保留变量,您需要使用会话,数据库等手动保存数据。
例如,您可以使用会话保存数据:
session(['data' => $data]);
在下一个请求中获取数据:
$data = session('data');
<强>更新强>
如果您想创建一些不断增加的costants,请使用众多软件包之一将数据保存到配置文件中。 /config/my.php
config:
<?php
return [
'value' => 20,
];
从应用程序的任何部分获取此信息:
$value = config('my.value');
另一种方法是在DB中保存数据。
答案 1 :(得分:1)
HTTP是无状态协议。因此,除非确保此数据持续存在,否则在后续对Web服务器的请求之间不会保留任何数据。
每次请求PHP脚本时,PHP都会负责编译并加载所请求的PHP文件并重新运行它们。全局变量或静态变量中不保留任何数据,必须重新检索以获得所需的数据状态。 编辑(严格来说,编译的PHP文件的字节代码可能会被缓存,这取决于一个人的安装细节。)
在页面访问之间为用户提供一致体验的最常用方法是使用会话。在任何PHP脚本中,您都应该能够使用以下命令启动脚本:
session_start();
然后您可以使用$ _SESSION变量
存储后续页面访问的值$_SESSION['my_var'] = "some value";
在后续页面请求中,您必须再次调用session_start,然后您应该能够检索存储在会话中的值:
session_start(); // gotta call this before setting/getting session values
echo "my_var is " . $_SESSION['my_var'];
会话处理实际上是一个相当精细的过程,涉及生成会话ID,选择存储方法等。有关更多详细信息,请阅读php docs on session handling。
如果您使用的是特定框架(在您的情况下为laravel),您可以确保自定义functions peculiar to that framework,这可以使事情变得更容易。