Použití anotací – seznam nápadů
- bojovyletoun
- Člen | 667
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
- bojovyletoun
- Člen | 667
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
- jtousek
- Člen | 951
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.
- Filip Procházka
- Moderator | 4668
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
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
@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
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()
a ObjectMixin::call()
- redhead
- Člen | 1313
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
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
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…
- Filip Procházka
- Moderator | 4668
Pořád se mi ale nelíbí způsob jakým se to volá, chtělo by to vymyslet něco víc sexy
- Filip Procházka
- Moderator | 4668
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í
- Filip Procházka
- Moderator | 4668
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)
- Filip Procházka
- Moderator | 4668
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…