تالار گفتمان nCIS.ir

نسخه‌ی کامل: محدود کردن route به مقادیر معتبر
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
من یک روت به شکل زیر دارم

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

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

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

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

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

نقل قول:اگه بشه جلوش رو گرفت فقط اسم شهر معتبر واردکنه اگر نه هم حداقل محدود به حروف.
خب هردوش شدنیه اولی که مثال زدم کافیه از یک عبارت منظم مناسب استفاده کنید و روش دوم هم میتونید یک 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 اعمالش کردم و اگه تست کنید می بینید به درستی کار میکنه در ضمن شما می تونید اسامی شهرها رو از دیتابیس یا به صورت دیگه ای که اونهارو در اختیار دارین دریافت و استفاده کنید