সিমফনি ২.x-এ সমস্ত কি সত্যিই একটি বান্ডিল হওয়া উচিত?


205

আমি এই জাতীয় প্রশ্ন সম্পর্কে সচেতন , যেখানে লোকেরা বান্ডেলের সাধারণ সিমফনি 2 ধারণাটি নিয়ে আলোচনা করার ঝোঁক।

বিষয়টি হল, উদাহরণস্বরূপ, একটি টুইটারের মতো অ্যাপ্লিকেশনটিতে কোনও নির্দিষ্ট অ্যাপ্লিকেশনটিতে, সরকারী ডক্সের মতো সবকিছুই কি জেনেরিক বান্ডেলের ভিতরে থাকা উচিত ?

আমি এটি জিজ্ঞাসা করার কারণটি হ'ল কারণ যখন আমরা অ্যাপ্লিকেশনগুলি বিকাশ করি, সাধারণভাবে, আমরা আমাদের কোডটি কিছু পূর্ণ-স্ট্যাক আঠালো কাঠামোর সাথে সংযুক্ত করতে চাই না।

যদি আমি একটি সিমফনি 2 ভিত্তিক অ্যাপ্লিকেশন বিকাশ করি এবং এক পর্যায়ে, আমি সিদ্ধান্ত নিই যে সিম্ফনি 2 বিকাশটি এগিয়ে রাখার পক্ষে সর্বোত্তম পছন্দ নয় , আমার জন্য কী সমস্যা হবে?

সুতরাং সাধারণ প্রশ্নটি হ'ল কেন সমস্ত কিছু বান্ডিল হ'ল একটি ভাল জিনিস?

সম্পাদনা # 1

এই প্রশ্নটি জিজ্ঞাসা করার প্রায় এক বছর পরে আমি এই বিষয়ে আমার জ্ঞান ভাগ করে নেওয়ার জন্য একটি নিবন্ধ লিখেছিলাম ।


1
এটি একটি মন্তব্য নয়, কোনও উত্তর নয়। আমি ব্যক্তিগতভাবে মনে করি, প্রকল্পটি শুরুর আগে আমাদের সাবধানে কাঠামোটি বেছে নেওয়া উচিত। প্রতিটি কাঠামোর স্টাফ করার নিজস্ব পদ্ধতি রয়েছে, সুতরাং এটি সেই উপায়ে সেরা সমর্থন করার জন্য সরঞ্জাম সরবরাহ করবে। আমরা যদি সেভাবে পছন্দ করি তবে আমরা অনুসরণ করি। সেখানে অন্যান্য পছন্দ আছে। আমরা করাতের পরিবর্তে কাঠ কাটতে ছুরি ব্যবহার করতে চাই না। তবে এটি আপনার কাছে উত্থাপিত একটি খুব আকর্ষণীয় প্রশ্ন :)
আনহ এনগুইন

উত্তর:


219

আমি এই বিষয়ে আরও পুঙ্খানুপুঙ্খ ও আপডেট ব্লগ পোস্ট লিখেছি: http://elnur.pro/symfony-without-bundles/


না, সবকিছু একটি বান্ডিল হতে হবে না। আপনার মতো কাঠামো থাকতে পারে:

  • src/Vendor/Model - মডেলগুলির জন্য,
  • src/Vendor/Controller - নিয়ন্ত্রকদের জন্য,
  • src/Vendor/Service - পরিষেবার জন্য,
  • src/Vendor/Bundle- বান্ডিলগুলির জন্য, যেমন src/Vendor/Bundle/AppBundle,
  • প্রভৃতি

এইভাবে, আপনি AppBundleকেবলমাত্র সেই স্টাফগুলিতে রাখবেন যা সত্যই সিমফনি 2 নির্দিষ্ট। আপনি যদি পরে অন্য কোনও কাঠামোতে স্যুইচ করার সিদ্ধান্ত নেন, আপনি Bundleনামস্থানটি থেকে মুক্তি পাবেন এবং এটি বেছে নেওয়া ফ্রেমওয়ার্ক স্টাফের সাথে প্রতিস্থাপন করবেন।

