Цель
Войдите в систему как пользователь в пакете Laravel.
Проблема
Нажатие кнопки входа перенаправляет на стартовую страницу, а в консоли я получаю код состояния 302. Это путь кнопки входа: <a href = "{{ route('login') }}">Login</a>
. Он определяется в web.php
следующим образом: Route::get('login', [LoginController::class, 'login'])->name('login')
. То же самое происходит, когда я пробую это в адресной строке с помощью: 127.0.0.1:8000/login
.
Описание
Это моя первая попытка пакетной разработки laravel. Поэтому я создал новое приложение Laravel с помощью Laravel 8. С помощью php artisan ui bootstrap --auth
я создал каркас аутентификации и теперь попытался сделать его пакетом laravel. Я следовал этой инструкции.
Всю ветку проекта вы можете найти здесь.
Заранее спасибо за ваше время.
Вот структура пакета до сих пор:
Маршруты
<?php
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Route;
use Leonp5\Limplecms\Http\Controllers\Admin\PagesController;
use Leonp5\Limplecms\Http\Controllers\Auth\LoginController;
// Set language
Route::get('locale/{locale}', function ($locale) {
Session::put('locale', $locale);
return redirect()->back();
});
Route::get('/', function () {
return view('limplecms::welcome');
});
Route::get('login', [LoginController::class, 'login'])->name('login');
Route::post('login', [LoginController::class, 'login']);
Route::post('logout', [LoginController::class, 'logout'])->name('logout');
Route::get('/home', [Leonp5\Limplecms\Http\Controllers\HomeController::class, 'index'])->name('home');
Route::resource(config('limplecms.admin_index_pages_url'), PagesController::class)->middleware('can:admin');
DependencyProvider пакета
<?php
namespace Leonp5\Limplecms;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Route;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
class LimpleCmsProvider extends ServiceProvider
{
public function register()
{
$this->mergeConfigFrom(__DIR__ . '/../config/config.php', 'limplecms');
$this->mergeConfigFrom(__DIR__ . '/../config/auth.php', 'limplecms');
}
public function boot(GateContract $gate)
{
$this->registerRoutes();
$this->loadViewsFrom(__DIR__ . '/../resources/views', 'limplecms');
if ($this->app->runningInConsole()) {
$this->publishes([
__DIR__ . '/../dist' => public_path('limplecms'),
], 'assets');
$this->publishes([
__DIR__ . '/../config/config.php' => config_path('limplecms.php'),
], 'config');
$this->publishes([
__DIR__ . '/../resources/views' => resource_path('views/vendor/limplecms'),
], 'views');
}
$gate->define("admin", function ($user) {
return $user->hasRole("admin");
});
$gate->define("editor", function ($user) {
return $user->hasRole("editor");
});
}
protected function registerRoutes()
{
Route::group($this->routeConfiguration(), function () {
$this->loadRoutesFrom(__DIR__ . '/../routes/web.php');
});
}
protected function routeConfiguration()
{
return [
// 'prefix' => config('limplecms.prefix'),
'middleware' => config('limplecms.middleware'),
];
}
}
ЛогинКонтроллер
(Метод входа/выхода определен в трейте AuthenticatesUsers
, который взят из Laravel, и я ничего там не менял)
<?php
namespace Leonp5\Limplecms\Http\Controllers\Auth;
use Leonp5\Limplecms\Http\Controllers\Controller;
// use App\Providers\RouteServiceProvider;
use Illuminate\Contracts\Container\BindingResolutionException;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
// protected $redirectTo = RouteServiceProvider::HOME;
// commenting out this line and add a specific redirectTo function for a custom redirect
// protected $redirectTo = RouteServiceProvider::HOME;
// needs to bring in Auth Facade
/**
*
* @return mixed
* @throws BindingResolutionException
*/
public function redirectTo()
{
$user = Auth::user();
if ($user->hasRole("admin")) {
$this->redirectTo = route('pages.index');
} else {
$this->redirectTo = route("home");
}
return $this->redirectTo;
}
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* Get the login username to be used by the controller.
*
* @return string
*/
public function username()
{
$login = request()->input('identity');
$field = filter_var($login, FILTER_VALIDATE_EMAIL) ? 'email' : 'username';
request()->merge([$field => $login]);
return $field;
}
/**
* Validate the user login request.
*
* @param \Illuminate\Http\Request $request
* @return void
*
* @throws \Illuminate\Validation\ValidationException
*/
protected function validateLogin(Request $request)
{
$messages = [
'identity.required' => 'Email or username cannot be empty',
'password.required' => 'Password cannot be empty',
];
$request->validate([
'identity' => 'required|string',
'password' => 'required|string',
], $messages);
}
}
HomeКонтроллер
<?php
namespace Leonp5\Limplecms\Http\Controllers;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
return view('limplecms::home');
}
}
auth.php (Конфигурация)
(скопировал стандартный файл и изменил только эту строчку)
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => Leonp5\Limplecms\Models\User::class,
],
],
config.php
<?php
return [
'admin_index_pages_url' => '/admin/pages',
'prefix' => 'cms',
'middleware' => ['web'],
];
Стандартное приветственное лезвие строительных лесов
(Не думайте, что проблема здесь, потому что ввод 127.0.0.1:8000/login
в адресной строке браузера также перенаправляет. Но кто знает...)
<div class = "relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center sm:pt-0">
@if (Route::has('login'))
<div class = "hidden fixed top-0 right-0 px-6 py-4 sm:block">
@auth
<a href = "{{ url('/home') }}" class = "text-sm text-gray-700 underline">Home</a>
@else
<a href = "{{ route('login') }}" class = "text-sm text-gray-700 underline">Login</a>
@if (Route::has('register'))
<a href = "{{ route('register') }}" class = "ml-4 text-sm text-gray-700 underline">Register</a>
@endif
@endif
</div>
@endif
Код состояния HTTP 302 означает перенаправление, а не код ошибки. Все коды статуса ищите здесь: httpsstatuses.com
Я определяю маршрут к функции входа в систему в LoginController, но функция «вход» не существует в вашем LoginController. А также функции выхода из системы не существует
Спасибо за ваши комментарии @AdamP. @ miken32 :) Я попытался уточнить вопрос. Я предполагаю, что «кнопка входа» не проблема, потому что такое же поведение происходит, когда я просто пытаюсь вызвать страницу через 127.0.0.1:8000/login
. Функции входа и выхода определены в трейте AuthenticatesUsers
, который находится внутри LoginController
. Я думал, что это работает, потому что до Laravel 8 в обычном приложении (не в пакете) это можно было назвать так: Route::get('login', 'Auth\LoginController@login')->name('login')
Благодаря комментарию @Adam P. я попытался определить маршрут в LoginController
для отображения формы входа, и это работает. Итак, внутри LoginController
я добавил этот метод:
public function show()
{
return view('limplecms::auth.login');
}
А внутри web.php
, где определяются маршруты, я изменилсяRoute::get('login', [LoginController::class, 'login'])->name('login');
чтобыRoute::get('login', [LoginController::class, 'show'])->name('login');
Так что же такое «кнопка входа»? По какому URL-адресу он переходит? Какой метод запускается?