Php 我应该使用Laravel中间件吗?

Php 我应该使用Laravel中间件吗?,php,laravel,laravel-5,middleware,Php,Laravel,Laravel 5,Middleware,我有一个Laravel应用程序,它需要一些配置变量,我的大多数控制器都需要使用这些变量。 因此,现在似乎是使用中间件的最佳时机。 这是中间件的正确用法吗?如果是这样,一旦中间件获得配置变量,最好的做法是将它们添加到请求对象中,以便我的控制器可以访问它们吗? 感谢所有的响应者。 J在IMO中,中间件用于预处理请求、限制用户访问以及其他与安全相关的功能 我只需在主控制器类中加载配置,并在扩展控制器中使用它 例如: 基本控制器 用户控制器 当然不是 实际上(根据您所写的),最好的方法是创建一个应用程序

我有一个Laravel应用程序,它需要一些配置变量,我的大多数控制器都需要使用这些变量。 因此,现在似乎是使用中间件的最佳时机。 这是中间件的正确用法吗?如果是这样,一旦中间件获得配置变量,最好的做法是将它们添加到请求对象中,以便我的控制器可以访问它们吗? 感谢所有的响应者。
J

在IMO中,中间件用于预处理请求、限制用户访问以及其他与安全相关的功能

我只需在主控制器类中加载配置,并在扩展控制器中使用它

例如:

基本控制器

用户控制器

当然不是

实际上(根据您所写的),最好的方法是创建一个应用程序服务,并在服务容器-
App\Providers\AppServiceProvider
(在
App/Providers/AppServiceProvider.php
中)上注册此服务

大概是这样的:

<?php
# The Config Service:

namespace App\Services;

/**
 * Config Manager
 */
class Config
{
    /** @var SomeDependency */
    protected $dependency;

    public function __construct(SomeDependency $dependency)
    {
        $this->dependency = $dependency;
    }

    public function getVar($var)
    {
        // ...
    }
}
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class MyController extends Controller
{
    public function index(Request $request)
    {
        app('config_service')->getVar('key');
        //...
    }
}

配置变量是静态的还是动态的。一旦在中间件中定义了配置变量,它们就是静态的。您可以添加更多关于变量使用时间、持续时间等的信息吗?您可以使用中间件设置配置变量。它不必用于限制访问。它可以用于对多个路由进行分组,并向它们公开某些值,同时将这些配置值限制为其他路由。您可以随意设置这些变量。以你想要的方式使用它没有错。谢谢你的回复。我想我真的在想什么时候该用哪种方法。i、 e.使用中间件、基本控制器或felipsmartins建议的服务提供商是最佳实践吗。(我真的很难确定何时使用服务提供商!)中间件可以在请求到达控制器之前检查条件。它们用于预处理和后处理。它与安全无关,与条件相关(一个条件可以是“用户必须经过身份验证”)。它可以用于设置变量和请求到达控制器之前所需的所有内容。此评论旨在强调您关于中间件用于安全的说法是不正确的。非常感谢Carlos,这很有意义,因此基本上只需使用中间件进行筛选,并将我的大多数联系人可能需要的逻辑放入即可基本控制器中的滚轮。这在我脑海中很好:)虽然我看到N.B不同意。那么N.B.你能把我的要求添加为中间软件吗?依你看,这应该是一条路。如果你必须处理一些事情,中间软件是一条路。但是,在这种情况下,似乎你不需要这样做。谢谢felipsmartins,其他人同意吗这不是使用服务提供商的好时机吗?@jon实际上,不需要创建服务提供商,只需要创建一个类,然后将其注册为容器中的应用程序服务。这很简单,也是一个很好的方法。谢谢这两个方面,这是我真正感到困惑的地方,这是使用中间件(一种服务)的最佳实践ice提供程序,或者简单地将逻辑添加到控制器。实际上,服务提供程序是使服务全局可访问的一种方法?或者我是否遗漏了什么?是的,使用此解决方案,提供程序将在应用程序上下文中可访问。由您决定哪个解决方案更适合您:在应用程序上下文中访问还是在控制中访问奥勒context@jon只需考虑HTTP过滤器等用于持续请求的中间件。服务只是通过应用程序上下文在多个位置重用的简单类/对象(即:Mailer服务)。关于控制器逻辑,请注意,在这种情况下,您不会在另一个控制器内重用逻辑或过程。
<?php
# The Config Service:

namespace App\Services;

/**
 * Config Manager
 */
class Config
{
    /** @var SomeDependency */
    protected $dependency;

    public function __construct(SomeDependency $dependency)
    {
        $this->dependency = $dependency;
    }

    public function getVar($var)
    {
        // ...
    }
}
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    //...

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {

        $this->registerConfigManager();

    }

    public function registerConfigManager()
    {
        $this->app->singleton('config_service', function ($app) {
            return new \App\Services\Config(new \SomeNamespace\SomeDependency);
        });
    }

    //...
}
<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class MyController extends Controller
{
    public function index(Request $request)
    {
        app('config_service')->getVar('key');
        //...
    }
}