Ostatnio programując na co dzień w Javie i używając Springa, Hibernate, Struts i Velocity nie natrafiłem na żaden interesujący problem dlatego nie pojawił się na blogu żaden wpis, który tego dotyczy.

Ale za to jest coś ciekawego w Doctrine :) W wersji 1.2 nie ma rozsądnej formy dziedziczenia, to co proponują autorzy nie podoba mi się. postanowiłem użyć takiego przypadku:

sf_guard_user to klasa standardowego pluginu, która odpowiada użytkownikowi. Dodatkowo stworzyłem tabelę ae_experts z jednym kluczem obcym odwołującym się do użytkownika. Czyli każdy ekspert jest również użytkownikiem. Tak sobie pokrętnie wytłumaczyłem obiektowo relacyjną bazę danych.

Efekt, który chciałem osiągnąć to przy każdym pobraniu eksperta jest również pobierany użytkownik. Skoro ekspert to user, to warto wyświetlać domyślnie imię i nazwisko. Aby to osiągnąć w klasie Expert (Expert.class.php) dodałem taki kod:

/**
 * Expert
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @package    ask-expert
 * @subpackage model
 * @author     Beriko Software, Grzegorz Bernaś
 * @version    SVN: $Id: Builder.php 7490 2010-03-29 19:53:27Z jwage $
 */
class Expert extends BaseExpert
{
	public function preDqlSelect($event)
	{
		$params = $event->getParams();
		$query  = $event->getQuery();
		$alias  = $params['alias'] . '.sfGuardUser';
		if ((!$query->isSubquery() || ($query->isSubquery() && $query->contains(' '.$params['alias'].' '))) && !$query->contains($alias))
		{
			$query->innerJoin($alias);
		}
	}

	public function __toString() {
		return $this->getSfGuardUser()->getFirstName().' '.$this->getSfGuardUser()->getLastName();
	}
}

Ale to nie wszystko, kod nie będzie działać jeżeli nie włączymy DQL’a (Doctrine Query Language). Aby to zrobić w pliku ProjectConfiguration.class.php do klasy ProjectConfiguration dodaj taki kod:

class ProjectConfiguration extends sfProjectConfiguration
{
	public function configureDoctrine(Doctrine_Manager $manager)
	{
		$manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
	}
}

Dzięki temu nie mam dwóch zapytań tylko jedno :) Nie wiem jaki to będzie miało wpływ na wydajność i pracę w przyszłości kiedy mój projekt edukacyjny urośnie, ale czas pokaże.

Poniższy program został napisany na labolatoria z C++ i ma pokazać w jaki sposób klasy po sobie dziedziczą

Co to jest dziedziczenie?

Często podczas tworzenia klasy napotykamy na sytuację, w której klasa ta powiększa możliwości innej klasy, nierzadko precyzując jednocześnie jej funkcjonalność. Dziedziczenie daje nam możliwość wykorzystania nowych klas w oparciu o stare klasy. Nie należy jednak traktować dziedziczenia jedynie jako sposobu na współdzielenie kodu między klasami. Dzięki mechanizmowi rzutowania możliwe jest interpretowanie obiektu klasy tak, jakby był obiektem klasy z której się wywodzi. Umożliwia to skonstruowanie szeregu klas wywodzących się z tej samej klasy i korzystanie w przejrzysty i spójny sposób z ich wspólnych możliwości. Należy dodać, że dziedziczenie jest jednym z czterech elementów programowania obiektowego (obok abstrakcji, enkapsulacji i polimorfizmu).Continue reading