lucid-php
Kevyt mvc php framework on nyt pari kuukautta ollut työn alla.
Huomasin tekeväni aika paljon toistoa aina uuden projektin tullessa, päädyin tekemään sovelluskehyksen joka soveltuu hyvin pieniin sekä vähän suurempiin projekteihin.
Lucid-php pohjautuu omiin kokemuksiin/tarpeisiin ja aikaisempiin töihin. Toki noita on netti pullollaan, mutta olen itse kaivannut suoraviivaisemman, kevyemmän sekä helposti laajennettavan frameworkin. Lucid-php:n tarkotus ei ole tarjota kaikkea maan ja taivaan väliltä, vaan lähinnä toimivan mvc projektialustan. Lucid-php on toki vielä kesken (myös kotisivut), mutta perus versio on ladattavissa:
Työn alla mm:
- Autentikointi mokkula
Rakentavaa kritiikkiä otan mielellään vastaan, turhanpäivästä viisastelua en.
EDIT:
Mod_rewrite on vielä toistaiseksi pakollinen.
PHP 5.3+ kun on vaatimuksena, niin kannattaa ottaa käyttöön nimiavaruudet ja samalla hoitaa class loading PSR-0 standardin mukaan:
https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
Tuo selkeyttää ja helpottaa kummasti.
Esim, mallit saan nyt suoraan autoload:illa includattua jos ovat vain oikein nimettyjä.
Eli luokan nimi: 'luokka'
Tiedosto vastaavasti: 'luokka.php'
Silloin ei tarvitse käyttää viittauksia kuten model_luokka jne. Onko nimiavaruuksien käytöstä jotain erityistä hyötyä? Olen kyllä yrittänyt soveltaa niitä php:ssä(kin), mutta ovat mielestäni olleet turhia.
Edit: Toki esim. Zend:in kokoisessa kehyksessä ajavat varmasti asiansa.
Nimiavaruuksilla vältät nimipäällekkäisyysongelmat (oman koodisi kanssa, muiden koodin kanssa ja itse PHP:n kanssa) ja saat koodista luettavampaa.
Tilanne voi monimutkaistua äkisti jos otat projektiisi mukaan ulkopuolisia komponetteja tai projektisi itsessään kasvaa. Mutta nimiavaruuksien kanssa homma pysyy nätisti kasassa.
Nykyään nimiavaruudet yhdistettynä tuolla PSR-0 standardilla pitää homman hyvin kasassa, ja erillisiä komponentteja on helppo käyttää itsenäisesti siellä missä niitä tarvitaan (tämä ei toki tietysti pelkästään tuolla PSR-0 standardilla ja nimiavaruuksilla hoidu). Mutta kuitenkin projektin rakenne ohjautuu oikeille raiteille niin että yhteensopivuus on paremmassa kunnossa.
Tuolla on lisää mietteitä nimiavaruuksista:
http://mwop.net/blog/254-Why-PHP-Namespaces-Matter
Moro,
function __autoload($class) { $class = ltrim($class, '\\'); /** controller **/ if(is_file(CONTROLLER_PATH . DS . $class . ".php")) { return include(CONTROLLER_PATH . DS . $class . ".php"); } /** namesapce **/ $includeFile = str_replace("\\", "/", $class) . ".php"; /** application **/ if(is_file(APPLICATION_PATH . DS . str_replace("_", "/", $includeFile))) { include(APPLICATION_PATH . DS . str_replace("_", "/", $includeFile)); } /** core **/ elseif(is_file(LIBRARY_PATH . DS . str_replace("_", "/", $includeFile))) { include(LIBRARY_PATH . DS . str_replace("_", "/",$includeFile)); } else { die("Could not autoload: " . $class . ", include file manually."); } }
Eli nyt koko 'lucid' kirjaston luokat on nimetty polkujen "mukaisesti", esim.
<?php class lucid_view { //etc..
Joten ne ladataan automaattisesti: new lucid_view();
Tiedosto löytyy siten hakemistosta /lucid/view.php
Lisäksi autoload mahdollistaa nimiavaruuksien käytön, esim kirjaus malli:
Tiedosto: /application/models/verkkomaksut/kirjaus.php
<?php namespace application\models\verkkomaksut; class kirjaus { //etc..
Ja lataus onnistuu:
<?php use application\models\verkkomaksut as svm; class indexController extends lucid_controller { public function init() { $this->setTemplate("onecolumn"); $this->template->title = "..."; } public function esimerkkiAction() { $kirjaus = new svm\kirjaus(); .... } ...
Mielestäni tämä on hyvä ratkaisu, toki lucid kirjasto ei ole omassa avaruudessa.
ps. en saannut backslashia jostain syystä näkymään täällä.. (Mod. korjasi... Ihmeen bugeja PHP:n omassa väritysfunktiossa!)
Hei, syyslomalla innoistuin hieman viemään lucid-php projektia eteenpäin, käykää ihmeessä lataamassa ja testatkaa.
Pyrin lisämään tänne pian linkin esimerkkisovellukseen, esim. lucidilla tehtyyn yksinkertaiseen 'blogiin', sen avulla voi ehkä saada paremman kuvan lucidin toimivuudesta.
Kritiikkiä ja kysymyksiä odotellessa, => http://lucid-php.net
lucid-simple-blog:
Esimerkki on askeettinen ja osin puutteellinen, mutta siinä käy kuitenkin ilmi ohjureiden, mallien ja näkymien eri tehtävät ja toiminnot perustasolla.
Normi 'jakelusta' poikkeavat tiedostot:
- /project/application/controllers/blogController.
- /project/application/models/blog.php
- /project/application/views/views/blog/*.html
Lisäksi project.conf - tiedostossa on määritelty oletusohjuriksi blogController
1. Apache mod_rewrite käyttöön
2. /project/public - hakemisto tulisi olla web-juuri
3. /project/log - hakemistoon/tiedostoihin kirjoitusoikedet
4. Tietokanta-asetukset määriteltävä project.conf tiedostoon
5. Tietokannan luontilause: database.sql
EDIT: Linkki poistettu
Suosittelisin kuitenkin opettelemaan PSR-standardien mukaiset koodauskäytännöt ja ottamaan ne myös koko Lucid-projektiin käyttöön. Nykyisellään kaikki Lucid-luokat on varustettu täysin redundantilla etuliitteellä "lucid_", mikä tekee koodista sotkuista. Kyseisen etuliitteen kuuluisi olla oma nimiavaruutensa.
Toinen ongelma globaalin nimiavaruuden "saastuttamisessa" on se, ettei Lucidia voi integroida mihinkään muuhun olemassaolevaan järjestelmään. Tästä kielii toisaalta jo sekin, että autoloader heittää virhettä, mikäli se ei itse löydä mitään luokkaa. Tämä on väärin, koska autoloadereita voi olla monta, eikä mitään luokkaa saisi osatakaan ladata kuin täsmälleen yksi lataaja.
The Alchemist kirjoitti:
..kaikki Lucid-luokat on varustettu täysin redundantilla etuliitteellä "lucid_"..
'lucid_' etuliite on tässä tapauksessa polku luokkaan, eli se kertoo mistä kyseinen luokka löytyy, esim:
lucid_controller = /lucid/controller.php
Mahdollistaa lucid kirjaston kasvattamista, esim:
lucid_validator_form = /lucid/validator/form.php
...
Toisaalta en näe enään mitään syytä miksi en vaihtaisi myös lucid kirjaston lataus samanlaiseksi kuin esimerkiksi malleilla on nyt:
//Tiedosto: application/modles/blog.php //Nimiavaruus: application\models //Luokka: blog $blog = new application\models\blog(); //Autoloadaa: /application/models/blog.php
Tuo esimerkki noudattaa jo muuten PSR:ää paitsi että luokkien pitäisi olla CamelCasella.
Aihe on jo aika vanha, joten et voi enää vastata siihen.