[Laravel] scope voor alle models

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 01:15
In bijna elke model heb ik een scope gemaakt die in al die models het zelfde zijn.
Is er een manier om een scope te maken en dat je die in elke model beschikbaar hebt?

Ik heb al op internet gezocht maar ben nog niet tegen gekomen wat ik zocht.

Acties:
  • 0 Henk 'm!

  • kwaakvaak_v2
  • Registratie: Juni 2009
  • Laatst online: 02-06 12:29
Traits?

Driving a cadillac in a fool's parade.


Acties:
  • 0 Henk 'm!

  • Siebsel
  • Registratie: November 2004
  • Laatst online: 12-09 13:20
Of een soort BaseModel waar je scope in staat en de rest op die base extenden. Maar ik denk dat ik ook eerder voor een trait zou gaan :)

Acties:
  • 0 Henk 'm!

  • naam
  • Registratie: Oktober 2007
  • Laatst online: 12-09 13:07
Of een property op de models en injecten uit de IoC? Vanuit een binding naar de IoC als een Singleton, kan je een scope maken die je overal kan gebruiken, en over je hele applicatie gelijk is.

[ Voor 57% gewijzigd door naam op 14-10-2015 18:48 ]


Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
Traits zijn hier inderdaad de goede oplossing voor. Neem een voorbeeld aan de AuthController waar ze "AuthenticatesAndRegistersUsers, ThrottlesLogins" als traits in de controller inladen.

RTFM!


Acties:
  • 0 Henk 'm!

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 21:54
Een trait is in dit geval veruit de meest elegante oplossing. Ook meteen de meest flexibele oplossing: stel dat de scope bijvoorbeeld niet van toepassing is op 1 van je models. Met een trait kun je dan eenvoudig niet usen. Met een base model wordt dit al snel een zooitje.

[ Voor 10% gewijzigd door PatrickH89 op 14-10-2015 19:35 ]


Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 01:15
Zou iemand een voorbeeld kunnen geven hoe ik dit moet doen?
Zelf zou ik niet weten waar ik moet beginnen, ik heb al gekeken op http://php.net/manual/en/language.oop5.traits.php maar kom r niet uit, waar moet ik bijv. het bestand neerzetten en hoe moet die heten.

Acties:
  • 0 Henk 'm!

  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
mbenjamins schreef op woensdag 14 oktober 2015 @ 11:59:
In bijna elke model heb ik een scope gemaakt die in al die models het zelfde zijn.
Is er een manier om een scope te maken en dat je die in elke model beschikbaar hebt?

Ik heb al op internet gezocht maar ben nog niet tegen gekomen wat ik zocht.
Kan je een voorbeeld geven?
Wat probeer je precies te bereiken?

Traits is een oplossing, maar wat moet ik mij voorstellen van het model?
Is het statisch of dynamisch? Kan je hem niet statisch oproepen?
code:
1
2
3
4
5
class MyClass {
      public static function foo() {
          echo 'hello';
      }
}

In andere class kan je hem dan statisch oproepen: MyClass::foo();

[ Voor 23% gewijzigd door HollowGamer op 14-10-2015 22:39 ]


Acties:
  • 0 Henk 'm!

  • _Moe_
  • Registratie: Mei 2006
  • Laatst online: 04-08 14:45
mbenjamins schreef op woensdag 14 oktober 2015 @ 21:40:
Zou iemand een voorbeeld kunnen geven hoe ik dit moet doen?
Zelf zou ik niet weten waar ik moet beginnen, ik heb al gekeken op http://php.net/manual/en/language.oop5.traits.php maar kom r niet uit, waar moet ik bijv. het bestand neerzetten en hoe moet die heten.
Een trait is in principe niet meer dan een uitbreiding van je methods. Daar bij komt nog eens kijken dat je alle methods binnen een trait gemakkelijk voor eender welke class kan gebruiken.

http://www.sitepoint.com/using-traits-in-php-5-4/ geeft je een duidelijk voorbeeld.

RTFM!


Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 12-09 14:37

TheNephilim

Wtfuzzle

Als we het dan over Traits in Laravel hebben; waar laat je ze?

Acties:
  • 0 Henk 'm!

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 21:54
Ik meestal in een Traits namespace binnen de scope van de trait. Bijvoorbeeld, een trait die alleen van toepassing is op een Command stop ik in de Console/Commands/Traits namespace. Laravel zelf doet dit zonder een Traits namespace (bijv. Illuminate\Database\Eloquent\SoftDeletes), dat kan ook mits je naamgeving goed is. Verder kan natuurlijk alles, maar dat is mijn mening :+

Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 01:15
Wat ik wil is een dynamisch scope waar een where in zit van een query, dat ik die in elke model kan gebruiken. De where kan namelijk in meerdere tabellen worden uitgevoerd.

