اذهب إلى المحتوى

السؤال

نشر

لدي المسار التالي:

Route::post('threads/{thread}/replies', [ReplyController::class, 'store']);

التابع store بهذا الشكل:

<?php

class ReplyController extends Controller
{
  public function store(Thread $thread)
  {
    $thread->addReply([
      'body' => \request('body'),
      'user_id' => auth()->id()
    ]);

    return back();
  }
}

و نموذج لإضافة تعليق على موضوع بهذا الشكل:

<div class="row justify-content-center mt-3">
  <div class="col-md-8">
    <form action="{{ $thread->path . "/replies" }}" method="post">
      @csrf
      <div class="form-group">
        <textarea name="body" class="form-control" rows="5" placeholder="Have something to say?"></textarea>
      </div>
      <button type="submit" class="btn btn-secondary">Post</button>
    </form>
  </div>
</div>

كل شيء يعمل الآن، ما أريده هو حماية وصول الزوار للمسار  و أن لا يتم عرض نموذج إضافة تعليق لهم و أن يتم عرض رابط للتوجيه إلى صفحة تسجيل الدخول في هذه الحالة.

Recommended Posts

  • 0
نشر

يُمكن حماية المسار بإستخدام الطبقة الوسيطة أو الmiddleware المُسماة auth بهذا الشكل:

Route::post('threads/{thread}/replies', [ReplyController::class, 'store'])->middleware('auth');

أو يُمكنك عمل ذلك في المُتحكم ReplyController لأنه سيعطيك حرية أكثر من خلال الباني:

<?php

class ReplyController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth')->only('store');
    }
  
}

من خلال التابع only يُمكنك تحديد التوابع التي تريد تطبيق الmiddleware عليها.

أما في جزء العرض فيُمكنك إستخدام توجيه مُحرك blade الذي يُكتب:

@auth

أو إستخدم شرط بسيط للتحقق من أن المُصادقة مُحققة:

@if(auth()->check())

بهذا الشكل ككل:

@auth
<div class="row justify-content-center mt-3">
  <div class="col-md-8">
    <form action="{{ $thread->path . "/replies" }}" method="post">
      @csrf
      <div class="form-group">
        <textarea name="body" class="form-control" rows="5" placeholder="Have something to say?"></textarea>
      </div>
      <button type="submit" class="btn btn-secondary">Post</button>
    </form>
  </div>
</div>
@else
<p class="text-center mt-3">Please <a href="{{ route('login') }}">sign in</a> to participate in this discussion.</p>
@endauth

و هكذا سيتم عرض النموذج إلا في حالة كان هناك مُستخدم مُصادق عليه أما إن كان زائر سيتم عرض رابط يُخبره بضرورة تسجيل الدخول لإضافة تعليق.

  • 0
نشر

يمكن باستخدام Middleware منع و توجبه الزوار و الأعضاء إلى أي صفحة تريدها فمثلا في حالتك هذه ممكن أنشاء middleware باستخدام الأمر التالي 

php artisan make:middleware UserAuth

أو يمكن زيارة الصفحة الخاصة بالتوثيق هنا

ثانيا عند تنفيذ هذا الأمر في command سيقوم بأنشاء ملف خاص لِ Middleware في المسار التالي 

app\Http\Middleware ستجد الملف التالي UserAuth.php في دالة handle ممكن تضع أي شرط لإكمال الدخول إلى route  محدد أو توجيه الزائر أو العضو إلى صفحة معينة ما دام الشرط غير صحيح 

فمثلا 

public function handle($request, Closure $next)
{
  if (auth()->guard('web')->user()) {
      return $next($request);
  } else {
      return redirect('/404');
  }
	
}

ومن ثم نذهب للملف التالي في المسار app/Http/Kernel.php ونقوم بوضع مسار Middleware الذي قمنا بأنشائه داخل المصوفة $routeMiddleware

'userauth' => \App\Http\Middleware\UserAuth::class,

ومن ثم في ملف الخاص بِ routes نضع في route الذي نريد منع الأعضاء من الدخول إليه 

Route::post('threads/{thread}/replies', [ReplyController::class, 'store'])->middleware('userauth');

وهكذا تكون عملية توجيه الاعضاء حسب شرط معين, يمكنك زيارة التوثيق الخاص Laravel في الرابط إعلاه.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...