দয়া করে নোট করুন যে আমি এখানে যা প্রস্তাব করছি তা অ্যাপ্লিকেশন নির্দিষ্ট কোডের জন্য। পুনরায় ব্যবহারযোগ্য বান্ডিলগুলির জন্য, আমি এখনও সেরা অনুশীলনগুলি ব্যবহার করার পরামর্শ দিই ।

সত্তা বান্ডিল বাইরে রাখা

src/Vendor/Modelকোনও বান্ডেলের বাইরে সত্তা রাখতে , আমি doctrineবিভাগটি config.ymlথেকে পরিবর্তন করেছি

doctrine:
    # ...
    orm:
        # ...
        auto_mapping: true

প্রতি

doctrine:
    # ...
    orm:
        # ...
        mappings:
            model:
                type: annotation
                dir: %kernel.root_dir%/../src/Vendor/Model
                prefix: Vendor\Model
                alias: Model
                is_bundle: false

সত্ত্বার নাম - ডক্ট্রাইন রিপোজিটরিগুলি থেকে অ্যাক্সেস করার জন্য - Modelএই ক্ষেত্রে শুরু করা যায়, উদাহরণস্বরূপ Model:User,।

আপনি গ্রুপ সম্পর্কিত সংস্থাগুলির একসাথে সাব-নেমস্পেস ব্যবহার করতে পারেন, উদাহরণস্বরূপ src/Vendor/User/Group.php,। এক্ষেত্রে সত্তার নাম Model:User\Group

নিয়ন্ত্রণকারীদের বান্ডিলের বাইরে রাখা

প্রথমে, আপনাকে এটি যোগ করে পরিষেবাগুলির জন্য ফোল্ডারটি স্ক্যান করতে JMSDiExtraBundle বলতে srcহবে config.yml:

jms_di_extra:
    locations:
        directories: %kernel.root_dir%/../src

তারপরে আপনি কন্ট্রোলারগুলিকে পরিষেবা হিসাবে সংজ্ঞায়িত করেন এবং এগুলিকে Controllerনেমস্পেসের নীচে রাখেন :

<?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
        ];
    }
}

নোট করুন যে আমি সংজ্ঞায়িত নিয়ন্ত্রকদের পরিষেবা হিসাবে সহজ করার জন্য আমার এলনুরআবস্ট্রাক্টকন্ট্রোলারবান্ডেলটি ব্যবহার করছি ।

শেষ কথাটি হ'ল সিমফনিকে বলি বিনা টেমপ্লেটগুলি সন্ধান করতে। আমি টেমপ্লেট গেজার পরিষেবাটি ওভাররাইড করে এটি করি, তবে যেহেতু পদ্ধতির সিমফনি ২.০ এবং ২.১ এর মধ্যে ভিন্ন, তাই আমি তাদের উভয়ের জন্য সংস্করণ সরবরাহ করছি।

সিমফনি ২.১+ টেমপ্লেট গেগারকে ওভাররাইড করা

আমি একটি বান্ডিল তৈরি করেছি যা এটি আপনার জন্য করে।

সাইমফনি ২.০ টেমপ্লেট শ্রোতাদের ওভাররাইড করা

প্রথমে শ্রেণীর সংজ্ঞা দাও:

<?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;
        }
    }
}

এবং তারপরে এটি যুক্ত করে সিমফোনিকে এটি ব্যবহার করতে বলুন config.yml:

parameters:
    jms_di_extra.template_listener.class: Vendor\Listener\TemplateListener

বান্ডিল ছাড়া টেমপ্লেট ব্যবহার করে

এখন, আপনি বান্ডিল বাইরে টেমপ্লেট ব্যবহার করতে পারেন। সেগুলি app/Resources/viewsফোল্ডারের নীচে রাখুন । উদাহরণস্বরূপ, উপরের উদাহরণস্বরূপ নিয়ামক থেকে এই দুটি ক্রয়ের টেম্পলেটগুলি এখানে অবস্থিত:

  • app/Resources/views/User/add.html.twig
  • app/Resources/views/User/profile.html.twig

