<?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>ebene7 &#187; Parameter</title>
	<atom:link href="http://blog.ebene7.com/schlagwort/parameter/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ebene7.com</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 18:57:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Symfony2: Custom ParamConverter für HTTP-Requests erstellen</title>
		<link>https://blog.ebene7.com/2013/01/31/symfony2-custom-paramconverter-fuer-http-requests-erstellen/</link>
		<comments>https://blog.ebene7.com/2013/01/31/symfony2-custom-paramconverter-fuer-http-requests-erstellen/#comments</comments>
		<pubDate>Thu, 31 Jan 2013 21:00:49 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Controller]]></category>
		<category><![CDATA[Converter]]></category>
		<category><![CDATA[Parameter]]></category>
		<category><![CDATA[Request]]></category>
		<category><![CDATA[Symfony2]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=3978</guid>
		<description><![CDATA[Eines der vielen kleinen Goodies die Symfony2 zu bieten hat ist der ParamConverter. Die ParamConverter übersetzen die Parameter beim HTTP-Request nach den gewünschten Vorgaben. So können zum Beispiel Datenmodelle direkt geladen oder Datum-Strings als DateTime-Objekte genutzt werden. Wenn man mit &#8230; <a href="https://blog.ebene7.com/2013/01/31/symfony2-custom-paramconverter-fuer-http-requests-erstellen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Eines der vielen kleinen Goodies die Symfony2 zu bieten hat ist der ParamConverter. Die ParamConverter übersetzen die Parameter beim HTTP-Request nach den gewünschten Vorgaben. So können zum Beispiel Datenmodelle direkt geladen oder Datum-Strings als DateTime-Objekte genutzt werden. Wenn man mit einem Standardsetup arbeitet, sind diese Converter direkt dabei.</p>
<p>Aber auch eigene Converter sind schnell geschrieben und einsatzfähig. Sämtliche Möglichkeiten des <a href="http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html" target="_blank">ParamConverters</a> stehen in der Dokumentation.<br />
<span id="more-3978"></span></p>
<p>Als Ausgangspunkt haben wir in dem Beispiel eine Action, die mit einer ID aufgerufen wird.</p>
<pre>&lt;?php
namespace E7\DemoBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use E7\DemoBundle\Model\Post;

class DefaultController extends Controller {
    /**
     * @Route("/test/{postId}")
     * @ParamConverter()
     * @param   Post $post
     */
    public function testAction(Post $post) {
      // some usefull code
    }
}</pre>
<p>Über die Annotation @ParamConverter weiß das System nun, dass der Parameter übersetzt werden soll. Die bereits zu Beginn erwähnten Converter sind bereits registriert. Um nun eine eigene Logik zu verwenden, brauchen wir einen eigenen Übersetzter. Die Klasse muss das Interface ParamConverterInterface implementieren.</p>
<p>Die Schnittstelle ist sehr einfach gehalten und bietet alls was man braucht. Die Methode supports() muss ein TRUE oder FALSE zurückgeben, ob die Klasse die Anfrage übersetzen kann und apply() mach dann den Rest.</p>
<pre>&lt;?php
namespace E7\DemoBundle\Request\ParamConverter;

use Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter\ParamConverterInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class ModelParamConverter implements ParamConverterInterface {
    function apply(Request $request, ConfigurationInterface $configuration) {
        $name = $configuration-&gt;getName();
        $idParam = $name . 'Id';
        $class = $configuration-&gt;getClass();

        if (!$request-&gt;attributes-&gt;has($idParam)) {
            return false;
        }

        $id = $request-&gt;attributes-&gt;get($idParam);

        $model = loadModelById($id);
        $request-&gt;attributes-&gt;set($param, $model);

        if (null === $model-&gt;getId()) {
            throw new NotFoundHttpException(sprintf('%s object not found.', $class));
        }

        return true;
    }

    function supports(ConfigurationInterface $configuration) {
        return modelClassExists($class);
    }
}</pre>
<p>Die Klasse soll schematisch zeigen, wie ein Converter funktionieren könnte. Die beiden Funktionen loadModelById() und modelClassExists() stehen nur als Pseudocode da. Alle verfügbaren Werte können über die Annotation $configuration abgerufen werden. Über $configuration kommen wir an den Namen des Parameter und den TypeHint.</p>
<pre>Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter Object
(
    [name:protected] =&gt; post
    [class:protected] =&gt; E7\DemoBundle\Model\Post
    [options:protected] =&gt; Array
        (
        )

    [optional:protected] =&gt;
    [converter:protected] =&gt; model
)</pre>
<p>Bevor unser Converter überhaupt beachtet wird, müssen wir ihn in der services.yml als Service registrieren.</p>
<pre>services:
    request.param_converter:
        class: E7\DemoBundle\Request\ParamConverter\ModelParamConverter
        tags:
            - { name: request.param_converter, converter: model }</pre>
<p>Ab jetzt sollte alles zusammenarbeiten und wir können nach belieben Requestparameter umformen. Viel Spaß!</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2013/01/31/symfony2-custom-paramconverter-fuer-http-requests-erstellen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Array als Parameterliste an den Konstruktor übergeben</title>
		<link>https://blog.ebene7.com/2011/03/21/array-als-parameterliste-an-den-konstruktor-uebergeben/</link>
		<comments>https://blog.ebene7.com/2011/03/21/array-als-parameterliste-an-den-konstruktor-uebergeben/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 05:00:51 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[Callback]]></category>
		<category><![CDATA[Factory]]></category>
		<category><![CDATA[Parameter]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.ebene7.com/?p=2797</guid>
		<description><![CDATA[In verschiedenen Fällen kann/muss man, z.B. Callback-Funktionen/Methoden mit einer variablen Parameterliste aufrufen. Was aber, wenn wir ein Objekt durch eine Factory erstellen wollen und der Konstruktor Parameter erwartet? Die Funktionen call_user_func() oder call_user_func_array() fallen leider aus, da wir noch kein &#8230; <a href="https://blog.ebene7.com/2011/03/21/array-als-parameterliste-an-den-konstruktor-uebergeben/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In verschiedenen Fällen kann/muss man, z.B. Callback-Funktionen/Methoden mit einer variablen Parameterliste aufrufen. Was aber, wenn wir ein Objekt durch eine Factory erstellen wollen und der Konstruktor Parameter erwartet?</p>
<p>Die Funktionen <a href="http://de2.php.net/manual/de/function.call-user-func.php" target="_blank">call_user_func()</a> oder <a href="http://de2.php.net/manual/de/function.call-user-func-array.php" target="_blank">call_user_func_array()</a> fallen leider aus, da wir noch kein Callback-Objekt haben. Es gibt aber einen sehr einfachen Weg mit Reflections.<span id="more-2797"></span></p>
<p>Zuerst ein paar einfache Klassen zum Testen. Von der Klasse Foo soll ein Objekt erstellt werden und diese erwartet je ein Objekt vom Typ Bar und Baz als Parameter im Konstruktor.</p>
<pre>&lt;?php
class Bar {}
class Baz {}

class Foo
{
  public function __construct(Bar $bar, Baz $baz)
  {
    echo '&lt;pre&gt;' . print_r(func_get_args(), true) . '&lt;/pre&gt;';
  }
}</pre>
<p>Nun wird das Objekt über eine sehr einfache Factory-Methode erzeugt und dabei wird die Parameterliste von create() an den Konstruktor weitergegeben.</p>
<pre>&lt;?php
class Factory
{
  public static function create($type)
  {
    $args = func_get_args();
    array_shift($args);
    $class = new ReflectionClass($type);
    return $class-&gt;newInstanceArgs($args);
  }
}

$foo = Factory::create('Foo', new Bar(), new Baz());</pre>
<p>So einfach ist es. Über die Reflection-Klasse wird ein neues Objekt erzeugt.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.ebene7.com/2011/03/21/array-als-parameterliste-an-den-konstruktor-uebergeben/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
