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) |