Если параметр url, то верните представление, иначе перейдите к контроллеру по маршруту Laravel

#laravel #routing

#laravel #маршруты

Вопрос:

У меня есть SearchController, который устанавливает переменную сеанса и отправляет пользователя в представление staff.resultList. Есть ссылка, которая переключает представления из списка в сеточное представление. Я пытаюсь добавить условный оператор, который облегчает это переключение. В моем файле маршрута у меня есть :

 Route::get('home/memberhome/search', function(){
    if(isset($_GET['resultView']) amp;amp; Session::has('lastSearch')){
        if($_GET['resultView'] == 'grid'){
            return view('staff.resultsGrid');
        } else {
            return view('staff.resultList');
        }
    } else {
        'SearchController@getAvailablity';
    }
});
  

Очевидно, что это не работает, но я не уверен в правильном синтаксисе, чтобы заставить это запускать контроллер, если условие не подразумевается, и просто отображать представления, если условия выполнены.

Могу ли я заставить это работать или есть другой подход, который я должен использовать?

Файл маршрута

 <?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
 */

use AppHttpControllers;
// use IlluminateHttpRequest;
// use Mail;
Route::get('/', function () {
    return redirect('home/memberhome');
});


Route::get('/sso/{accessCode}', 'SsoController@ssoLogin');
Route::get('/ssofailure', 'SsoController@ssoFail');
// Route::get('/optimum/{searchString?}', 'OptimumController@getAutoComplete($searchString=""');

Route::get('home/memberhome/search', function(){
    if(isset($_GET['resultView']) amp;amp; Session::has('lastSearch')){
        if($_GET['resultView'] == 'grid'){
            return view('staff.resultsGrid');
        } else {
            return view('staff.resultList');
        }
    } else {
        return redirect()->action('SearchController@getAvailablity');
    }
});
Route::group(['middleware' => ['auth', 'role:super_admin admin']], function () {
    // REPORTS ROUTES
    Route::get('dashboard/reports', 'ReportController@index');
    Route::get('dashboard/reports/filter', 'ReportController@filterReports');
    Route::get('dashboard/reports/export/{id}', 'ReportController@export');
    Route::get('dashboard/reports/{id}/bookings', 'ReportController@reports');
    Route::get('dashboard/reports/{id}/bookings/search', 'ReportController@searchBookings');
    Route::get('dashboard/client/search', 'ClientController@search');
    Route::get('dashboard/clients/create', 'ClientController@create');
    Route::post('dashboard/clients/store', 'ClientController@store');


    // INVOICE ROUTES
    Route::get('dashboard/invoices', 'InvoiceController@index');
    Route::post('dashboard/invoices', 'InvoiceController@store');
    Route::get('dashboard/invoices/edit/{id}', 'InvoiceController@edit');
    Route::post('dashboard/invoices/edit/{id}', 'InvoiceController@updateBooking');
    Route::get('dashboard/invoices/remove/{id}', 'InvoiceController@removeBooking');
    Route::get('dashboard/invoice/export/{id}', 'InvoiceController@export');
    Route::post('dashboard/invoices/{id}/paid', 'InvoiceController@markPaid');
    Route::get('dashboard/invoices/{id}', 'InvoiceController@show');

});
  

Комментарии:

1. Вы можете использовать redirect()->action('SearchController@getAvailablity');

Ответ №1:

Вы можете перенаправить пользователя на действие другого контроллера следующим образом:

 return redirect()->action('SearchController@getAvailablity');
  

Итак, это было бы что-то вроде этого:

 Route::get('home/memberhome/search', function(){
    if(isset($_GET['resultView']) amp;amp; Session::has('lastSearch')){
        if($_GET['resultView'] == 'grid'){
            return view('staff.resultsGrid');
        } else {
            return view('staff.resultList');
        }
    } else {
        return redirect()->action('SearchController@getAvailablity');
    }
});
  

Для получения дополнительной информации: https://laravel.com/docs/5.8/redirects#redirecting-controller-actions

Обновить

Если метод вашего контроллера не зарегистрирован ни в одном маршруте, вы можете получить к нему доступ следующим образом:

 return app(AppHttpControllersSearchController::class)->getAvailablity();
  

Итак, это было бы что-то вроде этого:

 Route::get('home/memberhome/search', function(){
    if(isset($_GET['resultView']) amp;amp; Session::has('lastSearch')){
        if($_GET['resultView'] == 'grid'){
            return view('staff.resultsGrid');
        } else {
            return view('staff.resultList');
        }
    } else {
        return app(AppHttpControllersSearchController::class)->getAvailablity();
    }
});
  

Комментарии:

1. Это приводит к: Action AppHttpControllersSearchController@getAvailablity not defined. Что, как я знаю, не так, поскольку, если я изменяю файл маршрута на Route::get('home/memberhome/search', 'SearchController@getAvailablity'); , он попадает в контроллер. Извините, я очень новичок в этой среде

2. @Lance Можете ли вы обновить свой вопрос с помощью файла маршрута?

3. @Lance Я переместил ваши маршруты в ваш вопрос вместо моего ответа. Я не вижу никаких маршрутов с SearchController@getAvailablity ?

4. Извините, что поместил их не в то место 🙁 Спасибо за вашу помощь!!