Installation:
composer require araise/crud-bundle
bin/console araise:crud:setup
Add Tailwind CSS dependencies and configure twig.yaml:
twig:
form_themes:
- '@araiseCrud/form_layout.html.twig'
Create an Entity:
bin/console make:entity
Ensure your entity has a __toString() method.
Generate a Definition:
bin/console make:definition
This creates a YAML/JSON config file (e.g., src/Definition/UserDefinition.php) defining CRUD behavior.
Update Database:
bin/console doctrine:schema:update --force
Access CRUD Interface:
Visit /app_user (replace app_user with your entity’s route prefix).
User entity with fields like name, email, and role.UserDefinition to configure:
name, email).password in list view)./app_user.UserDefinition for User entity).# src/Definition/UserDefinition.php
fields:
name:
label: 'Full Name'
type: text
sortable: true
email:
type: email
filterable: true
actions:
list:
- create
- edit
- delete
araise\CrudBundle\Controller\CrudController for custom logic.#[Route('/users/export', name: 'user_export', defaults: ['_resource' => UserDefinition::class])]
public function exportAction(Request $request): Response
{
$definition = $this->getDefinition(UserDefinition::class);
$data = $this->getCrudService()->getRepository()->findAll();
// Custom export logic
}
type: relation for many-to-one/many-to-many fields:
fields:
role:
type: relation
entity: App\Entity\Role
property: name
actions:
list:
- bulk_delete
- bulk_export
tailwind.config.js:
module.exports = {
content: [
'./templates/**/*.html.twig',
'./vendor/araise/**/*.twig',
],
theme: {
extend: {
colors: {
primary: '#3b82f6', // Custom primary color
},
},
},
};
araise/SearchBundle for global search:
# config/packages/araise_search.yaml
araise_search:
enabled: true
form_layout.html.twig to customize form fields:
{# templates/araiseCrud/form_layout.html.twig #}
{% block araise_crud_form_row %}
<div class="mb-4">
{{ form_row(form, { required: false }) }}
</div>
{% endblock %}
Serializer to expose CRUD as API:
#[Route('/api/users', name: 'api_user_list', methods: ['GET'])]
public function apiListAction(): JsonResponse
{
$data = $this->getCrudService()->getRepository()->findAll();
return $this->json($this->serializer->serialize($data, 'json'));
}
Locale Mismatch:
default_locale: en in translation.yaml or add translations via PR.Missing __toString:
__toString().public function __toString(): string
{
return $this->name ?? 'No name';
}
Route Conflicts:
_resource in route annotations:
#[Route('/custom', defaults: ['_resource' => UserDefinition::class])]
Tailwind Dependencies:
@tailwindcss/forms or postcss breaks form styling.yarn add @tailwindcss/forms postcss-loader
Definition Caching:
Definition files may not reflect immediately.bin/console cache:clear
Check Definition Validation:
bin/console araise:crud:validate to catch misconfigurations.Log Crud Events:
araise_crud.yaml:
araise_crud:
debug: true
Inspect Twig Templates:
templates/araiseCrudBundle/ to debug rendering issues.Database Schema:
araise_search_index and araise_table_filter tables exist after setup.Custom Actions:
Definition:
actions:
list:
- custom_action
public function customAction(Request $request): Response
{
// Logic here
}
Field Types:
araise\CrudBundle\Field\FieldTypeInterface.Menu Customization:
MenuBuilder to modify navigation:
class AppMenuBuilder extends DefinitionMenuBuilder
{
public function createMainMenu(): ItemInterface
{
$menu = $this->factory->createItem('root');
$menu->addChild('Custom Menu Item', ['route' => 'custom_route']);
return $menu;
}
}
Event Listeners:
CrudEntityPrePersistEvent):
#[Tags('kernel.event_listener', tag: 'araise_crud.entity_pre_persist')]
class MyListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
CrudEntityPrePersistEvent::NAME => 'onPrePersist',
];
}
}
Translation Overrides:
translations/messages.en.yaml:
araise_crud:
action:
create: 'Add New Entry'
How can I help you explore Laravel packages today?