We're Artisan Build, and
We're building Hallway.fm
We're a product agency, and this is where we open the door and invite you in to experience the process of building a successful commercial product using Laravel. Everyone is welcome to join for free to get an inside view into every aspect of creating the product and running the business.
Come join us for free! Already a member?Welcome back!Dive Deep Into the Tech
We're doing at least two streams per week, building features and pushing boundaries.
<?php declare(strict_types=1); namespace ArtisanBuild\Hallway\Channels\Events; use ArtisanBuild\Adverbs\Traits\ReturnsModelInstanceOnHandle; use ArtisanBuild\Adverbs\Traits\SimpleApply; use ArtisanBuild\Hallway\Channels\Enums\ChannelTypes; use ArtisanBuild\Hallway\Channels\States\ChannelState; use ArtisanBuild\Hallway\Members\Enums\MemberRoles; use ArtisanBuild\Hallway\Members\Traits\AuthorizesBasedOnMemberState; use ArtisanBuild\VerbsFlux\Attributes\EventForm; use ArtisanBuild\VerbsFlux\Attributes\EventInput; use ArtisanBuild\VerbsFlux\Contracts\RedirectsOnSuccess; use ArtisanBuild\VerbsFlux\Enums\InputTypes; use Throwable; use Thunk\Verbs\Attributes\Autodiscovery\StateId; use Thunk\Verbs\Event; style: italic;">#[EventForm( submit_text: 'Create Community Channel', on_success: RedirectsOnSuccess::class, )] class CommunityChannelCreated extends Event { use AuthorizesBasedOnMemberState; use ReturnsModelInstanceOnHandle; use SimpleApply; public array $authorized_member_roles = [ MemberRoles::Owner, MemberRoles::Admin, ]; style: italic;">#[StateId(ChannelState::class)] public ?int $channel_id = null; style: italic;">#[EventInput( type: InputTypes::Text, )] public string $name; style: italic;">#[EventInput( type: InputTypes::Text, params: ['maxlength' => '128'], rules: ['string', 'required', 'max:128'], )] public string $description = ''; style: italic;">#[EventInput( type: InputTypes::Select, options: ChannelTypes::class, options_filter: 'isCommunityChannel', )] public ChannelTypes $type; /** * @throws Throwable */ public function validate(): void { $this->assert($this->type->isCommunityChannel()); } }
Demystify Project Management
Watch us build a complex project in public with nothing more than GitHub to manage the process.
Get Your Hands Dirty
Premium members get access to all project repositories, a generous lifetime license, and the opportunity to contribute and help shape the product!
Peek Behind the Curtain
Watch us work through pricing, hiring contractors, marketing strategy, and other key business decisions.