Acties:
  • 0 Henk 'm!

  • Siebsel
  • Registratie: November 2004
  • Laatst online: 12-09 13:20
mbenjamins schreef op donderdag 15 oktober 2015 @ 13:47:
Wat ik wil is een dynamisch scope waar een where in zit van een query, dat ik die in elke model kan gebruiken. De where kan namelijk in meerdere tabellen worden uitgevoerd.
Daar zijn nu toch al verschillende mogelijke oplossingen voor gegeven?

Acties:
  • 0 Henk 'm!

  • PatrickH89
  • Registratie: November 2009
  • Laatst online: 21:54
Maak de scope in een van je models, zorg dat die werkt, knip de method en plak hem in een trait waarna je alleen nog een 'use Trait;' hoeft toe te voegen aan alle models die gebruik moeten maken van die scope?

Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 01:15
Kan ik het gewoon in de zelfde map zetten als de rest van de models met de naam Scope.php? Of kan ik het beste ergens anders neer zetten en anders noemen?

De volgende error krijg ik
code:
1
Trait 'App\Scope' not found


Scope.php staat in de app map.

Mijn Schope.php ziet er als volgt uit
PHP:
1
2
3
4
5
6
7
8
<?php

trait Scope {
    public function scopeShare()
    {
        return 'Test';
    }
}


In de model heb ik het volgende gezet.
PHP:
1
use Scope;

[ Voor 52% gewijzigd door mbenjamins op 15-10-2015 17:07 ]


Acties:
  • 0 Henk 'm!

  • TJVB
  • Registratie: Januari 2008
  • Laatst online: 10-09 10:37
Je mist de namespace declaratie in je Scope.php (ik gok dat je bestand Scope.php en niet Schope.php heet)

code:
1
2
3
4
5
6
7
8
9
10
<?php

namespace App;

trait Scope {
    public function scopeShare()
    {
        return 'Test';
    }
}

Acties:
  • 0 Henk 'm!

  • HollowGamer
  • Registratie: Februari 2009
  • Niet online
mbenjamins schreef op donderdag 15 oktober 2015 @ 13:47:
Wat ik wil is een dynamisch scope waar een where in zit van een query, dat ik die in elke model kan gebruiken. De where kan namelijk in meerdere tabellen worden uitgevoerd.
Begrijp ik het goed dat het gegevens uit een of meerdere (SQL) tabellen haalt?

Hoewel trait een oplossing is, ben ik niet zo'n fan om van alles een trait optie te maken.
Wat is er mis met bijvoorbeeld een simple Core of DB class, die een methode heeft om iets uit een tabel te halen? De class injecteer je vervolgens weer in een andere class.

Kan iemand mij uitleggen wat nu het voordeel is van een trait t.o.v. een DI of Pimple (vergelijkbaar systeem)?

Acties:
  • 0 Henk 'm!

  • mbenjamins
  • Registratie: December 2012
  • Laatst online: 01:15
Ik probeer deze scope nu aan te roepen in Twig maar daar werkt het niet als ik het in PHP test doet die het wel. Of kun je geen model gebruiken in Twig?

Acties:
  • 0 Henk 'm!

  • Siebsel
  • Registratie: November 2004
  • Laatst online: 12-09 13:20
HollowGamer schreef op donderdag 15 oktober 2015 @ 18:03:
[...]

Begrijp ik het goed dat het gegevens uit een of meerdere (SQL) tabellen haalt?

Hoewel trait een oplossing is, ben ik niet zo'n fan om van alles een trait optie te maken.
Wat is er mis met bijvoorbeeld een simple Core of DB class, die een methode heeft om iets uit een tabel te halen? De class injecteer je vervolgens weer in een andere class.

Kan iemand mij uitleggen wat nu het voordeel is van een trait t.o.v. een DI of Pimple (vergelijkbaar systeem)?
Dan is het alles of niets (of je extend je models op verschillende 'base' classes, wat ook niet veel overzichtelijker wordt). Met zo'n trait kun je zelf bepalen 'nu wil ik die method available hebben'. Helemaal als je meerdere scopes gaat krijgen die je in verschillende models wil gebruiken, maar door elkaar (bijv. model 1 gebruikt scope a,b,c, model 2 gebruikt scope a,b en model 3 gebruikt alleen scope a)
mbenjamins schreef op donderdag 15 oktober 2015 @ 23:05:
Ik probeer deze scope nu aan te roepen in Twig maar daar werkt het niet als ik het in PHP test doet die het wel. Of kun je geen model gebruiken in Twig?
Volgens mij niet. Twig ondersteund (als ik het goed heb), in tegenstelling tot blade, geen PHP (behalve de ingebouwde functies (echo, lussen, etc.). http://stackoverflow.com/.../use-php-function-in-twig
Pagina: 1