Если у меня есть два маршрута A и B в моем web.php. Как я могу сделать такую проверку промежуточного программного обеспечения:
if (something in my database have status == 0) {
return $next($request); ROUTE A
} else {
return $next($request); ROUTE B
}
Я упомянул return $next($request);, потому что здесь есть одно условие, я не хотите, чтобы оба маршрута были доступны одновременно. Так, например, если я перейду к url/routeA, если условие выполнено, разрешить, если не показать маршрут B. То же самое касается маршрута B.
Логика была бы такой, как если бы пользователь выбирал элемент из списка (в базе данных список представлен следующим образом: list с id,name,status), если статус равен 0, покажите маршрут A, если статус равен 1, покажите маршрут B. Если я попытаюсь посетить url/routeB?listID1 непосредственно проверьте состояние (для id1) и покажите маршрут A или B.
Только 0 или 1 в статусе. Если статус равен 1, все пользователи будут обращаться к routeB напрямую, если статус равен 0, то первые пользователи, которые попадут туда, будут обращаться к routeA, выполнят какое-то действие (которое установит статус на 1), будут перенаправлены на routeB. Следующие после него пользователи попадут на маршрут B напрямую.
Только 0 или 1 в статусе. Если статус равен 1, все пользователи будут обращаться к routeB напрямую, если статус равен 0, то первые пользователи, которые попадут туда, будут обращаться к routeA, выполнят какое-то действие (которое установит статус на 1), будут перенаправлены на routeB. Следующие за ним пользователи попадут прямо на routeB.
Конечно, перенаправление, когда они выполняют действие, а затем все другие пользователи попадут в условие else в промежуточном программном обеспечении.
Да, но как мне установить условие?
Вы думали о laravel policy для решения вашей задачи?
Никогда не использовал laravel policy, можете ли вы привести пример?
if (DB::table('my_table')->value('status') == 0) { /**/ } else { /**/ } Если у вас есть модели, замените DB::table на модель. Кроме того, я не уверен, в чем будет заключаться ваш запрос. Прочтите документация. Я также рекомендую прочитать руководства о том, как работает Laravel. У вас явно нет базовых знаний. Сначала сделайте несколько уроков, это очень поможет вам в будущем.
Могу ли я использовать if statements непосредственно в файле маршрута web.php? и если я могу, в чем смысл Route::group из ответа ниже, не могу ли я просто использовать if без Route::group?
Конечно вы можете. Группа маршрутов позволяет добавлять к маршрутам префикс и многое другое. Таким образом, вам не нужно добавлять один и тот же код снова и снова. Еще раз повторяю, читать документы
Как я могу использовать что-то вроде $request->route('id'); для получения какого-либо параметра из другого маршрута?
Я имею в виду, что мне нужно использовать параметр в операторе if. Как я могу это сделать?






Вы можете использовать имя маршрута и просто использовать его где угодно.
//define route
Route::get('/A', 'ControllerA@methodA')->name('A');
Route::get('/B', 'ControllerB@methodB')->name('B');
In your controller simply use route name
$routeName = ['A','B']; //route name
If (something in my database have status == 0) {
return Redirect::route($routeName[0]); //ROUTE A
} else {
return Redirect::route($routeName[1]); //ROUTE B
}
Otherwise you can do something getting route group parameter
Route::group(['prefix' => '/test/{id}'], function() {
//you can't access parameter directly here
$id = explode('test/',url()->current())[1]; //get parameter with different way
if ($id == 1){
exit('do something');
}else{
exit('do others');
}
});
У меня, вероятно, не было бы массива имен маршрутов, это просто добавляет уровень сложности. Если у вас много маршрутов, просто напишите их вместо массива.
@JustCarty, вы правы в этом вопросе, но я думаю, что это полезно, когда возникают новые условия.
Я не хочу, чтобы маршруты были доступны по URL-адресу, если условие не проверено. Поэтому я не хочу просто добавлять маршруты в web.php и предоставлять к ним свободный доступ. Мне нужен оператор if в //define routes. Я не знаю, как получить доступ к параметру из других маршрутов в операторе if.
@Victordb Я не уверен, что вам нужно что-то вроде этого 'Route :: get (' / route / {id} ', function ($ id) {if ($ id == 1) {// do something} else { // делаем другие}}); '
Да, но по какой-то причине я не могу использовать его в Route::group(['prefix' => '/'], function($id).
Привет, @Victordb, я редактирую свой ответ на ваш последний комментарий, возможно, это поможет вам решить вашу задачу. Спасибо
В итоге я сделал только один маршрут, проверил условие внутри контроллера и вернул соответствующее представление. Я ценю вашу помощь. Спасибо!!!
Если вы хотите, вы можете просто выполнить перенаправление со своего промежуточного программного обеспечения:
if (something in my database have status == 0) {
return redirect()->route('route_a_name');
} else {
return redirect()->route('route_b_name');
}
Просто убедитесь, что вы назвали свои маршруты в routes/web.php.
Пример:
Route::get('/route_a', 'YourController@RouteA')->name('route_a_name');
Редактировать:
Основываясь на дополнительной информации, которую вы предоставили, промежуточное ПО для того, что вы пытаетесь достичь, является своего рода чрезмерным. Вместо этого вы можете просто использовать один маршрут и передать параметр статуса. Для получения дополнительной информации о параметрах маршрутизации см. https://laravel.com/docs/5.6/routing#route-parameters.
Пример:
Route::get('/your_route/{status}', 'YourController@ControllerAction');
Затем в вашем контроллере обработайте логику в зависимости от статуса:
function ControllerAction(Request $request, $status) {
if ($status == 0) {
//Show view for A
} else {
//Show view for B
}
}
Я не хочу, чтобы маршруты были доступны по URL-адресу, если условие не проверено. Поэтому я не хочу просто добавлять маршруты в web.php и предоставлять им свободный доступ.
Зачем тогда использовать промежуточное ПО? Почему бы просто не иметь один маршрут и не пройти в статусе? например Route::get('/your_route/{status}', 'YourController@YourAction')
Вы правы, я проложил только 1 маршрут, я проверил статус в контроллере и вернул соответствующий вид на основе статуса. Пожалуйста, отредактируйте свой ответ, и я проголосую за него правильно. Спасибо.
Обновлено. Спасибо.
Разный статус для каждого пользователя?