Installation
composer require larakit/laravel-larakit-twig
Publish the config file:
php artisan vendor:publish --provider="Larakit\Twig\TwigServiceProvider" --tag="config"
Basic Configuration
Edit config/twig.php to define:
paths (where Twig templates are stored)extensions (enabled Twig extensions)cache (Twig cache directory)First Use Case: Rendering a Twig Template
use Larakit\Twig\Facades\Twig;
$content = Twig::render('path/to/template.twig', ['data' => 'value']);
return response($content);
Blade Integration (Optional)
Add to config/twig.php:
'blade' => [
'enabled' => true,
'prefix' => '@twig',
],
Now use Twig templates in Blade:
@twig('path/to/template.twig', ['data' => 'value'])
Template Organization
paths in config to define multiple template directories (e.g., views, emails, partials).'paths' => [
resource_path('views/twig'),
resource_path('views/emails'),
],
Dynamic Template Resolution
$template = Twig::resolve('user/{id}.twig', ['id' => 123]);
Reusable Components
components/header.twig) and include them:
{% include 'components/header.twig' %}
Email Templates
resources/views/emails and render them:
$email = Twig::render('emails/welcome.twig', ['user' => $user]);
Larakit Modules
laravel-larakit-mail) for seamless email templating:
Mail::sendTwig('emails/order-confirmation.twig', ['order' => $order]);
Frontend Integration
return response()->json([
'html' => Twig::render('partials/dashboard.twig'),
]);
API Responses
return Twig::render('pdf/invoice.twig', ['invoice' => $invoice]);
Testing
$this->app->instance('twig', Mockery::mock('overload:\Larakit\Twig\TwigManager'));
Caching Issues
php artisan twig:clear
config/twig.php during development:
'cache' => false,
Namespace Conflicts
Extension Loading
config/twig.php under extensions:
'extensions' => [
\Larakit\Twig\Extensions\MyExtension::class,
],
Blade vs. Twig Confusion
@twig directives in Blade files with Twig syntax directly. Use one or the other per template.Template Not Found
config/twig.php and check for typos in template names.Syntax Errors
config/twig.php:
'debug' => env('APP_DEBUG', false),
Variable Scope
return view('blade-template', ['twig_data' => Twig::render('twig-template.twig')]);
Custom Filters
namespace App\Extensions;
use Twig\TwigFilter;
class StringExtensions extends \Twig\Extension\AbstractExtension
{
public function getFilters()
{
return [
new TwigFilter('slugify', [$this, 'slugify']),
];
}
public function slugify($string)
{
return Str::slug($string);
}
}
config/twig.php:
'extensions' => [
\App\Extensions\StringExtensions::class,
],
Global Variables
public function boot()
{
Twig::share('app_name', config('app.name'));
}
Custom Functions
TwigFunction instead of TwigFilter.Overriding Default Behavior
TwigManager implementation to override default behavior:
$this->app->bind('twig', function ($app) {
return new \App\Services\CustomTwigManager($app);
});
How can I help you explore Laravel packages today?