Symfony components



Symfony components

0 0


thelia_workshop


On Github lunika / thelia_workshop

Pourquoi une V2 ?

  • Utilisation d'outils de dev modernes
  • Beaucoup de nouvelles fonctionnalités
  • Obtenir une nouvelle image
  • Séduire les développeurs

Mais encore ?

  • Renforcer les performances
  • Internationalisation du code source
  • Faciliter l'interopérabilité
  • Nouvelles fonctionnalités
  • Nouvelle documentation
  • Solution toujours plus modulaire

Quels outils modernes ?

Symfony components

  • Dependency Injection
  • Event Dispatcher
  • Http Kernel
  • Http Foundation
  • Config
  • Console
  • Form
  • Gestion de dépendance des librairies
  • Utilisation de l'autoloader
  • Dump d'un class map

Version 2 !

https://github.com/thelia/model

Version 3.1.x

  • connu
  • Plein de fonctionnalités existantes
  • C'est dans les vieux pots qu'on fait les meilleures confitures !

Intégration continue

(pas assez !!!)

PHP FIG

  • PSR-0 (class autoloader and namespaces)
  • PSR-1 (coding standard)
  • PSR-2 (coding standard)
  • PSR-3 (logger interface)

mais aussi

  • Assetic
  • password_compat
  • htmlpurifier
  • faker

Quelques stats

  • 56 Namespaces
  • 538 classes
  • 283372 lignes de code
  • On ne compte plus les bières

On veut du code !!!

Structure d'un plugin (local/modules)

MyModule
    MyModule.php
    Config
        config.xml
    Loop
        Product.php
        MyLoop.php
    Actions
        Customer.php
        Cart.php
    Form
        Customer.php
    Model
    ...
  • Godclass
  • Single responsibility principle
  • API claire et facile

Loop

namespace MyModule\Loop;

use Thelia\Core\Template\Element\BaseLoop;
use Thelia\Core\Template\Element\LoopResult;
use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
use Thelia\Core\Template\Loop\Argument\Argument;
use Thelia\Model\CustomerQuery;
use Thelia\Model\ConfigQuery;

class MyLoop extends BaseLoop
{
    /**
     * @return ArgumentCollection
     */
    protected function getArgDefinitions()
    {
        return new ArgumentCollection(
            Argument::createBooleanTypeArgument('current', 1),
            Argument::createIntListTypeArgument('id'),
            new Argument(
                'ref',
                new TypeCollection(
                    new Type\AlphaNumStringListType()
                )
            ),
            Argument::createBooleanTypeArgument('reseller'),
            Argument::createIntTypeArgument('sponsor')
        );
    }

    /**
    * @param $pagination
    *
    * @return \Thelia\Core\Template\Element\LoopResult
    */
    public function exec(&$pagination)
    {
        $search = CustomerQuery::create();


        if (null !== $id) {
            $search->filterById($id, Criteria::IN);
        }
        ...
        $customers = $this->search($search, $pagination);

        $loopResult = new LoopResult();

        foreach ($customers as $customer) {

            if ($this->not_empty && $customer->countAllProducts() == 0) continue;

            $loopResultRow = new LoopResultRow();
            $loopResultRow
                ->set("ID", $customer->getId())
                ->set("DISCOUNT", $customer->getDiscount())
            ...
            ;

            $loopResult->addRow($loopResultRow);
        }

        return $loopResult;
    }
}
    

Action

Observer Design Pattern

Form

            namespace Thelia\Form;


use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Choice;

class AdminLogin extends BaseForm {

    protected function buildForm()
    {
        $this->formBuilder
            ->add("username", "text", array(
                "constraints" => array(
                    new NotBlank(),
                    new Length(array("min" => 3))
                )
            ))
            ->add("password", "password", array(
                "constraints" => array(
                    new NotBlank()
                )
            ))
            ->add("remember_me", "checkbox", array(
                'value' => 'yes'
            ))
        ;
    }

    public function getName()
    {
        return "thelia_admin_login";
    }
}
        

Ressources

https://github.com/thelia

https://github.com/thelia/thelia

https://github.com/thelia/model

documentation => http://thelia.github.io

L'hymne de Thelia

OMT

            $ composer create-project thelia/thelia thelia2 dev-master