SORU
3 NİSAN 2012, Salı


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
3 NİSAN 2012, Salı


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çin
  • src/Vendor/Service — hizmetleri
  • src/Vendor/Bundle/AppBundle gibi paketler için src/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' %}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Commander Chalkboard

    Commander Ch

    20 Ocak 2014
  • SlimaksClass

    SlimaksClass

    15 Kasım 2010
  • Ty Moss

    Ty Moss

    20 Kasım 2007