php - 通过 HTTP 请求实例使用 session 与在 Laravel 中使用全局 session 助手之间的区别

标签 php laravel session laravel-5 dependency-injection

我找不到任何有关两种 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/

相关文章:

php - 将中缀表达式转换为 Elasticsearch 查询

php - Laravel 4 验证被破坏

php - 为什么我的登录表单允许用户使用正确的用户名登录,但密码不正确? (详见)

session - 记录 Tomcat 过期 session 的策略

php - 将项目添加到关联数组

php - 使用 implode 从联接表上的 mysql_query 生成 csv 文件,输出给出重复的字段?

php - Woocommerce 使用产品 SKU 获取产品 ID

wordpress - 是否可以在 View 文件夹之外使用 laravel Blade ?

json - Laravel 4.1 API 分页 - 创建自定义 JSON 响应

java - 在ServletContextListener中访问 session 变量