Creare un Database – ORM – Doctrine

La gestione del database su Symfony è di tipo ORM (Object-relational mapping), cioè òegge e scrive dal database utilizzando un’interfaccia orientata agli oggetti.

Symfony dispone di due ORM Propel e Doctrine.

L’ORM ha bisogno della descrizione delle tabelle e delle loro relazioni per creare le relative classi, quindi descriviamo il tutto in un file YAML.

1. C:\wamp64\www\jobeet\config\doctrine\schema.yml
Qui descriviamo in formato YML le tabelle e le colonne del DB

NB: in YAML l’indentazione deve essere fatta con uno o più spazi, mai con le tabulazioni.


# config/doctrine/schema.yml
JobeetCategory:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true, unique: true }
 
JobeetJob:
  actAs: { Timestampable: ~ }
  columns:
    category_id:  { type: integer, notnull: true }
    type:         { type: string(255) }
    company:      { type: string(255), notnull: true }
    logo:         { type: string(255) }
    url:          { type: string(255) }
    position:     { type: string(255), notnull: true }
    location:     { type: string(255), notnull: true }
    description:  { type: string(4000), notnull: true }
    how_to_apply: { type: string(4000), notnull: true }
    token:        { type: string(255), notnull: true, unique: true }
    is_public:    { type: boolean, notnull: true, default: 1 }
    is_activated: { type: boolean, notnull: true, default: 0 }
    email:        { type: string(255), notnull: true }
    expires_at:   { type: timestamp, notnull: true }
  relations:
    JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs } 
 
JobeetAffiliate:
  actAs: { Timestampable: ~ }
  columns:
    url:       { type: string(255), notnull: true }
    email:     { type: string(255), notnull: true, unique: true }
    token:     { type: string(255), notnull: true }
    is_active: { type: boolean, notnull: true, default: 0 }
  relations:
    JobeetCategories:
      class: JobeetCategory
      refClass: JobeetCategoryAffiliate
      local: affiliate_id
      foreign: category_id
      foreignAlias: JobeetAffiliates
 
JobeetCategoryAffiliate:
  columns:
    category_id:  { type: integer, primary: true }
    affiliate_id: { type: integer, primary: true }
  relations:
    JobeetCategory:  { onDelete: CASCADE, local: category_id, foreign: id }
    JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }

L’attributo onDelete definisce il comportamento ON DELETE delle chiavi esterne, Doctrine supporta CASCADE, SET NULL e RESTRICT. Per esempio quando un record job viene eliminato, tutti i record jobeet_category_affiliate associati verranno automaticamente eliminati dal database.

2. Aprire PhpMyAdmin> Nuovo> Crea un nuovo database> jobeet

3. Indichiamo a Symfony di utilizzare il database jobeet, supponendo che il nostro DB non abbia bisogno di password:
cmd.exe -> C:\wamp64\www\jobeet>symfony configure:database “mysql:host=localhost;dbname=jobeet”

Il task configure:database salva la configurazione all’interno del file jobeet/config/databases.yml:


all:
  doctrine:
    class: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=jobeet'
      username: root
      password: null

4. Crezione dei modelli cioè delle classi PHP per la gestione del DB:
cmd.exe -> C:\wamp64\www\jobeet>symfony doctrine:build –model

Crea i file php con le classi per la gestione del DB in jobeet/lib/model/doctrine/
– JobeetAffiliate.class.php
– JobeetAffiliateTable.class.php
– etc…

Il DB è ancora vuoto, non ha tabelle ne colonne

5. Generazione dei comandi SQL
cmd.exe -> C:\wamp64\www\jobeet>symfony doctrine:build –sql

Genera il file jobeet/data/sql/schema.sql:


