[PHP][Laravel] Model default waarde

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 05:22
Mijn vraag
Een applicatie die ik aan het bouwen ben komt content in te staan die ik geëncrypt wil hebben.
Ook als de content leeg is wil ik wel dat die geëncrypt wordt, zodat als je in de database kijkt niet kunt zien wat gevuld is en wat leeg is.

Wie kan mij hiermee helpen?

Wat ik al gevonden of geprobeerd heb
De onderstaande codes heb ik al geprobeerd.
Maar bij alle 3 krijg ik een error.
PHP:
1
2
3
protected $attributes = [
   'content' => encrypt('')
];


De error die ik krijg.
code:
1
syntax error, unexpected '(', expecting ']'


PHP:
1
$attributes['content'] = encrypt('');


De error die ik krijg.
code:
1
syntax error, unexpected '$attributes' (T_VARIABLE), expecting function (T_FUNCTION)


PHP:
1
$this->attributes['content'] = encrypt('');


De error die ik krijg.
code:
1
syntax error, unexpected '$this' (T_VARIABLE), expecting function (T_FUNCTION)

[ Voor 26% gewijzigd door mbenjamins op 17-04-2017 22:20 ]

Beste antwoord (via mbenjamins op 26-04-2017 23:11)


  • gybrus
  • Registratie: Juli 2008
  • Laatst online: 04-09 09:27
Prima oplossing, al ben ik voor deze use-case van mening dat de observers een beetje 'overdreven' zijn.
Je kan alles namelijk super compact binnen het model houden.

Hiermee maak je het model en de classes minder afhankelijk en kun je deze eenvoudig vervangen, maar laten we daar verder geen discussie over voeren daar heeft iedereen weer een eigen mening over.. :P

Wat wel een voordeel kan zijn met deze opzet. Je kan met wat kleine aanpassingen hier een Trait van maken en zo dit als een generiek stuk code aanleveren in verschillende models.
Je zou dan ervoor kunnen kiezen om een extra property in het model aan te maken waar alle 'te encrypte' velden in staan. http://php.net/manual/en/language.oop5.traits.php

Hier in alvast een voorbeeld hoe het met een 'content' veld zou kunnen werken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php namespace App\Http;

use Illuminate\Database\Eloquent\Model;

class ExampleModel extends Model
{
    /**
     * @var string
     */
    protected $table = 'crypt';

    /**
     * @var array
     */
    protected $fillable = ['content'];

    /**
     * The "booting" method of the model.
     *
     * We'll use this method to register event listeners.
     *
     * Events:
     * 1. "creating": We ensure content is filled with an empty string when the content isn't set.
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            if (! isset($model->attributes['content'])) {
                // setAttribute uses the accesors and mutators defined below.
                // The empty string will actually be encrypted during save.
                $model->setAttribute('content', '');
            }
        });
    }

    /**
     * Get and decrypt content attribute.
     * 
     * @param  string  $value 
     * @return string 
     */
    public function getContentAttribute($value)
    {
        return decrypt($value);
    }

    /**
     * Set and encrypt content attribute.
     * 
     * @param  string  $value
     * @return void
     */
    public function setContentAttribute($value)
    {
        $this->attributes['content'] = encrypt($value);
    }
}

KEVIN DIERKX | DISTORTED FUSION | GITHUB

Alle reacties


Acties:
  • 0 Henk 'm!

  • johanmulder
  • Registratie: Augustus 2002
  • Laatst online: 20-09 17:16

johanmulder

Nederlands Ondertiteld

Waarschijnlijk is de secret verplicht, dus je zou kunnen werken met een dummy value.

Werkt met: Apple Macbook Pro 16" | Bouwt: Multi-cloud SaaS-oplossingen | Vader | Wereldreiziger | Rijdt: Mercedes GLC


Acties:
  • 0 Henk 'm!

  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 00:29

xleeuwx

developer Tweakers Elect
johanmulder schreef op maandag 17 april 2017 @ 20:43:
Waarschijnlijk is de secret verplicht, dus je zou kunnen werken met een dummy value.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
if (! function_exists('encrypt')) {
    /**
     * Encrypt the given value.
     *
     * @param  string  $value
     * @return string
     */
    function encrypt($value)
    {
        return app('encrypter')->encrypt($value);
    }
}

Documentatie:
https://laravel.com/api/5...Encryption/Encrypter.html

Zoals johanmulder terecht zegt is het verplicht om de param mee te geven. Echter is een lege value ook een waarde en dus is je code goed.

Ik ben dan dus ook benieuwd wat je error is, en zou volgende keer fijn zijn als je die er gelijk bij laat zien.

Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 05:22
In de starttopic heb ik nu de errors ingezet.

Acties:
  • 0 Henk 'm!

  • xleeuwx
  • Registratie: Oktober 2009
  • Laatst online: 00:29

xleeuwx

developer Tweakers Elect
mbenjamins schreef op maandag 17 april 2017 @ 22:12:
In de starttopic heb ik nu de errors ingezet.
Lijkt er meer op dat je error van boven komt en niet de regel die jij hier neerzet.

Zou je de gehele code kunnen laten zien ?

