<?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>ORM | Nerdpress.org</title>
	<atom:link href="https://nerdpress.org/tag/orm/feed/" rel="self" type="application/rss+xml" />
	<link>https://nerdpress.org</link>
	<description>...dev, tech problems and solutions.</description>
	<lastBuildDate>Mon, 29 Aug 2011 18:39:56 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>[Symfony 2] Security Bundle &#8211; Benutzer mit username oder email anmelden.</title>
		<link>https://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 12 Aug 2011 13:04:36 +0000</pubDate>
				<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">https://nerdpress.org/?p=1566</guid>

					<description><![CDATA[<p>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.</p>
The post <a href="https://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/">[Symfony 2] Security Bundle – Benutzer mit username oder email anmelden.</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<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: &#x5B; 'ROLE_USER' ] }
                admin: { password: adminpass, roles: &#x5B; '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>The post <a href="https://nerdpress.org/2011/08/12/symfony-2-security-bundle-benutzer-mit-username-oder-email-anmelden/">[Symfony 2] Security Bundle – Benutzer mit username oder email anmelden.</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Symfony 2 PR3: doctrine:schema:create liefert &#8220;No Metadata Classes to process.&#8221;</title>
		<link>https://nerdpress.org/2010/10/17/symfony-2-pr3-doctrineschemacreate-liefert-no-metadata-classes-to-process/</link>
					<comments>https://nerdpress.org/2010/10/17/symfony-2-pr3-doctrineschemacreate-liefert-no-metadata-classes-to-process/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 17 Oct 2010 16:33:42 +0000</pubDate>
				<category><![CDATA[Doctrine ORM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[active entity]]></category>
		<category><![CDATA[cli]]></category>
		<category><![CDATA[Doctrine 2]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[symfony 2]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=1131</guid>

					<description><![CDATA[<p>Die Doku stellt in Aussicht, dass man den &#8220;normalen&#8221; Doctrine-Namespace-Shortcut benutzen kann, also bspw. @Entity anstelle von @DoctrineOrmMappingEntity. Funktioniert aber nicht, weil in irgend einer Service-Configuration dieser Namespace auf einen Alias gemapped wird, der da lautet &#8220;orm&#8221;. Die Syntax lautet aber nun auch nicht @ormEntity, sondern @orm:Entity. Schreibt man sein Model also bspw. so: &#60;?php &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/10/17/symfony-2-pr3-doctrineschemacreate-liefert-no-metadata-classes-to-process/" class="more-link">Continue reading<span class="screen-reader-text"> "Symfony 2 PR3: doctrine:schema:create liefert &#8220;No Metadata Classes to process.&#8221;"</span></a></p>
The post <a href="https://nerdpress.org/2010/10/17/symfony-2-pr3-doctrineschemacreate-liefert-no-metadata-classes-to-process/">Symfony 2 PR3: doctrine:schema:create liefert “No Metadata Classes to process.”</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>Die <a href="http://docs.symfony-reloaded.org/guides/doctrine/orm/overview.html">Doku</a> stellt in Aussicht, dass man den &#8220;normalen&#8221; Doctrine-Namespace-Shortcut benutzen kann, also bspw. @Entity anstelle von @DoctrineOrmMappingEntity. Funktioniert aber nicht, weil in irgend einer Service-Configuration dieser Namespace auf einen Alias gemapped wird, der da lautet &#8220;orm&#8221;. Die Syntax lautet aber nun auch nicht @ormEntity, sondern @orm:Entity. Schreibt man sein Model also bspw. so:</p>
<pre class="brush: php; title: ; notranslate">
&lt;?php

namespace ApplicationHelloBundleEntity;

/**
 * ApplicationHelloBundleEntityUser
 *
 * @orm:Table(name=&quot;users&quot;)
 * @orm:Entity
 */
class User
{
  /**
   * @var integer $id
   *
   * @orm:Column(name=&quot;id&quot;, type=&quot;integer&quot;)
   * @orm:Id
   * @orm:GeneratedValue(strategy=&quot;AUTO&quot;)
   */
  protected $id;
</pre>
<p>sollten alle CLI-Tasks auch wunderbar funktionieren. Es bleibt zu hoffen, dass die DI-Services eine reichhaltige Parameter-Dokumentation spendiert kriegen und das ganze Bundle-System eine transparente, dokumentierte API erhalten (wo zum Teufel liegt in der Sandbox bitte der versprochene Doctrine-Controller?) </p>
<p>Die Einstellung findet sich übrigens in der Service-Configuration unter src/vendor/symfony/src/Symfony/Bundle/DoctrineBundle/Resources/config/orm.xml:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;service id=&quot;doctrine.orm.metadata_driver.annotation.reader&quot; class=&quot;%doctrine.orm.metadata.annotation_reader_class%&quot;&gt;
            &lt;call method=&quot;setAnnotationNamespaceAlias&quot;&gt;
              &lt;argument&gt;DoctrineORMMapping&lt;/argument&gt;
              &lt;argument&gt;orm&lt;/argument&gt;
            &lt;/call&gt;
        &lt;/service&gt;
</pre>
<p>Ist leicht zu finden, wenn man weiß, wonach man suchen muss. Ich denke, es ist am einfachsten, die Service-Definition des DI-Containers an entsprechender Stelle an seine eigenen Bedürfnisse anzupassen. Wie das zuverlässig und projektübergreifend funktioniert, erkläre ich vielleicht mal, wenn ich&#8217;s selbst gerafft hab.</p>
<p>Achso, <a href="http://groups.google.com/group/symfony-devs/browse_thread/thread/a2912efa4b64002a/4606d5407258dd2d?show_docid=4606d5407258dd2d">hier</a> noch der Nebensatz (etwas herunter scrollen), in dem gesagt wird, das Jonathan irgendwann mal das &#8220;orm:&#8221; Präfix einführt. Symfony 2 ist definitiv noch nicht ready for production (was aber auch niemand behauptet).</p>The post <a href="https://nerdpress.org/2010/10/17/symfony-2-pr3-doctrineschemacreate-liefert-no-metadata-classes-to-process/">Symfony 2 PR3: doctrine:schema:create liefert “No Metadata Classes to process.”</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/10/17/symfony-2-pr3-doctrineschemacreate-liefert-no-metadata-classes-to-process/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>The only valid measurement of code quality: WTFs/minute</title>
		<link>https://nerdpress.org/2010/02/17/the-only-valid-measurement-of-code-quality-wtfs-minute/</link>
					<comments>https://nerdpress.org/2010/02/17/the-only-valid-measurement-of-code-quality-wtfs-minute/#comments</comments>
		
		<dc:creator><![CDATA[Max Girkens]]></dc:creator>
		<pubDate>Wed, 17 Feb 2010 09:25:43 +0000</pubDate>
				<category><![CDATA[Doctrine ORM]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[EntityManager]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[writeBehind]]></category>
		<category><![CDATA[WTFs]]></category>
		<guid isPermaLink="false">https://nerdpress.org/?p=810</guid>

					<description><![CDATA[<p>oder: Doctrine 2 wird wohl ziemlich gut. Hier gibt es ein paar Notizen von Jonathan Wage&#8217;s Präsentation dazu! Sehr cool klingt unter anderem auch die writeBehind Geschichte und dass Objekte nicht mehr von Doctrine Klassen abgeleitet werden müssen, sondern mit dem &#8220;Entity Managers&#8221; zB. gespeichert werden. Also keine ->save() methoden mehr. :) “Everything is an &#8230; </p>
<p class="link-more"><a href="https://nerdpress.org/2010/02/17/the-only-valid-measurement-of-code-quality-wtfs-minute/" class="more-link">Continue reading<span class="screen-reader-text"> "The only valid measurement of code quality: WTFs/minute"</span></a></p>
The post <a href="https://nerdpress.org/2010/02/17/the-only-valid-measurement-of-code-quality-wtfs-minute/">The only valid measurement of code quality: WTFs/minute</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></description>
										<content:encoded><![CDATA[<p>oder: <a href="http://www.doctrine-project.org/">Doctrine</a> 2 wird wohl ziemlich gut.</p>
<p><a href="http://window.punkave.com/2010/02/16/doctrine-2-jonathan-wage-at-sflive2010/">Hier</a> gibt es ein paar Notizen von Jonathan Wage&#8217;s Präsentation dazu!</p>
<p><span id="more-810"></span><br />
Sehr cool klingt unter anderem auch die writeBehind Geschichte und dass Objekte nicht mehr von Doctrine Klassen abgeleitet werden müssen, sondern mit dem &#8220;Entity Managers&#8221; zB. gespeichert werden.<br />
Also keine ->save() methoden mehr. :)</p>
<blockquote><p>
“Everything is an entity.” A lightweight persistent domain object, a regular PHP class. You don’t extend a base doctrine class. No final methods.</p>
<p>namespace Entities;<br />
class User<br />
{<br />
  private $id;<br />
  private $name;<br />
  private $address;<br />
}</p>
<p>Note use of <a href="http://de.php.net/manual/de/language.namespaces.php">namespaces</a>.</p>
<p>EntityManager is central access point to ORM. Used to query for persistent objects. Employs transactional write behind strategy that delays execution of SQL to execute it in the most efficient way.
</p></blockquote>The post <a href="https://nerdpress.org/2010/02/17/the-only-valid-measurement-of-code-quality-wtfs-minute/">The only valid measurement of code quality: WTFs/minute</a> first appeared on <a href="https://nerdpress.org">Nerdpress.org</a>.]]></content:encoded>
					
					<wfw:commentRss>https://nerdpress.org/2010/02/17/the-only-valid-measurement-of-code-quality-wtfs-minute/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
