Použití anotací – seznam nápadů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bojovyletoun
Člen | 667
+
0
-

Ahoj, chtěl bych toto thread využít jako seznam, na co všechno (i v budoucnosti) se dají použít anotace:

  • persistentní parametry
  • allowed(role=admin)
  • role(admin)
  • Ormion relace
Patrik Votoček
Člen | 2221
+
0
-

<OT>On ještě někdo používá Ormion</OT>

redhead
Člen | 1313
+
0
-
  • cache(expire = 3600, …) nad fcí, která se má cachovat
bojovyletoun
Člen | 667
+
0
-

Já jsem ho jednou použil, chtěl jsem se na něm naučit základy ORM, a na to to stačí. Co je lepší než Orminon?

OT:
vím o těchto ne jen orm
propil
doctrine
notorm
dibi :-
Query2 – minimalistický layer v PHP pro MySQL

h4kuna
Backer | 740
+
0
-

redhead napsal(a):

  • cache(expire = 3600, …) nad fcí, která se má cachovat

to uz funguje nebo teprve bude?

redhead
Člen | 1313
+
0
-

Je to můj nápad, využívám ho ve svém projektu. Nevím o tom, že by měl být přímo v Nette.

jtousek
Člen | 951
+
0
-

redhead: Nápad je to zajímavý, ovšem kdybychom tu všichni začali psát na co používáme anotace ve svých projektech tak by se v tom nikdo nevyznal. :)

Jinak anotace používá naprosto typicky Doctrine 2 (ale má i jiné drivery) nebo třeba validátory ze Symfony, které se chystám použít.

redhead
Člen | 1313
+
0
-

@jtousek: já myslel, že tenhle thread má posloužit jako seznam anotací, které můžeme využít (pro ostatní!). Mám jich víc, ale tenhle mi přijde docela dobrý, využitelný a zlehčující práci.

Filip Procházka
Moderator | 4668
+
0
-

jak pak takovou funkci voláš ?

idea: asi by šlo dát jí modelu jako private a udělat magickou __call() obálku, která by dovolovala metody s anotací @public a @cache(expire= ... , tags= ... ) popř. další nastavení (ted me napadlo @memchache(expire= ... , tags= ... ), volat s patřičnýma obálkama :)

Editoval HosipLan (26. 11. 2010 8:08)

redhead
Člen | 1313
+
0
-

Přesně tak, mám to tak, že ty metody v modelu mají prefix c_ (tedy např. c_getItems()) a na modelu se to volá jako $model->getItems(). Trochu na nic, že to IDE nenapovídá a je to takové nehezké (nad lepším řešením jsem neuvažoval, potřeboval jsem to mít rychle). Všechna magie okolo cachovaní se pak děje v __call().

To s tím private a @public je velmi dobrý nápad! Asi si si to tak přepíšu. Fantastisch!

edit: bere IDE tu @public anotaci v úvahu při napovídání? Protože pak by to byl libový!

Editoval redhead (26. 11. 2010 11:22)

jtousek
Člen | 951
+
0
-

@readhead: Ok v tom případě uvádím jeden z mých nápadů pro definici šablony (jiné než výchozí – např. pokud více akcí používá stejnou).

@template sablona.phtml

EDIT: Jesli IDE bere @public nevím, ale @access public mi Netbeans v úvahu vzalo.

Editoval jtousek (26. 11. 2010 15:10)

Filip Procházka
Moderator | 4668
+
0
-

Bohužel netbeans to nenapovídají, ale není přece problém si je definovat nad třídou pomocí @method

Mám dva nápady jak to udělat:


Container: https://gist.github.com/717009 (není to dodělané, odcházím ven a chtěl jsem nahodit myšlenku k dalšímu rozebírání :P)


Magický __call(): TODO
Funkcionalita podobná jako Object::__call()ObjectMixin::call()

redhead
Člen | 1313
+
0
-

Moje řešení s c_ prefixem metod. Cachuje i volání s jinými argumenty.

