Şöyle bir middleware yeterli.
herhangi-bir-rota yazan yere kullanıcı ödeme sayfasına girmeye çalışırsa ve yetkisi yoksa yönlendirileceği rotayı yazarsınız
<?php
namespace App\Http\Middleware;
use Closure;
class CanPay
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if ($request->user()->can_pay) {
return $next($request);
}
return redirect()->route('herhangi-bir-rota')->withErrors("Bu sayfayı görmeye yetkiniz yok");
}
}
withErrors ile gelen hataları ekrana yazdırmak için blade şablonu içerisinde
@if(count($errors))
<div class="alert alert-danger shadow-sm" role="alert">
<ul class="list-unstyled mb-0">
@foreach($errors->all() as $message)
<li class="text-left">{!! $message !!}</li>
@endforeach
</ul>
</div>
@endif
gibi yapılabilir. Buradaki $errors değişkeni Laravel'in her şablona gönderdiği kendi değişkenidir. O yüzden kendinize ait $errors isimli bir değiken kullanmamalısınız. Aklınızda bulunsun.
Daha sonra bu middleware için alias oluşturalım. Bunun için app/Http/Kernel.php içerisinde $routeMiddleware[] dizisi içerisine:
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'can.pay' => \App\Http\Middleware\CanPay::class, // Bu satır
];
Sonra herhangi bir rotayı bu middleware ile koruyabiliriz. Örneğin sizin rota payment olsun:
Route::get('payment')->uses('PaymentController@index')->name('payment')->middleware('can.pay')
Yani anlayacağınız blade şablonu ile işiniz yok. Blade şablonu içerisinde herhangi bir HTML alanı gizlemek isterseniz zaten @if(auth()->user()->can_pay) ile yapabilirsiniz.
Dökümanlarda middleware ve routes bölümüne bakmalısınız:
https://laravel.com/docs/5.7/routing
https://laravel.com/docs/5.7/middleware
Lütfen:
Forumda daha çok takıldığınız yerlerde yardımcı olmak isterim. Dökümantasyonda zaten yazanı foruma aktarmak istemiyorum. O yüzden dökümanları lütfen okuyalım, sorduğunuz soruların çok basit olduğunu anlayacaksınız.