Symfony 2 Tutorial
Neues Bundle erstellen:
php app/console generate:bundle --namespace=Blogger/BlogBundle
Eintrag erfolgt in app/AppKernel.php und app/config/routing.yml.
Model
Available types: array, object, boolean, integer, smallint, bigint, string, text, datetime, datetimetz, date, time, decimal, float.
php app/console doctrine:generate:entity entity="BloggerBlogBundle:Post"
--fields="category_id:integer title:string(255) content:text created_at:datetime updated_at:datetime" php app/console doctrine:generate:entity entity="BloggerBlogBundle:Tag"
--fields="name:string(255) created_at:datetime"
php app/console doctrine:generate:entity entity="BloggerBlogBundle:Category" --fields="name:string(255) created_at:datetime"
Relations
Post: src/Blogger/BlogBundle/Entity/Post.php use Doctrine\Common\Collections\ArrayCollection; /** * @ORM\Entity * @ORM\Table(name="post") * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\PostRepository") * @ORM\HasLifecycleCallbacks */ /** * @ORM\ManyToOne(targetEntity="Category") * @ORM\JoinColumn(name="category_id", referencedColumnName="id") ** @var Category $category */ protected $category; /** * @ORM\ManyToMany(targetEntity="Tag") * @ORM\JoinTable(name="post_tag", * joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} * ) *
* @var ArrayCollection $tags */
protected $tags;
/**
* Constructs a new instance of Post. */
public function __construct() {
$this->created_at = $this->updated_at = new \DateTime("now"); $this->tags = new ArrayCollection();
}
/**
* Invoked before the entity is updated. *
* @ORM\PreUpdate */
public function preUpdate() {
$this->updated_at = new \DateTime("now"); }
Category: src/Blogger/BlogBundle/Entity/Category.php use Doctrine\Common\Collections\ArrayCollection; /** * Blogger\BlogBundle\Entity\Category * * @ORM\Table(name="category") * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\CategoryRepository") */ /** * * @ORM\OneToMany(targetEntity="Post", mappedBy="category") *
* @var ArrayCollection $posts */
protected $posts;
public function __construct() {
$this->posts = new ArrayCollection(); $this->created_at = new \DateTime("now"); }
public function __toString() { return $this->name; }
Tag: src/Blogger/BlogBundle/Entity/Tag.php use Doctrine\Common\Collections\ArrayCollection; /** * Blogger\BlogBundle\Entity\Tag * * @ORM\Table(name="tag") * @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\TagRepository") */ /** * * @ORM\ManyToMany(targetEntity="Post", mappedBy="tags") *
* @var ArrayCollection $posts */
protected $posts;
public function __construct() {
$this->posts = new ArrayCollection(); $this->created_at = new \DateTime("now"); }
Generating Getters and Setters¶
php app/console doctrine:generate:entities Blogger
Creating the Database Tables/Schema¶
php app/console doctrine:schema:update –force
CRUD creation:
php app/console generate:doctrine:crud
BloggerBlogBundle:Post BloggerBlogBundle:Category BloggerBlogBundle:Tag
Formulare ausmisten (unnötige Felder entfernen) src/Blogger/BlogBundle/Form/
Templating
src/Blogger/BlogBundle/Resources/views/Default/layout.html.twig
<!DOCTYPE HTML> <html>
<head>
{% set bundlepath = 'bundles/bloggerblog/' %}
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>symfony2 tutorial</title>
{% block stylesheets %}
<link href="{{ asset( bundlepath ~ 'css/main.css') }}" type="text/css" rel="stylesheet" /> {% endblock %}
{% block javascripts %}
<script src="{{ asset( bundlepath ~ 'js/jquery-1.7.1.min.js') }}" type="text/javascript"></script> <script src="{{ asset( bundlepath ~ 'js/main.js') }}" type="text/javascript"></script>
{% endblock %} </head> <body> <div id="wrapper"> <div id="header"> <h1>Tutorial</h1> <ul>
<li><a href="{{ path('post') }}">Posts verwalten</a></li>
<li><a href="{{ path('category') }}">Kategorien verwalten</a></li> <li><a href="{{ path('tag') }}">Tags verwalten</a></li>
</ul> </div>
<div id="page-body">
{% block body %}{% endblock %} </div> <div id="footer"> {% include 'BloggerBlogBundle:Default:footer.html.twig' %} </div> </div> </body> </html> src/Blogger/BlogBundle/Resources/views/Default/footer.html.twig
src/Blogger/BlogBundle/Resources/views/Category/index.html.twig
{% extends 'BloggerBlogBundle:Default:layout.html.twig' %} {% block javascripts %}
{{ parent() }}
<script src="{{ asset( bundlepath ~ 'js/XXXXXX.js') }}" type="text/javascript"></script> {% endblock %} {% block body %} ………. ………. ………. {% endblock %}
Install assets
Using relations
src/Blogger/BlogBundle/Resources/views/Post/index.html.twig <th>CategoryName</th> <td>{{ entity.getCategory }}</td> <tr class=“taglist“> <td colspan="8"> Tags:{% for tag in entity.getTags %}
<a href="{{ path('tag_show', { 'id': tag.id }) }}">{{ tag.name }}</a> {% endfor %}
</td> </tr>
src/Blogger/BlogBundle/Resources/views/Tag/show.html.twig
<h2>Posts mit dem Tag „{{ entity.name }}“</h2> <table class="tagposts">
<tr>
<th>id</th> <th>Post title</th> </tr>
{% for post in entity.getPosts %} <tr>
<td>{{ post.id }}</td>
<td><a href="{{ path('post_show', { 'id': post.id }) }}">{{ post.title }}</a></td> </tr>
{% endfor %} </table>
src/Blogger/BlogBundle/Resources/views/Category/show.html.twig
<h2>Posts mit der Katgorie {{ entity.name }}</h2> <table class="categoryposts">
<tr>
<th>id</th> <th>Post title</th> </tr>
{% for post in entity.getPosts %} <tr>
<td>{{ post.id }}</td>
<td><a href="{{ path('post_show', { 'id': post.id }) }}">{{ post.title }}</a></td> </tr>
{% endfor %} </table>
String Translation
app/config/config.yml framework: #esi: ~ translator: { fallback: de } /** * @Route("/") * @Template() */public function rootAction() { $request = $this->getRequest(); $session = $request->getSession(); $lang = $this->getRequest()->getPreferredLanguage(array('de','en')); $session->setLocale($lang); return $this->redirect($this->generateUrl('index')); } /**
* @Route("{_locale}/index/", name="index", requirements={"_locale"="de|en"}) * @Method("GET")
* @Template() */
public function indexAction() { echo $this->get('translator')->trans('Willkommen'); return array(); } src/Blogger/BlogBundle/Resources/views/Default/index.html.twig {% extends 'BloggerBlogBundle:Default:layout.html.twig' %} {% block body %}
{% trans %}Willkommen{% endtrans %} {% endblock %} src/Blogger/BlogBundle/Resources/translations/messages.en.php <?php return array( 'Willkommen' => 'Welcome' ); ?>
Parameter
use Symfony\Component\HttpFoundation\Response; /*** @Route("/parameter/{id}/{id2}", name="parameter", requirements={"id" = "\d+"}, defaults={"id2" = "kein wert"}) * @Method("GET")
* @Template() */
public function parameterAction($id, $id2) {
return new Response('Parameter1: '.$id. ' Parameter2: '.$id2); }
Minify JavaScripts and Stylesheets with YUI Compressor
apt-get install yui-compressor
src/Blogger/BlogBundle/Resources/views/Default/layout.html.twig
{% stylesheets '@BloggerBlogBundle/Resources/public/css/*' output='css/compressed.css' filter='?yui_css' %}
<link rel="stylesheet" href="{{ asset_url }}" type="text/css" media="screen" />
{% endstylesheets %}
{% javascripts '@BloggerBlogBundle/Resources/public/js/*' output='js/compressed.js' filter='?yui_js' %}
<script src="{{ asset_url }}"></script> {% endjavascripts %}
Also in dev mode filter='yui_css' filter='yui_js' app/config/config.yml # Assetic Configuration assetic : debug: "%kernel.debug%" use_controller: false
# Uncomment the following line if your java bin is # in a different location # java: /usr/bin/java filters : cssrewrite: ~ yui_css : jar: /usr/share/yui-compressor/yui-compressor.jar yui_js : jar: /usr/share/yui-compressor/yui-compressor.jar
Google Closure Compiler
apt-get install sun-java6-jdk sun-java6-plugin update-java-alternatives -s java-6-sun
Once either one is done, run the
sudo update-java-alternatives -s java-6-suncommand and finally add the line “/usr/lib/jvm/java-6-sun” to the top of the /etc/jvm file
(
gksudo gedit /etc/jvm). Save and exit. To test your Java(TM) setup in the terminal type:-
mkdir /usr/share/closure-compiler cd /usr/share/closure-compiler wget http://closure-compiler.googlecode.com/files/compiler-latest.zip . unzip compiler-latest.zip src/Blogger/BlogBundle/Resources/views/Default/layout.html.twig {% javascripts '@BloggerBlogBundle/Resources/public/js/*' output='js/compressed.js' filter='closure' %}
<script src="{{ asset_url }}"></script> {% endjavascripts %} app/config/config.yml # Assetic Configuration assetic: debug: %kernel.debug% use_controller: false # java: /usr/bin/java filters: cssrewrite: ~ closure: jar: /usr/share/closure-compiler/compiler.jar