public function __call($name, $arguments)
{
    $ref = $this->getReflection()->getMethod('c_'.$name);
    if($ref != null)
    {
        $an = Annotations::get($ref, 'cache');
        $cache = $this->getCache();

        $key = $name;
        if(count($arguments) > 0)
            $key = $name.md5($name.implode('|', $arguments));

        if(!isset($cache[$key])) {
            $result = call_user_func_array(array($this, 'c_'.$name), $arguments);

            $dp = array();
            if($an) {
                foreach($an as $k => $a) {
                    $const = constant('Cache::'.strtoupper($k));
                    if($const)
                        $dp += array($const => $a);
                }
            }
            $cache->save($key, $result, $dp);
        }
        return $cache[$key];
    }
}

edit: Když na to teď koukám, je to nějaké ošklivé.

Editoval redhead (26. 11. 2010 20:27)

Filip Procházka
Moderator | 4668
+
0
-

vidíš to jsem tam chtěl udělat taky, ale už jsem to večer zapoměl dopsat do poznámek .)

Mikulas Dite
Člen | 756
+
0
-

Napovídání by mi chybělo hodně… Takže jsem si to napsal obráceně: https://gist.github.com/717781

Každá metoda je normálně public a zavolatelná. Pokud se zavolá s prefixem (třeba c_), tak se použije cache. Použil jsem něco podobného jako redhead, ale parametry pro klíč serializuju (ten implode by hodil array to string conversion error a ani pro objekty by nefungoval) a víc to využívá reflexe.

Bylo by to mnohem lepší, kdyby se __call volal úplně jako první, ne až když se ta metoda nenajde…

redhead
Člen | 1313
+
0
-

jj, s tím implode je to špatný.. Ale nikde nemám metodu, která přijímá objekt (většinou je to int nebo string..)

Filip Procházka
Moderator | 4668
+
0
-

https://gist.github.com/717009 … trošku jsem to poladil :)

Filip Procházka
Moderator | 4668
+
0
-

Pořád se mi ale nelíbí způsob jakým se to volá, chtělo by to vymyslet něco víc sexy

redhead
Člen | 1313
+
0
-

Doufám, že bude konečně fungovat zápis pole jako element anotace – dali by se pak ty Tagy dát přímo do @cache anotace. Myslím, že by to mohlo být stejně jako u Latte pomocí zkráceného zápisu pole – [x,y]

Filip Procházka
Moderator | 4668
+
0
-

imho by bylo lepší upgradovat syntaxi anotací a inspirovat se v Symfony, dneska jsem koukal na validace v anotacích a ty zápisy jsou velice návykové

/**
 * @Cache({ @Expire(3600), @Tags(bar, foo) })
 */

/**
 * @Cache({
 *   @Expire(3600),
 *   @Tags(bar, foo)
 * })
 */

nebyl by to ani zásah do současné syntaxe, jenom by se to rozšířila o možnost vnořování

Nilp
Člen | 65
+
0
-

AFAIK se anotace budou parsovat pomocí Neonu.

jtousek
Člen | 951
+
0
-

HosipLan: +1

Tak trochu jsem se zamýšlel nad tím, zda ty anotace co používá Doctrine nějak nenašroubovat i do Nette reflexí. Jednak se přesně z tohoto důvodu zdají lepší než ty v Nette a druhak jsem si říkal, že by bylo dobré je mít všude jednotně.

redhead
Člen | 1313
+
0
-

David to podle mě bude předělávat na Neon, už dávno chce sjednotit syntaxi všech lexikálních věcí frameworku. Jinak ten příklad ze Symfony se mi ale vůbec nelíbí.

Filip Procházka
Moderator | 4668
+
0
-

a proč se ti nelíbí ? Navrhni lepší. Je to strašně jednoduché něco prostě zavrhnout, že :)

Editoval HosipLan (29. 11. 2010 7:59)

redhead
Člen | 1313
+
0
-

Jak říkám, má to dělat stejný parser jako pro neon a latte:

@cache(expire = 3600, tags = [xyz, abc])

Editoval redhead (29. 11. 2010 9:11)

Filip Procházka
Moderator | 4668
+
0
-

Je to sice jednotné, ale tohle se zase moc nelíbí mně, nelíbí se mi to ani v šablonách, ale to je na jinou debatu…