Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

5 Stron V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Aplikacje PHP - Pluginy
Ociu
post 22.11.2005, 19:02:13
Post #21





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Cytat(Vengeance @ 2005-11-22 16:37:41)
A co jeśli chcemy napisać plugin do pluginu będącego pluginem innego pluginu naszej aplikacji? snitch.gif rotfl!

To wtedy trudniamy sobie życie laugh.gif

Pisząc PluginManager stweirdziłem, że najlepiej będzie zrobić sam loader.
  1. <?php
  2. Class PluginLoader {
  3. private $map = array();
  4. public $loaded = array();
  5.  
  6. public function add($plugin, $parametr = false) {
  7.  if($parametr == false) {
  8. $this->map[$plugin] = $plugin;
  9.  }else{
  10. $this->map[$plugin] = $parametr;
  11.  }
  12. }
  13.  
  14. public function load() {
  15. foreach($this->map AS $plugin => $parametr) {
  16. if($plugin == $parametr) {
  17. $this->loaded[$plugin] = new $plugin();
  18. } else {
  19. $this->loaded[$plugin] = new $plugin($parametr);
  20. }
  21. }
  22. $this->map = array();
  23. }
  24. }
  25. }
  26. ?>


Można to użyć tak:
  1. <?php
  2. $PluginLoader = new PluginLoader();
  3. $PluginLoader->add('Application');
  4. $PluginLoader->load();
  5. foreach($PluginLoader->loaded AS $name => $value) {
  6. $$name = $value;
  7. }
  8. ?>

Kod troszke badziewny, pisany z palca. Jak anrazie działa, będe go przebudowywał.
PS. Pisząc ten post, pomyślałem o tym, że można by zamieszać w to iteratory winksmiley.jpg
Go to the top of the page
+Quote Post
LBO
post 27.12.2005, 20:54:54
Post #22





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Vengeance @ 2005-11-22 14:37:41)
A co jeśli chcemy napisać plugin do pluginu będącego pluginem innego pluginu naszej aplikacji? snitch.gif rotfl!

wydaje mi sie ze trzeba stworzyc jeszcze klase (lub zaimplementowac w loaderze) kontrole zaleznosci... czyli np. plugin daje komunikat o braku potrzebnej mu do dzialania klasy stopuje skrypt... lub nie laduje sie wcale i wpisuje blad do logów.. no czy cos w tym rodzaju
Go to the top of the page
+Quote Post
Ociu
post 27.12.2005, 21:08:39
Post #23





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




A co jeśli pluginem jest wybieraniem odpowiedniej bazy danych ? Stopujesz go i cały system pada.

pozdrawiam
Go to the top of the page
+Quote Post
sztosz
post 27.12.2005, 21:31:39
Post #24





Grupa: Zarejestrowani
Postów: 866
Pomógł: 32
Dołączył: 2.06.2004
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Cytat(Vengeance @ 2005-11-22 16:37:41)
A co jeśli chcemy napisać plugin do pluginu będącego pluginem innego pluginu naszej aplikacji? snitch.gif rotfl!

Tutaj chyba taki pattern jak Decorator by dał radę.

Moim zdaniem nie da się zaimplentowac jakiegoś generalnego API dla pluginów.

Jeden moduł służący jako kontroller pluginów który nie pozwoli m.in używać dwóch różnyych pluginów robiących to samo ale w inny sposób.

+

Bardzo przejzysty kod (oczywiście wszystko obiektowo) z bardzo jasnym rozdzieleniem częsci protected od private każdej klasy.

+

Pluginy jako rozszerzenia danych klas (extends) zastepujące dane klasy (ichh funkcje w kodzie i wywołania)

ALBO (co jest chyba ciekawsze)

Plugin jako Decorator tylko że ttu z implentacją będzie bardzo trudno sad.gif


--------------------
Go to the top of the page
+Quote Post
NuLL
post 27.12.2005, 21:35:48
Post #25





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Ja pluginy w swoich aplikacjach rozwiazuje w inny, okreslony sposob i ktory dziala, nie bedac abstrakcja programistyczna biggrin.gif

