Php Laravel-仅为特定路由初始化类

Php Laravel-仅为特定路由初始化类,php,laravel,laravel-middleware,service-provider,Php,Laravel,Laravel Middleware,Service Provider,在我的应用程序中,我有一组路由需要在发送之前进行引导 为了说明这种情况: 有一个前缀为“app”的特殊路由组。所有这些路线也有一些参数: site.dev/app/index?age=11&else=af3fs4ta21 如果没有这些参数,则不应允许用户访问路由。我通过创建一个简单的路由中间件完成了这项工作 if (!$request->exists('age') || !$request->exists('else')) { return redirect

在我的应用程序中,我有一组路由需要在发送之前进行引导

为了说明这种情况: 有一个前缀为“app”的特殊路由组。所有这些路线也有一些参数:

site.dev/app/index?age=11&else=af3fs4ta21
如果没有这些参数,则不应允许用户访问路由。我通过创建一个简单的路由中间件完成了这项工作

if (!$request->exists('age') || !$request->exists('else')) {
        return redirect('/');
}
下一步是初始化一个将路由参数作为构造参数的类。然后param“else”被用作db调用的参数。我需要从/app route group访问每个路由中的此类

为了实现这一目标,我尝试设置服务提供商:

public function register()
{
    $this->app->singleton(Dual::class, function ($app) {
        return new Dual($this->app->request->all());
    });
}
然后我创建了一个特殊的控制器,扩展BaseController并将Dual类传递给它的构造函数

class DualController extends Controller
{
    public function __construct(Request $request, Dual $dual)
    {
        $this->middleware(\App\Http\Middleware\DualMiddleware::class);

        $this->dual = $dual;
    }
}
然后每个控制器都在扩展DualController并通过$this->Dual->method()访问Dual类

如果路由参数在它们的位置,并且数据库中已经有一行,则它可以工作

问题 此中间件在ServiceProvider和DualController初始化Dual类后执行。所以,中间件并没有真正起作用。如果路由参数不存在,它将失败

此外,若由于某种原因数据库中并没有必需的行,那个么Dual类将不会被初始化(因为它取决于对db的调用),整个应用程序将崩溃,说我正在尝试对null执行操作

期望的行为 首先检查路由是否存在参数

第二,检查数据库中是否有带有来自route的键的行

第三-尝试初始化双类并将其传递给路由组/应用程序使用的所有控制器

如果任何步骤失败->显示正确的消息

双重职业的一部分:
您可以在中间件中执行此操作:

$isElseExists = Model::where('else', request('else'))->first();
if (request('age') && request('else') && $isElseExists) {
    return $next($request);
} else {
    return back()->with('error', 'You are not allowed');
}
若一切正常,将执行控制器方法。然后,您将能够注入
Dual
类,而无需任何附加逻辑


如果出现问题,用户将被重定向到上一个URI,错误消息将闪现到会话中。

为什么不能检查中间件中是否允许用户?@AlexeyMezenin如果您所说的用户是指已注册和已登录的用户-此应用程序中没有此类内容,也不会有。我试图检查params,以及中间件中的DB中是否存在这样的模型,但只要laravel在构建和初始化控制器中的Dual类后执行路由中间件,它就无法工作。尝试将其作为路由中间件在
app/Http/Kernel.php
中添加一个密钥,然后在路由文件
->中间件('something')中定义它
@ahmad感谢您的回复。我一开始尝试过,静态中间件是在serviceprovider之后执行的。另一方面,全局中间件工作正常(首先是中间件,然后是构造),但全局是全局的,阻止了应用程序中的所有其他路由。@AlexeyMezenin我已使用导致问题的部分dual类更新了问题。问题主要在于getEli()->accessToken()部分,因为它试图在null上执行它。是的,问题是出于某种原因,控制器方法在该中间件之前执行。如果您检查所有内容都是中间件,并且不允许用户访问路由,则控制器方法中的逻辑将不会执行。即使我执行了dd()或者exit()或中间件中的任何内容,首先执行控制器_构造中的逻辑。我想它的工作方式是:->创建控制器类->检查中间件->检查控制器中的指定方法?@ficus您已经询问了一个方法。您可以从构造函数中移动逻辑,并在控制器方法中解析该类。另外,如果将注入
Dual
类,为什么会不好?@ficus您可以绑定该类,并在所有控制器、视图、模型等中全局执行
app('Dual')->instanceClient()
$isElseExists = Model::where('else', request('else'))->first();
if (request('age') && request('else') && $isElseExists) {
    return $next($request);
} else {
    return back()->with('error', 'You are not allowed');
}