域路由错误 Laravel 中缺少必需的参数

Posted

技术标签:

【中文标题】域路由错误 Laravel 中缺少必需的参数【英文标题】:Domain Routing error Missing required parameters in Laravel 【发布时间】:2019-05-09 04:39:37 【问题描述】:

我的项目遇到问题。我在 laravel 中创建域路由。但是当我进入登录页面路由时显示错误

Missing required parameters for [Route: admin.login.submit] [URI: login]. 

这是我的路线

Route::domain(env('APP_DOMAIN_URL'))->group(function () 
    Route::any('/', function() 
        return 'Site is under development';
    );
);

Route::domain('subdomain.' . env('APP_DOMAIN_URL'))->group(function () 

    Route::group(['namespace' => 'backend'], function() 
        Route::get('login', 'AdminLoginController@showLogin')->name('admin.login');
        Route::post('login', 'AdminLoginController@login')->name('admin.login.submit');
        Route::get('/', 'AdminController@dashboard')->name('admin.dashboard');
        Route::get('logout', 'AdminLoginController@logout')->name('admin.logout');

    );
);

我在Controller中的登录方法代码是

    <?php

namespace App\Http\Controllers\backend;

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AdminLoginController extends Controller 

    public function __construct() 
        $this->middleware('guest:admin', ['except' => ['logout']]);
    

    public function showLogin() 
        return view('backend.login');
    

    public function login(Request $request) 
        // Validate the form data
        $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required'
        ]);

        // Attempt to log the user in
        if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password, 'status' => 1], $request->remember)) 
            // if successful, then redirect to their intended location
            return redirect()->intended(route('admin.dashboard'));
        

        // if unsuccessful, then redirect back to the login with the form data
        $errors = ['email' => trans('auth.failed')];
        return redirect()->back()->withInput($request->only('email', 'remember'))->withErrors($errors);
    

    public function logout()         
        return redirect()->route('admin.dashboard');
    


我的刀片文件是

<div class="login-box-body">
    <p class="login-box-msg">Sign in to start your session</p>
    @include('backend.include.login_error')
    @include('backend.include.flashMessage')
    <form action=" route('admin.login.submit') " method="post">
         csrf_field() 
        <div class="form-group has-feedback">
            <input id="email" type="email" class="form-control" name="email" value=" old('email') " required autofocus placeholder="Email">
            <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
        </div>
        <div class="form-group has-feedback">
            <input id="password" type="password" class="form-control" name="password" required placeholder="Password">
            <span class="glyphicon glyphicon-lock form-control-feedback"></span>
        </div>
        <div class="row">
            <div class="col-xs-8">
                <div class="checkbox icheck">
                    <label>
                        <input type="checkbox" name="remember"  old('remember') ? 'checked' : ''> Remember Me
                    </label>
                </div>
            </div>
            <!-- /.col -->
            <div class="col-xs-4">
                <button type="submit" class="btn btn-success btn-block btn-flat">Sign In</button>
            </div>
            <!-- /.col -->
        </div>
    </form>

</div>

如果用户没有登录到子域的登录页面,还有什么方法可以重定向。

我正在使用 Laravel 5.7

我的错误信息

提前致谢

【问题讨论】:

我得到了你的答案,但我需要你的方法控制器来处理你的 post 路由,因为你要解决的主要错误是由该方法触发的,而不是你添加到回答。继续,您可以编辑答案并从您的控制器中添加login 方法吗? @DiogoSanto 我更新了我的问题。请看一下 【参考方案1】:

对于您的最后一个问题,to redirect users when logged or not, you can make use of theAuth 中间件`:

Route::group(['middleware' => ['auth']], function() 
    //Only Auth routes that you wish to allow, if user is authenticated
);

如果你想强制,你也可以在你的路由顶部实施检查:

if (Auth::guest()) 
   return redirect('login');

至于您的登录路径,我会这样做以帮助减少代码并分离您method中的逻辑:

在您的 laravel 项目的根文件夹,在您的 CMD 中运行以下命令:

php artisan make:request LoginRequest

这将在app/Http/Requests 创建一个新的Class

在这个类中添加你的验证,所以当路由和 POST 记录你的方法时,验证已经被触发:

LoginRequest 类

public function autorize()

    if (Auth::check()) 
        return false; //User already logged in, no point in going through this again
    
    return true; //It is a guest so lets approve it


public function rules()

    return [
        'email'    => 'required|email|users:unique',
        'password' => 'required'
    ];


public function messages()

    return [
        'email.required' => 'You need to add an email to login.',
        'email.email'    => 'The information provided does not seem to be an email.',
        ...
    ];

您在控制器上的登录方式

public function login(LoginRequest $request)

    // You can remove the first lines that do the validation as this is triggered before arriving to the method now!
    ....

如果使用多个域

前往您的config/app.php 并在base_domain 键下方添加您需要的其他域:

return [

   'base_domain' => env('APP_BASE_DOMAIN'),
    ...
];

从这里你必须让 Laravel 知道你的意图。有几个步骤可以遵循,还有一些方法可以更好地组织代码。我推荐this tutorial 来帮助你在你的 laravel 应用中设置子域!

【讨论】:

已经在使用代码了。如果我不使用域路由,则此代码有效。但是当我使用域路由时,这个代码不起作用 现在看看! :) @HabibHassan 试试我的解决方案,看看它是否仍然会给你带来问题【参考方案2】:

尝试将子域作为参数添加到路由助手方法中,例如:

<form 
    action=" route('admin.login.submit', ['subdomain' => 'admin']) " 
    method="post">

【讨论】:

是否需要在所有路由中添加子域。这非常耗时。有没有别的办法 代替 subdomain 作为参数,您可以在其他地方设置它,例如使用会话或配置变量或其他逻辑并将其插入到您的路由文件中。 我该怎么做?我的子域也不同。 Route::domain($subdomain. ' . env('APP_DOMAIN_URL'))-&gt;group 其中$subdomain 可以根据会话变量或其他值设置,具体取决于您何时需要哪个子域。如果设置变量太复杂,我会使用参数并在每条路线上手动设置。

以上是关于域路由错误 Laravel 中缺少必需的参数的主要内容,如果未能解决你的问题,请参考以下文章

启动路由器时出现意外错误:错误:缺少必需的参数“catchAll”

缺少必需的参数(laravel 8.8.0)

Laravel 8:[路线:students.update]缺少必需的参数

Laravel 错误:缺少路由所需的参数

Laravel中缺少路由所需的参数[重复]

Cloudinary\Error:缺少必需的参数 - 文件