Mam w kodzie aplikacji miejsca uruchamiajace pluginy owszem nie moge ich miec w dowolnym miejscu kodu. Ale np uruchamiajac plugin koszyka moge z katalogu produktow zrobic pseudosklep - w sam plugin jest uruchamiany w dwoch miejscach. Kod html jest umieszczony dzieki komentarzom zawartym w danym templacie i prostemu str_ireplace. Ot cała filozofia smile.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
LBO
post 28.12.2005, 18:19:40
Post #26





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Ociu @ 2005-12-27 20:08:39)
A co jeśli pluginem jest wybieraniem odpowiedniej bazy danych ? Stopujesz go i cały system pada.

heeh, zakladam podzial aplikacji na elementy CORE i dodatkowe (rozszerzenia funkcjonalnosci)... wtedy mozna sie pobawic w sposob dwojaki: dla elementow CORE zrobic dla pluginow API, dla rozszerzen loader'a... w sumie nie bawilem sie w pluginy (chociaz nagminnie stosuje loadery baz danych factory patternem, a to mozna juz nazwac pluginami)...
Go to the top of the page
+Quote Post
em1X
post 28.04.2006, 20:00:11
Post #27





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

Ostrzeżenie: (0%)
-----


Uniwersalnego sposobu mysle nie ma. Ostatnio robilem serwis, ktory w oryginale byl goły... jednak w miare dodawania pluginow jego funkcjonalnosc sie rozszerzala: dodaj zdjecie, wiadomosci prywatne, i tak dalej...

Za najprostsze rozwiazanie uznalem stworzenie abstrakcyjnej klasy Plugin, klasy PluginManager ładujacej pluginy.

Ogolnie rzecz biorac przydaly sie wzorce projektowe Factory oraz Strategy. Zabawa przednia po prostu super smile.gif milo, gdy programowanie sprawia przyjemnosc programiscie..


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
nasty
post 27.05.2006, 12:39:34
Post #28





Grupa: Zarejestrowani
Postów: 634
Pomógł: 14
Dołączył: 27.05.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Mi sie udalo napisac system do obsugi pluginow w moim programie nad ktorym kiedys pracowalem
Ale jest jedna sprawa, niema uniwersalnej metody obsugi pluginow, bo w kazdym systemie pluginy sa do czegos innego, ale tak bardzo ogulnie jest jedan metoda:

zrobic tabele w bazie danych ktura przechowuje adres guwnego pliku z pluginem (php), i gowne class pluginu
oraz funkecje Main()

w ten sposow program bedzie includowal plik z pluginem, (ale ten plik niczego nie robu przed wywolaniem funkcji Main()), i wykona :
  1. <?php
  2. $classname = // nazwa klasy plugina;
  3.  
  4. call_user_func(array($classname, 'Main'));
  5. ?>


w ten sposob mozna zrobic pluginy, aha i klasy w tym przypadku maja za zadanie wyruzniac pluginy, bo wszyskie beda wywolywac funckje Main.

Ten post edytował nasty_psycho 22.03.2007, 11:16:36
Go to the top of the page
+Quote Post
Ociu
post 27.05.2006, 17:05:12
Post #29





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Myślę, że ta metoda nadaje się lepiej do flitrów niż do pluginów.

IMHO, filtry, to klasy, które muszą mieć metodę o danej nazwie, main, execute, perform etc. która jest wykonywana. Można narzucić tą metodę ( interfejsy i te sprawy ). Działała to na zasadzie użyj i zapomnij.
Pluginy, to klasy, które nie są czymś ograniczone, to klasy (można oczywiście to zrobić, to zależy od piszącego), które poprostu są dodatkami, np. BlockController, mamy do nich dostęp cały czas.

  1. <?php
  2. class PluginManager{
  3. protected $pluginsMap = array();
  4.  
  5. public function __get( $sPluginName ) {
  6. if(isset($this->pluginsMap[$sPluginName])) {
  7. return $this->pluginsMap[$sPluginName];
  8. } else {
  9. throw new Exception('Plugin . ' $sPluginName ' . not found');
  10. }
  11. }
  12. }
  13. ?>


