如何在背包-laravel 的注册表单中添加更多字段?

Posted

技术标签:

【中文标题】如何在背包-laravel 的注册表单中添加更多字段?【英文标题】:How to add more fields to the Register form of backpack-laravel? 【发布时间】:2020-10-23 03:15:48 【问题描述】:

我尝试在背包-laravel的Register表单中添加更多字段,但是找不到Controller。

我遵循了文档:https://backpackforlaravel.com/docs/4.1/base-how-to#add-one-or-more-fields-to-the-register-form

这是我写进我的 routes/backpack/custom.php 的内容:

Route::get('admin/register', 'App\Http\Controllers\Admin\Auth\RegisterController')->name('backpack.auth.register');

我的注册控制器如下所示:

<?php

namespace App\Http\Controllers\Admin\Auth;

use Backpack\CRUD\app\Http\Controllers\Auth\RegisterController as BackpackRegisterController;

class RegisterController extends BackpackRegisterController

    /**
     * Get a validator for an incoming registration request.
     *
     * @param array $data
     *
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    
        $user_model_fqn = config('backpack.base.user_model_fqn');
        $user = new $user_model_fqn();
        $users_table = $user->getTable();
        $email_validation = backpack_authentication_column() == 'email' ? 'email|' : '';

        return Validator::make($data, [
            'first_name'                       => 'required|max:255',
            'last_name'                        => 'required|max:255',
            backpack_authentication_column()   => 'required|'.$email_validation.'max:255|unique:'.$users_table,
            'password'                         => 'required|min:6|confirmed',
        ]);
    

    /**
     * Create a new user instance after a valid registration.
     *
     * @param array $data
     *
     * @return User
     */
    protected function create(array $data)
    
        $user_model_fqn = config('backpack.base.user_model_fqn');
        $user = new $user_model_fqn();

        return $user->create([
            'first_name'                       => $data['first_name'],
            'last_name'                        => $data['last_name'],
            backpack_authentication_column()   => $data[backpack_authentication_column()],
            'password'                         => bcrypt($data['password']),
        ]);
    

我总是得到错误:

 UnexpectedValueException 

  Invalid route action: [App\Http\Controllers\Admin\Auth\RegisterController].

  at vendor/laravel/framework/src/Illuminate/Routing/RouteAction.php:91
    87|      */
    88|     protected static function makeInvokable($action)
    89|     
    90|         if (! method_exists($action, '__invoke')) 
  > 91|             throw new UnexpectedValueException("Invalid route action: [$action].");
    92|         
    93| 
    94|         return $action.'@__invoke';
    95|     

  • `App\Http\Controllers\Admin\Auth\RegisterController` was not found: Controller class `App\Http\Controllers\Admin\Auth\RegisterController` for one of your routes was not found. Are you sure this controller exists and is imported correctly? 

      +8 vendor frames 
  9   routes/backpack/custom.php:8
      Illuminate\Support\Facades\Facade::__callStatic("get")

      +11 vendor frames 
  21  [internal]:0
      Illuminate\Foundation\Application::Illuminate\Foundation\closure(Object(Backpack\CRUD\BackpackServiceProvider))

有人知道我能做什么吗?

【问题讨论】:

您能否尝试在项目的根目录中运行composer install。可能尚未自动加载新文件。 【参考方案1】:

试试这个:

use App\Http\Controllers\Admin\Auth\RegisterController;

Route::get('admin/register', [RegisterController::class, 'showRegistrationForm'])->name('backpack.auth.register');

要处理表单 POST,您还需要添加:

Route::post('admin/register', [RegisterController::class, 'register'])->name('backpack.auth.register');

此解决方案基于另一种格式来创建此处记录的路线:

https://laravel.com/docs/8.x/routing

在该页面上,您可以找到以下示例,我的解决方案基于该示例:

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);

【讨论】:

【参考方案2】:

感谢您的发言。但是,有必要放更多的东西。如下面的代码所示。所以它对我有用。

