আমি এই বিষয়ে আরও পুঙ্খানুপুঙ্খ ও আপডেট ব্লগ পোস্ট লিখেছি: 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' %}