Przez co możemy odwoływać się do pluginu w każdym miejscu w skrypcie.
Go to the top of the page
+Quote Post
erix
post 28.05.2006, 21:19:32
Post #30





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




ja robie w ten sposob:
Dajmy na to jest klasa $module, ktora jest baza dla wszystkich wtyczek (wtyczki ja extendsuja).

Do tego jest cos takiego jak kontroler modulow. W pliku startowym jest on inicjowany, includuje wlaczone wtyczki (globalna tablica z nazwami), tworzy odwolania w tablicy (jedna wtyczka = jeden element). Potem jest ona odpytywana ($wtyczka->init()), zeby sobie mogla poustawiac zmienne itp. (moglem dodac sprawdzanie, czy wtyczka jest na 100% do mojego systemu, ale pisze wtyczki tylko ja, to mi nie trzeba bylo biggrin.gif).

Potem (po inicjowaniu) odpalam metody run(), aby mogly sie zainicjowac niejako na drugim etapie (gdy sa zaleznosci pomiedzy modulami, np. wtyczka od sql).

Na dobranoc jest shutdown(); zapisuje dane, itp.

Pisane pod PHP4, proste, niezawodne i (biggrin.gif) dzialajace.

Ten post edytował erix 28.05.2006, 21:20:49


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
NuLL
post 29.05.2006, 00:05:00
Post #31





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Ktos korzysta z wlasnych silnikow pluginowych w waszych dzialajacych ( nie eksperymentalnych ) projektach questionmark.gif Patrzac na to co piszesz tutaj jestescie bardzo pracowici i kazdy z pomyslow wymaga duzo kodu by cokolwiek wlaczyc :|

Ten post edytował NuLL 29.05.2006, 00:05:36


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
g00fy
post 1.06.2006, 20:18:08
Post #32





Grupa: Zarejestrowani
Postów: 22
Pomógł: 0
Dołączył: 23.11.2004

Ostrzeżenie: (0%)
-----


mi podoba sie polaczenie Visitora z Componentem. lub jesli ktos chce to Observator.
Go to the top of the page
+Quote Post
NuLL
post 23.06.2006, 14:55:49
Post #33





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

Ostrzeżenie: (0%)
-----


Cytat
mi podoba sie polaczenie Visitora z Componentem. lub jesli ktos chce to Observator.

Cokolwiek to znaczy.

A ktos moze przygladal api pluginowemu Wordpressa questionmark.gif Wg mnie kawal dobrego kodu i pomyslu smile.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
Go to the top of the page
+Quote Post
anas
post 28.06.2006, 12:08:19
Post #34





Grupa: Zarejestrowani
Postów: 172
Pomógł: 0
Dołączył: 22.09.2002
Skąd: Gorzów Wlkp

Ostrzeżenie: (0%)
-----


Hej.

Myślę że tutaj z pomocą może przyjść Pico Container (Java) i port do php. Chyba Paweł Kozłowski z Supermedia to pisał. Samo rozszerzanie może bez problemu odbywać się na zasadzie wykorzystania wzorca Decorator - problem był w centralizowaniu dodawania(wstrzykiwania) w łancuch tworzenia zależności między obiektami właśnie tego plugin'u który nam potrzebny i rozszerzenia obiektu powyżej - Pico może to rozwiązać, ale narazie poza przeczytaniem ogólników nic więcej nie mogę powiedzieć, będę to testował - jak dojde do czegoś logicznego to napiszę.

pozdrowka

Ten post edytował anas 28.06.2006, 12:08:43
Go to the top of the page
+Quote Post
UDAT
post 24.03.2007, 19:32:47
Post #35





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


Ostatnio zastanawiam nad użyciem AOP w celu uzyskania funckjonalności pluginów.

