#laravel #laravel-fortify
Вопрос:
Мне нужно изменить /vendor/laravel/fortify/src/Contracts/CreatesNewUsers.php интерфейс и добавить еще 1 параметр bool, так как при использовании createNewUser в разных местах правила проверки приложений разные, скажем, в некоторых местах пароль не заполняется при создании пользователя, но должен быть отдельной функцией.
Поэтому я скопировал файл /project/resources/fortify/CreatesNewUsers.php с содержанием :
lt;?php namespace LaravelFortifyContracts; interface CreatesNewUsers { public function create(array $input, bool $makeValidation); }
и в app/Actions/Fortify/CreateNewUser.php Я изменил :
lt;?php namespace AppActionsFortify; use AppModelsUser; use IlluminateSupportFacadesHash; use IlluminateSupportFacadesValidator; //use LaravelFortifyContractsCreatesNewUsers; use ResourcesFortifyCreatesNewUsers; // Reference to my interface use LaravelJetstreamJetstream; class CreateNewUser implements CreatesNewUsers { use PasswordValidationRules; public function create(array $input, bool $makeValidation) { ...
Но при попытке использовать этот класс я получил ошибку
Interface "ResourcesFortifyCreatesNewUsers" not found
Какой путь является правильным ?
Спасибо!
Ответ №1:
Я переместил интерфейс в файл app/Actions/Fortify/CreatesNewUsers.php :
lt;?php namespace AppActionsFortify; interface CreatesNewUsers { public function create(array $input, bool $make_validation, array $hasPermissions); }
и модифицированный app/Actions/Fortify/CreateNewUser.php :
lt;?php namespace AppActionsFortify; use AppModelsUser; use IlluminateDatabaseQueryException; use IlluminateSupportFacadesHash; use IlluminateSupportFacadesValidator; use DB; use AppActionsFortifyCreatesNewUsers; use LaravelJetstreamJetstream; use SpatiePermissionModelsPermission; class CreateNewUser implements CreatesNewUsers { use PasswordValidationRules; /** * Validate and create a newly registered user. * * @param array $input * * @return AppModelsUser */ public function create(array $input, bool $make_validation, array $hasPermissions) { if ($make_validation) { $userValidationRulesArray = User::getUserValidationRulesArray(null, '', []); if (App::runningInConsole()) { unset($userValidationRulesArray['password_2']); } $validator = Validator::make($input, $userValidationRulesArray);//-gt;validate(); if ($validator-gt;fails()) { $errorMsg = $validator-gt;getMessageBag(); if (App::runningInConsole()) { echo '::$errorMsg::' . print_r($errorMsg, true) . 'lt;/pregt;'; } return $errorMsg; } } // if($make_validation) { $newUserData = [ 'name' =gt; $input['name'], 'email' =gt; $input['email'], 'account_type' =gt; $input['account_type'], 'phone' =gt; $input['phone'], 'website' =gt; $input['website'], 'notes' =gt; $input['notes'], 'first_name' =gt; $input['first_name'], 'last_name' =gt; $input['last_name'], ]; if (isset($input['password'])) { $newUserData['password'] = Hash::make($input['password']); } if (isset($input['status'])) { $newUserData['status'] = $input['status']; } if (isset($input['activated_at'])) { $newUserData['activated_at'] = $input['activated_at']; } if (isset($input['avatar'])) { $newUserData['avatar'] = $input['avatar']; } try { DB::beginTransaction(); $newUser = User::create($newUserData); foreach ($hasPermissions as $nextHasPermission) { $appAdminPermission = Permission::findByName($nextHasPermission); if ($appAdminPermission) { $newUser-gt;givePermissionTo($appAdminPermission); } } DB::commit(); return $newUser; } catch (QueryException $e) { DB::rollBack(); if (App::runningInConsole()) { echo '::$e-gt;getMessage()::' . print_r($e-gt;getMessage(), true) . 'lt;/pregt;'; } } return false; } }
Это позволяет мне использовать createNewUser из разных частей приложения, таких как сеялки, область администрирования, регистрация пользователей с различным поведением. Для меня это кажется хорошим способом использования fortify и createNewUser…