CREATE TABLE jobeet_affiliate (id BIGINT AUTO_INCREMENT, url VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, token VARCHAR(255) NOT NULL, is_active TINYINT(1) DEFAULT '0' NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE jobeet_category (id BIGINT AUTO_INCREMENT, name VARCHAR(255) NOT NULL UNIQUE, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE jobeet_category_affiliate (category_id BIGINT, affiliate_id BIGINT, PRIMARY KEY(category_id, affiliate_id)) ENGINE = INNODB;
CREATE TABLE jobeet_job (id BIGINT AUTO_INCREMENT, category_id BIGINT NOT NULL, type VARCHAR(255), company VARCHAR(255) NOT NULL, logo VARCHAR(255), url VARCHAR(255), position VARCHAR(255) NOT NULL, location VARCHAR(255) NOT NULL, description TEXT NOT NULL, how_to_apply TEXT NOT NULL, token VARCHAR(255) NOT NULL UNIQUE, is_public TINYINT(1) DEFAULT '1' NOT NULL, is_activated TINYINT(1) DEFAULT '0' NOT NULL, email VARCHAR(255) NOT NULL, expires_at DATETIME NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX category_id_idx (category_id), PRIMARY KEY(id)) ENGINE = INNODB;
ALTER TABLE jobeet_category_affiliate ADD CONSTRAINT jobeet_category_affiliate_category_id_jobeet_category_id FOREIGN KEY (category_id) REFERENCES jobeet_category(id) ON DELETE CASCADE;
ALTER TABLE jobeet_category_affiliate ADD CONSTRAINT jobeet_category_affiliate_affiliate_id_jobeet_affiliate_id FOREIGN KEY (affiliate_id) REFERENCES jobeet_affiliate(id) ON DELETE CASCADE;
ALTER TABLE jobeet_job ADD CONSTRAINT jobeet_job_category_id_jobeet_category_id FOREIGN KEY (category_id) REFERENCES jobeet_category(id) ON DELETE CASCADE;

Il DB è ancora vuoto, non ha tabelle ne colonne

6. Eseguiamo schema.sql nel DB
cmd.exe -> C:\wamp64\www\jobeet>symfony doctrine:insert-sql

Aprire PhpMyAdmin, ora il database ha tabelle e colonne

7. Ripuliamo la cache per permettere a Symfony di utilizzare le nuove classi creare con la creazione dei modelli
cmd.exe -> C:\wamp64\www\jobeet>symfony cache:clear

Reference:
http://symfony.com/legacy/doc/jobeet/1_4/it/03?orm=Doctrine

By |PHP, Symfony, Web Design|Commenti disabilitati su Creare un Database – ORM – Doctrine

Symfony 1.4.20 – Environments – Production – Dev

La gestione degli ambienti di sviluppo viene gestita da Symfony 1.4.20 dai file:

– wamp64/www/jobeet/web/index.php per l’ambiente di produzione

– wamp64/www/jobeet/web/frontend_dev.php per l’ambiente di sviluppo

Supponiamo che la nostra pagina sia visibile al visitatore a:

http://localhost/jobeet/web/contenuto/mypageone
equivale a scrivere:
http://localhost/jobeet/web/index.php/contenuto/mypageone

Se vogliamo lavorare in ambiente di sviluppo, quindi con la barra per il debug e tutti i messaggi di errore:
http://localhost/jobeet/web/frontend_dev.php/contenuto/mypageone

Probabilmente vedremo una fila di istruzioni deprecate e alla fine il render della nostra pagina.

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony 1.4.20 – Environments – Production – Dev

Symfony 1.4 – Skip or Set the View

Metodo = Template

1. apps/frontend/modules/contenuto/templates/mypageoneSuccess


<p>Page One</p>

2. apps/frontend/modules/contenuto/templates/mypagetwoSuccess


<p>Page Two</p>

3. apps/frontend/modules/contenuto/actions/actions.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeMypageone() // crea l'indirizzo - contenuto/mypageone
  { 
        
  }// END function
  public function executeMypagetwo() // crea l'indirizzo - contenuto/mypagetwo
  {      
  }// END function
}// END class

Point the browser at:
– http://localhost/jobeet/web/contenuto/mypageone -> render Page One
– http://localhost/jobeet/web/contenuto/mypagetwo -> render Page Two

Render dal Controller – Evitare il Template

3. apps/frontend/modules/contenuto/actions/actions.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeMypageone() // crea l'indirizzo - contenuto/mypageone
  { 
        return $this->renderText("<html><body>Hello, World!</body></html>");
  }// END function
  public function executeMypagetwo() // crea l'indirizzo - contenuto/mypagetwo
  {      
  }// END function
}// END class

Point the browser at:
– http://localhost/jobeet/web/contenuto/mypageone -> render Hello, World!

Usare un Template Diverso

3. apps/frontend/modules/contenuto/actions/actions.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeMypageone() // crea l'indirizzo - contenuto/mypageone
  { 
        $this->setTemplate('mypagetwo'); // nome template senza il suffisso Success
  }// END function
  public function executeMypagetwo() // crea l'indirizzo - contenuto/mypagetwo
  {      
  }// END function
}// END class

Point the browser at:
– http://localhost/jobeet/web/contenuto/mypageone -> render Page Two

Reference:
http://symfony.com/legacy/doc/gentle-introduction/1_4/it/06-inside-the-controller-layer

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony 1.4 – Skip or Set the View

Symfony 1.4.20 – Redirect – Forward

Using Plain PHP

1. apps/frontend/modules/contenuto/actions/actions.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeRedirect() // crea l'indirizzo - contenuto/redirect
  { 
  }// END function
}// END class

2. apps/frontend/modules/contenuto/templates/redirectSuccess.php


<p>Redirect to...</p>

<?php
header("location: http://www.lucedigitale.com");
exit;
?>

3. Point the browser at: http://localhost/jobeet/web/contenuto/redirect

redirect() function External Link

1. apps/frontend/modules/contenuto/actions/actions.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeRedirect() // crea l'indirizzo - contenuto/redirect
  { 
      return $this->redirect('http://www.google.com');
  }// END function
}// END class

2. apps/frontend/modules/contenuto/templates/redirectSuccess.php


<p>Redirect to...</p>

3. Point the browser at: http://localhost/jobeet/web/contenuto/redirect

redirect() function Internal Link

