Laravel 服务提供商与中间件
Laravel ServiceProvider vs. Middleware
我有一个关于 Laravel 的问题。在Laravel中使用ServiceProviders
或Middleware
的区别在哪里?
所以我的意思是,什么时候使用ServiceProviders
,什么时候应该选择Middleware
?
两者都在每次请求时执行,不是吗?也许你们中有人有用例示例。
ServiceProvider和Middleware有很大的不同。
服务提供商是所有 Laravel 应用程序引导的中心位置。这可以包括您自己的应用程序,以及 Laravel 的所有核心服务。这都是通过服务提供商引导的。通过引导,我的意思是注册东西,包括注册服务容器绑定、事件监听器、middleware
,甚至路由。服务提供商是配置您的应用程序的中心位置。因此,简而言之,服务提供商用于告诉 Laravel 在您 运行 您的应用程序时应该加载和使用哪些 classes 和文件。服务提供者有两种方法:register()
和boot()
。
在 register
方法中,您应该只将东西绑定到 service container 中。您永远不应尝试在注册方法中注册任何事件侦听器、路由或任何其他功能。简单的例子就是注册你的自定义 class:
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 依赖项时,它都会调用闭包函数,并实例化 returns 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 中找到有关中间件的更多信息。
我有一个关于 Laravel 的问题。在Laravel中使用ServiceProviders
或Middleware
的区别在哪里?
所以我的意思是,什么时候使用ServiceProviders
,什么时候应该选择Middleware
?
两者都在每次请求时执行,不是吗?也许你们中有人有用例示例。
ServiceProvider和Middleware有很大的不同。
服务提供商是所有 Laravel 应用程序引导的中心位置。这可以包括您自己的应用程序,以及 Laravel 的所有核心服务。这都是通过服务提供商引导的。通过引导,我的意思是注册东西,包括注册服务容器绑定、事件监听器、middleware
,甚至路由。服务提供商是配置您的应用程序的中心位置。因此,简而言之,服务提供商用于告诉 Laravel 在您 运行 您的应用程序时应该加载和使用哪些 classes 和文件。服务提供者有两种方法:register()
和boot()
。
在 register
方法中,您应该只将东西绑定到 service container 中。您永远不应尝试在注册方法中注册任何事件侦听器、路由或任何其他功能。简单的例子就是注册你的自定义 class:
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 依赖项时,它都会调用闭包函数,并实例化 returns 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 中找到有关中间件的更多信息。