我找不到任何有关两种 session 访问方法的信息。
$request->session()
来自 HTTP 请求实例,session()
来自 Laravel 5.3 中的 session 助手。
有什么区别或什么时候使用哪个?
如何在使用 P.H.P 单元时向下面的 Controller 方法发送获取请求
public function testMyMethod(Request $request){
$userExist = $request->session()->exists('user_id');
}
最佳答案
Service Container是 Laravel 架构的核心。所有服务、组件和依赖项都在那里注册,您可以在需要时随时请求它们中的任何一个。
但是 Laravel 提供了不止一种方式来“请求它”。你有全局辅助函数,你有外观,你在方法签名中有组件实例的“正确”、“更纯粹”的注入(inject)。我认为 Laravel 理念的很大一部分是干净、简单、直观的 API。在这种情况下,可以根据您的个人喜好来定义什么是“干净简单”,以及根据定义,任何与您的风格相匹配的东西,对您来说都是直观的。
我知道 PHP 社区一直在激烈争论哪种方法是“最好的”,facades 一直存在争议,传统的依赖注入(inject) OOP 纯粹主义者说唯一正确的方法可能是用 Controller 方法签名注入(inject)对象。 .
最后,这些各种方法中的任何一个都只是从同一个服务容器包中抓取对象。它在性能方面没有区别(我打赌两个间接函数调用不会影响你的性能)或其他方面。所以,使用更适合你风格的东西。如果我在一个典型的 Controller 中,我个人会进行“适当的”注入(inject),但如果它在其上下文中生成更清晰、更具可读性的代码,我可能会使用全局助手。
<?php
namespace App\Http\Controllers;
use Illuminate\Contracts\Session\Session;
use Facades\Illuminate\Contracts\Session\Session as SessionRealTimeFacade;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Request as RequestFacade;
use Illuminate\Support\Facades\Session as SessionFacade;
use PHPUnit\Framework\Assert;
class TestController extends Controller
{
public function sessionTest(Request $request, Session $session)
{
$options = [
$request->session()->get('_token'),
session()->get('_token'),
session('_token'),
$session->get('_token'),
SessionFacade::get('_token'),
SessionRealTimeFacade::get('_token'),
app('session')->get('_token'),
];
array_reduce(
$options,
function ($one, $other) {
Assert::assertEquals($one, $other);
return $other;
},
array_shift($options)
);
return 'All tests passed!';
}
}
顺便说一下,正如您所看到的,您不仅有 2 个选项:)
当然,这不仅仅适用于 session ,获取请求数据、获取数据库连接等也是如此。
(此外,我认为您在 5.3 中还没有实时门面)
关于php - 通过 HTTP 请求实例使用 session 与在 Laravel 中使用全局 session 助手之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42547684/