ekyna/verified-reviews-bundle
Install via Composer
composer require ekyna/verified-reviews-bundle
Ensure ekyna/product-bundle is also installed (dependency).
Enable the Bundle
Add to config/bundles.php:
Ekyna\VerifiedReviewsBundle\EkynaVerifiedReviewsBundle::class => ['all' => true],
Run Migrations
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
First Use Case Display verified reviews on a product page:
{% for review in product.verifiedReviews %}
<div class="verified-review">
<h4>{{ review.title }}</h4>
<div class="rating">{{ review.rating }}/5</div>
<p>{{ review.content }}</p>
<small>Verified {{ review.createdAt|date('M d, Y') }}</small>
</div>
{% endfor %}
Review Submission
Extend Ekyna\ProductBundle\Form\Type\ReviewType to add verification logic:
$builder->add('isVerified', HiddenType::class, [
'data' => $this->isUserVerified($user),
]);
Verification Logic
Override Ekyna\VerifiedReviewsBundle\Service\ReviewVerifier to implement custom rules:
public function isVerified(User $user, Product $product): bool
{
return $user->hasPurchased($product) && $user->isEmailVerified();
}
Displaying Reviews Fetch verified reviews via repository:
$verifiedReviews = $this->reviewRepository->findVerifiedByProduct($product);
Admin Management
Use EkynaVerifiedReviewsBundle:Admin\ReviewAdmin for SonataAdmin integration:
# config/packages/sonata_admin.yaml
sonata_admin:
options:
models:
Ekyna\VerifiedReviewsBundle\Entity\Review: ~
Frontend Integration
Use Twig extensions (ekyna_verified_reviews) for dynamic rendering:
{{ ekyna_verified_reviews(product) }}
API Exposure Add to your API resource:
public function toArray($request, Product $product, $format = null)
{
return [
'verified_reviews' => $product->getVerifiedReviews()->toArray(),
];
}
Event Listeners Trigger actions on review verification:
public static function getSubscribedEvents()
{
return [
EkynaVerifiedReviewsBundle::REVIEW_VERIFIED => 'onReviewVerified',
];
}
Missing Dependencies
Ensure ekyna/product-bundle is installed and configured before using this bundle. Check for:
composer why-not ekyna/product-bundle
Verification Logic Overrides
If extending ReviewVerifier, ensure your logic doesn’t conflict with existing constraints:
// Avoid this anti-pattern:
public function isVerified(User $user, Product $product): bool {
return true; // Bypasses all checks!
}
Database Schema Conflicts
If customizing the Review entity, regenerate migrations:
php bin/console make:migration
Caching Issues Verified reviews may not update immediately if cached. Clear cache after changes:
php bin/console cache:clear
Verify Entity Mapping
Check if the Review entity is properly mapped:
php bin/console debug:container ekyna_verified_reviews.review.manager
Log Verification Decisions
Add debug logs in ReviewVerifier:
$this->logger->debug('User verified?', ['user_id' => $user->getId(), 'product_id' => $product->getId()]);
Test with Fixtures
Use Hirzel\FixturesBundle to populate test data:
# data/fixtures/reviews.yml
Ekyna\VerifiedReviewsBundle\Entity\Review:
review1:
product: "@product1"
user: "@verified_user"
rating: 5
isVerified: true
Custom Verification Criteria
Create a decorator for ReviewVerifier:
$container->register('ekyna_verified_reviews.review_verifier.decorated', ReviewVerifierDecorator::class)
->addArgument('ekyna_verified_reviews.review_verifier')
->addTag('ekyna_verified_reviews.review_verifier');
Additional Review Fields
Extend the Review entity:
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $isFeatured;
Frontend Styling
Override Twig templates in templates/EkynaVerifiedReviewsBundle/ to customize rendering.
API Filters Add custom filters for API responses:
$this->add('verified_only', BooleanFilter::class, [
'property' => 'isVerified',
'operator' => 'eq',
'value' => true,
]);
How can I help you explore Laravel packages today?