2015-06-11 5 views
0

Ill есть проблема, потому что мои мутаторов никогда не дозвонились, когда больные Использовать конструктор:Laravel Мутаторы с конструктором?

Как это:

function __construct() { 
    $this->attributes['guid'] = Uuid::generate(4)->string; 
} 

public function setDateAttribute($date) { 
    dd($date); // Never gets called 
} 

Ill уже выяснил, что мутаторы п будет называться, когда плохо Используйте конструктор, поэтому я должен использовать:

public function __construct(array $attributes = array()){ 
    parent::__construct($attributes); 
    $this->attributes['guid'] = Uuid::generate(4)->string; 
} 

public function setDateAttribute($date) { 
    dd($date); // now its getting called 
} 

Но так плохо получить следующее сообщение об ошибке:

array_key_exists() expects parameter 2 to be array, null given 

Но я не знаю, где? Может ли кто-нибудь помочь мне узнать, как создать значение по умолчанию (например, UUID) для определенного столбца и использовать мутаторы в одном классе?

Edit: Спасибо Martin Bean за вашу помощь, но я теперь получаю следующее сообщение об ошибке:

Cannot declare class App\Uuid because the name is already in use 

Я пробовал:

Создание файла под названием "Uuid.php" в/приложение/-> /app/Uuid.php

С этим содержанием:

<?php namespace App; 

use Webpatser\Uuid\Uuid; 

trait Uuid 
{ 
    public static function bootUuid() 
    { 
     static::creating(function ($model) { 
      $model->uuid = Uuid::generate(4)->string(); 
     }); 
    } 
} 

изменил мою модель на:

<?php namespace App; 
use Carbon\Carbon; 
use Illuminate\Database\Eloquent\Model; 


class Task extends Model { 

    use \App\Uuid; 

Большое спасибо!

Edit 2:

Ill пробовал так:

class Task extends Model { 

    protected $table = 'tasks'; 

    protected $fillable = ['..... 'date', 'guid']; 

    public function setGuidAttribute($first=false){ 
    if($first) $this->attributes['guid'] = Uuid::generate(4)->string; 
} 

TaskController:

public function store() { 

    $input = Request::all(); 
    $input['guid'] = true; 
    Task::create($input); 

    return redirect('/'); 

} 

работает отлично, но когда заболел использование:

public function setDateAttribute(){ 
    $this->attributes['date'] = date('Y-m-d', $date); 
} 

В Task.php больной получает:

Undefined variable: date 
+0

Пожалуйста, почему вы должны использовать конструкцию? Что вы пытаетесь архивировать? – Digitlimit

+0

Я хотел бы установить UUID в конкретный столбец для каждого нового объекта – derdida

+0

Тогда вам не нужен конструктор для этого – Digitlimit

ответ

2

Редакцией:

основан на ваш комментарий:

i would like to set a field on first insert

use Uuid; //please reference the correct namespace to Uuid 

class User extends Model{ 

    protected $fillable = [ 
     'first_name', 
     'email', 
     'guid' //add guid to list of your fillables 
    ] 

    public function setGuidAttribute($first=false){ 
     if($first) $this->attributes['guid'] = Uuid::generate(4)->string; 
    } 
} 

Позже:

$user = User::create([ 
    'guid' => true, //setAttribute will handle this 
    'first_name' => 'Digitlimit', 
    'email" => [email protected] 
]); 

dd($user->guid); 

NB: Вынуть Метод __construct() из года ur model

+0

Спасибо за ваш ответ: Но теперь я получаю ошибку: неопределенный индекс 'date' (но параметр должен быть здесь, если я проверю свой запрос, у меня есть параметр даты) - плохо скопировал мой код на мой вопрос как редактирование. – derdida

+0

удалите это 'protected $ attributes;'. его переписывание некоторых атрибутов – Digitlimit

+0

Спасибо - сделайте это, но функция getGuidAttribute никогда не называется – derdida

0

Мутаторы вызывается при попытке установить свойство модели - они вызываются с помощью магического метода __get. Если вы вручную назначили свойство в методе или конструкторе, то никакие мутаторы никогда не будут вызваны.

Независимо от того, вы не должны создавать конструкторы классов классов Eloquent. Это может помешать тому, как модели Eloquent «загружаются».

Если вам нужно установить UUID на модели, то я предложил бы использовать признак, который имеет свой собственный метод загрузки:

namespace App; 

trait Uuid 
{ 
    public static function bootUuid() 
    { 
     static::creating(function ($model) { 
      $model->uuid = \Vendor\Uuid::generate(4)->string(); 
     }); 
    } 
} 

Вы применить признак к вашей модели ...

class SomeModel extends Model 
{ 
    use \App\Uuid; 
} 

... и теперь каждый раз, когда создается модель, UUID будет сгенерирован и сохранен в базе данных с вашей моделью.

+0

Спасибо за ваш ответ. Я никогда раньше не использовал черты, где я должен их спасти? Как контроллер? В противном случае, я думаю, мне нужно изменить имя или, потому что «UUID уже используется классом UUID»? - Может ли этот признак быть в том же файле класса, или мне нужен новый? – derdida

+0

У вас должен быть только один класс/trait/interface per file (в противном случае автоматическая загрузка не работает). И если вы используете пространства имен, то вполне допустимо, чтобы два класса имели одинаковые имена. Что касается того, где сохранить файл, это зависит от вас. Не сохраняйте его в каталоге контроллера, потому что они не связаны с контроллерами, вы применяете их к моделям. –

Смежные вопросы