Działająca wersja frameworka

0

Witam!

Udostepnilem w necie framework'a pod Coyote'a do potestowania dla chetnych. Oczywiscie bardzo wczesna wersja, wiec nawet nie wrzucam na CVS jeszcze bo za wczesnie:

http://boduch.net/coyote-f/framework.zip

Tutaj prosciutka dokumentacja:

http://boduch.net/coyote-f/

Sorry, za taka mala ilosc komentarzy. Po prostu poki co skupialem sie na tym, aby to dzialalo ;)
Dla chetnych maly tutorial jak to wszystko dziala.

  1. Instalacja
    ========

Nie wymaga. Wystarczy rozpakowac. Zadna konfiguracja nie jest wymagana do dzialania.
Wystarczy wejsc, np. poprzez URL:

http://127.0.0.1/framework/

Powinna sie ukazac strona powitalna.

1.1) Wymagania

PHP 5
serwer HTTP

Ten framework jest niemal w calosci obiektowy, wiec pisany pod PHP 5.
Konkretnie u mnie to jest v. 5.2.

Budowa systemu

Generalnie opiera sie na architekturze MVC. Nie bede sie tutaj zaglebial w szczegoly i
dokladnie wyjasnial czym to jest. Powiem pokrotce:

Kontroler

Projektowanie aplikacji w oparciu o MVC polega na tworzeniu kontrolerow. One maja za zadanie
wykonac powierzone im zadanie ;) Tutaj znajduje sie logika aplikacji, dokonywanie niezbednych
operacji. Kontrolery pisane sa obiektowo, umieszcznae w katalogu /controller. Umiescmy tam,
dla przykladu plik foo.php, ktory bedzie wygladal tak:

<?php

class foo extends controller
{
	function main()
	{
		echo 'Hello World!';
	}
}
?>

Nazwa klasy musi byc taka sama jak nazwa pliku (kontrolera). Glowna metoda kontrolera, to main().
Czyli na poczatku zostanie wykonany kod tej metody. Mozesz teraz wejsc poprzez adres:

http://127.0.0.1/index.php/Foo

Wyswietli sie magiczny napis Hello World. W tym momencie framework odczytal nazwe naszego zadania (Foo)
i wykonal odpowiedni kontroler.

Framework jest tak skonstrulowany, iz, pierwszy parametr adresu stanowi nazwe kontrolera - drugi -
metode. Czyli rownie dobrze, mozemy wywolac:

http://127.0.0.1/index.php/Foo/Main

UWAGA! Zeby to dzialalo, nalezy skonfigurowac routing. W pliku config.php, odkomentuj ten kod:

/*
$route['*'] = array(
	'url'			=> ':controller/:action',
	'controller'	=> ':controller',
	'action'		=> ':action',
	'default'		=> array(

		'action'		=> 'main'
	)
);*/

Teraz, mozemy poprzez adres:

http://127.0.0.1/index.php/Foo/Bar

wywolac kontroler Foo (klasa Foo) i metode (akcje) Bar. Jezeli takowa nie istnieje, system
powinien wyswietlic komunikat 404.

Widoki

Dotychczas w Coyote uzywana byla klasa template. Nadal jest dostepna, ale ja zaczelem wprost, wplatac
w kod HTML, kod PHP. Widok to warstwa prezentacji. Powinna zawierac w naszym przypadku - kod XHTML,
ale moze rowniez - np. - RSS.

Widoki sa zapisywane w katalogu /template. Umiesc w katalogu, plik - np.: foo_view.php. Jego zawartosc
moze byc nastepujaca:

<html>
<head>
<title><?= $title; ?></title>
</head>
<body>
Czesc <?= $name; ?>
</body>
</html>

Powrocmy do widku, do metody main(). Zmodyfikuj kod:

function main()
{
	$data = array(
		'title'		=> 'Tytul jakis',
		'name'		=> 'Adam'
	);
	$this->load->view('foo_view', $data);
}

Taki kod spowoduje wyswietlenie widoku foo_view i przekazanie do niego odpowiednich parametrow.
Proste? We frameworku znajduje sie rowniez klasa view (odsylam do dokumentacji). Mozemy zrobic tak:

$names = array('Jas', 'Stefan', 'Marek');
$this->view->assign('names', $names);
$this->view->append('names', 'Adam');
$this->load->view('index');

