Задать вопрос
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.
Важно использовать именно главную страницу для логина.
  • Вопрос задан
  • 360 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 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
Я тут случайно
А почему нельзя взять аутентификацию из коробки? Можно даже допилить ее, если понадобится. Зачем ТАК извращаться?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы