رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
محدود کردن route به مقادیر معتبر
#1
سلام
من یک روت به شکل زیر دارم

Route::get('/{city}', 'CategoriesController@rootCategory');

حالا می خوام وقتی فرد کلمه نامعتبری تو url وارد کرد نتیجه رو نیاره. با توجه به اینکه city پارامتری هست.
اگه بشه جلوش رو گرفت فقط اسم شهر معتبر واردکنه اگر نه هم حداقل محدود به حروف. 
از regular expression باید استفاده کرد؟ البته من خودم امتحان کردم جواب نگرفتم.
پاسخ
تشکر شده توسط:
#2
سلام

خب الان شما دو تا خواسته دارید که هرکدوم راه حل خودشو داره اگر فقط می خواهید توی route از حروف استفاده بشه می تونید از Regular Expression استفاده کنید در این صورت اگه هر کاراکتر غیرمجاز دیگه ای وارد بشه به خطای 404 میخوره مثلا

Route::get('/{city}', 'CategoriesController@rootCategory')->where('city', '[A-Za-z]+');

اما اینکه شما یکسری شهر مشخص دارین و می خواهید فقط یکی از همون شهرها به عنوان پارامتر توی url بیاد از Middleware استفاده کنید و بعد می تونید چک کنید پارامتر وارد شده با نام شهرهای مشخص شده یکی بود اجازه عبور request رو بهش بده وگرنه بتونید request رو reject کنید
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: captain
#3
البته عنوان کردم که فقط بتونه حروف فارسی به عنوان مقادیر معتبر وارد بشن.

نقل قول:اگه بشه جلوش رو گرفت فقط اسم شهر معتبر واردکنه اگر نه هم حداقل محدود به حروف.
پاسخ
تشکر شده توسط:
#4
خب هردوش شدنیه اولی که مثال زدم کافیه از یک عبارت منظم مناسب استفاده کنید و روش دوم هم میتونید یک Middleware تعریف کنید مثلا CityMiddleware رو اینطوری تعریف میکنیم :

namespace AppHttpMiddleware;

use Closure;

class CityMiddleware
{
    protected $cities;

    public function __construct()
    {
        $this->cities = ['تهران', 'شیراز', 'اصفهان', 'تبریز', 'مشهد'];
    }
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!in_array($request->city, $this->cities)) {
            abort(404);
        }
        return $next($request);
    }
}

باید قبلش این Middleware رو توی Kernel.php ثبت کنید که میتونید توی مبحث Middleware های آموزشهای همین انجمن نحوه ایجاد و ثبتش رو بخونید.

حالا اگر یک route به این صورت داشته باشیم :
Route::get('cities/{city}', function() {
    return 'It Works!';
})->middleware('city');
من Middleware رو به نام city ثبت کرده بودم بنابراین به این route اعمالش کردم و اگه تست کنید می بینید به درستی کار میکنه در ضمن شما می تونید اسامی شهرها رو از دیتابیس یا به صورت دیگه ای که اونهارو در اختیار دارین دریافت و استفاده کنید
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط: captain




کاربران در حال بازدید این موضوع: 1 مهمان