কোনও টেম্পলেট উল্লেখ করার সময়, কেবল বান্ডিল অংশটি বাদ দিন:

{% include ':Controller:view.html.twig' %}

2
এটি আসলেই একটি আকর্ষণীয় পদ্ধতির। এটির সাথে, আমি সত্যিকারের বান্ডিলগুলিও বিকাশ করতে পারি যার মধ্যে নির্দিষ্টভাবে নির্দিষ্ট বৈশিষ্ট্য রয়েছে যা সম্প্রদায়টি ব্যবহার করতে পারে my
ড্যানিয়েল রিবেইরো

57
আপনি যে কোডটি সম্প্রদায়ের সাথে ভাগ করেন সেগুলি সিমফনি 2 তেও না মিলিয়ে তৈরি করতে, আপনি সাধারণ জিনিসগুলি একটি লাইব্রেরিতে রেখে দিতে পারেন এবং তারপরে একটি বান্ডিল তৈরি করতে পারেন যা সেই লাইব্রেরিটি সিমফনি 2 এর সাথে সংহত করে।
এলনুর আব্দুররাখিমভ 21

9
আপনি যতক্ষণ কোনও কোড জেনারেশন কমান্ডের উপর নির্ভর না করেন ততক্ষণ এটি একটি আকর্ষণীয় ধারণা। generate:doctrine:crudউদাহরণস্বরূপ সত্তাটি (এলনুরের ক্ষেত্রে = মডেল) কাজ করার জন্য একটি বান্ডিলের মধ্যে থাকবে বলে প্রত্যাশা করে।
geca

2
এই পদ্ধতির সাথে সিএলআই অ্যাপ্লিকেশন / কনসোল ইন্টারফেসের কার্যকারিতা পুনরুদ্ধার করার কোনও উপায় আছে কি? আমি আমার মডেলগুলিকে কোনও বান্ডিলের বাইরে রাখার ধারণাটি পছন্দ করি তবে আমি সিএলআই কার্যকারিতা অ্যাক্সেস ধরে রাখতে চাই।
অ্যান্ডি বৈয়ার্ড

3
এটি একটি বান্ডেলে রাখা উচিত :)
d0001

20

অবশ্যই আপনি আপনার অ্যাপ্লিকেশন ডিকুয়াল করতে পারেন। একটি লাইব্রেরি যেমন বিকাশ এবং Symfony সেটিকে একীভূত vendor/-folder (ব্যবহার করে পারেন depsবা composer.json, নির্ভর করে খাসি আপনি Symfony2.0 বা Symfony2.1 ব্যবহার করুন)। তবে আপনার কমপক্ষে একটি বান্ডিল দরকার যা আপনার লাইব্রেরির "সামনের অংশ" হিসাবে কাজ করে, যেখানে সিমফনি 2 নিয়ামকটি (এবং এই জাতীয়) সন্ধান করে।


2
ট্যাগটির কারণে symfony-2.0আমি ধরে নেব যে আপনি বর্তমানের 2.0 সংস্করণটি ব্যবহার করবেন। এক্ষেত্রে আপনার পছন্দ মতো একটি গিট রিপোজিটরি তৈরি করুন এবং এতে সিম্ফনি থেকে স্বতন্ত্রভাবে কী বিকাশ করতে চান তাতে সবকিছু putুকিয়ে দিন। আপনার সিমফনি-প্রজেক্টে আপনার-ফাইলটি আপডেট করুন depsযেমন এখানে উল্লেখ করা হয়েছে symfony.com/doc/current/cookbook/workflow/… তারপরে php app/console generate:bundleসিম্ফনি-নির্দিষ্ট স্টাফের জন্য কেবল একটি (বা আরও) অ্যাপ্লিকেশন-বান্ডিল (গুলি ) তৈরি করুন।
কিংক্রাঞ্চ

