在我的应用程序中,我有一组需要在发送之前进行引导的路线。
有一个带有前缀' 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();
}
答案 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,并将错误消息闪现到会话中。