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

时间:2018-01-13 12:25:19

标签: php laravel laravel-middleware service-provider

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

为了说明这种情况:

有一个带有前缀' app'的特殊路线组。所有这些路线也有一些参数:

site.dev/app/index?age=11&else=af3fs4ta21

如果没有这些参数,则不允许用户访问路线。我通过创建一个简单的路由中间件来完成它。

if (!$request->exists('age') || !$request->exists('else')) {
        return redirect('/');
}

下一步是初始化一个将路由参数作为构造参数的类。那么param"否则"被用作db调用的参数。我需要在/ app route group的每个路由中访问此类。

为了实现我尝试设置serviceprovider:

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;
    }
}

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

如果路径参数在它们的位置并且数据库中已经存在一行,则它正在工作。

问题

此中间件在ServiceProvider& DualController正在初始化类Dual。所以,中间件并没有真正起作用。如果路线参数不存在则会失败。

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

期望的行为

首先检查params存在的路线。

其次,检查db中是否有来自路由的键的行。

第三 - 尝试初始化Dual类并将其传递给路由组/ app使用的所有控制器。

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

双重类的一部分:

class Dual
{
    protected $client = null;
    public $config = [];

    public function __construct($config)
    {
        $this->config = $config;
        $this->bootstrap();
    }

    public function getEli()
    {
        $eli = Eli::where(['else' => $this->config['else']])->first();
        return $eli;
    }

    public function instantiateClient()
    {
        $client = Client::factory(Client::ADAPTER_OAUTH, [
            'entrypoint' => $this->getEli()->eli_url,
            'client_id' => '111',
            'client_secret' => '111',
        ]);

        $client->setAccessToken($this->getEli()->accessToken()->first()->access_token);

        return $client;
    }

    public function getClient()
    {
        if ($this->client === null)
        {
            throw new \Exception('Client is NOT instantiated');
        }

        return $this->client;
    }

    public function bootstrap()
    {
        $this->client = $this->instantiateClient();
    }

1 个答案:

答案 0 :(得分:1)

您可以在中间件中执行此操作:

$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,并将错误消息闪现到会话中。