Her şey gerçekten Symfony 2 paket olmalıdır.x?
İnsanlar paket genel Symfony 2 kavramı tartışmak eğilimi this gibi sorular farkındayım.
Şey, örneğin belirli bir uygulama olduğu gibi, twitter gibi bir uygulama, her şey çok official docs dediği gibi genel bir paket içinde olmalıdır?
Bunu sormamın sebebi uygulamalar, genel olarak geliştirdiğimizde, son derece tam-yığın tutkal bazı çerçeve için bizim kodu kaç istemiyoruz çünkü.
Eğer bir Symfony 2 Uygulama, ve, bir noktada tabanlı bir ben ortaya çıkarsa, Symfony 2 gerçekten iyi bir seçim değil ben karar veririmgelişimi devam etwill bu benim için sorun olur mu?
Genel soru şu: neden her şey bir paket iyi bir şey mi?
EDİT#1
Bu soruyu sordum çünkü yaklaşık bir yıldır bu konu hakkında bilgimi paylaşmak article bir mektup yazdım.
CEVAP
Bu konu hakkında daha kapsamlı ve güncel bir blog yazısı yazdım: http://elnur.pro/symfony-without-bundles/
Hayır, her şey bir paket içinde olmalı. Böyle bir yapıya sahip olabilir:
- Modeller için
src/Vendor/Model
— src/Vendor/Controller
— denetleyicileri içinsrc/Vendor/Service
— hizmetlerisrc/Vendor/Bundle/AppBundle
gibi paketler içinsrc/Vendor/Bundle
—,- vb.
Bu şekilde, AppBundle
gerçekten Symfony2 belirli olan tek bir şey olur. Eğer başka bir çerçeve daha sonra geçiş yapmak için karar verirseniz, Bundle
ad kurtulmak ve seçilen çerçeve malzeme ile değiştirin.
Lütfen burada önerim için olduğunu unutmayınappbelirli bir kod. Yeniden demetleri için, ben hala the best practices kullanmanızı öneririz.
Tutmak varlıklar demetleri
Herhangi bir paket dışında src/Vendor/Model
varlıkları tutmak, config.yml
15 *bölüm değiştirdim
doctrine:
# ...
orm:
# ...
auto_mapping: true
için
doctrine:
# ...
orm:
# ...
mappings:
model:
type: annotation
dir: %kernel.root_dir%/../src/Vendor/Model
prefix: Vendor\Model
alias: Model
is_bundle: false
Varlık isimleri — Doktrin depoları erişmek için — örneğin bu durumda Model
ile Model:User
başlar.
Subnamespaces ilgili kuruluşlar birlikte grup için, örneğin, src/Vendor/User/Group.php
kullanabilirsiniz. Bu durumda, işletme adı Model:User\Group
.
Tutmak denetleyicileri demetleri
Öncelikle JMSDiExtraBundle config.yml
bunu ekleyerek hizmetler için src
klasörü taramak için söylemek gerekir:
jms_di_extra:
locations:
directories: %kernel.root_dir%/../src
Sonra 41 ** Controller
ad altına koy:
<?php
namespace Vendor\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\SecurityExtraBundle\Annotation\Secure;
use Elnur\AbstractControllerBundle\AbstractController;
use Vendor\Service\UserService;
use Vendor\Model\User;
/**
* @Service("user_controller", parent="elnur.controller.abstract")
* @Route(service="user_controller")
*/
class UserController extends AbstractController
{
/**
* @var UserService
*/
private $userService;
/**
* @InjectParams
*
* @param UserService $userService
*/
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
/**
* @Route("/user/add", name="user.add")
* @Template
* @Secure("ROLE_ADMIN")
*
* @param Request $request
* @return array
*/
public function addAction(Request $request)
{
$user = new User;
$form = $this->formFactory->create('user', $user);
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$this->userService->save($user);
$request->getSession()->getFlashBag()->add('success', 'user.add.success');
return new RedirectResponse($this->router->generate('user.list'));
}
}
return ['form' => $form->createView()];
}
/**
* @Route("/user/profile", name="user.profile")
* @Template
* @Secure("ROLE_USER")
*
* @param Request $request
* @return array
*/
public function profileAction(Request $request)
{
$user = $this->getCurrentUser();
$form = $this->formFactory->create('user_profile', $user);
if ($request->getMethod() == 'POST') {
$form->bind($request);
if ($form->isValid()) {
$this->userService->save($user);
$request->getSession()->getFlashBag()->add('success', 'user.profile.edit.success');
return new RedirectResponse($this->router->generate('user.view', [
'username' => $user->getUsername()
]));
}
}
return [
'form' => $form->createView(),
'user' => $user
];
}
}
Benim ElnurAbstractControllerBundle hizmetler olarak tanımlayan denetleyicileri kolaylaştırmak için kullanıyorum unutmayın.
Son şey sol Symfony demetleri olmadan şablonları için söylemek. Şablon tahminci hizmeti kılarak bunu, ama bu yaklaşım Symfony 2.0 ve 2.1, ben arasında farklı olduğundan her ikisi için sürümleri sağlamak.
Symfony 2.1 şablon tahminci geçersiz kılma
Sana bunu yapan bundle yarattık.
Symfony 2.0 şablon dinleyici geçersiz kılma
İlk olarak, sınıf tanımlayın:
<?php
namespace Vendor\Listener;
use InvalidArgumentException;
use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Bundle\Bundle;
use Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener as FrameworkExtraTemplateListener;
use JMS\DiExtraBundle\Annotation\Service;
class TemplateListener extends FrameworkExtraTemplateListener
{
/**
* @param array $controller
* @param Request $request
* @param string $engine
* @throws InvalidArgumentException
* @return TemplateReference
*/
public function guessTemplateName($controller, Request $request, $engine = 'twig')
{
if (!preg_match('/Controller\\\(. )Controller$/', get_class($controller[0]), $matchController)) {
throw new InvalidArgumentException(sprintf('The "%s" class does not look like a controller class (it must be in a "Controller" sub-namespace and the class name must end with "Controller")', get_class($controller[0])));
}
if (!preg_match('/^(. )Action$/', $controller[1], $matchAction)) {
throw new InvalidArgumentException(sprintf('The "%s" method does not look like an action method (it does not end with Action)', $controller[1]));
}
$bundle = $this->getBundleForClass(get_class($controller[0]));
return new TemplateReference(
$bundle ? $bundle->getName() : null,
$matchController[1],
$matchAction[1],
$request->getRequestFormat(),
$engine
);
}
/**
* @param string $class
* @return Bundle
*/
protected function getBundleForClass($class)
{
try {
return parent::getBundleForClass($class);
} catch (InvalidArgumentException $e) {
return null;
}
}
}
Ve sonra config.yml
bunu ekleyerek kullanmak için Symfony söyle:
parameters:
jms_di_extra.template_listener.class: Vendor\Listener\TemplateListener
Demetleri olmadan şablonları kullanarak
Şimdi, şablonlar demetleri kullanabilirsiniz. app/Resources/views
klasörü altında tutmak. Örneğin, kontrolör, bu iki eylem için şablonlar üzerinde bulunan
app/Resources/views/User/add.html.twig
app/Resources/views/User/profile.html.twig
Bir şablon söz konusu olduğunda, sadece paket kısmı silin:
{% include ':Controller:view.html.twig' %}
'foo' gerçekten ne anlama ge...
Symfony 2: Eğer bir kullanıcı bir şabl...
Bir paket olmadığını kontrol yüklenir ...
GERÇEKTEN nasıl değiştirildi dosyaları...
Std::bu gerçekten güvenli mi?...