Acties:
  • +4 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Je code klopt niet omdat je functies gebruikt bij het definieren van de variabelen.
Als beginner zou ik eerst leren hoe objecten programmeren werkt en de __construct()

[ Voor 34% gewijzigd door DJMaze op 17-04-2017 22:25 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-10 15:13

TheNephilim

Wtfuzzle

Je zoekt denk ik naar accessors en mutators in Laravel: https://laravel.com/docs/...rs#accessors-and-mutators.

PHP:
1
2
3
4
public function setContentAttribute($value)
{
    $this->attributes['content'] = encrypt($value);
}


PHP:
1
2
3
4
public function getContentAttribute($value)
{
    return decrypt($value);
}

Acties:
  • 0 Henk 'm!

  • gybrus
  • Registratie: Juli 2008
  • Laatst online: 04-09 09:27
Een combinatie van het geen wat TheNephilim meld en event listeners zou voldoende moeten zijn:

https://laravel.com/docs/...rs#accessors-and-mutators
https://laravel.com/docs/5.4/eloquent#events

Je gebruikte de accessors en mutators wanneer er data in en uit het model gehaald wordt en bij nieuwe models kun je middels het creating event er voor zorgen dat de data een 'default' krijgt wanneer deze niet is meegegeven. Maakt het wel zo makkelijk.

Dat attributes veld zou ik met rust laten gezien deze samen met $original heftig wordt gebruikt tijdens het ophalen en muteren van data.

KEVIN DIERKX | DISTORTED FUSION | GITHUB


Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 05:22
gybrus schreef op donderdag 20 april 2017 @ 20:06:
Een combinatie van het geen wat TheNephilim meld en event listeners zou voldoende moeten zijn:

https://laravel.com/docs/...rs#accessors-and-mutators
https://laravel.com/docs/5.4/eloquent#events

Je gebruikte de accessors en mutators wanneer er data in en uit het model gehaald wordt en bij nieuwe models kun je middels het creating event er voor zorgen dat de data een 'default' krijgt wanneer deze niet is meegegeven. Maakt het wel zo makkelijk.

Dat attributes veld zou ik met rust laten gezien deze samen met $original heftig wordt gebruikt tijdens het ophalen en muteren van data.
Het is nu de eerste keer dat ik met events heb gewerkt, hieronder wat ik gedaan heb.
Zou je er naar willen kijken als het zo goed is gedaan? Het werkt wel.

In EventServiceProvider heb ik $listen aangepast naar
PHP:
1
2
3
4
5
protected $listen = [
    'App\Events\ContentCreating' => [
        'App\Listeners\ContentEventListener',
    ],
];


Toen heb ik de volgende commando uitgevoerd.
code:
1
php artisan event:generate


In de model Content heb ik het volgende toegevoegd

PHP:
1
2
3
protected $events = [
    'creating' => ContentCreating::class,
];


De ContentCreating ziet er als volgt uit
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class ContentCreating
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $content;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($content)
    {
        $this->content = $content;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}


De ContentEventListener ziet er als volgt uit
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class ContentEventListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  ContentCreating  $event
     * @return void
     */
    public function handle(ContentCreating $event)
    {
        $event->content->content = '';
    }
}

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • gybrus
  • Registratie: Juli 2008
  • Laatst online: 04-09 09:27
Prima oplossing, al ben ik voor deze use-case van mening dat de observers een beetje 'overdreven' zijn.
Je kan alles namelijk super compact binnen het model houden.

Hiermee maak je het model en de classes minder afhankelijk en kun je deze eenvoudig vervangen, maar laten we daar verder geen discussie over voeren daar heeft iedereen weer een eigen mening over.. :P

Wat wel een voordeel kan zijn met deze opzet. Je kan met wat kleine aanpassingen hier een Trait van maken en zo dit als een generiek stuk code aanleveren in verschillende models.
Je zou dan ervoor kunnen kiezen om een extra property in het model aan te maken waar alle 'te encrypte' velden in staan. http://php.net/manual/en/language.oop5.traits.php

Hier in alvast een voorbeeld hoe het met een 'content' veld zou kunnen werken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php namespace App\Http;

use Illuminate\Database\Eloquent\Model;

class ExampleModel extends Model
{
    /**
     * @var string
     */
    protected $table = 'crypt';

    /**
     * @var array
     */
    protected $fillable = ['content'];

    /**
     * The "booting" method of the model.
     *
     * We'll use this method to register event listeners.
     *
     * Events:
     * 1. "creating": We ensure content is filled with an empty string when the content isn't set.
     */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            if (! isset($model->attributes['content'])) {
                // setAttribute uses the accesors and mutators defined below.
                // The empty string will actually be encrypted during save.
                $model->setAttribute('content', '');
            }
        });
    }

    /**
     * Get and decrypt content attribute.
     * 
     * @param  string  $value 
     * @return string 
     */
    public function getContentAttribute($value)
    {
        return decrypt($value);
    }

    /**
     * Set and encrypt content attribute.
     * 
     * @param  string  $value
     * @return void
     */
    public function setContentAttribute($value)
    {
        $this->attributes['content'] = encrypt($value);
    }
}

KEVIN DIERKX | DISTORTED FUSION | GITHUB

Pagina: 1