Installation
symfony new project 3.4
cd project
composer require egorzz/testbundle dev-master
vendor/egorzz/testbundle exists (note: namespace mismatch bug documented in README).Register Bundle
Update app/AppKernel.php:
new Egor\TestBundle\EgorTestBundle(), // Fix namespace after dev resolves
new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(),
new EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle(),
First Use Case
src/Egor/TestBundle/Resources/config/routing.yml for demo routes (e.g., /expense).php bin/console cache:clear
php bin/console doctrine:schema:update --force
http://localhost:8000/app_dev.php/expense to test the expense-tracking demo.Expense Tracking Integration
EgorTestBundle:Expense controller logic in your app’s src/AppBundle/Controller/ExpenseController.php:
use Egor\TestBundle\Controller\ExpenseController as BaseExpenseController;
class ExpenseController extends BaseExpenseController {
public function customAction() { ... }
}
vendor/egorzz/testbundle/Resources/views/Expense/index.html.twig to app/Resources/EgorTestBundle/views/Expense/ to customize.EasyAdmin Integration
EasyAdminBundle CRUD for Expense entity:
# app/config/easy_admin.yaml
easy_admin:
entities:
Egor\TestBundle\Entity\Expense:
class: Egor\TestBundle\Entity\Expense
list: [id, date, amount, category]
Paginator Usage
use Knp\Component\Pager\PaginatorInterface;
$paginator = $this->get('knp_paginator');
$expenses = $paginator->paginate(
$this->getDoctrine()->getRepository('EgorTestBundle:Expense')->findAll(),
$this->get('request')->query->getInt('page', 1),
10
);
| Symfony Pattern | Laravel Equivalent | Example |
|---|---|---|
Bundle Resources/config |
config/ files |
Move routing.yml → config/expenses.php as a service provider. |
| Twig templates | Blade views | Copy index.html.twig → resources/views/expenses/index.blade.php. |
| Doctrine ORM | Eloquent | Replace Expense entity with app/Expense.php model. |
| Kernel events | Service Provider boot() |
Register listeners in AppServiceProvider. |
Namespace Mismatch
egorzz/testbundle but defines namespace Egor\TestBundle.composer.json to alias the namespace:
"autoload": {
"psr-4": {
"Egor\\TestBundle\\": "vendor/egorzz/testbundle/src/"
}
}
composer dump-autoload.Symfony 3.4 Deprecations
AppKernel (deprecated in Symfony 4+). Laravel devs may hit:
registerBundles() → Use config/bundles.php in Symfony 4.app/Resources/ → Move to config/ or public/ as needed.Doctrine Schema Updates
--force may overwrite migrations. Always:
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
Route Debugging
php bin/console debug:router | grep expense
php artisan route:list.Twig Debugging
app/config/config_dev.yml:
twig:
debug: true
strict_variables: true
{{ dump() }} in Blade or dd() in controllers.Dependency Conflicts
EasyAdminBundle or KnpPaginatorBundle fail:
composer why-not egorzz/testbundle
composer require symfony/*:3.4.* --dev
Custom Entities
Expense entity by creating a child class:
namespace AppBundle\Entity;
use Egor\TestBundle\Entity\Expense as BaseExpense;
class Expense extends BaseExpense {
// Add custom fields/methods
}
orm.xml or annotations to map new fields.Event Listeners
expense.pre_save):
// src/AppBundle/EventListener/ExpenseListener.php
use Egor\TestBundle\Event\ExpenseEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ExpenseListener implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [ExpenseEvents::PRE_SAVE => 'onPreSave'];
}
public function onPreSave(ExpenseEvent $event) { ... }
}
services.yml:
services:
app.expense_listener:
class: AppBundle\EventListener\ExpenseListener
tags:
- { name: kernel.event_subscriber }
API Endpoints
Expense as an API by creating a custom controller:
use FOS\RestBundle\Controller\FOSRestController;
use Egor\TestBundle\Entity\Expense;
class ApiExpenseController extends FOSRestController {
public function getExpensesAction() {
return $this->handleView($this->view($this->getDoctrine()
->getRepository('EgorTestBundle:Expense')->findAll()));
}
}
routing.yml:
api_expenses:
path: /api/expenses
defaults: { _controller: AppBundle:ApiExpense:getExpenses }
How can I help you explore Laravel packages today?