app/ (configuración)
cache/
config/
logs/
bin/ (archivos compilados)
src/ (bundles)
...
vendor/ (librerías de terceros.)
...
web/ (archivos que se pueden acceder públicamente.)
app.php (controlador frontal)
...
//*instalacion*/
Instalar composer
cd c:\wamp\www
$composer create-project symfony/framework-standard-edition myProyect/ "2.3.*"
$cd myProyect/
$php app/check.php
añadir al php.ini (servidor web)
xdebug.max_nesting_level=250;
http://localhost/myProyect/web/app_dev.php
/*CONSOLA------------------------------------------------------------------------------*/
//crear un bundle
php app/console generate:bundle --namespace=Acme/HelloBundle --format=yml
php app/console cache:clear --env=prod --no-debug
http://localhost/symfonyTutorial/web/app_dev.php/hello/test
//listar servicios
php app/console container:debug
/*PLANTILLAS------------------------------------------------------------------------------*/
//Extender de una plantilla GENERAL (::) no pertenece a ningún bundle y que por tanto, se encuentra en el directorio app/Resources/views
{% extends '::base.html.twig' %}
{% extends 'AcmeBlogBundle::layout.html.twig'%}//plantilla general del bundle(en la capeta views)
{{ ... }}//variable
{% ... %}//comentario
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption }}</a></li>
{% endfor %}
{{ title|upper }}//modificadores
//generar una url
<li><a href="{{ path( '_welcome' ) }}">Ir a la home</a></li>
<li><a href="{{ path( 'acme_blog_pagination',{page:5} ) }}">Ir al Blog</a></li>
//enlazar contenido
<img src="{{ asset('images/logo.png') }}" alt="Symfony!" />
<link href="{{ asset('css/blog.css') }}" rel="stylesheet" type="text/css" />
//cargar otra plantilla
{{ include(
'AcmeBlogBundle:blocks:myBlock.html.twig',
{'contentBlock': 'contenido del bloque','variable2': 'valor2'}
) }}
//cargar un controlador
{{ render(controller('AcmeBlogBundle:Blog:getBlock',
{'contentBlock': 'cargado desde el controlador'}
)) }}
//cargar un controlador por ajax (necesarion tener hinclude.js)
{{ render_hinclude(controller('...'), {
'default': 'AcmeDemoBundle:Default:content.html.twig'
}) }}
/*CONFIGURACION------------------------------------------------------------------------------*/
app/config/config.yml //configuracion global de los bundles
/*CONTROLADORES------------------------------------------------------------------------------*/
//Funcion crear y devolver un objeto Response
public function indexAction($name,$defaultParam,$optionalParam="null")
{
return $this->render('AcmeHelloBundle:Hello:index.html.twig', array('name' => $name,'defaultParam'=>$defaultParam));
}
//redirigir
return $this->redirect($this->generateUrl('homepage'));
//llamar a otro controlador
$response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
'name' => $name,
'color' => 'green'
));
return $response;
//guardar plantilla
$content = $this->renderView(
'AcmeHelloBundle:Hello:index.html.twig',
array('name' => $name)
);
return new Response($content);
//renderizar plantilla
return $this->render(
'AcmeHelloBundle:Hello:index.html.twig',
array('name' => $name)
);
//cargar plantilla segun el controlador
return array('value'=>'valor') //busca una vista que se llame igual que el Action en una carpeta que se llame igual que el controlador
//acceder a servicios
$templating = $this->get('templating');
$router = $this->get('router');
$mailer = $this->get('mailer');
// crea una respuesta JSON con código de estado 200
$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');
/*RUTAS------------------------------------------------------------------------------*/
//siempre se ejecuta routing.yml (independiente del modo de ejecucion)
app:
resource: @AppBundle/Controller/
type: annotation
//ANOTACIONES
C:\xampp\htdocs\symfony01\src\AppBundle\Controller\DefaultController.php
/**
* @Route("/", name="homepage")
*/
bundle:controlador:acción
//Home
_welcome:
path: /
defaults: { _controller: AcmeDemoBundle:Main:homepage }
//con variables
blog_show:
path: /blog/{slug}
defaults: { _controller: AcmeBlogBundle:Blog:show }
//pasar parametro por defecto
blog:
path: /blog/{page}
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
requirements:
page: \d+ //debe ser un entero
//condiciones (_locale _format y _controller son variables especiales de entrutamiento)
article_show:
path: /articles/{_locale}/{year}/{title}.{_format}
defaults: { _controller: AcmeDemoBundle:Article:show, _format: html }
requirements:
_locale: en|fr //opciones posible
_locale: %acme_demo.locales% //leer variable global del config.yml
_format: html|rss
year: \d+ //debe ser un entero
methods: [GET] //filtrar metrodo
//importar rutas
acme_hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
//prefijar rutas importadas
prefix: /admin/ //añade un patron delante de todas las rutas importado http:/..../admin/ruta
//listar rutas
php app/console router:debug
//ver contenido
php app/console router:debug article_show
//probar ruta
php app/console router:match /blog/my-latest-post
/*PETICIONES----------------------------------------------------------------------*/
//Los datos de la peticion se guardan en un objeto Request
use Symfony\Component\HttpFoundation\Request;
public function indexAction(Request $request){
// ¿es una petición Ajax?
$request->isXmlHttpRequest();
$request->getPreferredLanguage(array('en', 'fr'));
// obtiene el valor de un parámetro $_GET
$request->query->get('page');
// obtiene el valor de un parámetro $_POST
$request->request->get('page');
}
/*SESIONES--------------------------------------------------------------------------*/
use Symfony\Component\HttpFoundation\Request;
public function indexAction(Request $request)
{
$session = $request->getSession();
// guarda un atributo para reutilizarlo durante una
// petición posterior del usuario
$session->set('foo', 'bar');
// obtener el valor de un atributo de la sesión
$foo = $session->get('foo');
// utilizar un valor por defecto si el atributo no existe
$filters = $session->get('filters', array());
}
/*Varios---------------------------------------------------------------------------*/
//crear una excepcion 404
throw $this->createNotFoundException('El producto solicitado no existe.');
/*URL*/
// /blog/2?category=Symfony (relativa)
$router->generate('blog', array('page' => 2, 'category' => 'Symfony'));//controlador
<a href="{{ path('blog_show', { 'slug': 'my-blog-post' }) }}">Read this blog post.</a>//vista
//http://www.example.com/blog/my-blog-post (absoluta)
$router->generate('blog_show', array('slug' => 'my-blog-post'), true);
<a href="{{ url('blog_show', { 'slug': 'my-blog-post' }) }}">Read this blog post.</a>
//FLUJO
C:\xampp\htdocs\symfony01\app\config\routing.yml //se carga siempre
//ORM
Entidad una clase que representa una tabla en BBDD