1. apps/frontend/modules/contenuto/actions/actions.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeRedirect() // crea l'indirizzo - contenuto/redirect
  { 
      $this->redirect('contenuto/mypage');// nomemodulo/nomepagina
      // oppure sintassi alternativa
      // $this->forward('nomemodulo', 'nomepagina');

      // il codice qui sotto non verrà eseguito perchè
      // redirect e forward sollevano un sfStopException per bloccare l'esecuzione di un'azione

  }// END function
  public function executeMypage() // crea l'indirizzo - contenuto/mypage
  { 
  }// END function
}// END class

NB: redirect cambia URL nel browser, forward NON cambia URL nel browser

2. apps/frontend/modules/contenuto/templates/redirectSuccess.php


<p>Redirect to...</p>

3. Point the browser at: http://localhost/jobeet/web/contenuto/redirect
It will render http://localhost/jobeet/web/contenuto/mypage

Redirect e Forward Condizionali

Symfony ha dei metodi condizionali per snellire la scrittura del codice, in particolare:
forwardIf(), forwardUnless(), forward404If(), forward404Unless(), redirectIf() e redirectUnless().


public function executeShow(sfWebRequest $request)
{
  // Doctrine cerca un parametro id nel DB
  $article = Doctrine::getTable('Article')->find($request->getParameter('id'));
 
  // Propel cerca un parametro id nel DB
  $article = ArticlePeer::retrieveByPK($request->getParameter('id'));
 
  // se non esiste dai errore 404 di Symfony
  if (!$article)
  {
    $this->forward404();
  }

Sintassi equivalente:


public function executeShow(sfWebRequest $request)
{
  // cerca nel DB
  $article = Doctrine::getTable('Article')->find($request->getParameter('id'));
  $this->forward404If(!$article); // errore 404 se non esiste
}
 

public function executeShow(sfWebRequest $request)
{
  // Cerca nel DB
  $article = Doctrine::getTable('Article')->find($request->getParameter('id'));
  $this->forward404Unless($article); // errore 404 a meno che esista, se esiste non da errore
}

Reference:
http://www.symfony-project.org/api/1_4/sfaction

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony 1.4.20 – Redirect – Forward

Symfony 1.4 – Multi Page – Pass data to Template and Render

Creare la cartella di progetto

1. Create the folder c:\wamp64\www\jobeet

Creare la struttura di cartelle

2. Inside \jobeet folder run the command:
cmd.exe -> c:\wamp64\www\jobeet\symfony generate:project jobeet –orm=Propel

Tris create the basic folders

Creare la app frontend

3. Copy C:\wamp64\bin\php\symfony.bat to c:\wamp64\www\jobeet\

4. cmd.exe -> c:\wamp64\www\jobeet\symfony generate:app frontend

This create the base content of \apps

Creare il contenuto

5. cmd.exe -> c:\wamp64\www\jobeet\symfony generate:module frontend contenuto

Crea il contenuto per \modules

6. Per ogni nuovo modulo, Symfony crea una azione index predefinita, puntiamo il browser a:

http://localhost/jobeet/web/contenuto/index

7. Apriamo il file apps/frontend/modules/contenuto/actions/actions.class.php e scriviamo


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeAboutme() // crea l'indirizzo - contenuto/aboutme
  { 
  }// END function
  
  public function executeContact() // crea l'indirizzo - contenuto/contact
  { 
  }// END function
}// END class

8. Creiamo apps/frontend/modules/contenuto/templates/aboutmeSuccess.php

<p>About me: I am <strong>Andrea</strong></p>

9. Creiamo apps/frontend/modules/contenuto/templates/contactSuccess.php

<p>Contact: My telephone number is 0123456789</p>

10. Puntiamo il browser a:
– http://localhost/jobeet/web/contenuto/aboutme
– http://localhost/jobeet/web/contenuto/contact

Come funziona?

I template dovranno essere nominati seguendo la regola:
aboutmeSuccess.php -> nomelink + Success

I metodi seguiranno la regola:
executeContact() -> execute + (Maiuscola)nomelink

Passare i dati al Template

1. action.class.php


<?php

class contenutoActions extends sfActions // estende la classe Symfony
{
  public function executeRandom() // crea l'indirizzo - contenuto/random
  { 
      $number = mt_rand(0, 100); // this is plain PHP
      // invia nella variabile del template numerocasuale in valore $number
      $this->numerocasuale = $number;
  }// END function
  
}// END class

2. randomSuccess.php


<p>The random number is <strong><?php echo $numerocasuale?></strong></p>

3. Puntare il browser a: http://localhost/jobeet/web/contenuto/random

Abbiamo due tipo di sintassi per assegnare le variabili da passare ai template:


    // Impostare le variabili dell'azione per passare informazioni al template
    $this->pippo = 'pluto';          // Versione breve
    $this->setVar('pippo', 'pluto'); // Versione estesa

Reference:
http://symfony.com/legacy/doc/gentle-introduction/1_4/it/04-The-Basics-of-Page-Creation

By |PHP, Symfony, Web Design|Commenti disabilitati su Symfony 1.4 – Multi Page – Pass data to Template and Render