Más con Symfony

3.2. Programa más rápido

Programar aplicaciones y crear nuevas tareas obliga a teclear muchos caracteres. A continuación se explica cómo reducir al mínimo imprescindible los caracteres que se teclean.

3.2.1. Eligiendo el IDE

Utilizar un buen IDE ayuda al programador a ser más productivo de muchas formas diferentes.

En primer lugar, los IDE más modernos incluyen autocompletado de código PHP. Esto significa que sólo tienes que escribir las primeras letras del nombre de un método. Además, esto también significa que si no te acuerdas del nombre del método, no hace falta que busques en la API del framework, ya que el IDE muestra la lista de todos los métodos disponibles en ese objeto.

En segundo lugar, algunos IDE como PHPEdit y Netbeans conocen más sobre Symfony y por eso ofrecen una integración mucho más específica con los proyectos Symfony.

3.2.1.1. Utilizando un IDE que soporte Symfony

Algunos IDE como PHPEdit 3.4 y NetBeans 6.8 disponen de soporte nativo de Symfony, por lo que ofrecen una integración muy completa con el framework. No te olvides repasar su documentación para aprender más sobre su soporte de Symfony y sobre cómo pueden ayudarte a programar más rápido.

3.2.1.2. Ayudando al IDE

El autocompletado de código PHP en los IDE sólo funciona con los métodos que han sido definidos explícitamente en el código. Por tanto, si tu código incluye métodos mágicos como __call() o __get() los IDE no son capaces de adivinar los métodos y propiedades disponibles para ese objeto. La buena noticia es que en esos casos puedes ayudar a los IDE definiendo los métodos y/o propiedades disponibles mediante un bloque de PHPDoc (utilizando las anotaciones @method y @property respectivamente).

Imagina que tienes una clase Message con una propiedad dinámica (message) y un método dinámico (getMessage()). El siguiente código muestra cómo pueden los IDE saber lo anterior sin ninguna definición explícita en el código PHP:

/**
 * @property clob $message
 *
 * @method clob getMessage() Devuelve el valor del mensaje actual
 */
class Message
{
  public function __get()
  {
    // ...
  }

  public function __call()
  {
    // ...
  }
}

Aunque el método getMessage() no existe, el IDE puede reconocerlo gracias a la anotación @method. Lo mismo sucede con la propiedad message debido a la anotación @property.

Esta técnica es la que utiliza por ejemplo la tarea doctrine:build-model. Si una clase se llama MailMessage, tiene dos columnas (message y priority) y usa Doctrine, su código PHP es el siguiente:

/**
 * BaseMailMessage
 *
 * This class has been auto-generated by the Doctrine ORM Framework
 *
 * @property clob $message
 * @property integer $priority
 *
 * @method clob        getMessage()  Returns the current record's "message" value
 * @method integer     getPriority() Returns the current record's "priority" value
 * @method MailMessage setMessage()  Sets the current record's "message" value
 * @method MailMessage setPriority() Sets the current record's "priority" value
 *
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## <##EMAIL##>
 * @version    SVN: $Id: Builder.php 6508 2009-10-14 06:28:49Z jwage $
 */
abstract class BaseMailMessage extends sfDoctrineRecord
{
    public function setTableDefinition()
    {
        $this->setTableName('mail_message');
        $this->hasColumn('message', 'clob', null, array(
             'type' => 'clob',
             'notnull' => true,
             ));
        $this->hasColumn('priority', 'integer', null, array(
             'type' => 'integer',
             ));
    }

    public function setUp()
    {
        parent::setUp();
        $timestampable0 = new Doctrine_Template_Timestampable();
        $this->actAs($timestampable0);
    }
}