通过HTTP请求实例使用会话与使用Laravel中的全局会话帮助程序之间的区别

Use*_*456 8 php session dependency-injection laravel laravel-5

我找不到任何与两种类型的会话访问方法相关的信息. $request->session()来自HTTP请求实例和session()Laravel 5.3中的会话助手.是否有任何差异或何时使用?

使用PHP单元时如何向get controller方法发送get请求

public function testMyMethod(Request $request){
$userExist = $request->session()->exists('user_id');
}
Run Code Online (Sandbox Code Playgroud)

ale*_*ino 8

服务容器是Laravel架构的核心.所有服务,组件和依赖项都在那里注册,您可以在需要时随时提出要求.

但是Laravel提供了不止一种"要求它"的方法.你有全局辅助函数,你有外观,你有方法签名中的组件实例的"正确","更纯"的注入.我认为Laravel哲学的一个重要部分是干净,简单,直观的API.在这种情况下,可以根据您的个人喜好来定义"清洁和简单"的内容,并且根据定义,您的风格与您的风格无关.

我知道在PHP社区中有关于哪种方法"最好",外观一直存在争议的激烈辩论,传统的依赖注入OOP纯粹主义者说唯一正确的方法可能是用控制器方法签名注入对象......

最后,这些方法中的任何一种都只是从同一个服务容器包中抓取对象.它在性能方面没有区别(我打赌两个间接函数调用不会达到你的性能)或其他方面.所以,更好地使用适合自己风格的东西.如果我在一个典型的控制器中,我个人会进行"正确"的注入,但是如果它在其上下文中创建更清晰,更易读的代码,我可能会使用全局帮助器.

<?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!';
    }    
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你可以看到你有超过2个选项:)

当然,这不仅适用于会话,获取请求数据,获取数据库连接等等也是如此.

(另外,我认为你还没有5.3中的实时外观)


ker*_*rin 6

  1. Laravel 文档

根据 Laravel 文档 - https://laravel.com/docs/5.3/session - “通过 HTTP 请求实例使用会话与使用全局会话助手之间几乎没有实际区别”,并且两者都是可测试的。

->assertSessionHas($key, $value = null);

会话 - Laravel 文档

  1. Laravel 启动和运行 - Matt Stauffer

在他的书中(第 320 页),Matt 讨论了可用于访问会话信息的不同方式:

  • 使用Session门面

    session()->get('user_id');

  • session()在任何给定的 IlluminateRequest对象上使用该方法

    Route::get('dashboard', function(Request $request) { $request->session()->get('user_id'); });

  • 注入一个实例Illuminate\Session\Store

    Route::get('dashboard', function(Illuminate\Session\Store $session) { return $session->get('user_id'); });

  • 使用全局session()帮助器

    $value = session()->get('key); $value = session('key);

他的最后评论是:如果您是 Laravel 新手并且不确定使用哪个,我建议使用 global helper

因此,我不会担心差异,只选择适合您的方式。如果您对这两种方式都没有偏好,请选择 Matt Stauffer 的建议。