A w widoku:

<?php foreach ($names as $name): ?>
Hello <?= $name; ?><br />
<?php endforeach; ?>

Modele

Modele, czyli warstwa danych. Poki co - nie bede o tym pisal ;)

Biblioteki

W katalogu /lib projektu znajduja sie moduly, ktore rozszerzaja funkcje jadra. Mozna piasc wlasne
biblioteki. W plik autoload.php znajduje sie spis bibliotek, ktore sa dolaczne do programu na starcie.
Mamy np>

  • acl.class.php - ACL (poki co prosta klasa)
  • benchmark.class.php - wiadomo - pomiary
  • cache.class.php - wiadomo
  • config.class.php - odczyt konfigu (mozna rozszerzyc te klase)
  • controller.class.php - podstawowe funkcje
  • core.class.php - funkcje ladowania nowych modulow, helperow itp
  • db.class.php - dostep do bazy danych
  • error.class.php - obsluga bledow
  • input.class.php - obsluga danych przychodzacych (_GET, _POST, _COOKIES, walidacje)
  • lang.class.php - pomoc w tworzeniu aplikacji wielojezycznych
  • output.class.php - output, tam rowniez metody sluzace do ustawiania np. plikow CSS w widokach
  • router.class.php - analizowanie zadan
  • template.class.php - biblioteka opcjonalna
  • trigger.class.php - obsluga hookow
  • validate.class.php - walidacja formularzy i innych danych

Nie wszystkie te biblioteki sa ladowane na starcie. Jezeli chcesz zaladowac dana biblioteke
w trakcie dzialania programu mozesz zrobic:

$this->load->library('biblioteka');

Helpery

Klasy lub funkcje ulatwiajace programowanie. W pliku autoload.php znajduje sie lista helperow
ladowana automatycznie. Np. taki helper url() tworzy URL. Mozna go uzyc (np. w widoku) w ten sposob:

<b>URL: <?= url('Foo/Bar'); ?></b> // wyswietli http://127.0.0.1/Foo/Bar

Inne polaczenie (wraz z funkcja html_a()):

<b>URL: <?= html_a(url('Foo/Bar'), 'Kliknij'); ?></b> // wyswietli: <a href="http://127.0.0.1/Foo/Bar">Kliknij</a>

Mozna tworzyc swoje helpery, umiescic w katalogu /helper i wywolac w trakcie dzialania programu:

$this->load->helper('moj_helper');
foo();

Ok, na razie wystarczajaco sie napisalem ;)
Dzieki za przeczytanie, w razie czego czekam na pytania.

0

Tak przeglądam powierzchownie twój kod Adamie i zauważyłem pewną rzecz: skoro korzystasz z PHP w wersji > 5 to czemu nie skozystasz z autoload? http://pl2.php.net/autoload Uprościłoby to ładowanie plików i byłyby ładowane przy pierwszym użyciu (i odpada zabawa z tablicami :)).

A tak na marginesie: po co powielać coś, co jest już napisane (np. ZendFramework)?

0
sznurek napisał(a)

Tak przeglądam powierzchownie twój kod Adamie i zauważyłem pewną rzecz: skoro korzystasz z PHP w wersji > 5 to czemu nie skozystasz z autoload? http://pl2.php.net/autoload Uprościłoby to ładowanie plików i byłyby ładowane przy pierwszym użyciu (i odpada zabawa z tablicami :)).

A, powiem Ci, ze myslalem nad tym. Na samym poczatku planowalem ladowanie klas z roznych lokalizacji i chcialem przekazac do funkcji load_class() dodatkowe parametry. Jak juz te funkcje napisalem to tak zostalo ;) Taka forma mi nie przeszkadza, poniewaz funkcje load_class() wykorzystuje rowniez do zwracania instancji danej klasy (hmm, taka odmiana singletonu ;)) w roznych miejscach w kodzie:

function foo()
{
  $config =& load_class('config');
  $config->option(....
}
</quote>

A tak na marginesie: po co powielać coś, co jest już napisane (np. ZendFramework)?

Po pierwsze satysfakcja. Ten kod planuje wykorzystywac w innych projektach, a jakos inne frameworki nie odpowiadaja mi do konca. Postanowilem umiescic tutaj wzorce, ktore mi sie podobaja.

0
Adam Boduch napisał(a)

Po pierwsze satysfakcja. Ten kod planuje wykorzystywac w innych projektach, a jakos inne frameworki nie odpowiadaja mi do konca. Postanowilem umiescic tutaj wzorce, ktore mi sie podobaja.

No, skoro tak :) To inne pytanie: czy ten framework wrzucisz na ten sam cvs co Coyote? Czy wspołtworzyć go może każdy, czy tylko grono zaufanych osób? Mam nadzieje, że nie miałbyś nic przeciwko kilu drobnym sugestiom ;)

