【问题标题】:Laravel ServiceProvider vs. MiddlewareLaravel - 服务提供者与中间件
【发布时间】:2020-01-31 10:32:42
【问题描述】:

我有一个关于laravel 的问题。 我知道,由于“基于主要意见”,这个问题可能会被关闭,但也许你可以给我一些提示。

我在问我,在laravel 中使用ServiceProvidersMiddleware 有什么区别?

所以我的意思是,我什么时候使用ServiceProviders,什么时候应该选择Middleware

两者都会在每次请求时执行,不是吗? 也许你们中的一些人有用例的例子。 非常感谢!

【问题讨论】:

    标签: laravel middleware service-provider


    【解决方案1】:

    ServiceProviders 和 Middleware 之间有很大的区别。

    服务提供者是所有 Laravel 应用程序引导的中心。这可以包括你自己的应用程序,以及 Laravel 的所有核心服务。这一切都是通过服务提供商引导的。引导,我的意思是注册事物,包括注册服务容器绑定、事件监听器、middleware,甚至路由。服务提供商是配置应用程序的中心位置。因此,简而言之,服务提供者用于告诉 Laravel 在运行应用程序时应该加载和使用哪些类和文件。服务提供者有两种方法:register()boot()

    register 方法中,您应该只将事物绑定到service container。您永远不应尝试在 register 方法中注册任何事件侦听器、路由或任何其他功能。简单的例子是注册你的自定义类:

    public function register()
    {
       $this->app->bind('App\Library\Services\CustomClass ', function ($app) {
         return new CustomClass ();
        });
    }
    

    我们已导入 App\Library\Services\CustomClass 以便我们可以使用它。在 register 方法中,我们使用了服务容器的 bind 方法来添加我们的服务容器绑定。因此,每当需要解析 App\Library\Services\CustomClass 依赖项时,它都会调用闭包函数,并实例化并返回 App\Library\Services\CustomClass 对象。

    boot 方法在所有其他服务提供者都已注册后调用,这意味着您可以访问框架已注册的所有其他服务。在大多数情况下,您希望在此方法中注册您的事件侦听器,当发生某些事情时会触发它,等等。一个简单的示例可能是扩展 Laravel 的验证以添加您自己的一些自定义字段:

    public function boot()
    {
        Validator::extend('my_custom_validator', function ($attribute, $value, $parameters, $validator) {
            // validation logic goes here...
     }
    

    有关服务提供商的更多信息,请访问official documentation

    另一方面,middleware 提供了一种方便的机制来过滤进入您的应用程序的 HTTP 请求。例如,Laravel 包含一个中间件,用于验证您的应用程序的用户是否经过身份验证。如果用户未通过身份验证,中间件会将用户重定向到登录屏幕。但是,如果用户通过了身份验证,中间件将允许请求进一步进入应用程序:

    public function handle($request, Closure $next)
    {
       if (Auth::check()) {
          // The user is logged in, do something...
       }else{
          // The user is not logged in, do something else...
    }
    

    更多关于中间件的信息可以在official documentation找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2015-10-24
      • 2016-10-06
      • 1970-01-01
      相关资源
      最近更新 更多