Bu konuda daha ayrıntılı ve güncel bir blog yazısı yazdım: http://elnur.pro/symfony-without-bundles/
Hayır, her şeyin bir paket halinde olması gerekmez. Bunun gibi bir yapıya sahip olabilirsiniz:
src/Vendor/Model
- modeller için,
src/Vendor/Controller
- kontrolörler için,
src/Vendor/Service
- hizmetler için,
src/Vendor/Bundle
- demetler gibi src/Vendor/Bundle/AppBundle
,
- vb.
Bu şekilde, AppBundle
gerçekten Symfony2'ye özgü olan şeyleri koyacaksınız . Daha sonra başka bir çerçeveye geçmeye karar verirseniz, Bundle
ad alanından kurtulur ve seçilen çerçeve öğeleriyle değiştirirsiniz.
Burada önerdiğim şeyin uygulamaya özel kod için olduğunu lütfen unutmayın . Yeniden kullanılabilir paketler için hala en iyi uygulamaları kullanmanızı öneririm .
Varlıkları grupların dışında tutma
Varlıkları tutmak için src/Vendor/Model
herhangi bir paketin dışına, ben değiştim doctrine
bölümüne config.yml
gelen
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ıkların adları - Doktrin depolarından erişmek için - Model
bu durumda, örneğin,Model:User
.
İlgili varlıkları birlikte gruplandırmak için alt ad alanlarını kullanabilirsiniz, örneğin src/Vendor/User/Group.php
. Bu durumda, işletmenin adı Model:User\Group
.
Denetleyicileri paketlerin dışında tutma
İlk olarak, JMSDiExtraBundle'asrc
klasörü hizmetler için taramasını şunu eklemeniz gerekir config.yml
:
jms_di_extra:
locations:
directories: %kernel.root_dir%/../src
Daha sonra denetleyicileri hizmetler olarak tanımlar ve Controller
ad alanının altına koyarsınız :
<?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
];
}
}
ElnurAbstractControllerBundle'ımı denetleyicileri hizmetler olarak tanımlamayı kolaylaştırmak için kullandığımı unutmayın .
Kalan son şey Symfony'a paketsiz şablon aramasını söylemektir. Bunu şablon tahmin hizmetini geçersiz kılarak yapıyorum, ancak Symfony 2.0 ve 2.1 arasındaki yaklaşım farklı olduğundan, her ikisi için de sürümler sağlıyorum.
Symfony 2.1+ şablon tahmincisini geçersiz kılma
Bunu sizin için yapan bir paket hazırladım .
Symfony 2.0 şablon dinleyicisini geçersiz kılma
İlk önce 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 Symfony'a bunu ekleyerek onu kullanmasını söyleyin config.yml
:
parameters:
jms_di_extra.template_listener.class: Vendor\Listener\TemplateListener
Şablonları demetsiz kullanma
Artık şablonları paketlerin dışında kullanabilirsiniz. Bunları app/Resources/views
klasörün altında tutun . Örneğin, yukarıdaki örnek denetleyiciden bu iki eylemin şablonları şu konumda bulunur:
app/Resources/views/User/add.html.twig
app/Resources/views/User/profile.html.twig
Bir şablona başvururken, paket parçasını atlamanız yeterlidir:
{% include ':Controller:view.html.twig' %}