27 September 2010
Na firmowym blogu XSolve xlab.pl umieściłem artykuł o uporządkowanym wysyłaniu e-maili w projektach symfony 1.4, wykorzystującym dobrodziejstwa programowania zorientowanego obiektowo.
Krótki wstęp:
Niemal każdy projekt, z jakim miałem do czynienia, zawierał fragmenty, w których były wysyłane e-maile. Najczęściej czynność ta jest wykonywana w kontrolerze aplikacji (klasa actions), a treścią wiadomości jest wyrenderowany partial. To rozwiązanie jest dobre do czasu, gdy chcemy wysłać tego samego e-maila z dwóch różnych aplikacji (np. z frontend i z backend), czy z taska. Warto wtedy przyjrzeć się wbudowanemu systemowi do wysyłania emaili jaki oferuje symfony 1.4 (korzystającym z Switf Mailer).
Czytaj całość:
Uporządkowane wysyłanie e-maili w projekcie symfony
Read more
13 May 2010
The sfWidgetFormSelect doesn’t provide ability to render disabled options. It’s rarely used feature of a HTML select element, but sometimes it could save your life :-) In fact, we can achieve this feature by creating our own widget, like one listed below, which inherits from sfWidgetFormSelect. This solution is inspired by problem posted on Symfony Experts.
Read more
2 February 2010
Symfony is very powerful PHP framework, one of the most popular in the PHP world. In big projects you should probably noticed, that there isn’t easy way to extend core classes, which aren’t returned by factories, for example actions classes. Every generated module has actions.class.php, which inherits from sfActions. What, if we want to have same method in few actions, let’s call it getCurrentDay to achieve effect listed bellow?
class defaultActions extends sfActions
{
public function executeIndex(sfWebRequest $request)
{
$year = $request->getParameter('year', date('Y'));
$this->day = $this->getCurrentDay($year);
$this->month = $this->getCurrentMonth($year);
}
}
Current day is <strong>Monday 2010</strong>
The month is <strong>February</strong>
Read more
25 January 2010
Few minutes ago Brent Shaffer asked on the Twitter
Which is more standard, “public static function” or “static public function”?
I was curious about it, so I’ve checked which convention is used in my favourite Symfony Project. Of course, I haven’t got enough time to check it manually, class by class, so I wrote simple bash script:
egrep "^[^\*/]*static.*function" /usr/share/php/symfony/ -rioh --include=*.php | sed 's/^\s*//g' | sort | uniq -c | sort -r
The answer for the Symfony 1.2 was:
685 public static function
181 static public function
27 static protected function
16 protected static function
16 private static function
11 static function
2 abstract public static function
I’ve done same thing for Doctrine ORM Project
egrep "^[^\*/]*static.*function" /usr/share/php/Doctrine/lib/ -rioh --include=*.php | sed 's/^\s*//g' | sort | uniq -c | sort -r
and the result was:
78 public static function
6 static public function
6 static protected function
Now I can tell that “public static function” is more common, and by the way I use same convention in my classes :-)
Read more
28 October 2009
Ostatnio zetknąłem się z problemem wspólnych partiali dla wszystkich aplikacji w projekcie Symfony (dokładnie frontend i backend). Dokładniej, to te partiale były templatkami mailowymi, wysyłanymi zarówno przy zdarzeniach wygenerowanych w frontendzie jak i w panelu administracyjnym. Jako, że ponad wszystko cenię zasadę DRY (Don’t Repeat Yourself, czyli Nie Powtarzaj Się), chciałem, aby moje templatki były napisane raz, a używane z każdego miejsca w projekcie. Pewnym rozwiązaniem byłoby zrobienie symlinka: apps/frontend/modules/mails -> apps/backend/modules/mails i to działa, ale nie jest zbyt eleganckie. Z pomocą przyszła analiza kodu Symfony (dzięki Bogu, że jest Open Source:-)).
Read more
27 February 2009
Import użytkowników z zewnętrznej tabeli do pluginu sfDoctrineGuardPlugin dla Symofny, nie jest taki prosty na jaki wygląda na pierwszy rzut oka. Wydawałoby się, że wystarczy w pętli tworzyć obiekt klassy sfGuardUSer, ustawiać username i password dla niego oraz wywoływać metodę save(). Nic bardziej mylnego. SfDoctrineGuardPlugin do przechowywania haseł używa hasha tworzonego na podstawie soli (salt), dzięki temu zwiększa się bezpieczeństwo. Dodatkowo domyślnie używanym algorytmem jest sha1, a nie popularny md5, stosowany z zapałem przez wielu programistów PHP. Cały problem polega na tym, że plugin przy tworzeniu nowego obiektu, generuje sól (chyba, że podamy własną) i nie przyjmuje do informacji, że ustaliliśmy jej wartość NULL. Małym pocieszeniem jest fakt, że możemy własnoręcznie ustawić dla rekordu algorithm na md5, ale mimo wszystko po ustawieniu hasha do atrybutu password, zostanie on połączony z solą i ponownie zahashowany, co rozwali wszystkie nasze hasła.
Aby temu zapobiec, należy stworzyć klasę ImportsfGuardUser i umieścić ją w lib/ (nie zapomnij wyczyścić cache symfony):
Read more
17 February 2009
Ostatnio w projekcie Symfony 1.1 z użyciem Doctrine, dzięki webdebug toolbarowi, dostrzegłem czegoś, co mnie przeraziło. Otóż, jeśli w wygenerowanym przez Symfony adminie mamy klucze obce na liście, to wywoła on tyle zapytań ile elementów * ilość kluczy obcych.
Read more
11 February 2009
Jeśli z jakiegoś powodu potrzebujesz prefixu w url’u generowanym przez routing Symfony (lub w szczególności go tam nie potrzebujesz a pojawia się z powodu nietypowej konfiguracji serwera), można to osiągnąć w bardzo prosty sposób. Wystarczy w pliku apps/nazwa_aplikacji/config/factories.yml w sekcji all wpisać:
all:
request:
class: sfWebRequest
param:
relative_url_root: -
Powyższy kod usunie zbędny prefix. Zamiast myślnika można wpisać dowolny ciąg znaków, będzię się on pojawiał w postaci: http://twojserwer.pl/twoj_prefix/nazwa_aplikacji.php/modul/akcja. Ten trick może być też potrzebny jeśli symfony jest zainstalowane w podkatalogu wirtualnego hosta.
Read more
2 December 2008
Najlepszy, moim zdaniem, framework PHP Symfony doczekał się stabilnej wersji 1.2. W najnowszej odsłonie, znajdziemy między innymi 2 równoległe ORM’y – propel w wersji 1.3 oraz Doctrine 1.0 – do wyboru. Tym samym Doctrine weszło do Core Symfony, co bardzo dobrze wróży na przyszłość. Poza tym, z okazji wydania wersji 1.2 rusza projekt Jobeet będący 24-odcinkowym tutorialem, pokazującym krok po kroku tworzenie aplikacji w Symfony. Jest to następcą Askeeta, który został stworzony pod Symfony 1.0, które powoli odchodzi na emeryturę :-) Polecam ten kurs na początek – bardzo fajnie zapozna każdego laika z frameworkiem.
Do tego polecam też lekturę dokumentacji:http://www.symfony-project.org/doc/1_2/, możemy w niej znaleźć między innymi książkę Definitive Guide to Symfony, książkę na temat Formularzy oraz Doctrine.
Read more