typo3/cms-extbase
TYPO3 Extbase framework extension: provides the MVC foundation for TYPO3 CMS extensions, including controllers, domain models, persistence, validation, and property mapping. Used to build structured, maintainable TYPO3 applications and plugins.
Understand the Core Concept Extbase is a Model-View-Controller (MVC) framework for TYPO3 CMS, not Laravel. However, its Domain-Driven Design (DDD) principles (Entities, Repositories, Services, Value Objects) align closely with Laravel’s Eloquent and Service Layer patterns.
Domain\Model\* → Laravel app/Models/Repository → Laravel Eloquent + Repository patternService → Laravel Services (e.g., App\Services\*)Controller → Laravel Controller (but with TYPO3-specific hooks).Installation (TYPO3 Context) Since this is a TYPO3 package, you cannot use it directly in Laravel. Instead:
First Use Case: Modeling a Blog Post
// Extbase-style Domain Model (hypothetical Laravel adaptation)
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class BlogPost extends Model
{
// Extbase-style property (like @var in TYPO3)
protected $title;
protected $content;
// Extbase-style getter/setter (Laravel accessors)
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
}
// Extbase Repository (Laravel Repository Pattern)
namespace App\Repositories;
use App\Models\BlogPost;
use Illuminate\Pagination\LengthAwarePaginator;
class BlogPostRepository
{
public function findAll(): LengthAwarePaginator
{
return BlogPost::paginate(10);
}
}
Where to Look First
TYPO3\CMS\Extbase\Domain\Model\AbstractEntity (Base model)TYPO3\CMS\Extbase\Persistence\Repository (Query builder)TYPO3\CMS\Extbase\Domain\Object\AbstractValueObject (Immutable data objects)Eloquent, Accessors/Mutators, and Repository interfaces.Extbase enforces strict separation of concerns via:
User, Order).Email, Money).Eloquent but with more constraints).Services).Laravel Adaptation:
// Extbase ValueObject → Laravel Value Object (Immutable)
namespace App\ValueObjects;
final class Email
{
private string $address;
public function __construct(string $address)
{
$this->validate($address);
$this->address = $address;
}
private function validate(string $address): void
{
if (!filter_var($address, FILTER_VALIDATE_EMAIL)) {
throw new \InvalidArgumentException("Invalid email");
}
}
public function getAddress(): string
{
return $this->address;
}
}
Extbase repositories extend TYPO3\CMS\Extbase\Persistence\Repository and provide query methods.
Laravel Equivalent: Use Spatie’s Laravel Repository or a custom trait.
// Extbase Repository → Laravel Repository
namespace App\Repositories;
use App\Models\BlogPost;
use Spatie\Repository\Repository;
class BlogPostRepository extends Repository
{
public function model()
{
return BlogPost::class;
}
// Extbase-style query method
public function findPublished(): array
{
return $this->model->where('published', true)->get();
}
}
Extbase uses TYPO3’s DI container, but Laravel’s service container works similarly. Example: Inject a repository into a service/controller.
// Extbase Controller → Laravel Controller
namespace App\Http\Controllers;
use App\Repositories\BlogPostRepository;
use Illuminate\Http\Request;
class BlogController extends Controller
{
protected $blogPostRepository;
public function __construct(BlogPostRepository $blogPostRepository)
{
$this->blogPostRepository = $blogPostRepository;
}
public function index()
{
$posts = $this->blogPostRepository->findPublished();
return view('posts.index', compact('posts'));
}
}
Extbase uses TYPO3\CMS\Extbase\Validation\Validator\*.
Laravel Equivalent: Use Laravel’s Validation or Respect/Validation.
// Extbase Validator → Laravel Validator
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($data, [
'email' => 'required|email',
'title' => 'required|max:255',
]);
if ($validator->fails()) {
// Handle errors (Extbase throws \TYPO3\CMS\Extbase\Validation\Exception\InvalidValidationResultException)
}
If using Extbase in TYPO3 and Laravel separately:
// Laravel HTTP Client to fetch Extbase data
$response = Http::get('https://typo3-site.com/api/posts');
$posts = $response->json();
tt_content, sys_file_reference).
with()).
findBy* methods with initializeObject().TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager).
cache_hash in DB).
// Example: Extbase-style Service in Laravel
namespace App\Services;
use App\Repositories\BlogPostRepository;
class BlogService
{
protected $repository;
public function __construct(BlogPostRepository
How can I help you explore Laravel packages today?