//routes
Route::group(['middleware' => [config('backpack.base.web_middleware', 'web')]], function () 
    //routes here
    Route::get('admin/register', 'App\Http\Controllers\Admin\Auth\RegisterController@showRegistrationForm')->name('backpack.auth.register');
    Route::post('admin/register', 'App\Http\Controllers\Admin\Auth\RegisterController@register');
);
Route::group([
    'prefix'     => config('backpack.base.route_prefix', 'admin'),
    'middleware' => array_merge(
        (array) config('backpack.base.web_middleware', 'web'),
        (array) config('backpack.base.middleware_key', 'admin')
    ),
    'namespace'  => 'App\Http\Controllers\Admin',
], function ()  // custom admin routes
    Route::crud('tag', 'TagCrudController');
    //your codes CRUDs
); // this should be the absolute last line of this file

控制器站在文件夹中 App\Http\Controllers\Admin\Auth\RegisterController

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Models\Pessoa;
use Backpack\CRUD\app\Library\Auth\RegistersUsers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Validator;

class RegisterController extends Controller

    protected $data = []; // the information we send to the view

    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */
    use RegistersUsers;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    
        $guard = backpack_guard_name();

        $this->middleware("guest:$guard");

        // Where to redirect users after login / registration.
        $this->redirectTo = property_exists($this, 'redirectTo') ? $this->redirectTo
            : config('backpack.base.route_prefix', 'dashboard');
    

    /**
     * Get a validator for an incoming registration request.
     *
     * @param array $data
     *
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    
        $user_model_fqn = config('backpack.base.user_model_fqn');
        $user = new $user_model_fqn();
        $users_table = $user->getTable();
        $email_validation = backpack_authentication_column() == 'email' ? 'email|' : '';

        return Validator::make(
            $data,
            [
                'name'                             => 'required|max:100',
                'cpf'                              => 'required|min:11|max:14',
                backpack_authentication_column()   => 'required|' . $email_validation . 'max:255|unique:' . $users_table,
                'password'                         => 'required|min:6|confirmed',
            ],
            [
                'name.required' => 'O nome é obrigatório', // custom message
                'cpf.min' => 'O CPF tem que ter no mínimo 11 caracteres e no máximo 14', // custom message
                'cpf.max' => 'O CPF tem que ter no mínimo 11 caracteres e no máximo 14', // custom message
                'cpf.required' => 'O CPF é obritagorio',
                'email.required' => 'E-mail é obrigatório ',
                'email.unique' => 'O email já foi registrado.',
                'password.confirmed' => 'A confirmação da senha não corresponde.', //password
            ]
        );
    

    /**
     * Create a new user instance after a valid registration.
     *
     * @param array $data
     *
     * @return User
     */
    protected function create(array $data)
    
        $user_model_fqn = config('backpack.base.user_model_fqn');
        $user = new $user_model_fqn();

        return $user->create([
            'name'                             => $data['name'],
            'cpf'                              => $data['cpf'],
            'pessoa_id'                        => $data['pessoa_id'],
            backpack_authentication_column()   => $data[backpack_authentication_column()],
            'password'                         => bcrypt($data['password']),
        ]);
    

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistrationForm()
    
        // if registration is closed, deny access
        if (!config('backpack.base.registration_open')) 
            abort(403, trans('backpack::base.registration_closed'));
        
        //   $this->data['title'] = trans('backpack::base.register'); // set the page title
        //   $this->data['title'] = "Registrar Usuário"; // set the page title

        return view(backpack_view('auth.register'));
        // return view(backpack_view('auth.register'), $this->data);
    

    /**
     * Handle a registration request for the application.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    
        // if registration is closed, deny access
        if (!config('backpack.base.registration_open')) 
            abort(403, trans('backpack::base.registration_closed'));
        

        $requestData = $request->all();

        $this->validator($requestData)->validate();

        $objPessoa = new Pessoa();
        $objPessoa->nome = $request->name;
        $objPessoa->email = $request->email;
        $objPessoa->cpf = $request->cpf;
        $objPessoa->save();

        $requestData['pessoa_id'] = $objPessoa->id;

        $user = $this->create($requestData);

        event(new Registered($user));
        $this->guard()->login($user);

        return redirect($this->redirectPath());
    

    /**
     * Get the guard to be used during registration.
     *
     * @return \Illuminate\Contracts\Auth\StatefulGuard
     */
    protected function guard()
    
        return backpack_auth();
    


