如何在背包-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 的注册表单中添加更多字段?的主要内容,如果未能解决你的问题,请参考以下文章