1. Go to this page and download the library: Download dakataa/crud library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
dakataa / crud example snippets
namespace App\Controller;
use App\Entity\Product;
use App\Form\ProductType;
use Dakataa\Crud\Attribute\Action;
use Dakataa\Crud\Attribute\Entity;
use Dakataa\Crud\Attribute\EntityType;
use Dakataa\Crud\Controller\AbstractCrudController;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/product')]
#[Entity(Product::class)]
#[EntityType(ProductType::class)]
class ProductController extends AbstractCrudController
{
}
use Dakataa\Crud\Attribute\Resolver\QueryResolver;
use Dakataa\Crud\Controller\CrudServiceContainer;
#[Route('/product')]
#[Entity(Product::class)]
#[EntityType(ProductType::class)]
#[QueryResolver('buildCustomQuery')]
class ProductController extends AbstractCrudController
{
protected function buildCustomQuery(Request $request, Action $action, QueryBuilder $query, CrudServiceContainer $serviceContainer): void
{
$query->andWhere('a.enabled = true');
}
}
use App\Entity\Building;
use App\Entity\PropertyOwner;
use Dakataa\Crud\Attribute\Entity;
use Dakataa\Crud\Attribute\Resolver\AccessGrantedResolver;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Dakataa\Crud\Security\SecuritySubject;
use Symfony\Component\HttpFoundation\Request;
#[AccessGrantedResolver('resolveAccess')]
class OwnerController
{
private function resolveAccess(
Request $request,
string $permission,
SecuritySubject $subject,
bool $granted,
CrudServiceContainer $serviceContainer,
): bool {
if (!$subject->object instanceof PropertyOwner) {
return $granted;
}
return $serviceContainer->authorizationChecker->isGranted(
$permission,
new SecuritySubject(
new Entity(Building::class),
$subject->object->getProperty()->getBuilding(),
),
);
}
}
use Dakataa\Crud\Attribute\Action;
use Dakataa\Crud\Attribute\Resolver\ActionAccessGrantedResolver;
#[ActionAccessGrantedResolver(
'resolveActionAccess',
actions: ['list', 'view', 'edit'],
)]
class OwnerController
{
private function resolveActionAccess(
Request $request,
Action $action,
?object $object,
bool $granted,
CrudServiceContainer $serviceContainer,
): bool {
return $granted && $this->isAllowedForCurrentBuilding($request, $action, $object);
}
}
use App\Entity\Product;
use Dakataa\Crud\Attribute\Resolver\EntityResolver;
use Dakataa\Crud\Controller\AbstractCrudController;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Symfony\Component\HttpFoundation\Request;
#[EntityResolver('findProduct', actions: ['view', 'edit'])]
class ProductController extends AbstractCrudController
{
protected function findProduct(
Request $request,
CrudServiceContainer $serviceContainer
): ?Product {
return $serviceContainer->entityManager
->getRepository(Product::class)
->findOneBy([
'slug' => $request->attributes->get('id'),
]);
}
}
use Dakataa\Crud\Attribute\Action;
use Dakataa\Crud\Attribute\Resolver\ResponseContextResolver;
use Dakataa\Crud\Controller\AbstractCrudController;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Symfony\Component\HttpFoundation\Request;
#[ResponseContextResolver(
resolver: 'resolveProductContext',
actions: ['add', 'edit'],
)]
class ProductController extends AbstractCrudController
{
protected function resolveProductContext(
Request $request,
Action $action,
array $context,
CrudServiceContainer $serviceContainer
): array {
$product = $context['object'] ?? null;
return [
'helpText' => 'Changes are applied immediately.',
'isEdit' => $action->getName() === 'edit',
'productId' => $product?->getId(),
];
}
}
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/featured')]
#[Action]
#[ResponseContextResolver('resolveFeaturedContext')]
public function featured(Request $request): Response
{
return parent::list($request);
}
#[ResponseContextResolver('resolveSharedContext')]
#[ResponseContextResolver('resolveListContext', actions: ['list'])]
class ProductController extends AbstractCrudController
{
}
use App\Entity\Product;
use Dakataa\Crud\Attribute\Action;
use Dakataa\Crud\Attribute\Resolver\FormTypeOptionsResolver;
use Dakataa\Crud\Controller\AbstractCrudController;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Symfony\Component\HttpFoundation\Request;
#[FormTypeOptionsResolver(
resolver: 'resolveFormTypeOptions',
actions: ['add', 'edit'],
)]
class ProductController extends AbstractCrudController
{
protected function resolveFormTypeOptions(
Request $request,
Action $action,
?Product $product,
array $options,
CrudServiceContainer $serviceContainer
): array {
$options['validation_groups'] = $product?->getId() === null
? ['Default', 'create']
: ['Default', 'update'];
return $options;
}
}
use Dakataa\Crud\Attribute\Action;
use Dakataa\Crud\Attribute\Resolver\FormSubmitResolver;
use Dakataa\Crud\Attribute\Resolver\FormSuccessResolver;
use Dakataa\Crud\Controller\AbstractCrudController;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
#[FormSubmitResolver('prepareFormData', actions: ['add', 'edit'])]
#[FormSuccessResolver('handleSuccessfulSubmit', actions: ['add'])]
class ProductController extends AbstractCrudController
{
protected function prepareFormData(
Request $request,
Action $action,
FormInterface $form,
CrudServiceContainer $serviceContainer
): void {
// The form is valid, but an entity has not been flushed yet.
}
protected function handleSuccessfulSubmit(
Request $request,
Action $action,
FormInterface $form,
CrudServiceContainer $serviceContainer
): void {
$data = $form->getData();
// This also works for forms backed by an array or DTO instead of an entity.
}
}
use App\Form\ContactType;
use Dakataa\Crud\Attribute\Action;
use Dakataa\Crud\Attribute\EntityType;
use Dakataa\Crud\Attribute\Resolver\FormSuccessResolver;
use Dakataa\Crud\Controller\AbstractCrudController;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/contact')]
#[EntityType(ContactType::class, successMessage: 'Message sent successfully')]
#[FormSuccessResolver('sendMessage', actions: ['add'])]
class ContactController extends AbstractCrudController
{
protected function sendMessage(
Request $request,
Action $action,
FormInterface $form,
CrudServiceContainer $serviceContainer
): void {
$data = $form->getData();
// Send the message or dispatch an application command.
}
}
use Dakataa\Crud\Attribute\Column;
use Dakataa\Crud\Attribute\Resolver\ColumnVisibilityResolver;
use Dakataa\Crud\Controller\AbstractCrudController;
use Dakataa\Crud\Controller\CrudServiceContainer;
use Symfony\Component\HttpFoundation\Request;
#[ColumnVisibilityResolver('isPartnerColumnVisible', fields: ['partner'])]
class BuildingController extends AbstractCrudController
{
protected function isPartnerColumnVisible(
Request $request,
Column $column,
CrudServiceContainer $serviceContainer
): bool {
return !$request->attributes->has('partnerId');
}
}