而布兰德留在了 resources\views\vendor\backpack\base\auth\register.blade.php

@extends(backpack_view('layouts.plain'))

@section('content')
    <div class="row justify-content-center">
        <div class="col-12 col-md-8 col-lg-4">
            <h3 class="text-center mb-4"> trans('backpack::base.register') </h3>
            <div class="card">
                <div class="card-body">
                    <form class="col-md-12 p-t-10" role="form" method="POST"
                        action=" route('backpack.auth.register') ">
                        !! csrf_field() !!

                        <div class="form-group">
                            <label class="control-label" for="name"> trans('backpack::base.name') </label>
                            <div>
                                <input type="text" class="form-control $errors->has('name') ? ' is-invalid' : '' "
                                    name="name" id="name" value=" old('name') ">
                                @if ($errors->has('name'))
                                    <span class="invalid-feedback">
                                        <strong> $errors->first('name') </strong>
                                    </span>
                                @endif
                            </div>
                        </div>
                        <div class="form-group">
                            <label class="control-label" for="name">CPF</label>

                            <div>
                                <input type="text" class="form-control $errors->has('cpf') ? ' is-invalid' : '' "
                                    name="cpf" id="cpf" value=" old('cpf') " placeholder="000.000.000-00">
                                @if ($errors->has('cpf'))
                                    <span class="invalid-feedback">
                                        <strong> $errors->first('cpf') </strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group">
                            <label class="control-label"
                                for=" backpack_authentication_column() "> config('backpack.base.authentication_column_name') </label>

                            <div>
                                <input type=" backpack_authentication_column() == 'email' ? 'email' : 'text' "
                                    class="form-control $errors->has(backpack_authentication_column()) ? ' is-invalid' : '' "
                                    name=" backpack_authentication_column() "
                                    id=" backpack_authentication_column() "
                                    value=" old(backpack_authentication_column()) ">

                                @if ($errors->has(backpack_authentication_column()))
                                    <span class="invalid-feedback">
                                        <strong> $errors->first(backpack_authentication_column()) </strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group">
                            <label class="control-label" for="password"> trans('backpack::base.password') </label>

                            <div>
                                <input type="password"
                                    class="form-control $errors->has('password') ? ' is-invalid' : '' "
                                    name="password" id="password">

                                @if ($errors->has('password'))
                                    <span class="invalid-feedback">
                                        <strong> $errors->first('password') </strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group">
                            <label class="control-label"
                                for="password_confirmation"> trans('backpack::base.confirm_password') </label>

                            <div>
                                <input type="password"
                                    class="form-control $errors->has('password_confirmation') ? ' is-invalid' : '' "
                                    name="password_confirmation" id="password_confirmation">

                                @if ($errors->has('password_confirmation'))
                                    <span class="invalid-feedback">
                                        <strong> $errors->first('password_confirmation') </strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group">
                            <div>
                                <button type="submit" class="btn btn-block btn-primary">
                                     trans('backpack::base.register') 
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
            @if (backpack_users_have_email() && config('backpack.base.setup_password_recovery_routes', true))
                <div class="text-center"><a
                        href=" route('backpack.auth.password.reset') "> trans('backpack::base.forgot_your_password') </a>
                </div>
            @endif
            <div class="text-center"><a
                    href=" route('backpack.auth.login') "> trans('backpack::base.login') </a></div>
        </div>
    </div>
@endsection

【讨论】:

以上是关于如何在背包-laravel 的注册表单中添加更多字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中禁用注册新用户

表单在 laravel 7 中不起作用,啥也没发生

Laravel 表单请求动态字段在重定向时消失

如何在laravel背包中启用软删除

我如何传递从另一个模型获取的角色数组以在 laravel 中注册表单

如何将 url 中的参数传递给背包创建表单