W ten sposób bardzo prosto można dodać/tworzyć dowolne pluginy.

Przykład1: Plugin autoryzacji
  1. <?php
  2. aspect Security{
  3. pointcut modelConstruction:new(IModel(*));
  4. pointcut modelExecution:exec(public IModel+::*(*));
  5.  
  6. around(): (modelExecution || modelConstruction){
  7. //Przeprowadź autoryzację
  8. }
  9. }
  10. ?>


Przykład1: Plugin BBCode do artykółów
  1. <?php
  2. aspect BBCodePlugin{
  3. pointcut setArticleBody:exec(public Article::setBody(2));
  4.  
  5. after($body): setArticleBody{
  6. return BBCodeParser::parseText ( $body );
  7. }
  8. }
  9. ?>


W ten sam sposób można dodać najprzeróżniejsze pluginy, a nawet pluginy pluginów pluginów....


Zalety:
+ można dodać prawie każdy możliwy plugin
+ zero przygotowań kodu / 0 nadmiarowych linii kodu
+ może współistnieć z innym systemem pluginów
+ odnosimy korzyści z użycia AOP ( poprawa modularności, itp. )
+ można dać pluginy/filtry na np. konstrukcję obiektów/ustawienie właściwości co w normalnym podejściu byłoby trudne
+ można połączyć łatwo z PicoContainer'em ( nałożyć pointcut'a na tworzenie obiektów )
Wady:
- pomocna jest dobrze zaplanowana architektura ( drobne, krótkie metody, używanie interfejsów, itp. )
- narazie AOP dla PHP jest w powijakach ( nie jest jednak fatalnie )
- dodatkowa faza wdrażania - weaving ( jedno zadanie Phing'a/Make'a itp. załatwia sprawę )
- wymaga zaznajomienia się z AOP

Linki:
* PHPAspect
* PHP AOP
* AspectJ ( pierwowzór wszystkich implementacji AOP )

Ten post edytował UDAT 24.03.2007, 19:33:51
Go to the top of the page
+Quote Post
webik
post 29.03.2007, 12:37:43
Post #36





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 1.05.2006
Skąd: Leżajsk\Kraków

Ostrzeżenie: (0%)
-----


Witam

Cytat(anas @ 28.06.2006, 11:08:19 ) *
Myślę że tutaj z pomocą może przyjść Pico Container (Java) i port do php


Jestem takiego zamego zdania, tylko ja napisalem swoj wlasny Container... z wsparciem dla wzorca Decorator... Na razie go tetuje ale testy wpypadaja obiecujaco, moze nie ma takiego uniwersalizmu i takich mozliwosci jak Pico ale mysle ze w miare rozwoju to dogonie Pico biggrin.gif ...

Wg mnie to najlepsze rozwiazanie....

Pozdrawiam


--------------------
Errare humanum est
Go to the top of the page
+Quote Post
darektbg
post 1.04.2007, 09:22:42
Post #37





Grupa: Zarejestrowani
Postów: 54
Pomógł: 0
Dołączył: 25.09.2006

Ostrzeżenie: (0%)
-----


W Rapide jest to ciekawie zrobione, możliwe są cztery rodzaje pluginów:

1. Przed uruchomieniem procesu wykonywania akcji
2. Przed wykonaniem każdej akcji
3. Po wykonaniu każdej akcji
4. Po zakonczeniu uruchamiania akcji

Załodowanie konkretnego pluginu:
  1. <?php
  2. $oFront->registerPlugin(new Rapide_Controller_Front_Plugin_ACL);
  3. ?>


W tym przypadu akurat plugin ACL, korzysta z metody preExecution(wykonywana przed wywołanie konkretnej akcji):
  1. <?php
  2. class Rapide_Controller_Front_Plugin_ACL extends Rapide_Controller_Front_Plugin
  3. {
  4. public function preExecution(Rapide_Dispatcher_Token_Interface $oToken)
  5. {
  6.  // operacje wykonywane przez plugin
  7. return $oToken;
  8. }
  9. }
  10. ?>


