Симфони 2 – инсталиране на Sonata и FOS Bundles

Symfony - изработка на уеб сайтове
Здравейте отново,
В този урок ще инсталираме Sonata Bundle и FOS User Bundle (FOS – Friends Of Symfony). По този начин ще имаме едно малко завършено приложение ако сте следвали първата част “Инсталиране и Конфигуриране на Symfony 2” и втората част
Генериране на bundle, entity и CRUD модул“.
Симфони 2 няма Админ Генератор както Симфони 1, но пък за това има Sonata Bundle, който служи като Админ Генератор. Sonata обаче е разработен проект от Томас Рабайкс ( Symfony ентусиаст ) и е спонсориран от Екино ( софтуерна фирма във Франция ). FOS User Bundle е проект, който управлява потребителите, има основни функционалности като регистрация, логин, забравена парола, висока сигурност, създаване на групи от потребители и т.н. Този модул може да се ползва за видимата част да се защити определено съдържание и да е видимо само за определени потребители, както и за админ частта достъпна само за администраторите на Симфони 2 приложение. Двата модула се инсталират бързо и лесно и улесняват бъдещата работа на програмистта.
В предните уроци инсталирахме Симфони 2 и конфигурирахме, bundle, entity и CRUD module, сега ще продължим с инсталирането на Sonata и FOS User Bundle и ще си създадем админ частта на проложението.

1 ) Трабва да добавим този код в Symfony/deps

[SonataAdminBundle]
    git=http://github.com/sonata-project/SonataAdminBundle.git
    target=/bundles/Sonata/AdminBundle

[SonataBlockBundle]
    git=http://github.com/sonata-project/SonataBlockBundle.git
    target=/bundles/Sonata/BlockBundle

[SonataCacheBundle]
    git=http://github.com/sonata-project/SonataCacheBundle.git
    target=/bundles/Sonata/CacheBundle

[SonatajQueryBundle]
    git=http://github.com/sonata-project/SonatajQueryBundle.git
    target=/bundles/Sonata/jQueryBundle
 
[SonataUserBundle]
    git=git://github.com/sonata-project/SonataUserBundle.git
    target=/bundles/Sonata/UserBundle
 
[SonataEasyExtendsBundle]
    git=git://github.com/sonata-project/SonataEasyExtendsBundle.git
    target=/bundles/Sonata/EasyExtendsBundle
 
[SonataDoctrineORMAdminBundle]
    git=http://github.com/sonata-project/SonataDoctrineORMAdminBundle.git
    target=/bundles/Sonata/DoctrineORMAdminBundle

[KnpMenuBundle]
    git=http://github.com/KnpLabs/KnpMenuBundle.git
    target=/bundles/Knp/Bundle/MenuBundle

[KnpMenu]
    git=http://github.com/KnpLabs/KnpMenu.git
    target=/knp/menu

[Exporter]
    git=http://github.com/sonata-project/exporter.git
    target=/exporter

[FOSUserBundle]
    git=git://github.com/FriendsOfSymfony/FOSUserBundle.git
    target=bundles/FOS/UserBundle

2 ) След това в програмата GIT Bash (http://git-scm.com/downloads)

cd /c/xampp/htdocs/symfony

и влизаме в проекта
Symfony - програмиране

php bin/vendors install

уеб програмиране
3 ) Добавяме следния код във файла Symfony/app/autoload.php

$loader->registerNamespaces(array(
	//…    
    'FOS'              => __DIR__.'/../vendor/bundles',
    'Sonata'           => __DIR__.'/../vendor/bundles',
    'Application'      => __DIR__,
    'Knp'              => array(
                          __DIR__.'/../vendor/bundles',
                          __DIR__.'/../vendor/knp/menu/src',
                          ),
    'Exporter'         => __DIR__.'/../vendor/exporter/lib',

));

4 ) Добавяме следния код във файла Symfony/app/AppKernel.php

$bundles = array(            
 	//…
            new FOSUserBundleFOSUserBundle(),
            new SonatajQueryBundleSonatajQueryBundle(),
            new SonataAdminBundleSonataAdminBundle(),
            new SonataBlockBundleSonataBlockBundle(),
            new SonataCacheBundleSonataCacheBundle(),
            new SonataDoctrineORMAdminBundleSonataDoctrineORMAdminBundle(),
            new KnpBundleMenuBundleKnpMenuBundle(),
            new SonataUserBundleSonataUserBundle('FOSUserBundle'),
            new SonataEasyExtendsBundleSonataEasyExtendsBundle(),
   );

