<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nerdpress.org &#187; Symfony</title>
	<atom:link href="http://nerdpress.org/tag/symfony-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://nerdpress.org</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Mon, 30 Jan 2012 14:28:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>[Symfony 2] Security Bundle &#8211; Benutzer mit username oder email anmelden.</title>
		<link>http://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/</link>
		<comments>http://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/#comments</comments>
		<pubDate>Fri, 12 Aug 2011 13:04:36 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Project Setup]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Doctrine 2]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[SecurityBundle]]></category>
		<category><![CDATA[symfony 2]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1566</guid>
		<description><![CDATA[Augenscheinlich unterstützt das Security-Modul in der Standard-Konfiguration nur die Authentifizierung via Benutzername und Password. Wie man sich mit einem Benutzernamen ODER der E-Mail-Adresse und einem Passwort authentifiziert, ist ein wenig versteckt. Das ist die Anleitung, wie es funktioniert.]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Augenscheinlich unterstützt das Security-Module nur die Authentifizierung via Benutzername und Password. Wie man sich mit einem Benutzernamen ODER der E-Mail-Adresse und einem Password authentifiziert, ist ein wenig versteckt. So gehts:</p>
<p><span id="more-1566"></span></p>
<p>Schaut man sich den generischen EntityUserProvider an, so sieht man ab Zeile 46 sowas wie</p>
<pre class="brush: php; title: ; notranslate">
    /**
     * {@inheritdoc}
     */
    public function loadUserByUsername($username)
    {
        if (null !== $this-&gt;property) {
            $user = $this-&gt;repository-&gt;findOneBy(array($this-&gt;property =&gt; $username));
        } else {
            if (!$this-&gt;repository instanceof UserProviderInterface) {
                throw new InvalidArgumentException(sprintf('The Doctrine repository &quot;%s&quot; must implement UserProviderInterface.', get_class($this-&gt;repository)));
            }

            $user = $this-&gt;repository-&gt;loadUserByUsername($username);
        }

        if (null === $user) {
            throw new UsernameNotFoundException(sprintf('User &quot;%s&quot; not found.', $username));
        }

        return $user;
    }
</pre>
<p>Dieser Code besagt, dass nur dann, wenn die Konfigurationeinstellung &#8220;property&#8221; aus der security.yml entfernt wird (steht üblicherweise auf &#8220;username&#8221; und gibt das Datenbankattribut an, das eben den Benutzernamen hält), das entsprechende Doctrine-Entity &#8220;User&#8221; auch eine Repository-Class hat und diese darüber hinaus UserProviderInterface implementiert, man seine eigene loadUserByUsername()-Methode implementieren kann, die dann von der Firewall zur Identifizierung des Benutzer beim Login herangezogen wird (dieser Vorgang ist komplett intransparent, Symfony Magic).</p>
<p>Also aus seiner &#8220;alten&#8221; security.yml</p>
<pre class="brush: python; title: ; notranslate">
    providers:
        default:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
            entity: { class: DvlpCoreBundleEntityUser, property: username }
</pre>
<p>sowas machen:</p>
<pre class="brush: python; title: ; notranslate">
     ...
            entity: { class: DvlpCoreBundleEntityUser }
</pre>
<p>Dann muss das zu User gehörtige UserRepository nur noch UserProviderInterface implementieren, bspw. so:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

namespace DvlpCoreBundleEntity;

use DoctrineORMEntityRepository;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityCoreUserUserInterface;

/**
 * UserRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class UserRepository extends EntityRepository implements UserProviderInterface
{
    /**
     * {@inheritdoc}
     */
    public function loadUserByUsername($username)
    {
        return $this-&gt;getEntityManager()
            -&gt;createQuery('SELECT u FROM DvlpCoreBundle:User u JOIN u.Profile p WHERE u.username = :username OR p.email = :username')
            -&gt;setParameters(array(
                'username' =&gt; $username
            ))
            -&gt;getOneOrNullResult();
    }

    /**
     * {@inheritDoc}
     */
    public function refreshUser(UserInterface $user)
    {
        return $this-&gt;loadUserByUsername($user-&gt;getUsername());
    }

    /**
     * {@inheritDoc}
     */
    public function supportsClass($class)
    {
        // NEVER CALLED ...
        return $class === 'DvlpCoreBundleEntityUser';
    }
}
}
</pre>
<p>Schon kann man als Benutzernamen entweder den Username oder die E-Mail-Adresse des Users angeben.</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sfGoogleTranslatePlugin</title>
		<link>http://nerdpress.org/2011/04/09/sfgoogletranslateplugin/</link>
		<comments>http://nerdpress.org/2011/04/09/sfgoogletranslateplugin/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 14:46:15 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[google translate]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[symfony 1.4]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1447</guid>
		<description><![CDATA[Hallo Welt! Ich hab einen kleinen Wrapper für die Google Translate API v1 als symfony 1.4 Plugin auf github gehoben: https://github.com/ivoba/sfGoogleTranslate Einfach Plugin installieren und dann im Model oder wo es gebraucht wird: Das Plugin nutzt den sfWebbrowser, der ist ja ziemlich praktisch, den braucht man also auch noch. Die detect Methode wird auch unterstützt. [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Hallo Welt!<br />
Ich hab einen kleinen Wrapper für die Google Translate API v1 als symfony 1.4 Plugin auf github gehoben:<br />
<a href="https://github.com/ivoba/sfGoogleTranslate">https://github.com/ivoba/sfGoogleTranslate</a></p>
<p>Einfach Plugin installieren und dann im Model oder wo es gebraucht wird:</p>
<pre class="brush: php; title: ; notranslate">
$gT = new sfGoogleTranslate('de','fr');
$t = $gT-&gt;translate('Hallo schöne Frau');
echo $t;
</pre>
<p><span id="more-1447"></span></p>
<p>Das Plugin nutzt den sfWebbrowser, der ist ja ziemlich praktisch, den braucht man also auch noch.<br />
Die detect Methode wird auch unterstützt.</p>
<p>Evtl. könnte man jetzt noch tasks machen, wie etwas aus dem I18nTranslate Plugin, welcher alle i18n dictionary files übersetzt.</p>
<p>Wer sich berufen fühlt, kann den ja porten und das Ding forken ;)</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/04/09/sfgoogletranslateplugin/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/04/09/sfgoogletranslateplugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[symfony 1.4] Class &#8216;sfLoader&#8217; not found</title>
		<link>http://nerdpress.org/2011/03/14/symfony-1-4-class-sfloader-not-found/</link>
		<comments>http://nerdpress.org/2011/03/14/symfony-1-4-class-sfloader-not-found/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 13:39:34 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfony 1.4]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1412</guid>
		<description><![CDATA[Sollte man mal eine symfony 1.2.x Anwendung auf symfony 1.4.x migrieren und man stößt auf diesen Fehler: Dann hat man versucht einen Helper in der Action zu laden zB so: Der sfLoader ist in 1.4 allerdings entfernt worden. Stattdessen sollte man dann sowas schreiben: Dann klappts.]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Sollte man mal eine <strong>symfony 1.2.x</strong> Anwendung auf <strong>symfony 1.4.x</strong> migrieren und man stößt auf diesen Fehler:</p>
<pre class="brush: php; title: ; notranslate">
Class 'sfLoader' not found
</pre>
<p>Dann hat man versucht einen Helper in der Action zu laden zB so:</p>
<pre class="brush: php; title: ; notranslate">
sfLoader::loadHelpers('String');
</pre>
<p>Der sfLoader ist in 1.4 allerdings entfernt worden.<br />
Stattdessen sollte man dann sowas schreiben:</p>
<pre class="brush: php; title: ; notranslate">
$this-&gt;getContext()-&gt;getConfiguration()-&gt;loadHelpers('String');
</pre>
<p>Dann klappts.</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/03/14/symfony-1-4-class-sfloader-not-found/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/03/14/symfony-1-4-class-sfloader-not-found/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony 2 Standard Edition released</title>
		<link>http://nerdpress.org/2011/03/07/symfony-2-standard-edition-released/</link>
		<comments>http://nerdpress.org/2011/03/07/symfony-2-standard-edition-released/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 17:20:38 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[Doctrine ORM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[Doctrine 2]]></category>
		<category><![CDATA[Standard Edition]]></category>
		<category><![CDATA[symfony 2]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1401</guid>
		<description><![CDATA[Ab heute, dem 7. 3. 2011, steht auf http://symfony.com die &#8220;Standard-Edition&#8221; der neuesten Version 2 des populären RAD-Frameworks zum Download bereit. Bereits am vergangenen Wochenende ging die neue Website des Projekts online. Symfony 2 wird als Sammlung loser gekoppelter Komponenten &#8211; sog. &#8220;Bundles&#8221; &#8211; in mehreren Ausgaben erhältlich sein. Zum jetzigen Zeitpunkt existiert bereits eine [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ab heute, dem 7. 3. 2011, steht auf http://symfony.com die &#8220;Standard-Edition&#8221; der neuesten Version 2 des populären RAD-Frameworks zum Download bereit. Bereits am vergangenen Wochenende ging die neue Website des Projekts online.<br />
<span id="more-1401"></span><br />
Symfony 2 wird als Sammlung loser gekoppelter Komponenten &#8211; sog. &#8220;Bundles&#8221; &#8211; in mehreren Ausgaben erhältlich sein. Zum jetzigen Zeitpunkt existiert bereits eine Sandbox und eine davon abgeleitete &#8220;Standard-Edition&#8221;, die wie gewohnt ein festes Code-Verzeichnislayout vorgeben.</p>
<p>Als zukünftige Ausgaben denkbar sind ein Symfony2-basierendes CMF (Content Management Framework) oder eine auf die speziellen Befürfnisse von Online-Shops zugeschnittene Bundle-Sammlung.</p>
<p>Der Code ist noch nicht als stabil deklariert. Die bereits vorhandene und wie immer intensiv gepflegte Referenz-Dokumentation lädt bereits jetzt zum Reinschnuppern und Ausprobieren ein.  </p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/03/07/symfony-2-standard-edition-released/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/03/07/symfony-2-standard-edition-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Symfony 2] Sandbox/Standard Edition &#8211; bootstrap.php</title>
		<link>http://nerdpress.org/2011/03/06/symfony-2-sandboxstandard-edition-bootstrap-php/</link>
		<comments>http://nerdpress.org/2011/03/06/symfony-2-sandboxstandard-edition-bootstrap-php/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 08:03:12 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[Deployment]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Bootstrap]]></category>
		<category><![CDATA[symfony 2]]></category>
		<category><![CDATA[Symfony 2 Sandbox]]></category>
		<category><![CDATA[Symfony Standard Edition]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1394</guid>
		<description><![CDATA[Wer sich wundert, woher die beiden Dateien &#8220;app/bootstrap.php&#8221; respektive &#8220;app/bootstrap_cache.php&#8221; im Standard-app-Verzeichnis der Sandbox kommen: Das Script unter bin/build_bootstrap.php generiert eben diese aus existierenden Sourcen. Das Script sollte im Projekt-Rootverzeichnis aufgerufen werden, also etwa so: $ php bin/build_bootstrap.php Das ganze dient schlicht dazu, den PHP-Autoloader zu entlasten (und ersetzt somit die core_compile.yml-Konfiguration aus der Symfony [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Wer sich wundert, woher die beiden Dateien &#8220;app/bootstrap.php&#8221; respektive &#8220;app/bootstrap_cache.php&#8221; im Standard-app-Verzeichnis der Sandbox kommen: Das Script unter bin/build_bootstrap.php generiert eben diese aus existierenden Sourcen.<br />
<span id="more-1394"></span><br />
Das Script sollte im Projekt-Rootverzeichnis aufgerufen werden, also etwa so:<br />
<sourcecode lang="sh">$ php bin/build_bootstrap.php</sourcecode><br />
Das ganze dient schlicht dazu, den PHP-Autoloader zu entlasten (und ersetzt somit die core_compile.yml-Konfiguration aus der Symfony 1.x-Welt).</p>
<p>Natürlich spricht nichts dagegen, das Script als Vorlage für seinen eigenen genererate-bootstrap-code zu modifizieren.</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/03/06/symfony-2-sandboxstandard-edition-bootstrap-php/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/03/06/symfony-2-sandboxstandard-edition-bootstrap-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony command line Farben unter Snow Leopard</title>
		<link>http://nerdpress.org/2011/01/19/symfony-command-line-farben-unter-snow-leopard/</link>
		<comments>http://nerdpress.org/2011/01/19/symfony-command-line-farben-unter-snow-leopard/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 11:18:32 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[posix]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1322</guid>
		<description><![CDATA[d&#8217;oh seit längerem hatte ich erfolglos versucht den Ouput der Symfony Tasks auf meinem Mac farbig dargestellt zu bekommen. Nach Experimenten mit verschiedenen Color Themes und AddOns für die Terminal.app und / oder iTerm hatte ich dann die tollsten Ansi Farben, Prompts und VI-Themes. Nur die Symfony Tasks waren immer noch einfarbig. RTFM&#8230;. In dem [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>d&#8217;oh</p>
<p>seit längerem hatte ich erfolglos versucht den Ouput der Symfony Tasks auf meinem Mac farbig dargestellt zu bekommen.</p>
<p>Nach Experimenten mit <a href="http://niw.at/articles/2007/11/02/TerminalColoreopard/en">verschiedenen</a> <a href="http://blog.fallingsnow.net/2009/08/28/fixing-colors-in-terminal-app-on-10-6/">Color Themes</a> und AddOns für die Terminal.app und / oder <a href="http://iterm.sourceforge.net/">iTerm</a> hatte ich dann die tollsten Ansi Farben, <a href="http://vc.gerg.ca/hg/vcprompt/">Prompts</a> und VI-Themes.<br />
<span id="more-1322"></span><br />
<a href="http://nerdpress.org/wp-content/uploads/2011/01/Bildschirmfoto-2011-01-19-um-12.06.04.jpg" rel="lightbox[post-1322]" title=""><img src="http://nerdpress.org/wp-content/uploads/2011/01/Bildschirmfoto-2011-01-19-um-12.06.04.jpg" alt="Bildschirmfoto-2011-01-19-um-12 06 04 in " width="542" height="402" class="alignnone size-full wp-image-1323" /></a></p>
<p>Nur die Symfony Tasks waren immer noch einfarbig.</p>
<p>RTFM&#8230;.</p>
<p>In dem Fall sogar noch einfacher:<br />
check_configuration.php einfach mal laufen lassen:</p>
<pre class="brush: bash; title: ; notranslate">
php lib/vendor/symfony/data/bin/check_configuration.php
</pre>
<pre class="brush: bash; title: ; notranslate">
[[WARNING]] The posix_isatty() is available: FAILED
***
Install and enable the php_posix extension
(used to colorized the CLI output)
***
</pre>
<p>wie gesagt: d&#8217;oh. </p>
<p>via macports schnell installiert:</p>
<pre class="brush: bash; title: ; notranslate">
sudo port install php5-posix
</pre>
<p>und farbiger Output bei allen Symfony Tasks. Und das unter Snow Leopard.<br />
Vielleicht hat das ja noch jemand übersehen und erspart sich hiermit die lange Suche.</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/01/19/symfony-command-line-farben-unter-snow-leopard/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/01/19/symfony-command-line-farben-unter-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfony und Google Analytics</title>
		<link>http://nerdpress.org/2011/01/12/symfony-und-google-analytics/</link>
		<comments>http://nerdpress.org/2011/01/12/symfony-und-google-analytics/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 16:56:17 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1311</guid>
		<description><![CDATA[Ich weiss nicht ob Ihr es wußtet: Es gibt ein feines Plugin für Google Analytics für symfony. Kris Wallsmith sei dank. Da kann man sich fragen, warum denn ein Plugin dafür? Die paar Zeilen Code kopier ich doch schnell ins Layout. Über das Plugin kann man jedoch Analytics &#8220;environment aware&#8221; einbinden. Man will ja nicht [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Ich weiss nicht ob Ihr es wußtet:<br />
Es gibt ein feines <a href="http://www.symfony-project.org/plugins/sfGoogleAnalyticsPlugin">Plugin für Google Analytics</a> für symfony.<br />
Kris Wallsmith sei dank.</p>
<p>Da kann man sich fragen, warum denn ein Plugin dafür?<br />
Die paar Zeilen Code kopier ich doch schnell ins Layout.<br />
Über das Plugin kann man jedoch Analytics &#8220;environment aware&#8221; einbinden.<br />
Man will ja nicht das die Test- oder gar Entwicklungsumgebung die Messung verfälscht.</p>
<p><span id="more-1311"></span></p>
<p>Das läuft dann über die app.yml:</p>
<pre class="brush: bash; title: ; notranslate">
prod:
  sf_google_analytics_plugin:
    enabled:      on
    profile_id:   UA-XXXXXXX
    tracker:      google
</pre>
<p>Außerdem hat das Plugin noch einiges mehr im petto:<br />
Zum Beispiel kann man: </p>
<ul>
 &#8211; Seiten mit custom Namen tracken<br />
 &#8211; Seiten tracken in der action<br />
 &#8211; Routen kanonisch tracken<br />
 &#8211; einzelne Module vom Tracking ausschließen<br />
 &#8211; custom Werte aus der app in der action tracken
</ul>
<p>Da freut sich wer es braucht&#8230;</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2011/01/12/symfony-und-google-analytics/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2011/01/12/symfony-und-google-analytics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>symfony 1.4 &#8211; automatisierte builds</title>
		<link>http://nerdpress.org/2010/11/12/symfony-1-4-automatisierte-builds/</link>
		<comments>http://nerdpress.org/2010/11/12/symfony-1-4-automatisierte-builds/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 09:48:11 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[Deployment]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1158</guid>
		<description><![CDATA[Hier mal ein Beispiel für einen (via shell script) automatisierten build bei einer PHP, Symfony 1.4 Anwendung mit GIT zur Versionskontrolle. der Einfachkeit halber liegt der zu migrierende sql dump schon im repository. Könnte man natürlich auch jetzt von remote holen. hier sollte keine Handarbeit mehr nötig sein, da man ja alle DB Änderungen per [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Hier mal ein Beispiel für einen (via shell script) automatisierten build bei einer PHP, Symfony 1.4 Anwendung mit GIT zur Versionskontrolle.</p>
<pre class="brush: bash; title: ; notranslate">
#wipe old version of build db
mysql -uUSER -pPW drop build-db
</pre>
<pre class="brush: bash; title: ; notranslate">
#wipe the build workspace
rm -rf ./build-workspace
</pre>
<pre class="brush: bash; title: ; notranslate">
#checkout the sourcecode
git clone git@my-domain.com:my-repository ./build-workspace
</pre>
<pre class="brush: bash; title: ; notranslate">
cd build-workspace
</pre>
<p><span id="more-1158"></span></p>
<pre class="brush: bash; title: ; notranslate">
#(re)configure database for build server
php ./symfony configure:database &quot;mysql:host=build-db-server;dbname=build-server-sql-user&quot;
</pre>
<pre class="brush: bash; title: ; notranslate">
#(re)build db
php ./symfony doctrine:build-db
</pre>
<p>der Einfachkeit halber liegt der zu migrierende sql dump schon im repository.<br />
Könnte man natürlich auch jetzt von remote holen.</p>
<pre class="brush: bash; title: ; notranslate">
#import some test data
mysql -uUSER -pPW --force database_name &lt; data/sql/some_data_to_migrate.sql
</pre>
<p>hier sollte keine Handarbeit mehr nötig sein,<br />
da man ja alle DB Änderungen per <a href="http://www.doctrine-project.org/projects/orm/1.2/docs/manual/migrations/en">doctrine migrations</a> gemacht hat.<br />
Im Gegensatz zu schema Änderungen bleibt man so abwärtskompatibel zu Vorgängerversionen.</p>
<pre class="brush: bash; title: ; notranslate">
#migrate the test data / db if necessary
php ./symfony doctrine:migrate
</pre>
<p>zum guten Schluss alles testen</p>
<pre class="brush: bash; title: ; notranslate">
#run test, save results as xml
php ./symfony test:all -xml=path/to/results.xml
</pre>
<p>Es lohnt sich in mehrfacher Hinsicht wirklich das komplette Projekt inkl. DB automatisiert von 0 installierbar zu machen.<br />
Auch wenn es vielleicht erstmal nur auf ein paar Instanzen laufen soll.</p>
<p>Man kann erstens bei verteiltem Arbeiten schnell mal eine weitere Arbeitskopie auf einem anderen Rechner erstellen.</p>
<p>Zweitens kann man relativ <a href="http://prendreuncafe.com/blog/post/2009/10/06/Simple-Continuous-Integration-of-a-Symfony-Project-using-Hudson">einfach</a> ein continuous integration setup auf die Beine stellen und sofort ruhiger schlafen ;)</p>
<p>Außerdem kann man ständig die Migration von aktuellen Live Daten, oder einer Vorgängerversion in die Entwicklungsversion testen.<br />
&#8220;Continuous Migration&#8221; ;)</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/11/12/symfony-1-4-automatisierte-builds/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/11/12/symfony-1-4-automatisierte-builds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dependency Injection mit Symfony 1.x</title>
		<link>http://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/</link>
		<comments>http://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/#comments</comments>
		<pubDate>Thu, 27 May 2010 16:58:23 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software engineering]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Inversion of Control]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[sfDependencyInjectionContainerPlugin]]></category>
		<category><![CDATA[Symfony Components]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=987</guid>
		<description><![CDATA[Beschreibung IoC Pattern anhand Grails Services und Kurze Einführung in die Symfony-Komponente "Dependency Injection".]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Durch meine ersten Gehversuche mit <a href="http://www.grails.org/">Grails</a> sowie einen interessanten Vortrag über JSF2 bin ich kürzlich über das Kürzel &#8220;<a href="http://de.wikipedia.org/wiki/Inversion_of_Control">IoC</a>&#8221; gestoßen. Das ganze ist vom Prinzip her recht einfach und in Grails, das im Grunde ein stinknormales MVC-Pattern implementiert, konkret gelöst, indem man durch eine Namenskonvention am Controller automatisch sogenannte Services instanziiert. </p>
<p><span id="more-987"></span></p>
<p>Also anstatt zu schreiben:</p>
<pre class="brush: groovy; title: ; notranslate">
class DefaultController {

  def mySuperService

  def index = {
   mySuperService = new MySuperService(params);
   mySuperService.getData()
  }
}
</pre>
<p>schreibe ich einfach</p>
<pre class="brush: groovy; title: ; notranslate">
class DefaultController {

  def mySuperService

  def index = {
   mySuperService.getData()
  }
}
</pre>
<p>Gut, sieht jetzt nicht besonders spektakulär aus, doch wenn man weiß, dass mySuperService im Hintergrund (Stichwort &#8220;Spring Managed Bean&#8221;) automatisch instanziiert sowie an meinen Controller gebunden wurde und dass da prinzipiell noch viel mehr <a href="http://www.grails.org/Services">geht</a>, ist das bereits ein ganz brauchbares Feature.</p>
<p>Natürlich ist die Injizierung per Naming-convention eine Grails-eigene Lösung (alles, was auf Service endet, ist ein Service und wird injiziert), um Konfigurationsarbeit zu sparen. Für gewöhnlich wird das Verhalten sogenanner &#8220;<a href="http://java.sun.com/javaee/6/docs/api/javax/annotation/ManagedBean.html">managed Beans</a>&#8221; natürlich konfiguriert, entweder Java-typisch via XML-Konfigurationsdatei oder durch <a href="http://de.wikipedia.org/wiki/Annotation#Informatik">Annotationen</a>.</p>
<p>Dabei kann wiederum java-typisch auch der &#8220;Scope&#8221; einer Bean bestimmt werden; hier bringt vor allem der &#8220;Singleton&#8221; bzw. Application Scope einen Vorteil gegenüber einer statuslosen PHP-Anwendung. Doch bereits die Fähigkeit, den Scope überhaupt fein granulieren zu können, setzt das ganze wieder von PHP-Gemurkse ala $_SESSION, $_REQUEST etc. ab. </p>
<p>Also egal wo und in welchem Kontext man Managed Beans, Enterprise Java Beans, Spring Beans (Die Unterschiede interessieren hier mal nicht die Bohne &#8211; ich könnte sie auch gar nicht qualifiziert erläutern) einsetzt &#8211; das IoC-Muster spart Code, vereinfacht Abhängigkeiten und sorgt für schlankere Konstruktoren &#8211; ist insgesamt also eine sehr mächtige Sache.</p>
<p>Was aber nicht heißt, dass so etwas generell nicht auch in meiner PHP-Anwendung funktionieren kann.</p>
<h3><strong>sfDependencyInjectionContainerPlugin</strong></h3>
<p>Dieses Plugin (<a href="http://www.symfony-project.org/plugins/sfDependencyInjectionContainerPlugin">http://www.symfony-project.org/plugins/sfDependencyInjectionContainerPlugin</a>) leistet genau das: Es verwaltet entweder über eine in PHP formulierte <a href="http://de.wikipedia.org/wiki/Dom%C3%A4nenspezifische_Sprache">DSL</a>(hust), über XML oder eine symfony-typische .yml-Datei konfigurierte Abhängigkeiten. Das Plugin ist selbst nur ein Adapter, das die <a href="http://components.symfony-project.org/">Symfony-Komponente</a> <a href="http://components.symfony-project.org/dependency-injection/">DependencyInjection</a> in ein Symfony 1.2 (und höher) Projekt integriert &#8211; in Symfony 2.0 wird DependencyInjection voraussichtlich Bestandteil des Systemkerns sein.</p>
<p>Zur Installation und Konfiguration des Plugins verweise ich auf die <a href="http://www.symfony-project.org/plugins/sfDependencyInjectionContainerPlugin">README</a>-Datei. Trotzdem vielleicht der Hinweis, dass die Bibliotheken mit einem eigenen Autoloader daherkommen, daher empfehle ich, folgende Programm-Zeilen in eure ProjectConfiguration.class.php hinzuzufügen:</p>
<p>config/projectConfiguration.class.php</p>
<pre class="brush: php; title: ; notranslate">
  require_once dirname(__FILE__) . '/../pfad/zur/DependencyInjection/Komponente/sfServiceContainerAutoloader.php';
  sfServiceContainerAutoloader::register();
</pre>
<p>Anders habe ich es nicht hinbekommen, zwar lässt sich durch eine config/autoload.yml die Laufzeit von Class Not Found-Fehlern befreien, aber das Symfony Command Line Interface geht dann trotzdem hops. Für einen Tipp, wie man&#8217;s eleganter hinkriegt, wäre ich dankbar.</p>
<p>Beispielsweise möchte ich den Nerdpress-RSS-Feed in meine Seite einbinden. Dazu baue ich einen Proxy, um bequem via AJAX auf das entfernte RSS-XML zugreifen zu können.<br />
Diesen Proxy definiere ich als Service und injiziere ihn meine Symfony-Module:</p>
<p>config/services.yml:</p>
<pre class="brush: jscript; title: ; notranslate">
services:
  NerdpressRssProxy:
    class: NerdpressRssProxy
</pre>
<p>Diese drei Zeilen reichen bereits aus, um meine Abhängigkeit zu definieren.</p>
<p>Nun implementiere ich die Service-Klasse:</p>
<p>lib/NerdpressRssProxy.php</p>
<pre class="brush: php; title: ; notranslate">
class NerdpressRssProxy
{
  /**
   * @var sfFileCache
   */
  protected $cache;

  /**
   * @return sfFileCache
   */
  public function getCache()
  {
    if (null === $this-&gt;cache)
    {
      $this-&gt;cache = new sfFileCache(array('cache_dir' =&gt; sfConfig::get('sf_cache_dir')));
    }
    return $this-&gt;cache;
  }

  /**
   * @return string
   * @throws Exception
   */
  public function getEntries()
  {
    $cache = $this-&gt;getCache();

    sfContext::getInstance()-&gt;getConfiguration()-&gt;loadHelpers(array('Helper', 'Tag', 'Url', 'Text'));

    if(!($rss = $cache-&gt;get('nerdpress_rss')))
    {
      if(($rss = @file_get_contents('http://nerdpress.org/feed')))
      {
        $rss = auto_link_text($rss, 'all', array('class' =&gt; 'external'));

        $cache-&gt;set('nerdpress_rss', $rss, 3600);
      }
      else
      {
        throw new Exception('Rss feed could not be opened');
      }
    }
    return $rss;
  }
}
</pre>
<p>Die Methode getEntries() rufe ich nun in meinem Nerdpress-RSS-Modul auf, um die WebResponse zu befüllen:</p>
<p>apps/frontend/modules/rssProxy/actions/actions.class.php</p>
<pre class="brush: php; title: ; notranslate">
class rssProxyActions extends sfActions
{
  public function preExecute()
  {
    $this-&gt;getResponse()-&gt;setContentType('application/rss+xml');
  }

  public function executeNerdpress(sfWebRequest $request)
  {
    try
    {
      // SERVICE HOLEN UND getEntries() AUFRUFEN
      $rss = $this-&gt;getService('NerdpressRssProxy')-&gt;getEntries();

      $this-&gt;getResponse()-&gt;setHttpHeader('Content-Length', mb_strlen($rss));
      $this-&gt;getResponse()-&gt;setContent($rss);
    }
    catch(Exception $e)
    {
      $this-&gt;forward404($e-&gt;getMessage());
    }
    return sfView::NONE;
  }
}
</pre>
<p>Das wars. Einfach, oder? Ingesamt 3 Zeilen yml-Konfiguration reichen, um Dependency Injection &#8220;the PHP way&#8221; zu realisieren, Symfony sei Dank. Natürlich ist nicht *ganz* so hübsch wie in der J2EE-Welt und sicherlich funktional noch weit davon entfernt. Aber ein Anfang ist gemacht, und wenn man seine Services erst einmal auf diese Art und Weise unter Kontrolle bringt, ist man vom Nutzen der Sache schnell überzeugt: Mit ein bisschen Disziplin gehören &#8220;Controller-Spaghettiwürste&#8221; nämlich der Vergangenheit an.</p>
<p>Bitte entschuldigt eventuell fehlerhafte oder unsaubere Beschreibungen der Begriffe &#8220;Bean&#8221;, &#8220;IoC&#8221;, JSF2 etc. Ich bitte explizit um Korrektur in Form von Kommentaren :)</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/05/27/dependency-injection-mit-symfony-1-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony reloaded &#8211; Symfony 2.0 preview release</title>
		<link>http://nerdpress.org/2010/02/18/symfony-reloaded-symfony-2-0-preview-release/</link>
		<comments>http://nerdpress.org/2010/02/18/symfony-reloaded-symfony-2-0-preview-release/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 18:17:01 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=815</guid>
		<description><![CDATA[Gerade erst gesehen: Symfony 2.0 kommt anscheinend gegen Ende 2010. get the code.:) The repository is updated every 15 minutes. Einiges klingt schon ziemlich vielversprechend. &#8230;die Tage mal genauer reinschauen. It is up to 3 times faster than symfony 1.4 or Zend Framework 1.10 and consumes half the memory.]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Gerade erst gesehen: <a href="http://symfony-reloaded.org/">Symfony 2.0</a> kommt anscheinend gegen Ende 2010.</p>
<p><a href="http://symfony-reloaded.org/code">get the code.</a>:)</p>
<blockquote><p>
The repository is updated every 15 minutes.
</p></blockquote>
<p>Einiges klingt schon ziemlich vielversprechend.<br />
&#8230;die Tage mal genauer reinschauen.</p>
<blockquote><p>
It is up to 3 times faster than symfony 1.4 or Zend Framework 1.10 and consumes half the memory.
</p></blockquote>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/02/18/symfony-reloaded-symfony-2-0-preview-release/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/02/18/symfony-reloaded-symfony-2-0-preview-release/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