--------------------
skocz.org - system skracania linków
Go to the top of the page
+Quote Post
Strzałek
post 2.04.2007, 14:21:08
Post #38





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

Ostrzeżenie: (0%)
-----


Hola, hola, powoli. Ale to co pokazałeś z Rapide to raczej Filtry i implementacja Intercepting Filter. W temacie chodzi o coś innego, przeczytaj jeszcze raz od początku.

Za pomocą czegoś takiego nie da się zrobić pluginu tylko filtr!

To mała różnica winksmiley.jpg


--------------------
Go to the top of the page
+Quote Post
Athlan
post 3.04.2007, 16:39:38
Post #39





Grupa: Developerzy
Postów: 823
Pomógł: 12
Dołączył: 18.12.2005

Ostrzeżenie: (0%)
-----


Imho @nasty_psycho już dobrze kombinuje:
http://forum.php.pl/index.php?s=&showt...st&p=260817
NuLL podał dobry przykład Wordpressa, jednakże pluginy sa jedynie ładowane a przy większej organizacji danych trzeba funkcje do templata wstrzykiwac samemu. Drobna uwaga to to, że dobrze jest to zrobione, że opcje same dodają się do górnego menu (super).

Cytat
Hola, hola, powoli. Ale to co pokazałeś z Rapide to raczej Filtry i implementacja Intercepting Filter. W temacie chodzi o coś innego, przeczytaj jeszcze raz od początku.


Strzałek, nie patrz teraz pod kątem co to jest i jak ładowane, ale jak to wykorzystujemy. Możemy zrobić sobie plugin, który będzie integrował w tablice $_GET i $_POST, który wykryje włączone/wyłączone magic quotes i wykona odpowiednie kroi przed executem jakiegokolwiek kontrolera.

Odbiegając od filozofii... pojawił się tutaj post, w którym został poruszony problem dajmy na to bbcode w odpowiednich miejscach aplikacji, np w treści newsa, ale w komentarzach już nie. Nie jestem pewnien, czy możliwy jest superelastyczny sposób, aby przefiltrować takie dane. Jeżeli chceilibyśmy sprawdzac czy istnieje ewentalny plugin do załóżmy obiektu newsa. Każdny news potraktujmy jako obiekt:

  1. <?php
  2. $oNews = new News('id');
  3. $oNews->loadPlugins();
  4. echo $oNews->data->title;
  5. echo $oNews->data->text;
  6. ?>


sprawdzimy czy jest plugin do przefiltrowania tytułu newsa i podejmiemy odpowiednie ktoki, jednaże w treści bbcode by nie został użyty. Wydłuża się tutaj czas działania apliacji o więcej niż "troszkę". Tak jak to było powiediane wcześniej, nie ma uniwersalnego API do ładowania pluginów.

Moim zdaniem ZAWSZE będzie potrzebna ingerencja programisty, chociażmy tak:

  1. <?php
  2. $oBBCode = $oPlugin->load('bbcode');
  3. $oBBCode->parse($oNews->title);
  4. ?>


--------------------
Portfolio: Vgroup.pl | athlan.pl | Test.php.pl - sprawdź się z wiedzy o PHP i ułóż własne pytania!
Pomogłem? Kliknij pod postem.
Go to the top of the page
+Quote Post
LBO
post 4.04.2007, 10:37:25
Post #40





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(Strzałek @ 2.04.2007, 15:21:08 ) *
Hola, hola, powoli. Ale to co pokazałeś z Rapide to raczej Filtry i implementacja Intercepting Filter. W temacie chodzi o coś innego, przeczytaj jeszcze raz od początku.

Za pomocą czegoś takiego nie da się zrobić pluginu tylko filtr!

To mała różnica winksmiley.jpg


W dodatku to jest jeszcze okrojona wersja filtrów z Zend Framework.
Go to the top of the page
+Quote Post

5 Stron V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.03.2024 - 07:45