5 ) Добавяме следния код във файла app/config/config.yml

fos_user:
    db_driver: orm
    firewall_name: main
    user_class: ApplicationSonataUserBundleEntityUser
    
sonata_block:
    default_contexts: [cms]
    blocks:
        sonata.admin.block.admin_list:
            contexts:   [admin]

        #sonata.admin_doctrine_orm.block.audit:
        #    contexts:   [admin]

        sonata.block.service.text:
        sonata.block.service.action:
        sonata.block.service.rss:

        # Some specific block from the SonataMediaBundle
        #sonata.media.block.media:
        #sonata.media.block.gallery:
        #sonata.media.block.feature_media:

6 ) Добавяме в “entity Product” следния код за да може да се използва от Sonata Bundle:
src/Mol/StoreBundle/Entity/Product

public function __toString()
{
  return $this->getName();
}

7 ) Във файла app/config/config.yml трабва да разкоментираме

translator: { fallback: %locale% }

и да го променим на

translator: { fallback: en }

След това трябва да добавим конфигурацията за Sonata:

sonata_admin:
    title:      Sonata Project
    title_logo: /bundles/sonataadmin/logo_title.png
    templates:
        # default global templates
        layout:  SonataAdminBundle::standard_layout.html.twig
        ajax:    SonataAdminBundle::ajax_layout.html.twig

        # default actions templates, should extend a global templates
        list:    SonataAdminBundle:CRUD:list.html.twig
        show:    SonataAdminBundle:CRUD:show.html.twig
        edit:    SonataAdminBundle:CRUD:edit.html.twig
    dashboard:
        blocks:
            # display a dashboard block
            - { position: left, type: sonata.admin.block.admin_list }
        groups:
            store:
                label: Products

8 ) След това във файла src/Mol/StoreBundle/Resources/config/services.yml:

services:
    mol.store.admin.product:
        class: MolStoreBundleAdminProductAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: Store, label: product }
        arguments: [null, MolStoreBundleEntityProduct, SonataAdminBundle:CRUD]

9 ) След това във файла app/config/routing.yml:

fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"
 
fos_user_profile:
    resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
    prefix: /profile
 
fos_user_register:
    resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
    prefix: /register
 
fos_user_resetting:
    resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
    prefix: /resetting
 
fos_user_change_password:
    resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
    prefix: /change-password
 
admin:
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
    prefix: /admin
 
_sonata_admin:
    resource: .
    type: sonata_admin
    prefix: /admin
 
soanata_user:
    resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
    prefix: /admin

admin:
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
    prefix: /admin

_sonata_admin:
    resource: .
    type: sonata_admin
    prefix: /admin

10 ) След това създаваме папката “Admin” в src/Mol/StoreBundle/ и в нея трябва да създадем класа ProductAdmin.php и там на първо време трябва да поставим следния код:

namespace MolStoreBundleAdmin;

use SonataAdminBundleAdminAdmin;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleValidatorErrorElement;
use SonataAdminBundleFormFormMapper;

class ProductAdmin extends Admin
{
  protected function configureFormFields(FormMapper $formMapper)
  {
    $formMapper
      ->add('name')
      ->add('price')
      ->add('description', null, array('required' => false))
    ;
  }

  protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  {
    $datagridMapper
      ->add('name')
      ->add('price')
    ;
  }

  protected function configureListFields(ListMapper $listMapper)
  {
    $listMapper
      ->addIdentifier('name')
      ->add('price')
    ;
  }

  public function validate(ErrorElement $errorElement, $object)
  {
    $errorElement
      ->with('name')
      ->assertMaxLength(array('limit' => 32))
      ->end()
    ;
  }
}

11 ) След това трябва да създадем нов модул със следната команда в GIT Bash:

php app/console sonata:easy-extends:generate SonataUserBundle

изработка на сайтове със Symfony 2
и модулчето е готово, можете да го намерите в app/Application/Sonata/UserBundle
Да не забравяме да добавим в app/appKernel.php този ред код:

new ApplicationSonataUserBundleApplicationSonataUserBundle()

12 ) Сега имаме да правим доста конфигурации в app/config/security.yml

security:
    encoders:
        FOSUserBundleModelUserInterface: sha512
 
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
        SONATA:
            - ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT  # if you are not using acl then this line must be uncommented
 
    providers:
        fos_userbundle:
            id: fos_user.user_manager
 
    firewalls:
 
        # -> custom firewall for the admin area of the URL
        admin:
            pattern:      /admin(.*)
            form_login:
                provider:       fos_userbundle
                login_path:     /admin/login
                use_forward:    false
                check_path:     /admin/login_check
                failure_path:   null
            logout:
                path:           /admin/logout
            anonymous:    true
        # -> end custom configuration
 
        # defaut login area for standard users
        main:
            pattern:      .*
            form_login:
                provider:       fos_userbundle
                login_path:     /login
                use_forward:    false
                check_path:     /login_check
                failure_path:   null
            logout:       true
            anonymous:    true
 
# ...
 
    access_control:
        # URL of FOSUserBundle which need to be available to anonymous users
        - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
 
        # -> custom access control for the admin area of the URL
        - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/login-check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        # -> end
 
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
 
        # Secured part of the site
        # This config requires being logged for the whole site and having the admin role for the admin part.
        # Change these rules to adapt them to your needs
        - { path: ^/admin, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
        - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
# ...

Директно даваме целия код, който трябва да е в този файл.

13 ) В новия модул, който генерирахме трябва да направим малко промени ако искаме да работи. Отиваме в app/Application/Sonata/UserBundle/Entity/User.php и вътре кода трябва да е следния:

namespace ApplicationSonataUserBundleEntity;

use FOSUserBundleEntityUser as BaseUser;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity
 * @ORMTable(name="user")
 */
class User extends BaseUser
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

И след това в другия файл app/Application/Sonata/UserBundle/Entity/Group.php

namespace ApplicationSonataUserBundleEntity;

use FOSUserBundleEntityGroup as BaseGroup;
use DoctrineORMMapping as ORM;

/**
 * @ORMEntity
 * @ORMTable(name="group")
 */
class Group extends BaseGroup
{
    /**
     * @ORMId
     * @ORMColumn(type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

14 ) След тези промени в GIT Bash пишем следните команди:

php app/console doctrine:schema:update –dump-sql

и след това
Symfony - разработване на уеб сайтове

php app/console doctrine:schema:update –force

и след това
Symfony и Sonata Bundle интегриране към уеб сайт

php app/console assets:install web

Symfony и FOS Bundle - уеб програмиране
15 ) Трабва да добавим и translator-a в директория app/Application/Sonata/userBundle/Resources/translations/SonataUserBundle.en.yml със следното съдържание:

form:
  label_username:                  Username
  label_email:                           Email
  label_plain_password:        Password (Plain)
  label_groups:                         Groups
  label_roles:                             Roles
  label_locked:                          Locked
  label_expired:                         Expired
  label_enabled:                       Enabled
  label_credentials_expired:  Credentials Expired
  label_name:                            Name
 
list:
  label_username:                   Username
  label_email:                           Email
  label_enabled:                       Enabled
  label_locked:                          Locked
  label_created_at:                  Created At
  label_roles:                            Roles
  label_name:                           Name
 
filter:
  label_username:             Username
  label_locked:                    Locked
  label_email:                      Email
  label_id:                             ID
  label_name:                     Name

16 ) И сега трябва да създадем потребители. Това става със следните команди в GIT Bash:

php app/console fos:user:create admin [email protected] password --super-admin

разработване на уеб сайтове чрез Symfony
тази команда е за създаване на администратор акаунт, следващата е за обикновен потребител:

php app/console fos:user:create testuser [email protected] password

Ако отидем на:
http://localhost/Symfony/web/app_dev.php/admin/dashboard
ще бъдем препратени към
http://localhost/Symfony/web/app_dev.php/admin/login
там можем да си въведам admin/password и ще влезам в модула където ще видим само “Product” елемента за манипулиране.
И това е, вече си имаме Sonata Bundle от където можем да управляваме модулите, които разработваме във визуалната част на уеб сайта и са видими за потребителите. Разбира се FOS User Bundle може да се ползва и за визуалната част,, където да създадем акаунти и да има регистрация. Модулчето е доста добре разработено и предлага добри функционалности. Специално ние сме много доволни и много благодарни на КnpUniversity за тази разработка и добавка към Symfony 2. Така ще можем да разработваме уеб сайтове по-лесно и програмния ни код ще е по-оптимизиран.

3 thoughts on “Симфони 2 – инсталиране на Sonata и FOS Bundles

  1. Чудесна статия!!!Благогодаря за отделеното време и ясните разяснения.

  2. This page certainly has all of the information I
    needed about this subject and didn’t know who to ask.

Вашият коментар

Вашият email адрес няма да бъде публикуван Задължителните полета са отбелязани с *