Laravel только один из двух доступных маршрутов одновременно

Если у меня есть два маршрута 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 напрямую.

Разный статус для каждого пользователя?

JustCarty 13.07.2018 18:06

Только 0 или 1 в статусе. Если статус равен 1, все пользователи будут обращаться к routeB напрямую, если статус равен 0, то первые пользователи, которые попадут туда, будут обращаться к routeA, выполнят какое-то действие (которое установит статус на 1), будут перенаправлены на routeB. Следующие за ним пользователи попадут прямо на routeB.

Victordb 13.07.2018 18:11

Конечно, перенаправление, когда они выполняют действие, а затем все другие пользователи попадут в условие else в промежуточном программном обеспечении.

JustCarty 13.07.2018 18:14

Да, но как мне установить условие?

Victordb 13.07.2018 18:15

Вы думали о laravel policy для решения вашей задачи?

Mahbub 13.07.2018 18:15

Никогда не использовал laravel policy, можете ли вы привести пример?

Victordb 13.07.2018 18:16
if (DB::table('my_table')->value('status') == 0) { /**/ } else { /**/ } Если у вас есть модели, замените DB::table на модель. Кроме того, я не уверен, в чем будет заключаться ваш запрос. Прочтите документация. Я также рекомендую прочитать руководства о том, как работает Laravel. У вас явно нет базовых знаний. Сначала сделайте несколько уроков, это очень поможет вам в будущем.
JustCarty 13.07.2018 18:16

Могу ли я использовать if statements непосредственно в файле маршрута web.php? и если я могу, в чем смысл Route::group из ответа ниже, не могу ли я просто использовать if без Route::group?

Victordb 13.07.2018 18:19

Конечно вы можете. Группа маршрутов позволяет добавлять к маршрутам префикс и многое другое. Таким образом, вам не нужно добавлять один и тот же код снова и снова. Еще раз повторяю, читать документы

JustCarty 13.07.2018 18:32

Как я могу использовать что-то вроде $request->route('id'); для получения какого-либо параметра из другого маршрута?

Victordb 13.07.2018 18:35

Я имею в виду, что мне нужно использовать параметр в операторе if. Как я могу это сделать?

Victordb 13.07.2018 18:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
11
725
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать имя маршрута и просто использовать его где угодно.

  //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 13.07.2018 18:35

@JustCarty, вы правы в этом вопросе, но я думаю, что это полезно, когда возникают новые условия.

Md Nasir Fardoush 13.07.2018 18:41

Я не хочу, чтобы маршруты были доступны по URL-адресу, если условие не проверено. Поэтому я не хочу просто добавлять маршруты в web.php и предоставлять к ним свободный доступ. Мне нужен оператор if в //define routes. Я не знаю, как получить доступ к параметру из других маршрутов в операторе if.

Victordb 13.07.2018 18:41

@Victordb Я не уверен, что вам нужно что-то вроде этого 'Route :: get (' / route / {id} ', function ($ id) {if ($ id == 1) {// do something} else { // делаем другие}}); '

Md Nasir Fardoush 13.07.2018 18:50

Да, но по какой-то причине я не могу использовать его в Route::group(['prefix' => '/'], function($id).

Victordb 13.07.2018 18:56

Привет, @Victordb, я редактирую свой ответ на ваш последний комментарий, возможно, это поможет вам решить вашу задачу. Спасибо

Md Nasir Fardoush 13.07.2018 19:32

В итоге я сделал только один маршрут, проверил условие внутри контроллера и вернул соответствующее представление. Я ценю вашу помощь. Спасибо!!!

Victordb 13.07.2018 19:57
Ответ принят как подходящий

Если вы хотите, вы можете просто выполнить перенаправление со своего промежуточного программного обеспечения:

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 и предоставлять им свободный доступ.

Victordb 13.07.2018 18:40

Зачем тогда использовать промежуточное ПО? Почему бы просто не иметь один маршрут и не пройти в статусе? например Route::get('/your_route/{status}', 'YourController@YourAction')

JPark 13.07.2018 18:49

Вы правы, я проложил только 1 маршрут, я проверил статус в контроллере и вернул соответствующий вид на основе статуса. Пожалуйста, отредактируйте свой ответ, и я проголосую за него правильно. Спасибо.

Victordb 13.07.2018 19:50

Обновлено. Спасибо.

JPark 13.07.2018 20:11

Другие вопросы по теме