11

সম্পূর্ণ স্ট্যাক ফ্রেমওয়ার্ক থেকে আপনি কতগুলি কার্যকারিতা ব্যবহার করতে চান তার উপর নির্ভর করে কোনও সাধারণ সিমফনি বিতরণ কোনও অতিরিক্ত (অ্যাপ্লিকেশন) বান্ডিল ছাড়াই কাজ করতে পারে।

উদাহরণস্বরূপ, আপনার কন্ট্রোলাররা যে কোনও কলযোগ্য যা আপনার প্রকল্পের কাঠামোর যে কোনও জায়গায় রেখে দেওয়া যেতে পারে, অটোলয়েড হওয়ার সাথে সাথেই।

একটি রাউটিং সংজ্ঞা ফাইলটিতে আপনি ব্যবহার করতে পারেন:

test:
    pattern:   /test
    defaults:  { _controller: Controller\Test::test }

এটি কোনও সরল পুরাতন পিএইচপি অবজেক্ট হতে পারে, কেবল কোনও Symfony\Component\HttpFoundation\Responseঅবজেক্ট ফিরিয়ে দিতে হবে তা দ্বারা ফ্রেমওয়ার্কের সাথে এটি আবদ্ধ ।

আপনার টুইগ টেম্পলেটগুলি (বা অন্যদের) যুক্ত করা যেতে পারে app/Resources/views/template.html.twigএবং ::template.html.twigযৌক্তিক নাম ব্যবহার করে রেন্ডার করা যায় ।

