122 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # Bundles
 | |
| 
 | |
| ## How to Create a bundle
 | |
| 
 | |
| ### Create files and directories
 | |
| 
 | |
| Example:
 | |
| ```bash
 | |
| newdirs='lib/ContactForm/src'
 | |
| mkdir -p ${newdirs}/Controller ${newdirs}/Controller ${newdirs}/Entity ${newdirs}/Repoository ${newdirs}/DependencyInjection
 | |
| touch ${newdirs}/Controller/ContactFormController.php
 | |
| touch ${newdirs}/ContactForm.php
 | |
| touch ${newdirs}/Controller/ContactForm.php
 | |
| ```
 | |
| 
 | |
| The ContactFormController.php example:
 | |
| ```php
 | |
| <?php
 | |
| namespace NickYeoman\ContactForm\Controller;
 | |
| 
 | |
| use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | |
| use Symfony\Component\Routing\Annotation\Route;
 | |
| 
 | |
| class ContactForm extends AbstractController
 | |
| {
 | |
|    
 | |
|     #[Route('/contact-us', name: 'contactform_form')]
 | |
|     public function index() {
 | |
|         return $this->render('@SymfonyCMS/dashboard.html.twig', [
 | |
|             'controller_name' => 'ContactFormController',
 | |
|         ]);
 | |
|     }
 | |
| }
 | |
| ```
 | |
| You will have to make changes to namespace, classname, route, render.
 | |
| 
 | |
| The ContactForm.php file example:
 | |
| ```php
 | |
| <?php
 | |
| 
 | |
| namespace NickYeoman\ContactForm;
 | |
| 
 | |
| use Symfony\Component\HttpKernel\Bundle\Bundle;
 | |
| 
 | |
| class ContactForm extends Bundle
 | |
| {
 | |
|     // empty is fine, it will still load
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Symfony Bundle Functioning
 | |
| 
 | |
| First you have to tell composer where to autoload from ``` "vendorName\\bundleName\\": "lib/bundleName/src/",```.  In the file composer.json modify the autoload line, for example:
 | |
| 
 | |
| ```json
 | |
| "autoload": {
 | |
|         "psr-4": {
 | |
|             "NickYeoman\\ContactForm\\": "lib/ContactForm/src/",
 | |
|             "App\\": "src/"
 | |
|         }
 | |
|     },
 | |
| ```
 | |
| 
 | |
| and then run ```composer dump-autoload```.
 | |
| 
 | |
| Next, you have to add the namespace\bundle name to config/bundles.php
 | |
| ```vendorName\bundleName\bundleName::class => ['all' => true],```
 | |
| composer would do this automatically if it was grabbing from packigst, but we are just using a dev environment for now. Example:
 | |
| ```php
 | |
| NickYeoman\ContactForm\ContactForm::class => ['all' => true],
 | |
| ```
 | |
| 
 | |
| ### Symfony Bundle Config
 | |
| 
 | |
| Create a DependencyInjection file:
 | |
| ```php
 | |
| <?php
 | |
| namespace NickYeoman\ContactForm\DependencyInjection;
 | |
| 
 | |
| use Symfony\Component\Config\FileLocator;
 | |
| use Symfony\Component\DependencyInjection\ContainerBuilder;
 | |
| use Symfony\Component\DependencyInjection\Extension\Extension;
 | |
| use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
 | |
| 
 | |
| class ContactFormExtension extends Extension 
 | |
| {
 | |
|     public function load(array $configs, ContainerBuilder $container)
 | |
|     {
 | |
|         
 | |
|         $loader = new YamlFileLoader(
 | |
|             $container,
 | |
|             new FileLocator(__DIR__.'/../../config')
 | |
|         );
 | |
|         $loader->load('services.yaml');
 | |
|     }
 | |
| }
 | |
| 
 | |
| ```
 | |
| 
 | |
| 
 | |
| Next create a service in config/services.yaml:
 | |
| ```yaml
 | |
| services:
 | |
|   NickYeoman\ContactForm\Controller\:
 | |
|       resource: '../src/Controller/'
 | |
|       tags: ['controller.service_arguments']
 | |
| ```
 | |
| 
 | |
| Finally, you can specify the route.  Create a new route file config/routes.yaml
 | |
| ```yaml
 | |
| ContactForm:
 | |
|   resource:
 | |
|     path: ../src/Controller/
 | |
|     namespace: NickYeoman\ContactForm\Controller
 | |
|   type: attribute
 | |
| ```
 | |
| 
 | |
| 
 | |
| ## Resources
 | |
| 
 | |
| * [Official Symfony Docs - Create a bundle](https://symfony.com/doc/current/bundles.html#creating-a-bundle)
 | |
| * [Symfony casts - Bootstrapping](https://symfonycasts.com/screencast/symfony-bundle/bundle-directory) |