Pozdrawiam.

//EDIT:

hmm, taka odmiana singletonu ;)

Jak słyszę singleton to mną trzepie, ale tak mnie pewnie Java spaczyła :) (w pozytywnym tego słowa znaczeniu ;))

0

Tak, wrzuce na CVS. Pewnie, ze nie mam nic przeciwko sugestiom.

0
Adam Boduch napisał(a)

(...)Pewnie, ze nie mam nic przeciwko sugestiom.

Więc oto kilka rzeczy które zauwałyłem:

  • umieszczanie SQL w różnych plikach (np. user.class.php): IMO cała część aplikacji dot. bazy danych powinna wyglądać mniej więcej tak:
  • Interfejs DataResource - zawiera wszystkie potrzebne metody do operowania na bazie danych (np fetch itp.). Potem wystarczy utworzyć MySqlDataResource, SQLiteDataResource lub nawet FakeDataResource zwracająca tylko przykładowe dane zakodowane w pliku PHP (bardzo przydatne podczas testowania).
  • Potem obiekty DAO(Data Access Objects) - czyli klasa UserDao - a w niej metody add($name, $pass...) itp. Oczywiście to tylko przykład, ale chodzi mi o oddzielenie operacji na bazie od reszty aplikacji.
  • //EDIT: Tak teraz o tym myślę, że wystarczy np. sam interfejs UserDao a potem MySqlUserDao itp. Do tego jakaś klasa Database ze statycznymi funkcjami pomagającymi w obróbce danych :)
  • Kolejne spaczenie z Javy - wydaje mi się, że gdyby wyróżnić nazwy klas (np. pisząc je z duże litery s/core/Core/) kod stałby się czytelniejszy, ale to tylko moja opinia.
  • Sposób na singletony: http://martinfowler.com/articles/injection.html <- odkąd to przeczytałem nie mogę żyć bez mojego własnego kontenera Ioc :) poza tym odpada ręczne przekazywanie obiektów do różnych klas, co jest WIELKIM udogodnieniem.
  • Pomimo to, że wykorzystujesz PHP 5 to nie korzystasz ze wszystkich jego mozliwości. Np. w którymś pliku natknąłem się na kod:
while(list($k, $v) = each($array)) ...

a przecież w PHP 5 powinno to wyglądać tak:

for($array as $k=>$v) ..

No, chyba że miałeś ważny powód by nie używać tej konstrukcji... (albo przyzwyczajenia z poprzednich wersji PHP).

  • Nigdzie nie zauważyłem użycia wyjątków - w moim przypadku ich użycie pomaga w tworzeniu aplikacji (np. w Kontrolerze rzucam 404NotFoundException, a kod który to łapie przekierowywuje użytkownika na 404.html)

I na koniec, zauważyłem to przed chwilą - HTML w kodzie PHP. Choćby dla czytelności powinien być umieszczony w osobnych plikach.

Ale to są tylko propozycje osoby która miała mało styczności z PHP (więcej z Javą ~7 miesięcy) ;-) Pomysły zaczerpniete z własnego zbioru kodów, CodeIgnitera, Symfony, oraz Zend Frameworka.

Pozdrawiam.

0
sznurek napisał(a)
  • umieszczanie SQL w różnych plikach (np. user.class.php): IMO cała część aplikacji dot. bazy danych powinna wyglądać mniej więcej tak:

Tak, tak - na razie te zapytania sa wpisane w klase, ale zgodnie z architektura MVC, beda one oddzielone w osobnym modelu :)

  • Kolejne spaczenie z Javy - wydaje mi się, że gdyby wyróżnić nazwy klas (np. pisząc je z duże litery s/core/Core/) kod stałby się czytelniejszy, ale to tylko moja opinia.