সমস্ত ডিআই পরিষেবাগুলি অ্যাপ্লিকেশন / কনফিগারেশন / কনফিগারেশন.আইএমএল (বা app/config/services.ymlউদাহরণস্বরূপ থেকে আমদানি করা যায় এবং সংজ্ঞা দেওয়া যায় এবং সমস্ত পরিষেবা শ্রেণিগুলিও কোনও সাধারণ পুরানো পিএইচপি অবজেক্ট হতে পারে the ফ্রেমওয়ার্কে মোটেও আবদ্ধ নয় not

এই সবগুলি ডিফল্টরূপে সিমফনি পূর্ণ স্ট্যাক ফ্রেমওয়ার্ক দ্বারা সরবরাহ করা হয়।

আপনার যখন সমস্যা হবে তখন আপনি যখন অনুবাদ ফাইলগুলি ব্যবহার করতে চান (এক্সলিফের মতো), কারণ সেগুলি কেবল বান্ডিলের মাধ্যমেই সন্ধান করা হয় ।

Symfony আলো বিতরণ লক্ষ্য সবকিছু যে সাধারণত থোকায় থোকায় মাধ্যমে আবিষ্কৃত হবে আবিষ্কার করে এই ধরনের সমস্যাগুলোর সমাধানের জন্য।


5

আপনি KnpRadBundle ব্যবহার করতে পারেন , যা প্রকল্প কাঠামো সহজ করার চেষ্টা করে।

আরেকটি পদ্ধতি হ'ল src/Company/Bundle/FrontendBundleউদাহরণস্বরূপ src/Company/Stuff/Class.phpবান্ডিলগুলির জন্য এবং ক্লাসগুলির জন্য যা সিম্ফনি স্বতন্ত্র এবং যে কাঠামোর বাইরে পুনরায় ব্যবহার করা যেতে পারে


তবে আমি অ্যাপ্লিকেশনটি ন্যাপআরডবান্ডেলটিতে সংযুক্ত করবো ... এই বিষয়ে কোনও সহজ পন্থা নেই?
ড্যানিয়েল রিবেইরো

1
যে অংশগুলি সিমফোনির উপর নির্ভর করে (কন্ট্রোলার, মডেলস, টেম্পলেটগুলি ইত্যাদি) সর্বদা সিম্ফনিতে মিলিত হবে, যেহেতু আপনি এটি ব্যবহার করছেন (ক্লাস প্রসারিত করছেন, সাহায্যকারী ব্যবহার করে ইত্যাদি ...)। যে ক্লাসগুলি একা কাজ করে সেগুলি কোম্পানির নামস্থানে থাকবে এবং আপনি নির্ভরতা ধারক ব্যবহার করে এগুলি লোড করতে পারেন। এই শ্রেণিগুলি কাঠামো স্বাধীন হতে পারে।
মাইগুয়েল_ইবারো

1
জিনিসটি হ'ল, ধারণাটি Bundleসরাসরি প্রকাশ্যে ভাগ করে নেওয়ার দিকে যায়। আমি যখন কিছু অ্যাপ্লিকেশন লিখি তখন আমি নিজের কোডটি ভাগ করতে চাই না, অংশগুলি যেগুলি আমি ইচ্ছাকৃতভাবে সম্প্রদায়-চালিত মডিউল হিসাবে তৈরি করেছি। আমি কি ভূল?
ড্যানিয়েল রিবেইরো

আপনাকে বান্ডিলগুলি ভাগ করতে হবে না। কিছু কনফিগারেশন সহ ক্লাসগুলির একটি গ্রুপ হিসাবে একটি বান্ডিলের কথা ভাবেন। প্রতিটি প্রকল্পে আপনার বিভিন্ন বান্ডিল থাকতে পারে।
মিগুয়েল_আইবারো


5

যেহেতু এটি ইতিমধ্যে 5 বছর কেটে গেছে, তাই এখানে সিমফনি বান্ডিল সম্পর্কে আরও কয়েকটি নিবন্ধ রয়েছে।

  1. সিমফোনিতে বান্ডিলগুলি কী কী? ইলতার ভ্যান ডের বার্গ দ্বারা।

TLDR:

আপনার অ্যাপ্লিকেশনটিতে সরাসরি আপনার একাধিক বান্ডিল দরকার? সম্ভবত না। নির্ভরতার স্প্যাগেটি রোধ করতে আপনি একটি অ্যাপবান্ডেলটি লিখে রাখাই ভাল। আপনি কেবল সেরা অনুশীলনগুলি অনুসরণ করতে পারেন এবং এটি দুর্দান্ত কাজ করবে।

  1. সিমফনি: টুনি উবারনিকেল দ্বারা বান্ডিল কীভাবে

TLDR:

আপনার অ্যাপ্লিকেশন লজিকের জন্য অ্যাপবান্ডেল নামে একটি বান্ডিল তৈরি করুন। একটি অ্যাপবান্ডেল - তবে দয়া করে আপনার অ্যাপ্লিকেশনটির যুক্তিটি সেখানে রাখবেন না!


-2

সিম্ফনি কাঠামোটি দ্রুত ধারণার প্রমাণ প্রবর্তনের জন্য খুব ভাল এবং সমস্ত কোড এসআরসি / এ ডিফল্ট বান্ডিল অ্যাপ্লিকেশনটির মধ্যে প্রবেশ করতে পারে /

এই বান্ডিলটিতে আপনি আপনার কোডটি যেমন চান কাঠামো করতে পারেন।

আপনি যদি নিজের POC বিকাশের জন্য অন্য প্রযুক্তি ব্যবহার করতে চান তবে আপনি সহজেই এটি অনুবাদ করতে পারেন কারণ আপনি আপনার সমস্ত কোড বান্ডিল ধারণায় গঠন করেন না।

সমস্ত ধারণার জন্য আপনি এটিকে চূড়ান্ত করেন না। বান্ডিল ভাল তবে সবকিছু বান্ডিল এবং প্রতিদিন ভাল হয় না।

তৃতীয় পক্ষের বান্ডিলের প্রভাব হ্রাস করার জন্য আপনি আপনার প্রুফ অফ কনসেপ্টটি বিকাশের জন্য সম্ভবত একটি সাইলেক্স (সিমফনি মাইক্রো ফ্রেমওয়ার্ক) ব্যবহার করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.