Quiero preguntar sobre el error "Muy pocos argumentos para funcionar Illuminate \ Database \ Eloquent \ Model :: setAttribute (), 1 pasado"

Intento registrar usuarios, uso php artisan make: auth para construir mi autenticación. Pero agrego un campo en la migración de usuarios. y trato de usar uuid. este es mi código:

Modelo de usuario

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Traits\Uuids;
class User extends Authenticatable
{
use Notifiable;
use Uuids;
/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $guarded = ['id'];
protected $table = 'users';
protected $fillable = [
    'name', 'email', 'password','phone_number',
];


/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];
}

Registrar controlador

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| 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;

/**
 * Where to redirect users after registration.
 *
 * @var string
 */
protected $redirectTo = '/home';

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('guest');
}

/**
 * Get a validator for an incoming registration request.
 *
 * @param  array  $data
 * @return \Illuminate\Contracts\Validation\Validator
 */
protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'phone' => 'required|numeric|min:8',
        'password' => 'required|string|min:6|confirmed',
        'password_confirmation' => 'required|same:password',
    ]);
}

/**
 * Create a new user instance after a valid registration.
 *
 * @param  array  $data
 * @return \App\User
 */
protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'phone_number' => $data['phone'],
        'password' => Hash::make($data['password']),
    ]);
}


}

Migración de usuarios

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->uuid('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->integer('phone_number');
        $table->rememberToken();
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('users');
}
}

Rasgo de Uuids

<?php
namespace App\Traits;

trait Uuids 
{
/**
 * 
 */
protected static function boot()
{
    parent::boot();
    static::creating(function ($model) {
        $model->{$model->uuid} = 
        str_replace('-', '', \Uuid::generate(4)->string);
    });
}
}

Por favor dame consejos. Gracias.

0
andri purnama 16 oct. 2018 a las 19:54

2 respuestas

La mejor respuesta

No puedo encontrar ninguna referencia sobre la propiedad o propiedad mágica que escribió a continuación (como un método getUuidAttribute por ejemplo)

$model->{$model->uuid} = str_replace('-', '', \Uuid::generate(4)->string);

Entonces, supongo que el código anterior se compilaría como

$model->{null} = str_replace('-', '', \Uuid::generate(4)->string);

Supongo que está buscando $model->id que tiene el tipo de columna de base de datos como uuid. Pero, obviamente, no puede tener un nombre de columna de base de datos dinámica, ya que está mal en absoluto. Ejemplo de columna dinámica si su fragmento funciona correctamente

$model->'6b324d55-433c-455a-88b6-feb2ee6c3709' = 'c3bec822-e5ee-4d91-b1a3-f5f552fd004a';

Algo no está bien, ¿verdad? Sería mejor si tuviera este aspecto.

$model->id = 'c3bec822-e5ee-4d91-b1a3-f5f552fd004a';

Y, por supuesto, haga que su último fragmento sea el siguiente

<?php
namespace App\Traits;

trait Uuids {

    // to make model run this 'boot' method, append it with your trait name
    protected static function bootUuids() { // <-- bootUuids
        // parent::boot();

        static::creating(function ($model) {
            $model->id = str_replace('-', '', \Uuid::generate(4)->string);
        });
    }
}
0
Chay22 16 oct. 2018 a las 17:15

Este error se debe a lo siguiente

$data = ['user_id' => 1,'content' => 'content'];
$data = User::create($data);

En esta condición, este error ocurre si nuestro nombre de variable de matriz es data y create $ data = User :: create ($ data); Si los datos de aquí en adelante crean el objeto de datos de retorno de laravel y luego ambos datos se vuelven ambiguos, arroja un error.

1
Pawan Kumar 30 jul. 2019 a las 18:00