A to juz kwestia umowna :)

  • Sposób na singletony: http://martinfowler.com/articles/injection.html <- odkąd to przeczytałem nie mogę żyć bez mojego własnego kontenera Ioc :) poza tym odpada ręczne przekazywanie obiektów do różnych klas, co jest WIELKIM udogodnieniem.

Dzieki - przyjrze sie temu.

  • Pomimo to, że wykorzystujesz PHP 5 to nie korzystasz ze wszystkich jego mozliwości. Np. w którymś pliku natknąłem się na kod:
while(list($k, $v) = each($array)) ...

a przecież w PHP 5 powinno to wyglądać tak:

for($array as $k=>$v) ..

To pewnie wycinek kodu z klasy template, ktore jest pisana pod PHP4 i uzywana w obecnej wersji. Ale to nic, chodzi Ci zapewne o petle foreach, ktora w PHP4 dostepna juz byla. W kazdym razie konstrukcja foreach i powyzsza petla while daje ten same efekt - kwestia przyzwyczajenia.

  • Nigdzie nie zauważyłem użycia wyjątków - w moim przypadku ich użycie pomaga w tworzeniu aplikacji (np. w Kontrolerze rzucam 404NotFoundException, a kod który to łapie przekierowywuje użytkownika na 404.html)

Hmmm, wydaje mi sie to dobrym rozwiazaniem.

I na koniec, zauważyłem to przed chwilą - HTML w kodzie PHP. Choćby dla czytelności powinien być umieszczony w osobnych plikach.

Hmmm... gdzie? Byc moze chodzi Ci o widoki? Ale to tak ma byc. Mozna uzywac klasy template jezeli ktos chce pisac szablony, albo zagniezdzac w widokach (w kodzie HTML) instrukcje PHP pobierajace dane od modelu czy tez kontrolera.

0

Ciesze się, że niektóre pomysły ci się spodobały :)
Jak będzie na CVS(tak na marginesie: czemu nie SVN?) to popracuję troche nad tym, jeżeli pozwolisz :)

//to akurat nie główny powód, ale dla SVN nie ma tak genialnego klienta, jak WinCVS ;) - M

0

//to akurat nie główny powód, ale dla SVN nie ma tak genialnego klienta, jak WinCVS ;) - M
ale jest Tortoise SVN ;)

0
SebaZ napisał(a)

ale jest Tortoise SVN ;)
To już wolę z konsolowego klienta korzystać :d
A tak bardziej do rzeczy wydaje się subcommander - afair ma "płaski" widok, na którym tak na prawdę zależy Maroonedowi.
Swoją droga ciekawe czy M. lubi wszystko co płaskie? :P

0
Emocjonalny śmieć napisał(a)
SebaZ napisał(a)

ale jest Tortoise SVN ;)
To już wolę z konsolowego klienta korzystać :d
Dlaczego? Pytam, bo się jakoś przyzwyczaiłem już do Tortoise'a i chce poznać opinię

0

Tortoise to jakaś parodia.. bez komentarza. [edited miesiąc później: no generalnie Tortoise jest ok, tylko dodatkowe ikonki dla każdego katalogu to takie niezbyt dla mnie... ale jako klient SVN jest przyjazny, tu zwracam honor :P]

Qyon [weź w końcu tego nicka zmień...] - nie lubię wszystkiego co płaskie :P amator...

A subcommander - 2x podchodziłem, nie udało mi się zassać nigdy nic z repo.. no widać "za trudny" dla mnie ;)

no ale...... nie sieję już offtopa :)

0

Dla zainteresowanych:

Ciagle cos zmieniam w nowym kodzie i dopisuje. Generalnie jest mnostwo roboty, gdyz dodaje tylko nowe moduly, ale nie przepisalem nic z obecnego kodu Coyote jeszcze ;)

W kazdym razie wstawilem na serv. zrodla tego co zrobilem:

http://boduch.net/coyote/coyote0-9-4.zip

Po rozpakowaniu strona startowa framework'a wyglada tak:

http://boduch.net/coyote/

Doc API (niedokonczone jeszcze):

http://boduch.net/coyote/docs

Generalnie nie wstawiam jeszcze na CVS bo za duzo jeszcze pewnie pozmieniam ;)

0

No Adamie muszę przyznać, że to całkiem niezła robota. W zasadzie można sie było spodziewać, skoro stworzyłeś coyote. Mam tylko nadzieję, że tak samo jak w coyote bedzie latwo dodawac nowe moduły, czy robić własne modyfikacje kodu.

0

Poinformuję tylko, że dokumentacja pod linkiem http://boduch.net/coyote/docs nie śmiga i przy wybraniu pliku (z menu po lewej) wyrzuca błędy typu:

Parse error: syntax error, unexpected T_STRING in /home/adam/boduch.net/coyote/docs/Coyote/_template---changelog.php.html on line 1

0

Dzieki za informacje.
Nie moze miec 'coyote' w pasku adresu 2 razy bo swiruje ;)
Tymczasowo dalem tutaj: http://boduch.net/coyote-f

0

http://cvs.4programmers.net/cgi-bin/cvsweb/framework/

Nadal wersja dev, ale wstawilem na CVS.
Umiescilem w osobnym katalogu, zupelnie inna struktura plikow, calkiem nowy kod - nie chcialem mieszac ze starym.

No wlasnie, jezeli chodzi o same moduly dla serwisu to pare juz napisalem. Logowanie, rejestracja, parser, obsluga sesji itp. Na razie nie wiem gdzie to wstawic, czy do katalogu /coyote czy utworzyc /4programmers.net ... albo moze nowa galaz ;) Bo struktura plikow i katalog jest inna wiec sie pomiesza wszystko.

0

Właśnie ściągnąłem i na dzień dobry - sieczka. Patrzę w źródło a tam pełno short tagów (<?). Marooned już dawno mówił, żeby używać <?php. PHP 5 domyślnie ma już wyłączone short_tags więc wypadałoby pisać od razu z <?php. [ <?= to też short_tag :> ]

Taki szczegół - framework zadziała TYLKO jeśli będzie pod http://localhost/framework/ (w kodzie są na sztywno podane url'e http://127.0.0.1/framework/)

Buglist:

  • nie da się dodawać akcji do istniejących kontrolerów przez stronę :-P (rozumiem że to tylko demo systemu/ułatwiacz)
0

Nie no - ma wlaczone domyslnie.
Generalnie nie uzywam short tagow, jedynie w szablonach stosuje <?= ?>

<?= foo(); ?> Szbyciej sie pisze niz <?php echo foo(); ?> ;)

Jak jakies bledy zauwazysz to prosze daj znac, nie testowalem za bardzo na *nix, a moga byc problemy z case-sensitive. Wlasnie poprawilem jeden blad na CVS.

Aha. Jezeli sciagniesz kod z CVS, rozpakujesz to rezultat bedzie (powinien) byc identyczny z http://boduch.net/coyote/

0

Taki cytat z php.ini.dist:

; NOTE: Using short tags should be avoided when developing applications or
; libraries that are meant for redistribution, or deployment on PHP
; servers which are not under your control, because short tags may not
; be supported on the target server. For portable, redistributable code,
; be sure not to use short tags.

Więc jeśli coyote ma być systemem uniwersalnym, to wypadałoby jednak się trzymać wytycznych dla tego typu projektów.

0

CodeIgniter / Kohana mają takie coś, że same przerabiają <?= w szablonach na <?php echo...

0

Ktos: dzieki za podsuniecie rozwiazania. Trzeba to przemyslec bo ciekawe.

0

Ale <?= to też short tag? To jaki jest long tag - <?php= ? to ewentualnie takiego używać.. [blah - nie mogli w XMLu wymyślić sobie czegoś innego niż <? ? eh :P]

0

Nie ma takiego long taga :P

0

No to jak.. czyli <?= jest ok?

0

No nie. Short tag to <? czyli <?= to tez short tag :)

0

[blah - nie mogli w XMLu wymyślić sobie czegoś innego niż <? ? eh :P]

Marooned: the power of the ASP:

<%=Blablabla%>

:P

0
Adam Boduch napisał(a)

No nie. Short tag to <? czyli <?= to tez short tag :)
Dlatego pytam. Jak wygląda long tag dla <?= ?

// nie ma takiego :) [przynajmniej ja żyję od dawna w takim przekonaniu] - Cold

0
<?php echo ?> ;)
0
Ktos napisał(a)

[blah - nie mogli w XMLu wymyślić sobie czegoś innego niż <? ? eh :P]

Marooned: the power of the ASP:

<%=Blablabla%>

:P
W php też można coś takiego ustawić

1 użytkowników online, w tym zalogowanych: 0, gości: 1