Vatrush
@Vatrush

Как выводить представление по одному и тому же маршруту в зависимости от условия?

Вот код моего роутера
Route::group(['middleware' => 'guest'], function () {
    Route::get('/', function () {
        return view('layouts/login');
    })->name('login');
});

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function () {
        return view('index');
    })->name('index');
    Route::get('/', function () {
        return view('layouts/main');
    })->name('main');
    Route::get('/profile', function () {
        return view('layouts/profile');
    })->name('profile');
    Route::get('/exchange', function () {
        return view('layouts/exchange');
    })->name('exchange');
});

Если я использую в группе guest вместо маршрута "/" любой другой "login",'"auth" и тд. то все хорошо, но если оставить "/", то вылетит это Route [login] not defined.
Важно использовать именно главную страницу для логина.
  • Вопрос задан
  • 345 просмотров
Решения вопроса 3
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
Для начала научитесь контроллеры создавать.

Потом почитайте про Auth и как узнать залогинен сейчас пользователь или нет, в зависимости от этого отдавайте разные шаблоны, а не создавайте "2 роута на одну ссылку" т.к. это невозможно.
Ответ написан
@jazzus
Как сказал Александр Аксентьев, вам нужно потренироваться делать контроллеры.

Создаете HomeController

Создаете роут для главной страницы.
Route::get('/', 'HomeController@index');

Подключаете в контроллере Auth
use Auth;
Прописываете метод в контроллере
public function index()
{
      if(!Auth::check()){
         return view('login');
      }
      return view('index');
}

Роут будет вызывать метод index в контроллере, который будет проверять авторизован пользователь или нет и отдавать разные шаблоны.
Ответ написан
Комментировать
Vatrush
@Vatrush Автор вопроса
Вот как я решил это.
Я создал контроллер главной страницы:
class HomeController extends Controller
{
    public function index()
    {
        if(!Auth::check()){
            return view('layouts/login');
        }
        return view('index');
    }
    public function main()
    {
        if(!Auth::check()){
            return view('layouts/login');
        }
        return view('layouts/main');
    }
}

Затем в роутах прописал вот так:
Route::get('/', 'HomeController@index')->name('index');
Route::get('/', 'HomeController@main')->name('main');

UPD исправление плохого кода.


Как я сделал выше - неправильно.
Переделал вот так, ибо я не взял во внимание то, что шаблон выводится независимо от роутера, и я выводил его зачем-то по роуту '/' :
HomeController.php
class HomeController extends Controller
{
    public function main()
    {
        if(!Auth::check()){
            return view('layouts/login');
        }
        return view('layouts/main');
    }
}

web.php
Route::get('/', 'HomeController@main')->name('main');

Дальше я столкнулся с проблемой, что если гость переходит по пути который существует на сайте, то вылетает ошибка которая в вопросе вместо редиректа, независимо от того, что маршруты которые нужно запретить находятся в группе роутов auth.
Исправил вот так (не знаю насколько правильно, знатоки мб подскажут):
В Handler.php в конце метода rednder()
if(!Auth::guest()){
    return parent::render($request, $exception);
} else {
    return redirect()->guest('/LOGIN.PAGE.HERE');
}

После этого если гость переходит по существующему маршруту, его перекидывает на страницу логина, в моем случае '/'.
Так же я убрал ВСЕ return view для маршрутов в роутере и прописал все это в контроллере HomeController, а web.php привел к такому виду:
Route::get('/path', ['as' => 'name', 'uses' => 'MainController@method']);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@NubasLol
if (auth()->guest()) {
Route::group(['middleware' => 'guest'], function () {
    Route::get('/', function () {
        return view('layouts/login');
    })->name('login');
});
} else {

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function () {
        return view('index');
    })->name('index');
    Route::get('/', function () {
        return view('layouts/main');
    })->name('main');
    Route::get('/profile', function () {
        return view('layouts/profile');
    })->name('profile');
    Route::get('/exchange', function () {
        return view('layouts/exchange');
    })->name('exchange');
});
}
Ответ написан
Astatroth
@Astatroth
Я тут случайно
А почему нельзя взять аутентификацию из коробки? Можно даже допилить ее, если понадобится. Зачем ТАК извращаться?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы