
Здравейте отново,
В този урок ще инсталираме 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
и влизаме в проекта

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

и модулчето е готово, можете да го намерите в 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
и след това

php app/console doctrine:schema:update –force
и след това

php app/console assets:install web

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 admin@cholakovit.com password --super-admin

тази команда е за създаване на администратор акаунт, следващата е за обикновен потребител:
php app/console fos:user:create testuser test@cholakovit.com 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. Така ще можем да разработваме уеб сайтове по-лесно и програмния ни код ще е по-оптимизиран.
Wow, that’s a ralely clever way of thinking about it!
Чудесна статия!!!Благогодаря за отделеното време и ясните разяснения.
This page certainly has all of the information I
needed about this subject and didn’t know who to ask.