Found 79 issues

First time here? 👋

Welcome to Find a PR.

Find a PR is an open-source site that is built to help developers find projects so that they can submit their very first pull request.

If you're a contributor looking to find a project to contribute to, feel free to browse through the list below.

If you're a maintainer looking to list your project on Find a PR, you can read how to do this in the documentation.

enhancement help wanted good first issue

Describe the bug logUnguarded() works provided that $guarded is set explicitly in the model. If it is not set explicitly but globally set, say in AppServiceProvider using Model::unguard(); then nothing is logged.

To Reproduce

  1. remove $fillable and $guarded from a model that use uses LogsActivity
  2. call Model::unguard(); in AppServiceProvider in the boot method
  3. set
    public function getActivitylogOptions() : LogOptions
    {
        return LogOptions::defaults()->logUnguarded();
    }
  1. Make some changes to a model and save them

Expected behavior Some changed properties should be logged but none are

Versions (please complete the following information)

  • PHP: 8.1
  • Database: MySql
  • Laravel: 9.38
  • Package: larvel-activitylog
View more
1 comment
colinmackinlay

colinmackinlay

20th Nov 2022 @ 12:31

help wanted

Describe the bug

When you attempt to dump a binary string or anything containing one (like an array or an object), Ray does not dump anything. It just fails silently.

Versions

Ray version (you can see this in "About Ray"): 2.8.1

You can use composer show to get the version numbers of:

  • spatie/ray package version: 1.41.2
  • spatie/laravel-ray package version (if applicable): 1.37.1

PHP version: 8.2.17 Laravel version (if applicable): 11.18.1

To Reproduce

Add this in your code:

ray(hex2bin('ae0f3d'));

Expected behavior

Ray should display this (like the console when dump is used):

b"®\x0F="

Desktop (please complete the following information):

  • OS: MacOs
  • Version: 14.6.1
View more
5 comments 👍 1
sebj54

sebj54

27th Aug 2024 @ 14:57

help wanted filament

v2.4 allows users to add Google 2FA to their account for an added layer of security. 3.x should also implement this in some way.

Things to consider

  • How to generate the code
  • How do verify via 2FA when this is enabled on a users account.
  • Can admins reset 2FA for a user if they've lost their 2FA device?
  • How should backup codes work?
View more
3 comments
joelbutcher

joelbutcher

15th Jan 2025 @ 18:25

help wanted

In raising this issue, I confirm the following (please check boxes):

  • I have read and understood the contributors guide.
  • I have checked the pull requests tab for existing solutions/implementations to my issue/suggestion.
  • I have checked that the bug-fix I am reporting can be replicated.

Description of the problem

One of the important reasons for using hyperscript is that it handles escaping of characters which are reserved in html. Which prevents XSS.

spatie/html-element does not do this. Mainly because it uses strings as intermediate format instead of an object representation of the DOM.

View more
6 comments 👍 4
Erikvv

Erikvv

1st Feb 2018 @ 02:19

bug enhancement good first issue

What happened?

I just installed package and complement for AI powered solution. When I create an issue to test it I get :

Capture d'écran 2024-07-21 125216

I had to change the links function like this to make it work for me:

public function links(): array
{
    $rawText = Str::finish($this->rawText, 'ENDLINKS');

    $textLinks = $this->between('LINKS', 'ENDLINKS', $rawText);

    $textLinks = explode(PHP_EOL, $textLinks);

    $links = [];

    foreach ($textLinks as $textLink) {
        $textLink = str_replace('\\', '\\\\', $textLink);
        $textLink = str_replace('\\\\\\', '\\\\', $textLink);

        $decodedLink = json_decode($textLink, true);

        if ($decodedLink !== null) {
            $links[$decodedLink['title']] = $decodedLink['url'];
        }
    }

    return $links;
}

How to reproduce the bug

When I install the package in my project and use it with AI powered

Package Version

1.0

PHP Version

8.2.14

Laravel Version

11.14

Which operating systems does with happen with?

Windows

Notes

No response

View more
2 comments
bestmomo

bestmomo

21st Jul 2024 @ 10:57

good first issue

Many of them are out of date, some by a few major versions!

It would be great to get these into good order and start keeping them up to date

View more
4 comments
simonhamp

simonhamp

24th Oct 2024 @ 11:53

bug unconfirmed help wanted medium priority

Package

filament/filament

Package Version

v3.3.4

Laravel Version

v11.44.1

Livewire Version

No response

PHP Version

PHP 8.2

Problem description

Hi, I'm using the FileUpload form field to upload larger files and I noticed that the "tap to cancel" field on the uploader is not working at all. This is also true for the SpatieMediaFileUpload field. I have checked the filepond demos where it works as expected, so it does not seem to be a filepond bug. I'm not sure if this is CSS, JS or even browser related. I've tested Chrome, Firefox and Edge and it's not working in any browser for me.

Image

Expected behavior

Successfully cancel the file upload while uploading.

Steps to reproduce

  • navigate to the CreateOrder form
  • (optional) throttle network speed (for more time)
  • upload a large-ish file in the FileUpload field
  • try to cancel the upload while uploading

Reproduction repository (issue will be closed if this is not valid)

https://github.com/c-zehnter/fileupload

Relevant log output


View more
3 comments
c-zehnter

c-zehnter

12th Mar 2025 @ 10:05

help wanted

Laravel Version

12.32.5

PHP Version

8.2.29

Database Driver & Version

No response

Description

When analyzing the behavior of the Blade components, the following sequence can be observed:

  • In x-slot:search, the is-grouped property is defined, and its value is true.
  • In x-form.field, the value of isGrouped is also true, as defined in the component’s @props.
  • However, in x-form.input, the value of isGrouped becomes false (the default).

This indicates that the property value is lost during the rendering of the slot inside the x-table component.

The reason lies in how Blade handles named slots. When the search slot is rendered using {{ $search }} within x-table, Blade re-renders the slot content as a new, isolated instance, without preserving the parent component’s context or properties (x-form.field).

As a result:

  • The x-slot:search keeps is-grouped=true.
  • The x-form.field also sees isGrouped=true while it renders.
  • But when {{ $search }} is used, the slot content is rendered outside the x-field scope, so inner components like x-form.input and x-form.button do not receive the @aware values.

In contrast, inside x-form.field, when {{ $slot }} is used, Blade maintains the component scope, and the aware variables remain accessible — which explains why x-input correctly recognizes the isGrouped value in that case.

In summary:

The value of the isGrouped (or hasAddons) property is lost when the slot content is rendered outside the scope of the component that defines it, such as when using {{ $search }}. This happens because Blade recompiles the slot content in isolation, without preserving variables and properties propagated through @aware.

Steps To Reproduce

{{-- component: field --}}
@props([
    'hasAddons' => false,
    'isGrouped' => false,
])

<fieldset @class([
    'field',
    'has-addons' => $hasAddons,
    'is-grouped' => $isGrouped,
])>
    {{ $slot }}
</fieldset>
{{-- component: input --}}
@aware([
    'hasAddons' => false,
    'isGrouped' => false,
])

@props([
   // ...
])

@if ($hasAddons || $isGrouped)
    <input {{ $attributes }} />
@else
    <fieldset class="field">
        <input {{ $attributes }} />
    </fieldset>
@endif
{{-- component: table --}}
<div>
    @isset($search)
        <x-form>
            <x-form.field :is-grouped="$search->attributes->has('is-grouped')">
                {{ $search }}
            </x-form.field>
        </x-form>
    @endisset

    <table>
        {{ $slot }}
    </table>
</div>
{{-- view: home --}}
@section('main')
    <x-table>
        <x-slot:search is-grouped>
            <x-form.input placeholder="Título" name="title" is-size="normal" is-expanded />
            <x-form.button icon="search" is-size="normal" />
        </x-slot>
        @forelse ($posts as $post)
            <tr> ... </tr>
        @empty
            <tr> is empty </tr>
        @endforelse
    </x-table>
@endsection

Sources:

View more
1 comment
hctorres02

hctorres02

6th Oct 2025 @ 23:49

help wanted

Laravel Version

12.18.0

PHP Version

8.4.11

Database Driver & Version

No response

Description

https://laravel.com/docs/12.x/vite#inline-assets

We use inline assets for exactly this reason, to inject the CSS directly into the page when passing HTML content to a PDF generator. However since we upgraded to vite 7, the content() method now returns just the JS import rather than the full raw css content.

const e=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));export{e as T};

For a short term hack we've implemented the following:

function getViteCssContent(string $entryPath): ?string
{
    $manifestPath = public_path('build/manifest.json');
    if (!file_exists($manifestPath)) {
        return null;
    }
    $manifest = json_decode(file_get_contents($manifestPath), true);
    $entry = $manifest[$entryPath] ?? null;
    if (!$entry || !isset($entry['css']) || empty($entry['css'])) {
        return null;
    }
    $cssFile = head($entry['css']);
    $fullPath = public_path('build/' . $cssFile);
    if (!file_exists($fullPath)) {
        return null;
    }
    return file_get_contents($fullPath);
}

Steps To Reproduce

Use Vite::content() with expectation of seeing full raw CSS, not JS import

View more
3 comments 👍 1
bobbypiperagrovista

bobbypiperagrovista

3rd Sep 2025 @ 08:53

help wanted

Bug description

Chrome, Firefox, and Safari now support setting the width and height attributes on <source> elements within <picture> elements. You can read more about this in the web.dev article on optimizing CLS. This enhancement allows browsers to better handle layout shifts and varying aspect ratios for responsive images.

How to reproduce

Current Behavior:

Currently, Statamic Responsive Images does not take advantage of this browser capability. As a result, when multiple sources are provided, the appropriate width and height attributes are not applied to <source> elements, which may lead to layout shifts due to varying aspect ratios.

Proposed Enhancement:

Set appropriate width and height attributes on <source> elements based on their aspect ratios.

Benefits:

  • Improved Visual Stability: Reduce Cumulative Layout Shift (CLS) by providing browsers with the correct dimensions upfront.
  • Better Performance: Modern browsers can allocate the correct space for images during page load.
  • Enhanced Responsiveness: Accurately reflect different image aspect ratios for a more consistent user experience.

Environment

Environment
Application Name: local
Laravel Version: 11.41.3
PHP Version: 8.3.16
Composer Version: 2.8.5
Environment: development
Debug Mode: ENABLED
URL: local.test
Maintenance Mode: OFF
Timezone: Europe/Paris
Locale: en

Cache
Config: NOT CACHED
Events: NOT CACHED
Routes: NOT CACHED
Views: NOT CACHED

Drivers
Broadcasting: null
Cache: file
Database: sqlite
Logs: stack / single
Mail: smtp
Queue: redis
Session: file

Statamic
Addons: 3
Sites: 1
Stache Watcher: Disabled (auto)
Static Caching: Disabled
Version: 5.46.1 PRO

Statamic Addons
rias/statamic-redirect: 3.9.3
spatie/statamic-responsive-images: 5.2.1
statamic/seo-pro: 6.5.0

Installation

Fresh statamic/statamic site via CLI

Antlers Parser

regex (default)

Additional details

Leveraging native width and height support on <source> elements can lead to significant improvements in layout stability and overall performance on modern browsers. This enhancement would allow the package to better handle responsive images by using up-to-date browser capabilities.

Thanks for considering this enhancement!

View more
2 comments 👍 1
jimblue

jimblue

7th Feb 2025 @ 22:03

enhancement help wanted good first issue

using prompt engineering techniques provide enhancement to the Gemini service class in the Gemini prompt class, creating functions commonly used in Laravel applications.

View more
kwakuOfosuAgyeman

kwakuOfosuAgyeman

5th Jan 2025 @ 05:43

help wanted findapr

I tried the example config from the docs to a Laravel/Inertia/Vue app, and it don't work.

If use the code (HandleInertiaRequests.php): 'messages' => flash()->render([], 'array'),

Error: Flasher\Prime\Flasher::render(): Argument #1 ($presenter) must be of type string, array given, called in D:\Laragon6\www\mobi-care\app\Http\Middleware\HandleInertiaRequests.php on line 36

And changing it to: 'messages' => flash()->render('array'), it loads the page, but, I only see the notifications if i press F5, with its not the desired state.

View more
brunonetadmin

brunonetadmin

18th Mar 2025 @ 17:16

bug confirmed low priority help wanted

Package

filament/filament

Package Version

v3.3.3

Laravel Version

v12.1.1

Livewire Version

v3.6.1

PHP Version

PHP 8.4.5

Problem description

In a form with a select with two options and two dependent fields: a fileupload and a richeditor. Using requiredIf(), when the selected option is "1" the fileupload field is required, and when the selected option is "2" the richeditor is required.

The problem is that the fileupload is not required correctly, and you can create a record with type "1" without uploading anything. When selecting type "2" the richeditor is required so you can't create a record with type "2" and no text.

The fileupload is always required if you use ->required(), so I think this is a problem just with the conjuntion fileupload + requiredIf().

Expected behavior

You shouldn't be able to submit the form if you choose "1" in the select and don't upload the file, and the error message "The file field is required when type is 1" should appear.

Steps to reproduce

use Filament\Forms;

Forms\Components\Select::make('type')
    ->required()
    ->options([
        1 => trans('File'),
        2 => trans('Text'),
    ]),
Forms\Components\FileUpload::make('filename')
    ->requiredIf('type', 1),
Forms\Components\RichEditor::make('text')
    ->requiredIf('type', 2)
]);

Reproduction repository (issue will be closed if this is not valid)

https://github.com/mariavilaro/filament-issue-requiredif-fileupload

Relevant log output


View more
3 comments
mariavilaro

mariavilaro

27th Mar 2025 @ 16:57

enhancement good first issue

using prompt engineering techniques provide enhancement to the Claude service class in the Claude prompt class, creating functions commonly used in Laravel applications. For example, brand builder, seo product optimizer, video and or image captioner, automated chatbots #goodfirstissue

View more
kwakuOfosuAgyeman

kwakuOfosuAgyeman

5th Jan 2025 @ 05:38

help wanted HttpClient
Q A
Feature PR symfony/symfony#59576
PR author(s) @Lctrs
Merged in 7.4

We created this issue to not forget to document this new feature. We would really appreciate if you can help us with this task. If you are not sure how to do it, please ask us and we will help you.

To fix this issue, please create a PR against the 7.4 branch in the symfony-docs repository.

Thank you! :smiley:

View more
nicolas-grekas

nicolas-grekas

29th Sep 2025 @ 07:13

enhancement help wanted
  • standard tags
  • input fields
  • components
  • patterns

Add code snippets for each block

View more
👍 1
willemvb

willemvb

25th Jul 2016 @ 12:49

help wanted

Octane Version

2.8.1

Laravel Version

10.48.28

PHP Version

8.3.16

What server type are you using?

Swoole

Server Version

6.0.1

Database Driver & Version

No response

Description

I'm using Envoyer to deploy a Laravel Octane application, taking advantage of its zero-downtime deployment features.

However, Octane currently does not support zero-downtime deployment because it does not follow symlink directories. It always remains in the actual directory (instead of the symlinked one) where the Octane server was initially started. When the outdated release directory is deleted, Octane continues running in that location, causing errors on every request and resulting in 500 response codes on the live application.

Error thrown:

Warning: require(/var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/bootstrap.php): Failed to open stream: No such file or directory in /var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/swoole-server on line 18
Fatal error: Uncaught Error: Failed opening required '/var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/bootstrap.php' (include_path='.:/usr/bin/[email protected]/8.3.16/share/[email protected]/pear') in /var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/swoole-server:18
Stack trace:
#0 /var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/swoole-server(95): {closure}(Array)
#1 [internal function]: {closure}(Object(Swoole\Http\Server), 0)
#2 /var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/swoole-server(170): Swoole\Server->start()
#3 {main}
  thrown in /var/www/domain.com/releases/202502010200023/vendor/laravel/octane/bin/swoole-server on line 18
#1 [internal function]: {closure}(Object(Swoole\Http\Server), 1)
#1 [internal function]: {closure}(Object(Swoole\Http\Server), 3)
#1 [internal function]: {closure}(Object(Swoole\Http\Server), 2)
#1 [internal function]: {closure}(Object(Swoole\Http\Server), 4)
#1 [internal function]: {closure}(Object(Swoole\Http\Server), 5)

Steps To Reproduce

Use any 0-downtime deployment or test it manually using the following instructions:

  1. Use the Swoole driver as an example.
  2. cd one directory up from the project's base path.
  3. Create a current symlink directory for your project using the command: ln -nsf ./octane-project-test ./current
  4. Start the Octane server: php ./current/artisan octane:start
  5. Copy your project to another directory: cp -R ./octane-project-test ./octane-project-test-new
  6. Activate the new release: ln -nsf ./octane-project-test-new ./current
  7. Reload the Octane server: php ./current/artisan octane:reload
  8. Remove the original project directory: rm -rf ./octane-project-test
View more
17 comments 👍 1 👀 2
mikkpokk

mikkpokk

2nd Mar 2025 @ 01:35

help wanted

Currently you can only see the latest 3 articles, latest 5 threads and latest 5 replies of a user on their profile. It would be cool if we could paginate through those results. We already use livewire so would be cool if we could add some magic with that.

View more
driesvints

driesvints

10th Sep 2025 @ 19:37

good first issue

I would love to see support for oAuth in Catchet. I know there are some other (closed) issues requesting the same functionality, but I think this would be a great addition for Catchet.

View more
3 comments
FoksVHox

FoksVHox

28th Feb 2025 @ 08:29

bug unconfirmed low priority help wanted

Package

filament/tables

Package Version

v4.0.0-beta19

Laravel Version

v12.21.0

Livewire Version

v3.6.4

PHP Version

PHP 8.4.8

Problem description

When a model contains a HasManyThrough relationship and it is used when overriding a resource getEloquentQuery(), items are duplicated based on the Through table id.

For example if i want to filter records by user on the list page using a HasManyThrough relationship.

Users -> Throughs -> Items 

The two main changes to the default app are the HasManyThrough relation in App\Models\User.php

public function items(): HasManyThrough 
{
    return $this->hasManyThrough(Item::class, Through::class);
}

And the override of getEloquentQuery in the resource

public static function getEloquentQuery(): Builder
{
    return Auth::user()->items()->getQuery();
}

Expected behavior

Items are not duplicated. It is a regression from v3, where this was working properly.

V3:

V4:

Steps to reproduce

I have provided a repository with a relevant README to reproduce.

Reproduction repository (issue will be closed if this is not valid)

https://github.com/Iilun/filament-v4-has-many-through

Relevant log output

When running tinker queries, we can find the root cause. When using HasManyThrough->getQuery()->get(), the `id` field from the model is indeed the same as `trough_id`.
What's interesting is that this is NOT the case when querying the relation directly (without getQuery)


> User::first()->items()->getQuery()->limit(2)->get()
= Illuminate\Database\Eloquent\Collection {#7082
    all: [
      App\Models\Item {#7072
        id: 1,
        through_id: 1,
        name: "Harley Davis",
        created_at: "2025-07-26 20:40:21",
        updated_at: "2025-07-26 20:40:21",
        user_id: 1,
      },
      App\Models\Item {#7083
        id: 1,
        through_id: 1,
        name: "Connie Carter",
        created_at: "2025-07-26 20:40:21",
        updated_at: "2025-07-26 20:40:21",
        user_id: 1,
      },
    ],
  }
> User::first()->items()->limit(2)->get()
= Illuminate\Database\Eloquent\Collection {#7056
    all: [
      App\Models\Item {#7057
        id: 1,
        through_id: 1,
        name: "Harley Davis",
        created_at: "2025-07-26 20:40:21",
        updated_at: "2025-07-26 20:40:21",
        laravel_through_key: 1,
      },
      App\Models\Item {#7103
        id: 2,
        through_id: 1,
        name: "Connie Carter",
        created_at: "2025-07-26 20:40:21",
        updated_at: "2025-07-26 20:40:21",
        laravel_through_key: 1,
      },
    ],
  }

Update: It turns out this also induces a bug in v3, where the generated record link is for the through_id instead of item_id, even though the display is correct (the first three items all open page for id = 1)

View more
Iilun

Iilun

26th Jul 2025 @ 21:20

bug unconfirmed low priority help wanted

Package

filament/filament

Package Version

4-beta6

Laravel Version

12

Livewire Version

3

PHP Version

8.4

Problem description

Not sure if I'm doing something wrong, but I can't get charts in nested non-active tabs to render properly on page load, or update properly. The video shows the problem using the reproduction repo.

I'm using this to render the chart in 3 places:

Livewire::make(StatChartWidget::class, fn ($record) => [
        'record' => $record,
    ])
    ->key(Str::random(10))

In the video, the following happens:

1. Page load

  • Chart in the body loads ✅
  • Chart in the visible tab loads ✅
  • Chart in the non-visible nested "Data" tab is empty ❌

2. "Refresh data" to update the model's data attribute while the 'Data' tab is not active

  • Chart in the body refreshes ✅
  • Chart in the visible tab refreshes ✅
  • Chart in the non-visible nested "Data" tab is not refreshed ❌

2. "Refresh data" to update the model's data attribute while the 'Data' tab is active

  • Chart in the body refreshes ✅
  • Chart in the visible tab refreshes ✅
  • Chart in the non-visible nested "Data" tab refreshes ✅

I'm using #[Reactive] but I also tried refreshing via an event, and tried ->lazy(). Neither helped.

https://github.com/user-attachments/assets/6cb1cb43-8c9b-4f3e-ab62-face3931473a

Expected behavior

Charts / Livewire components in a page should render and update correctly regardless of what tab they're in.

Steps to reproduce

  1. Clone repo
  2. Run migrate:fresh --seed to seed statistics table
  3. Go to Statistics resource
  4. See video and steps outlined in description to reproduce

Reproduction repository (issue will be closed if this is not valid)

https://github.com/binaryfire/filament-bug-reproduction

Relevant log output


View more
4 comments
binaryfire

binaryfire

19th Jun 2025 @ 09:21

help wanted hacktoberfest good first issue documentation

We are logging activity of several models, some using SoftDeletes trait and others not.

When we set config option 'subject_returns_soft_deleted_models' => true then calling subject() on any model not using SoftDeletes trait throws an exception: Call to undefined method Illuminate\Database\Eloquent\Builder::withTrashed().

Can the subject() method below be made to check first whether the Model uses the SoftDeletes trait? Or perhaps check whether withTrashed() is a defined method on the Model? I tried a few things but couldn't figure out how to get the class of the Model..

https://github.com/spatie/laravel-activitylog/blob/68eb6e65382f94fe86ce5ff6572159f80d024ba9/src/Models/Activity.php#L28-L35

View more
26 comments
bluec

bluec

7th Nov 2018 @ 13:44

help wanted

When encountering nested tokens, they are parsed only during formatting, not when compiling the pattern. And the type of tokens are validated only during the rendering as well. But the native implementation detects such error during the instantiation: https://3v4l.org/Sf69D This means that the error handling required for the polyfill is not the same than for the native implementation.

View more
stof

stof

23rd Oct 2018 @ 15:58

enhancement help wanted hacktoberfest

Found the \Illuminate\Database\Eloquent\Concerns\HasAttributes::originalIsEquivalent() method during code diving and it should be usable for our trait! 🎉 This PR would be mainly reasearch when that method was added, if it's compatible with our version support rules and switching our own change detection logic with the core one.

View more
3 comments
Gummibeer

Gummibeer

20th Oct 2021 @ 10:03

bug unconfirmed help wanted medium priority

Package

filament/filament

Package Version

v3.3

Laravel Version

v12.13

Livewire Version

v3.6

PHP Version

PHP 8.4.5

Problem description

My model need translations so I use a secondary table to store it. In this example, I have Sector (table: hike_sectors) and SectorTranslation (table: hike_sector_translations). I want in my table to search using default language name. I have created a service to custom automatically the searchable query. But there is an issue by using LEFT JOIN.

Here is my code :

class TranslatableTableService
{
    public function sortable(Builder $query, string $direction, string $attribute = 'id', $languageId = null): Builder
    {
        $languageId ??= LanguageHelper::getDefaultId();

        $model = $query->getModel();
        $translationModel = new ($model->getTranslationModelClass());

        $mainTable = $model->getTable();
        $translationTable = $translationModel->getTable();
        $alias = 't_' . $translationTable;

        $foreignKey = $model->translations()->getForeignKeyName();

        return $query
            ->leftJoin("{$translationTable} as {$alias}", function ($join) use ($alias, $foreignKey, $mainTable, $languageId) {
                $join->on("{$alias}.{$foreignKey}", '=', "{$mainTable}.id")
                    ->where("{$alias}.language_id", '=', $languageId);
            })
            ->orderBy("{$alias}.{$attribute}", $direction)
            ->select("{$mainTable}.*");
    }

    public function searchable(Builder $query, string $search, string $attribute, $languageId = null): Builder
    {
        $languageId ??= LanguageHelper::getDefaultId();

        $model = $query->getModel();
        $translationModel = new ($model->getTranslationModelClass());

        $mainTable = $model->getTable();
        $translationTable = $translationModel->getTable();
        $alias = 't_' . $translationTable;

        $foreignKey = $model->translations()->getForeignKeyName();

        return $query
            ->leftJoin("{$translationTable} as {$alias}", function ($join) use ($alias, $foreignKey, $mainTable, $languageId) {
                $join->on("{$alias}.{$foreignKey}", '=', "{$mainTable}.id")
                    ->where("{$alias}.language_id", '=', $languageId);
            })
            ->where("{$alias}.{$attribute}", 'like', "%$search%")
            ->select("{$mainTable}.*");
    }
}

public static function table(Table $table): Table
{
    return $table
        ->columns([
            Tables\Columns\TextColumn::make('name')
                ->label('Nom')
                ->state(function (Sector $record) {
                    return $record->translated('name');
                })
                ->searchable(query: function (Builder $query, string $search, TranslatableTableService $service): Builder {
                    return $service->searchable($query, $search, 'name');
                }),
            Tables\Columns\TextColumn::make('slug')
                ->label('Url')
                ->state(function (Sector $record) {
                    return $record->translated('slug');
                }),
        ])
        ->defaultSort('position')
        ->reorderable('position')
        ->filters([
            //
        ])
        ->actions([
            TranslatableEditAction::make(),
            Tables\Actions\DeleteAction::make(),
        ])
        ->bulkActions([
            //
        ]);
}

Here is the issue (don't pay any attention to the letter t at the beginning of the table name, it's an error handling of my service) : SQLSTATE[42S22]: Column not found: 1054 Unknown column 't_hike_sector_translations.name' in 'where clause' (Connection: mysql, SQL: select count(*) as aggregate from hike_sectors where ((t_hike_sector_translations.name like %tour%)))

This error come from filament/tables/src/Concerns/CanPaginateRecords.php:35 file : $total = $query->toBase()->getCountForPagination();

So I try to add a sortable to my column :

->sortable(query: function (Builder $query, string $direction, TranslatableTableService $service): Builder {
    return $service->sortable($query, $direction, 'name');
})

Same issue.

BUT using ->defaultSort('name') instead of ->defaultSort('position') that work perfectly !! I don't know why except that the LEFT JOIN is used when I make all this thing otherwise not. But to use a custom search using left join I have to use ->sortable to my column and ->defaultSort at my specific column to my table to make work the search.

Expected behavior

I just want to use ->searchable using custom query with LEFT JOIN independently at other query

Steps to reproduce

Try to use ->searchable in column of table using custom query with LEFT JOIN

Reproduction repository (issue will be closed if this is not valid)

https://github.com/Alpaweb/FilamentSearchableColumn

Relevant log output


View more
3 comments
Alpaweb

Alpaweb

17th Jul 2025 @ 11:13

help wanted

What about allowing displaying post-install messages again, eg when running this?

composer recipes the/package

View more
nicolas-grekas

nicolas-grekas

1st Jun 2022 @ 09:13

help wanted

Bug description

Currently, the plugin calculates width/height incorrectly when swapping aspect ratios, leading to incorrect HTML output. When changing the aspect ratio of an image, the longest side should remain fixed, and the other side should be calculated accordingly.

How to reproduce

For an image of 3000x1688px as a source:

{{ responsive:image ratio="16/9" md:ratio="9/16" }}

it returns:

<picture>
    <source [...] >
    <source [...] >
    <source [...] >
    <img src="/img/asset/hash/image.jpg?w=3000&amp;h=1688&amp;s=9358bb54be5d388a9a2529a4196dcfc6" alt="" width="3000" height="1688">
</picture>

Now for the same image as source but with:

{{ responsive:image ratio="9/16" md:ratio="16/9" }}

it returns:

<picture>
    <source [...] >
    <source [...] >
    <source [...] >
    <img src="/img/asset/hash/image.jpg?w=3000&amp;h=5333&amp;s=6c5c0bb8447dbd7ff61a692f98b5f46d" alt="" width="3000" height="5333">
</picture>

The calculated aspect ratio is correct, but the dimensions are not. The generated values exceed the original image size.

In this last example, the correct height should be 3000px, and the width should be 1688px to ensure the image stays within its original dimensions.

Environment

Environment
Application Name: local
Laravel Version: 11.41.3
PHP Version: 8.3.14
Composer Version: 2.8.5
Environment: development
Debug Mode: ENABLED
URL: local.test
Maintenance Mode: OFF
Timezone: Europe/Paris
Locale: en

Cache
Config: NOT CACHED
Events: NOT CACHED
Routes: NOT CACHED
Views: CACHED

Drivers
Broadcasting: null
Cache: file
Database: sqlite
Logs: stack / single
Mail: smtp
Queue: redis
Session: file

Statamic
Addons: 3
Sites: 1
Stache Watcher: Disabled (auto)
Static Caching: Disabled
Version: 5.46.0 PRO

Statamic Addons
rias/statamic-redirect: 3.9.3
spatie/statamic-responsive-images: 5.2.1
statamic/seo-pro: 6.5.0

Installation

Fresh statamic/statamic site via CLI

Antlers Parser

regex (default)

View more
👍 1
jimblue

jimblue

3rd Feb 2025 @ 23:33

help wanted
View more
1 comment
julianstolp

julianstolp

11th Mar 2025 @ 14:11

help wanted

Not PHPUnit 11 because we still need to support for PHP 8.1

e.g. at the moment we have stuff like:

  1. Symfony\Flex\Tests\Configurator\CopyFromPackageConfiguratorTest::testConfigureAndOverwriteFiles The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.

Help wanted 🙏

View more
nicolas-grekas

nicolas-grekas

23rd May 2025 @ 10:13

enhancement help wanted hacktoberfest

Describe the bug I have a table which has an order column. When I reorder the elements I update each model with the new order. Because the table has some large JSON columns I select only id and order columns for efficiency. I set the new order and save the model.

foreach (Faq::query()->get(['id', 'order']) as $faq) {
    $faq->order = $newOrder[$faq->id];
    $faq->save();
}

The diffs created in the activity_log table look like this:

{
   "old": {
      "order": 1,
      "answer": null,
      "question": null
   },
   "attributes": {
      "order": 2,
      "answer": "long JSON content",
      "question": "long JSON content"
   }
}

From what I see laravel-activitylog fetches the model with all columns from the database before creating a log entry which kind of defeats the purpose of my "select list optimization" and produces an incorrect diff.

Generally I want these large JSON columns to be logged in case a user changes them but in this case I only change the order column so I would like to see only the order column in the diff.

I have tried running these updates straight off the Eloquent builder:

Faq::query()->where('id', $id)->update(['order' => $newOrder[$id]]);

but in this case nothing is logged.

I have the following activitylog configuration for my models:

public function getActivitylogOptions(): LogOptions
{
    return LogOptions::defaults()
                     ->logAll()
                     ->logOnlyDirty()
                     ->logExcept([
                         'id',
                         'created_at',
                         'updated_at',
                     ]);
}

To Reproduce Select a subset of columns from the database, change these columns, save the model and see that other (not initially selected) columns are present in the diff.

Expected behavior Only columns that've actually been changed should be present in the diff.

Versions

  • PHP: 8.1
  • Database: MySQL 8
  • Laravel: 9.31.0
  • Package: 4.6.0
View more
6 comments 👍 1
KKSzymanowski

KKSzymanowski

28th Sep 2022 @ 21:53

bug unconfirmed help wanted medium priority

Package

filament/filament

Package Version

v4

Laravel Version

v12

Livewire Version

No response

PHP Version

PHP 8.4

Problem description

The goal

Update the managers and assignees relationships on the Ticket model

public function users(): BelongsToMany
{
    return $this->belongsToMany(User::class);
}

public function managers(): BelongsToMany
{
    return $this->users()
        ->wherePivot('user_role', TicketUserRole::Manager->value);
}

public function assignees(): BelongsToMany
{
    return $this->users()
        ->wherePivot('user_role', TicketUserRole::Assignee->value);
}

using the ModalTableSelect field.

While this works

Using a standard Select field works perfectly fine.

Select::make('assignees')
    ->label(__('Verantwortung'))
    ->relationship()
    ->multiple()
    ->searchable([
        'first_name',
        'last_name',
        ])
    ->preload()
    ->pivotData([
        'user_role' => TicketUserRole::Assignee,
    ])
    ->getOptionLabelFromRecordUsing(fn (User $record) => $record->getFilamentName()),

The correct users are selected by default and updating them works as expected.

This doesn't work

Using the ModalTableSelect field results in an error on trying to open the modal.

ModalTableSelect::make('assignees')
    ->label(__('Verantwortung'))
    ->relationship()
    ->multiple()
    ->pivotData([
        'user_role' => TicketUserRole::Assignee,
    ])
    ->tableConfiguration(UsersSelectTable::class)
    ->getOptionLabelFromRecordUsing(fn(User $record) => $record->getFilamentName()),

The correct users are selected by default but the following error appears on trying to open the modal SQLSTATE[HY093]: Invalid parameter number (Connection: mysql, SQL: select count(*) as aggregate from 'users')

I guess its about the wherePivot calls. With the users relationship everything works perfectly. But that's not what we want to achieve.

Expected behavior

Not to get the SQLSTATE[HY093]: Invalid parameter number (Connection: mysql, SQL: select count(*) as aggregate from 'users') error.

Steps to reproduce

  • Setup basic Laravel 12 / Filamentphp 4 environment
  • Try updating an many-to-many relationship with an wherePivot call using the ModalTableSelect field.

Reproduction repository (issue will be closed if this is not valid)

https://github.com/AngeloKreienbuehl/filament-issue

Relevant log output


View more
👍 6
AngeloKreienbuehl

AngeloKreienbuehl

12th Sep 2025 @ 12:38

Workflow help wanted
Q A
Feature PR symfony/symfony#60201
PR author(s) @lyrixx
Merged in 7.4

We created this issue to not forget to document this new feature. We would really appreciate if you can help us with this task. If you are not sure how to do it, please ask us and we will help you.

To fix this issue, please create a PR against the 7.4 branch in the symfony-docs repository.

Thank you! :smiley:

View more
nicolas-grekas

nicolas-grekas

1st Oct 2025 @ 15:27

bug confirmed help wanted medium priority

Package

filament/filament

Package Version

3.3.28

Laravel Version

12.19.3

Livewire Version

3.6.3

PHP Version

8.4.8

Problem description

For a Filament Panel Page that includes a child Livewire component, a Filament Notification fired by that child component is rendered twice by Filament's notifications.blade.php if a Livewire event is fired at the same time. If an event is not fired, the notification renders only once.

Expected behavior

The Filament Notification blade should be rendered only once for any call to the Notification object.

Steps to reproduce

Given the provided repo.

composer install
php artisan migrate
php artisan make:filament-user

In vendor/filament/notifications/resources/views/notifications.blade.php log out the $notifications variable:

@php
    use Filament\Support\Enums\Alignment;
    use Filament\Support\Enums\VerticalAlignment;

    \Log::info($notifications);
@endphp

Navigate to /admin/foobar .

Click "With Event" button. Refresh.

Click "Without Event" button. Refresh.

Checking laravel.log, the "With Event" log is proceeded by two renders of a notification with the same ID. The "Notification without Event" is proceeded by just one.

(See log output below)

Reproduction repository (issue will be closed if this is not valid)

https://github.com/jasonlund/filament-notification

Relevant log output

[2025-06-23 16:36:13] local.INFO: []  
[2025-06-23 16:36:42] local.INFO: []  
[2025-06-23 16:36:43] local.INFO: Notification with Event  
[2025-06-23 16:36:43] local.INFO: {"9f3994ea-cbdd-429b-9202-1c2aa6582117":{"id":"9f3994ea-cbdd-429b-9202-1c2aa6582117","actions":[],"body":null,"color":null,"duration":6000,"icon":"heroicon-o-check-circle","iconColor":"success","status":"success","title":"With Event","view":"filament-notifications::notification","viewData":[]}}  
[2025-06-23 16:36:43] local.INFO: {"9f3994ea-cbdd-429b-9202-1c2aa6582117":{"id":"9f3994ea-cbdd-429b-9202-1c2aa6582117","actions":[],"body":null,"color":null,"duration":6000,"icon":"heroicon-o-check-circle","iconColor":"success","status":"success","title":"With Event","view":"filament-notifications::notification","viewData":[]}}  
[2025-06-23 16:36:44] local.INFO: []  
[2025-06-23 16:36:46] local.INFO: Notification without Event  
[2025-06-23 16:36:46] local.INFO: {"9f3994ee-65f6-434d-95b4-e1c266b15e85":{"id":"9f3994ee-65f6-434d-95b4-e1c266b15e85","actions":[],"body":null,"color":null,"duration":6000,"icon":"heroicon-o-check-circle","iconColor":"success","status":"success","title":"Without Event","view":"filament-notifications::notification","viewData":[]}}  
[2025-06-23 16:36:52] local.INFO: []
View more
2 comments
jasonlund

jasonlund

23rd Jun 2025 @ 16:40

help wanted
View more
weaverryan

weaverryan

10th Jan 2024 @ 19:05

unconfirmed bug in dependency help wanted medium priority

Package

filament/filament

Package Version

v3.x – Filament Demo site

Laravel Version

Whatever is used in the Filament Demo site as of today

Livewire Version

v3.x – Filament Demo site

PHP Version

Whatever is used in the Filament Demo site as of today

Problem description

See the following for a video demonstration of the issue on Filament's demo site: app.birdeatsbug.com/vmq0tUZ66zl2wkfJydzNXVUP3kI-pnGC-bxe2Uqua1ES

Navigating away from, and back/forward via the browser to, a Filament form does not rehydrate the form fields in question, resulting in an unexpected null error for said input, even when the browser has a non-null value for the form field.

Expected behavior

Expected that the submission of the form would reflect the visual state of the form fields.

Steps to reproduce

See the following for a video demonstration of the issue on Filament's demo site: app.birdeatsbug.com/vmq0tUZ66zl2wkfJydzNXVUP3kI-pnGC-bxe2Uqua1ES

This appears to be because the form fields are not rehydrated on browser back/forward cache.

Reproduction repository (issue will be closed if this is not valid)

https://github.com/johnbacon/demo

Relevant log output


View more
2 comments
johnbacon

johnbacon

25th Jun 2025 @ 14:07

help wanted

Octane Version

2.6.1

Laravel Version

11.41.3

PHP Version

8.3

What server type are you using?

Roadrunner

Server Version

2024.3.2

Database Driver & Version

No response

Description

ok this is in the borderline to be a bug but i write it anyway.

i am deploying using deployer , i suppose will happen for any Zero Downtime Deployments.

/releases/99/
/releases/100/
/releases/101/ 

and then a symbolic link from the latest release to /current , all pretty standard.

the problem come when running artisan octane:start vendor/laravel/octane/src/Commands/StartRoadRunnerCommand.php

will set roadrunner server with '-o', 'server.command='.(new PhpExecutableFinder)->find().','.base_path(config('octane.roadrunner.command', 'vendor/bin/roadrunner-worker')),

where base_path(...) will resolve to /releases/101/ not to /current

so in next deployment e.g. (/releases/102/) , when we run artisan octane:reload it will still use old /releases/101/ source code (i checked and yes if i go back to /releases/101/ and make a change it will be present after artisan octane:reload).

the solution is very simple, in config/octane.php you just need to add:

    'roadrunner'=>[
        'command' => env('OCTANE_ROADRUNNER_WORKER_PATH', base_path('vendor/bin/roadrunner-worker')),
    ]

OCTANE_ROADRUNNER_WORKER_PATH=../../current

would be nice is this added to config/octane.php , and maybe don't use base_path

or even better a option to provide the path in octane:start

Steps To Reproduce

deploy a octane laravel app using deployer , octane:reload will not work as expected

View more
1 comment
inikoo

inikoo

13th Feb 2025 @ 14:32

help wanted

Add in PHP 7.3 as Normalizer::normalize() argument for NFKC_Casefold normalization.

View more
1 comment
nicolas-grekas

nicolas-grekas

7th Feb 2019 @ 10:11

enhancement help wanted

Discussed in https://github.com/spatie/schema-org/discussions/202

Originally posted by indyjonesnl January 10, 2024

$lodgingBusiness = Schema::lodgingBusiness()
  ->openingHours(
    Schema::openingHoursSpecification()
      ->dayOfWeek([Schema::dayOfWeek()::Monday])
      ->opens(new DateTime('09:00:00'))
      ->closes(new DateTime('17:00:00'))
  )
  ->checkinTime(new DateTime('14:00:00'))
  ->checkoutTime(new DateTime('11:00:00'))

This results in the current date + time being included in the output "opens":"2024-01-10T09:00:00+00:00","closes":"2024-01-10T17:00:00+00:00" and ..."checkinTime":"2024-01-10T14:00:00+00:00","checkoutTime":"2024-01-10T11:00:00+00:00"...

While the Schema should contain only the time, formatted as 14:30:00+08:00.

Can someone point me in the right direction?

View more
2 comments 👍 1
Gummibeer

Gummibeer

11th Jan 2024 @ 13:12

help wanted

Octane Version

2.11.0

Laravel Version

12.20.0

PHP Version

8.3.23

What server type are you using?

FrankenPHP

Server Version

1.8.0

Database Driver & Version

No response

Description

I have an octane app running inside a docker container and use a bind mount for the application code. When editing files, fs events are not sent across the bind mount to the container, so the watcher does not detect them. I have the same issue reported in #487. There is also an open issue on the frankenphp repository https://github.com/php/frankenphp/issues/1616.

A potential solution would be to add an option to octane:frankenphp, like --chokidar to use chokidar instead of frankenphp's watcher.

Steps To Reproduce

Same as #487, but using frankenphp.

View more
5 comments 🚀 1
rty765

rty765

14th Jul 2025 @ 19:46

bug unconfirmed help wanted medium priority

Package

filament/tables

Package Version

v4.0.0-beta1

Laravel Version

v12.19.3

Livewire Version

v3.6.3

PHP Version

8.4.5

Problem description

I’m using the spatie/laravel-permission package to manage user roles and permissions.

In my UsersRelationManager, which displays a table of users belonging to a Tenant (one-to-many), I have a ToggleColumn called is_admin. Its purpose is to assign or remove the "admin" role when toggled.

I want to make this column sortable to list admins first. However, when I use orderByRaw() in the sortable callback, sorting doesn’t work as expected (see attached image).

Image

Here is my table configuration:

public function table(Table $table): Table 
{
    return $table
        ->columns([
            TextColumn::make('name'),
            TextColumn::make('email'),
            ToggleColumn::make('is_admin')
                ->updateStateUsing(function (User $record, bool $state): void {
                    if ($state) {
                        $record->assignRole('admin');
                    } else {
                        $record->removeRole('admin');
                    }
                })
                ->sortable(true, function (Builder $query, string $direction): void {
                    $query->orderByRaw(<<<SQL
                        exists(
                            select 1
                            from model_has_roles
                            join roles on roles.id = model_has_roles.role_id
                            where model_has_roles.model_id = users.id
                            and model_has_roles.model_type = ?
                            and roles.name = 'admin'
                        ) {$direction}
                    SQL, [User::class])->orderBy('name', 'asc');
                }),
        ])
        ->recordUrl(null)
        ->recordAction(null)
        ->recordActions([
            DeleteAction::make(),
        ]);
}

Problem:

Sorting does not prioritize users with the "admin" role as expected. Instead, the order remains unchanged when clicking the column header.

Expected behavior

The expected behavior is that the ToggleColumn sorting works correctly. When sorting in ascending order, all rows with the toggle enabled (checked) should appear first, followed by the unchecked rows.

Please see the attached image for reference.

Image

Steps to reproduce

  1. Create a Tenant resource.
  2. Create a UsersRelationManager for the User model.
  3. Configure the table as shown in the provided code snippet.

Note: When refreshing the page, the sorting initially renders correctly.

Reproduction repository (issue will be closed if this is not valid)

https://github.com/filamentphp/demo

Relevant log output


View more
2 comments
CoringaWc

CoringaWc

3rd Jul 2025 @ 20:24

help wanted

I would be good to support normalizer_get_raw_decomposition function that appeared in PHP 7.3. I've tried to implement it but seems that existing decomposition data is already optimized to get the final decomposition. Example test case is available here. Pinging @nicolas-grekas as he is the author of Normalizer polyfill.

View more
4 comments
IonBazan

IonBazan

12th May 2018 @ 23:26

help wanted

Laravel Version

12.0

PHP Version

8.2

Database Driver & Version

MySQL 9.2

Description

Problem Description:

I am running Laravel’s schedule:run every minute inside a Docker container. I have defined 5 scheduled commands inside console route.

  • Each command executes correctly.

  • However, I noticed that the scheduler only runs every next minute — effectively skipping an entire minute of execution.

  • laravel.log show the behavior:

    • At minute 12:01 → all commands execute.
    • At minute 12:02 → nothing runs.
    • At minute 12:03 → commands execute again.

So the scheduler runs every other minute, instead of every minute.

Expected Behavior:

  • Laravel scheduled commands should run every single minute as defined.

Actual Behavior:

  • Scheduled commands only run once every two minutes, skipping the intermediate minutes.

Attachments:

cron.log laravel.log

Here are the 2 log files attached. You can find the Laravel logs here to see how they are skipping the next-minute execution.


Steps To Reproduce

Repository for Reproduction: https://github.com/harshp-fabninjas/Laravel-docker/tree/master

Environment:

  • Laravel version: 12.0
  • PHP version: 8.2
  • Docker version: 28.3.0

Steps:

  1. Clone and set up the Laravel project using the provided Docker setup.
  2. Confirm that scheduled commands log their execution into the laravel.log file.

Notes:

  • Cron is configured in the Dockerfile with:

    * * * * * cd /var/www && busybox sh -c '/usr/local/bin/php artisan schedule:run >> /var/www/storage/logs/cron.log 2>&1'
    
  • Supervisor manages the processes.

  • Errors appear in the laravel.log file.


Root Cause Analysis:

The issue seems related to how Laravel handles sub-minute scheduling:

When a sub-minute task (e.g., everyTenSeconds()) is present, schedule:run does not exit immediately.

Instead, it stays alive until the end of the current minute, waking up each second to check whether tasks should run.

If cron starts php artisan schedule:run at 12:00:01 instead of 12:00:00, Laravel enters its loop late, potentially missing some scheduled executions.

At 12:01:00, when cron attempts to start another schedule:run, Laravel sees that the previous process is still alive and exits immediately.

Result: it looks like every other minute is skipped.

I'm not sure but this might be the case. Let me know the proper solution for this kind of situation causing issues over the production.

View more
8 comments
harshp-fabninjas

harshp-fabninjas

16th Sep 2025 @ 08:13

help wanted

NotOrm Package

The goal is to make abstract code based on the package notorm to build a new orm system

View more
ambroisehdn

ambroisehdn

15th Jun 2022 @ 12:34

help wanted question

AST, or "abstract syntax tree", creates the expectation of a nested tree structure. In the case of a query string, the AST will only ever be one level deep; as multi nodes are combined into one.

If anyone wants to suggest a better, more clear name: you're welcome.

View more
3 comments
brendt

brendt

20th Dec 2018 @ 13:41

bug unconfirmed help wanted medium priority

Package

filament/tables

Package Version

3.3.14

Laravel Version

11.44.7

Livewire Version

3.6.3

PHP Version

8.3.19

Problem description

When I use the search field to filter data, horizontal scrolling no longer works on mobile devices. I encountered the same problem in the demo (https://demo.filamentphp.com/shop/products). Trying to filter the data, it becomes impossible to scroll horizontally.

Expected behavior

horizontal scrolling also with filtered data on mobile

Steps to reproduce

Trying to filter the data

Reproduction repository (issue will be closed if this is not valid)

https://github.com/filamentphp/demo

Relevant log output


View more
2 comments
phphelloworld

phphelloworld

10th May 2025 @ 10:39

bug unconfirmed low priority help wanted

Package

filament/forms

Package Version

v4.0.0

Laravel Version

v12

Livewire Version

No response

PHP Version

php 8.3

Problem description

the form is in a modal On reorder, the item can be drop into the markdown editor.

Expected behavior

just drop the item into another place

Steps to reproduce

Just clone the repo and migrate + seed. Go to the admin ([email protected]/password) and try to reorder (drop it on the markdown)

Reproduction repository (issue will be closed if this is not valid)

https://github.com/webplusmultimedia/filament-v4-repeater-bug

Relevant log output


View more
webplusmultimedia

webplusmultimedia

24th Jul 2025 @ 16:17

help wanted

Hi 👋🏼!

I am coming here to gather some feedback on my idea before starting working on it.

Background

I wanted to create a POC of https://github.com/symfony/skeleton made for Sylius. I created a simple recipe for sylius/core-bundle, then an example skeleton repo and I have found out my recipes does not work as another recipe already write files with the same name. Then, I noticed symfony/framework-bundle is always put as the first recipe to be executed, and this is a thing I wish to be able to configure.

Goal

Somehow allow myself to make (in this POC case) sylius/core-bundle as a first recipe to be executed. Of course, I can fork symfony/flex, but it would be perfect to avoid this way.

Idea

The idea is simple, we allow configuring such list for example in this way:

{
    ...
    "extra": {
        "flex": {
            "prioritized-recipes": [
                "sylius/core-bundle",
                "another/sylius-package",
                ...
            ]
        }
    }
    ...
}

In Flex we could implement this +/- this way:

        // symfony/framework-bundle recipe should always be applied first after the metapackages
        // however, we allow to override it with a list of prioritized recipes
        $recipes = $this->getPrioritizedRecipes();
        $recipes = array_merge($recipes, [
            'symfony/framework-bundle' => null,
        ]);
        $packRecipes = [];
        $metaRecipes = [];

instead current

        // symfony/framework-bundle recipe should always be applied first after the metapackages
        $recipes = [
            'symfony/framework-bundle' => null,
        ];
        $packRecipes = [];
        $metaRecipes = [];

Why?

  • In some projects, we may want to load our recipes before the Symfony's ones
  • In frameworks based on Symfony (like Sylius) we need to set up the whole project in our own way, so framework-bundle as a first recipe to be executed makes it unable for us

Other options

I have not checked it yet, but I believe we can achieve the similar feature using Composer's Event Dispatcher. But first, I would like to hear if such a feature is welcomed. Or maybe you have a better idea how to solve this. I am open to provide such feature right after we agree on some solution.

View more
6 comments ❤️ 1
jakubtobiasz

jakubtobiasz

7th Nov 2022 @ 19:24

bug help wanted

When attempting to filter tests by test or file name pressing the "Enter" key has no effect.

Pressing "Enter" at the default screen correctly triggers a "test run" where all tests are run.

View more
4 comments
ntwb

ntwb

25th Feb 2018 @ 10:49

help wanted

If a pack lists things in its "replace" section, unpacking this pack should copy these rules into the "replace" section of the root composer.json.

I think that implementing this requires patching the Unpacker class only.

Anyone up to give it a try?

View more
2 comments
nicolas-grekas

nicolas-grekas

8th Jul 2020 @ 18:35

bug unconfirmed low priority help wanted

Package

filament/filament

Package Version

v4.0.10

Laravel Version

v12.28.1

Livewire Version

v3.6.4

PHP Version

8.4.12

Problem description

I have a table and a header action where i have a Select which provides a value i want to save. It seems that the legacy_model_binding = true have something todo with that, but I could be wrong.

Expected behavior

The Action saves an no Exception is thrown

Steps to reproduce

Open the project click on the Action "Bugs" and Submit the Form (empty or something selected).

Reproduction repository (issue will be closed if this is not valid)

https://github.com/SudoGetBeer/fliament-legacy-null-bug

Relevant log output

# ErrorException - Internal Server Error
foreach() argument must be of type array|object, null given

PHP 8.4.12
Laravel 12.28.1
filamentselectbug.test

## Stack Trace

0 - vendor/filament/forms/src/Components/Select.php:606
1 - vendor/filament/forms/src/Components/Select.php:1449
2 - vendor/filament/forms/src/Components/Concerns/CanBeValidated.php:801
3 - vendor/filament/forms/src/Components/Concerns/CanBeValidated.php:907
4 - vendor/filament/schemas/src/Concerns/CanBeValidated.php:85
5 - vendor/filament/schemas/src/Concerns/InteractsWithSchemas.php:389
6 - vendor/livewire/livewire/src/Features/SupportLegacyModels/SupportLegacyModels.php:136
7 - vendor/livewire/livewire/src/Features/SupportLegacyModels/SupportLegacyModels.php:84
8 - vendor/livewire/livewire/src/Features/SupportLegacyModels/SupportLegacyModels.php:89
9 - vendor/livewire/livewire/src/Features/SupportLegacyModels/EloquentCollectionSynth.php:109
10 - vendor/livewire/livewire/src/Features/SupportLegacyModels/EloquentCollectionSynth.php:39
11 - vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:178
12 - vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:166
13 - vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:145
14 - vendor/livewire/livewire/src/Mechanisms/HandleComponents/HandleComponents.php:112
15 - vendor/livewire/livewire/src/LivewireManager.php:102
16 - vendor/livewire/volt/src/LivewireManager.php:35
17 - vendor/livewire/livewire/src/Mechanisms/HandleRequests/HandleRequests.php:94
18 - vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:46
19 - vendor/laravel/framework/src/Illuminate/Routing/Route.php:265
20 - vendor/laravel/framework/src/Illuminate/Routing/Route.php:211
21 - vendor/laravel/framework/src/Illuminate/Routing/Router.php:822
22 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
23 - vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:50
24 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
25 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:87
26 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
27 - vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:48
28 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
29 - vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:120
30 - vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
31 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
32 - vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:36
33 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
34 - vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:74
35 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
36 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
37 - vendor/laravel/framework/src/Illuminate/Routing/Router.php:821
38 - vendor/laravel/framework/src/Illuminate/Routing/Router.php:800
39 - vendor/laravel/framework/src/Illuminate/Routing/Router.php:764
40 - vendor/laravel/framework/src/Illuminate/Routing/Router.php:753
41 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:200
42 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180
43 - vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php:19
44 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
45 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:27
46 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
47 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:47
48 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
49 - vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php:27
50 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
51 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:109
52 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
53 - vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php:48
54 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
55 - vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php:58
56 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
57 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/InvokeDeferredCallbacks.php:22
58 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
59 - vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePathEncoding.php:26
60 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:219
61 - vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:137
62 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:175
63 - vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:144
64 - vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1220
65 - public/index.php:20
66 - /Applications/Herd.app/Contents/Resources/valet/server.php:167

## Request

POST /livewire/update

## Headers

* **priority**: u=4
* **dnt**: 1
* **cookie**: XSRF-TOKEN=eyJpdiI6IllHVmZBUDhya3JzdWZtTTdpb2dGbHc9PSIsInZhbHVlIjoiTFB4d0RqZS8zMkVkMStnMW5tZEE1VTZ3MkFLRzBlalhVdEU4YkxBS3VjcmFRa3hmSDE3cGdVdUd6ZnFYRTZ6RXVjWjNWeXBVYm5LZjZSelFiRm4xeTh6ZHBuY3dJNFdRaG40M1hCL0tWalU3cnRHYStiY2IrOFdmNVpkWUNHb0QiLCJtYWMiOiIzNjM3MTI4ZGY2NDZiZTExNWIwMzRlM2QxMGIzYTk5YTY2YWYzYmFmNzFmYzg4MjM2OTY5OTY4MThlYjQwMjk1IiwidGFnIjoiIn0%3D; laravel_session=eyJpdiI6IkdhYjk0MldvWHZodFF1T1M1aFhGblE9PSIsInZhbHVlIjoiVUQrWkdkdWQ3NEdKa1ZwWnFBeHBaK2JvWXErNUpyNTBTM3NlTTRySURjbHhFcUwxZnFQZ0JObnJrcS94Q3hOc0FvcEZod0NEYzUzTEl2Z1V4cHBKY0JKbHdTZ3MwcS9WMmM0UXVIMHA2ZVZUM01kck5EZHAyWUhhZkhIVmVyZG0iLCJtYWMiOiJhMTIyOWFhNmVhN2E3YmRlYjVhZjkyYWY1MTRhNGRhODgyZDBmYjRiOTkxZmNlZjUwMjdjOWQ2YmNkMTVkNGU3IiwidGFnIjoiIn0%3D
* **connection**: keep-alive
* **sec-gpc**: 1
* **origin**: http://filamentselectbug.test
* **content-length**: 1770
* **x-livewire**: 
* **content-type**: application/json
* **referer**: http://filamentselectbug.test/
* **accept-encoding**: gzip, deflate
* **accept-language**: de,en-US;q=0.7,en;q=0.3
* **accept**: */*
* **user-agent**: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:142.0) Gecko/20100101 Firefox/142.0
* **host**: filamentselectbug.test

## Route Context

controller: Livewire\Mechanisms\HandleRequests\HandleRequests@handleUpdate
route name: livewire.update
middleware: web

## Route Parameters

No route parameter data available.

## Database Queries

* sqlite - select * from "sessions" where "id" = '7voH7J7U1LLugZFnFIHh4PBzo3fx4Lv9aMZx32KV' limit 1 (0.74 ms)
* sqlite - select * from "users" where "users"."id" in (1) (0.04 ms)
* sqlite - select count(*) as aggregate from "users" (0.07 ms)
* sqlite - select * from "users" order by "users"."id" asc limit 10 offset 0 (0.03 ms)
View more
1 comment
SudoGetBeer

SudoGetBeer

12th Sep 2025 @ 07:35

help wanted

Hello,

I noticed that there is an incompatibility with the mbstring polyfill and PHP 8.1 / Alpine Linux, which breaks a lot of my projects as soon as the php81-mbstring is not installed, but php81-iconv is installed:

Example:

Warning: iconv(): Wrong encoding, conversion from "ASCII" to "UTF-8//IGNORE" is not allowed in phar:///var/www/localhost/htdocs/phpstan.phar/vendor/symfony/polyfill-mbstring/Mbstring.php on line 736

It looks like //IGNORE is not accepted since echo iconv('UTF-8', 'UTF-8', 'test'); works, while echo iconv('UTF-8', 'UTF-8//IGNORE', 'test'); doesn't

View more
2 comments 👍 1
danielmarschall

danielmarschall

7th Jan 2022 @ 00:12

good first issue

Dashboard showing Operational

Image

Front end showing no issues, but the status seems to still be linked to the incident even if it's closed as fixed

Image

Image

Image

View more
4 comments 👍 1
glipschitz

glipschitz

25th Jan 2025 @ 11:01

enhancement help wanted

Hi! If I use this package with my project I has a problem. My package.json has a "git dependency" like this:

{
  "peerDependencies": {
    "package": "git+ssh://[email protected]/team/project.git"
  }
}

And npm-install-peers breaks.

View more
👍 5
JWo1F

JWo1F

18th Dec 2017 @ 08:52

documentation good first issue

The docs aren't finished. This issue exists to track the missing pieces:

  • App icons
  • Context menus
  • Dock
  • Printing
  • ProgressBar
  • Queue
  • Screens
  • Settings
  • Shell
  • System
  • Touch ID
  • Testing
  • Obfuscating and securing PHP code
  • Build signing (#361)
    • macOS
    • Windows
  • How to customise Electron / PR to NativePHP
  • Security disclosures process
  • Highlight current section
  • Show ToC persistently on the right-hand side
  • Sponsorship page
  • Contributors page
  • Show sponsors in sidebar
  • Add next/previous section buttons to the bottom of pages
  • Add Edit on GitHub link to pages
View more
10 comments
simonhamp

simonhamp

8th Sep 2024 @ 15:01

documentation help wanted good first issue

Provide updates to new functionalities in the v2 of the package.

View more
kwakuOfosuAgyeman

kwakuOfosuAgyeman

5th Jan 2025 @ 05:45

bug help wanted

What happened?

After installation, I noticed that in the browser console it outputs an error of wireEl is undefined.

How to reproduce the bug

Just install this package in a livewire project, preferable with Filament's admin package. And see the browser console.

composer create-project laravel/laravel test;
composer require filamentphp/filament;
composer require spatie/laravel-blade-comments;

Then go through the browser console and see the error

Package Version

1.0.1

PHP Version

8.2.0

Laravel Version

10.13.0

Which operating systems does with happen with?

macOS

Notes

Filament ......................................................
Packages ...... filament, forms, notifications, support, tables
Version .............................................. v2.17.44
Views ..................................... PUBLISHED: filament

View more
5 comments 👍 2
sawirricardo

sawirricardo

2nd Jun 2023 @ 07:15

confirmed bug in dependency help wanted medium priority

Package

filament/filament

Package Version

v4.0.7

Laravel Version

v12.28.1

Livewire Version

^3.5

PHP Version

PHP 8.4

Problem description

Describe the bug unsavedChangesAlerts() not triggered when reordering a Repeater component. See animated Gif as it shows exactly the issue.

Screenshots ANIMATED GIF

Image

Desktop (please complete the following information): I'm using Desktop

  • OS: Windows 11 (updated)
  • GPU: NVIDIA RTX 3050]
  • Backend: OpenGL
  • Google Chrome (updated to latest version)
  • Laravel stable 12.28.1
  • Filament stable 4.0.7
  • Livewire ^3.5 (default with filament)
  • PHP 8.4

Additional context Need more context, just ask, but you'd probably be able to find it in the linked repository.

Expected behavior

Expected behavior Expecting the warning to pop-up saying that you will lose changes made in the form when leaving the page without saving first.

Steps to reproduce

To Reproduce Steps to reproduce the behavior:

Using existing code (option 1)

https://github.com/christoferd/filament-bug-demo-2025

  1. clone, install, setup .env, migrate, seed
  2. go to Customers resource,
  3. Edit a Customer
  4. then follow steps below from step 3.

DIY (option 2)

  1. add ->unsavedChangesAlerts() to the Panel
  2. go to a Form/Resource Edit that contains a Repeater component
  3. make sure there are at least 2 records in the Repeater component
  4. save the form, refresh the page
  5. change the order of the Repeated records, do not save
  6. click on a navigation link that will take you away from the page (expecting the warning to pop-up)
  7. Notice the issue, that the warning did not popup and the next page loaded, losing the changes made in the edit form.

Reproduction repository (issue will be closed if this is not valid)

https://github.com/christoferd/filament-bug-demo-2025

Relevant log output

**Logs**
I didn't see anything in the Browser Console Log, and there are no Laravel error logs.
If there are logs to produce then let me know.
View more
1 comment
christoferd

christoferd

8th Sep 2025 @ 13:06

help wanted

Octane Version

v2.3.10

Laravel Version

v11.6.0

PHP Version

v8.3.6

What server type are you using?

FrankenPHP

Server Version

v1.1.4 PHP 8.3.6 Caddy v2.7.6

Database Driver & Version

Postgress

Description

Last week we updated our app previously using php-fpm running on Forge to use Laravel Octane with FrankenPHP. Our site is mostly an API that handles analytics events (Like google analytics). It uses the default Laravel api throttling.

In staging our app worked fine (30 req/sec same IP), but when deploying to production (1400 req/sec, different IPs) it started to fail, giving a lot of 429 Too Many Requests.

image

I quickly rolled back to php-fpm and after a few hours tried again with the same problem. Rolled back and the next day I switched to Swoole and it worked perfectly without changing a single line of code nor having to redeploy anything. So I can confidently say that is NOT a bug in my code, but rather a bug with FrankenPHP or the Octane integration with FrankenPHP.

My theory is that the RateLimiter is not reseting between requests so it's shared between different users. So multiple different users trigger the rate limiter:

This is my Rate limiter configuration:

// AppServiceProvider

RateLimiter::for('api', function (Request $request) {
    return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});

our production CACHE_STORE is redis. Throttling worked perfectly fine without octane and with octane but using Swoole. It failed with hundred of 429 Too Many Requests after installing FrankenPHP.

This is our bootstrap/app.php:

<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Support\Facades\App;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
        then: function () {
            Route::middleware('api')
                ->prefix('api')
                ->as('api.')
                ->domain(config('app.domain'))
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->domain(config('app.domain'))
                ->group(base_path('routes/web.php'));

            Route::middleware('web')
                ->domain(config('playsaurus.ads.domain'))
                ->group(base_path('routes/ads.php'));
        }
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->throttleApi();

        $middleware->redirectTo(
            guests: '/login',
            users: '/',
        );

        $middleware->web(append: [
            \App\Http\Middleware\HandleInertiaRequests::class,
            \Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
        ]);

        $middleware->api(append: [
            \App\Http\Middleware\ConfigureLocale::class,
        ]);

        $middleware->alias([
            'localize' => \App\Http\Middleware\ConfigureLocale::class,
            'embed' => \App\Http\Middleware\AllowsEmbeding::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->dontReport([
            \App\Services\Announcements\InvalidVariantKey::class,
            \App\Exceptions\CouponRedeemException::class,
        ]);
    })->create();

Steps To Reproduce

It's difficult to reproduce. Because I can't test it in production because that would mean a lot of downtime for our users.

My theory is that it would be possible to reproduce from multiple different IPs. But since I don't have the means to test it, I don't know.

View more
12 comments 👍 1
jhm-ciberman

jhm-ciberman

14th May 2024 @ 00:15

help wanted

Laravel Version

v12.28.1

PHP Version

8.3.20

Database Driver & Version

PostgreSQL 10.22 up to latest

Description

PostgreSQL fails with this error when comparing an integer ID from the source table with the same ID stored as string value in versionable_id due to strict type comparison:

SQLSTATE[42883]: Undefined function: 7 ERROR:  operator does not exist: character varying = integer
LINE 1: ...s_versions\" where \"cms_versions\".\"versionable_id\" in (6) and...

HINT:  No operator matches the given name and argument types. You might need to add explicit type casts. (Connection: testing, SQL: select * from \"cms_versions\" where \"cms_versions\".\"versionable_id\" in (6) and \"cms_versions\".\"versionable_type\" = Aimeos\\Cms\\Models\\Page and \"cms_versions\".\"tenant_id\" = demo)

MySQL and SQLite don't show that problem because they don't enforce a strict type check when comparing values and are able to compare integer with string values using type conversion.

Steps To Reproduce

1.) create a source table with an integer ID column 2.) create a morph table 3.) create models for the source (Source) and morph table (Version) 4.) Define a morphTo relation (latest) in the Source model 5.) Fill in a record in the source table (id=1) and a corresponding value in the morph table (versionable_id='1', versionable_type='\App\Models\Source') 6.) Use Source::whereHas('latest')->get() to join the morph table

View more
2 comments
aimeos

aimeos

13th Sep 2025 @ 08:02

help wanted

Laravel Version

12.30.1

PHP Version

8.4.2

Database Driver & Version

Redis 8.0.1

Description

I have a use case where I need to subscribe to a Redis event when a key expires, in order to trigger specific logic.

After enabling keyspace notifications in Redis with:

# redis-cli >
CONFIG SET notify-keyspace-events Ex

and subscribing with:

Redis::subscribe(['__keyevent@0__:expired'], function ($message) {
    // handle logic
});

I don’t receive the global event.

This happens because Laravel only listens to channels with the prefix defined in config/database.php under redis.options.prefix. If I replace the default prefix with an empty string, the subscription works correctly.

It looks like currently there is no way to listen to global Redis events without modifying the prefix.

Question

Is it possible to implement a way to subscribe to global events without having to remove/override the Redis prefix? And also without having to set an empty prefix at runtime, since I might want to subscribe to both Redis global events and other prefixed channels at the same time.

This seems related to this issue: https://github.com/laravel/framework/issues/29449

Steps To Reproduce

  1. Enable Redis key expiration notifications:

    CONFIG SET notify-keyspace-events Ex
    
  2. Use Laravel to subscribe to the expiration channel:

    Redis::subscribe(['__keyevent@0__:expired'], function ($message) {
        // handle logic
    });
    
  3. Let a key expire.

  4. Notice that no event is received unless you remove the prefix by setting redis.options.prefix to an empty string in config/database.php.

View more
4 comments
Lukasss93

Lukasss93

24th Sep 2025 @ 14:10

help wanted

Laravel Version

v12.10.2

PHP Version

8.4.12

Database Driver & Version

MySQL 8 (Docker image mysql:8); client on runner/container is Debian 13’s default-mysql-client or mariadb-client (both the same)

Description

After generating a schema dump with php artisan schema:dump --prune, running php artisan migrate fails while loading the dump because Laravel shells out to the mysql CLI (MySqlSchemaState::load). On Debian 13 the MySQL/MariaDB client enables TLS by default, which results in ERROR 2026 (HY000): TLS/SSL error: self-signed certificate in certificate chain. There is no config/flag in Laravel to disable TLS for this CLI call (PDO SSL options don’t apply to the external mysql process). A small, opt-in way to control SSL for the schema load path would solve this for CI/dev environments.

@taylorotwell commented the code path that would allow disabling SSL for the schema load CLI in commit 1bfad3

Steps To Reproduce

  1. Start MySQL 8 (e.g. Docker mysql:8) with env: MYSQL_DATABASE=testing, MYSQL_ROOT_PASSWORD=password.
  2. Run Laravel on Debian 13 (e.g. container based on serversideup/php:8.4-unit) and install a MySQL client (apt-get install default-mysql-client or Oracle mysql-client).
  3. Generate a dump once: php artisan schema:dump --prune (dump exists at database/schema/mysql-schema.sql).
  4. Ensure no PDO SSL env (e.g. no MYSQL_ATTR_SSL_CA) to keep PDO non-TLS; this issue is about the CLI import.
  5. Run php artisan migrate.
  6. Observe failure during “Loading stored database schemas” with:
ERROR 2026 (HY000): TLS/SSL error: self-signed certificate in certificate chain

because the invoked mysql CLI defaults to TLS and there is no way in Laravel to pass --ssl-mode=DISABLED (MySQL) / --ssl=OFF (MariaDB) for the schema load.

View more
2 comments 👍 2
plumthedev

plumthedev

14th Sep 2025 @ 21:03

good first issue filament

On the record update for an active incident, there needs to be a tie to the component to be update the current component status.

Image

View more
glipschitz

glipschitz

19th Jan 2025 @ 03:05

help wanted findapr

Immediately after installing php-flasher/flasher-laravel, the application breaks with the following error:

foreach() argument must be of type array|object, bool given Simply installing the package causes this fatal error.

Steps to Reproduce:

Create a fresh Laravel app.

Run:

composer require php-flasher/flasher-laravel

Load any page in the app — no usage of flasher() or flasher_render() yet.

Laravel crashes with a foreach() error.

View more
8 comments
dlopez525

dlopez525

11th Apr 2025 @ 18:20

help wanted findapr

Description: I am using Flasher 2.0.1 in my Laravel 11 project and would like to know how to properly use the Flasher library in JavaScript. Additionally, I want to ensure that the JavaScript configuration is consistent with the settings defined in the flasher.php configuration file.

Details: Flasher Version: 2.0.1 Laravel Version: 11 Problem: Need guidance on using the Flasher library with JavaScript in a way that mirrors the configuration set in flasher.php.

View more
raseldev99

raseldev99

16th Sep 2024 @ 04:50

help wanted

When calling mb_convert_encoding() with $fromEncoding === 'HTML-ENTITIES', the polyfill does not return functionally equivalent strings to the native function. This is because mb_convert_encoding() uses html_entity_decode() when $fromEncoding === 'HTML-ENTITIES' and that function does not return characters for many numeric entities 0-31 and 127-159. For example:

<?php

require "vendor/symfony/polyfill-mbstring/Mbstring.php";

use Symfony\Polyfill\Mbstring as p;

for($i = 0; $i < 1024; $i++) {
	$string = "&#" . $i . ";";
	$mbstring = mb_convert_encoding($string, 'UTF-8', 'HTML-ENTITIES');
	$polyfill = p\Mbstring::mb_convert_encoding($string, 'UTF-8', 'HTML-ENTITIES');
	if($mbstring != $polyfill) {
		echo "Mismatch: $string - mbstring: $mbstring; polyfill: $polyfill\n";
	}
}

outputs:

Mismatch: &#0; - mbstring: ; polyfill: &#0;
Mismatch: &#1; - mbstring: ; polyfill: &#1;
Mismatch: &#2; - mbstring: ; polyfill: &#2;
Mismatch: &#3; - mbstring: ; polyfill: &#3;
Mismatch: &#4; - mbstring: ; polyfill: &#4;
Mismatch: &#5; - mbstring: ; polyfill: &#5;
Mismatch: &#6; - mbstring: ; polyfill: &#6;
Mismatch: &#7; - mbstring: ; polyfill: &#7;
Mismatch: &#8; - mbstring:; polyfill: &#8;
Mismatch: &#11; - mbstring:
                            ; polyfill: &#11;
Mismatch: &#12; - mbstring:
                            ; polyfill: &#12;
Mismatch: &#14; - mbstring: ; polyfill: &#14;
Mismatch: &#15; - mbstring: ; polyfill: &#15;
Mismatch: &#16; - mbstring: ; polyfill: &#16;
Mismatch: &#17; - mbstring: ; polyfill: &#17;
Mismatch: &#18; - mbstring: ; polyfill: &#18;
Mismatch: &#19; - mbstring: ; polyfill: &#19;
Mismatch: &#20; - mbstring: ; polyfill: &#20;
Mismatch: &#21; - mbstring: ; polyfill: &#21;
Mismatch: &#22; - mbstring: ; polyfill: &#22;
Mismatch: &#23; - mbstring: ; polyfill: &#23;
Mismatch: &#24; - mbstring: ; polyfill: &#24;
Mismatch: &#25; - mbstring: ; polyfill: &#25;
Mismatch: &#26; - mbstring: ; polyfill: &#26;
Mismatch: &#27; - mbstring:  polyfill: &#27;
Mismatch: &#28; - mbstring: ; polyfill: &#28;
Mismatch: &#29; - mbstring: ; polyfill: &#29;
Mismatch: &#30; - mbstring: ; polyfill: &#30;
Mismatch: &#31; - mbstring: ; polyfill: &#31;
Mismatch: &#39; - mbstring: '; polyfill: &#39;
Mismatch: &#127; - mbstring: ; polyfill: &#127;
Mismatch: &#128; - mbstring: €; polyfill: &#128;
Mismatch: &#129; - mbstring: ; polyfill: &#129;
Mismatch: &#130; - mbstring: ‚; polyfill: &#130;
Mismatch: &#131; - mbstring: ƒ; polyfill: &#131;
Mismatch: &#132; - mbstring: „; polyfill: &#132;
Mismatch: &#133; - mbstring: …; polyfill: &#133;
Mismatch: &#134; - mbstring: †; polyfill: &#134;
Mismatch: &#135; - mbstring: ‡; polyfill: &#135;
Mismatch: &#136; - mbstring: ˆ; polyfill: &#136;
Mismatch: &#137; - mbstring: ‰; polyfill: &#137;
Mismatch: &#138; - mbstring: Š; polyfill: &#138;
Mismatch: &#139; - mbstring: ‹; polyfill: &#139;
Mismatch: &#140; - mbstring: Œ; polyfill: &#140;
Mismatch: &#141; - mbstring: ; polyfill: &#141;
Mismatch: &#142; - mbstring: Ž; polyfill: &#142;
Mismatch: &#143; - mbstring: ; polyfill: &#143;
Mismatch: &#144; - mbstring: ; polyfill: &#144;
Mismatch: &#145; - mbstring: ‘; polyfill: &#145;
Mismatch: &#146; - mbstring: ’; polyfill: &#146;
Mismatch: &#147; - mbstring: “; polyfill: &#147;
Mismatch: &#148; - mbstring: ”; polyfill: &#148;
Mismatch: &#149; - mbstring: •; polyfill: &#149;
Mismatch: &#150; - mbstring: –; polyfill: &#150;
Mismatch: &#151; - mbstring: —; polyfill: &#151;
Mismatch: &#152; - mbstring: ˜; polyfill: &#152;
Mismatch: &#153; - mbstring: ™; polyfill: &#153;
Mismatch: &#154; - mbstring: š; polyfill: &#154;
Mismatch: &#155; - mbstring: ›; polyfill: &#155;
Mismatch: &#156; - mbstring: œ; polyfill: &#156;
Mismatch: &#157; - mbstring: ; polyfill: &#157;
Mismatch: &#158; - mbstring: ž; polyfill: &#158;
Mismatch: &#159; - mbstring: Ÿ; polyfill: &#159;

While many of these are control characters (and the native function does return them), the single quote (dec 39) is particularly problematic.

View more
1 comment
cpeel

cpeel

18th Mar 2021 @ 04:11

bug unconfirmed low priority help wanted

Package

filament/filament

Package Version

v4.0.0-beta25

Laravel Version

v12.22.1

Livewire Version

v3.6.4

PHP Version

8.4.10

Problem description

After upgrading to Filament v4, I noticed that the table list displayed with modifyQueryUsing didn't match the data from the actual SQL query. Reverting to v3 fixed the issue, so it seems to be a unique problem with v4.

sql:

select
    *
from
    `owners`
    inner join `patients` on `owners`.`id` = `patients`.`owner_id`
    inner join `breeds` on `patients`.`breed_id` = `breeds`.`id`
    inner join `vaccines` on `patients`.`vaccine_id` = `vaccines`.`id`
where
    `patients`.`registered_at` = '2025-08-11'
    and `owners`.`deleted_at` is null
order by
    `owners`.`id` asc
limit
    10 offset 0

v3:

v4:

However, I found a solution: specifying select fixed the display.

                    ->select([
                            'owners.id',
                            'owners.email',
                            'owners.phone',
                            'owners.owner_name',
                            'patients.patient_name',
                            'patients.type',
                            'patients.registered_at',
                            'breeds.breed_name',
                            'vaccines.vaccine_name',
                    ])

Expected behavior

Displays the same as v3.

Steps to reproduce

  1. Run the seeder in the repository. php artisan migrate:fresh --seed
  2. Log in using the credentials ([email protected]: test).
  3. Navigate to /admin/owners to display the OwnersResource. (You can compare this with v3 by switching to the v3 branch and running composer install to downgrade.)

Reproduction repository (issue will be closed if this is not valid)

https://github.com/bzy107/filament_v4

Relevant log output


View more
4 comments
bzy107

bzy107

12th Aug 2025 @ 11:31

Feature help wanted

Calling for help from Docker experts. We need to create the best possible docker-compose.yml file for this project. The application requirements are well defined (we use env vars, Webpack Encore, PHP 7.1, Symfony 4.1, SQLite database, etc.) so it should be possible to create that file.

View more
30 comments 👍 28
javiereguiluz

javiereguiluz

21st May 2018 @ 09:37

bug unconfirmed low priority help wanted

Package

filament/filament

Package Version

v4.0.18

Laravel Version

v12.30.1

Livewire Version

v3.6.4

PHP Version

PHP 8.3.13

Problem description

There is an intermittent issue with the following error displaying, at least in FireFox. Sometimes it happens sometimes it doesn't. It seems to happen less often in the reproduction repo that I made for this issue report.

I think this might be some kind of race condition. You may have to refresh with the console open a couple times for it to display.

Expected behavior

It just, shouldn't error out. It would work "as expected".

Steps to reproduce

I'm attaching the simplest possible way to replicate this. Also attaching a link to a repo.

Filament Page class

<?php

namespace App\Filament\Pages;

use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Pages\Page;
use Filament\Schemas\Schema;
use Filament\Support\RawJs;

class Test extends Page
{
    protected static string $routePath = '/test';

    protected string $view = 'filament.pages.test';

    public ?array $data = [];

    public function mount(): void
    {
        $this->form->fill([
            'price' => '1234.56',
        ]);
    }

    public function form(Schema $schema): Schema
    {
        return $schema
            ->components([
                TextInput::make('price')
                    ->mask(RawJs::make('$money($input)'))
                    ->live(),
                Textarea::make('description'),
            ])
            ->statePath('data');
    }
}

Filament Page View

<x-filament-panels::page>
    <form wire:submit="create">
        {{ $this->form }}
    </form>

    <x-filament-actions::modals />
</x-filament-panels::page>

Reproduction repository (issue will be closed if this is not valid)

https://github.com/GlitterCakes/filament-bug-report

Relevant log output


View more
3 comments
GlitterCakes

GlitterCakes

21st Sep 2025 @ 03:56

help wanted

Sulu CMS separates its assets into assets/admin and assets/website, this means when installing Encore within a Sulu CMS install you will have to change a bunch of paths: https://docs.sulu.io/en/latest/cookbook/webpack-encore.html

This isn't my main issue, I think this is acceptable for an initial setup. But I do think we can improve what happens when you composer require a symfony bundle that provides stimulus controllers.

In the Sulu + Encore setup, the controllers.json file lives in assets/website/controllers.json. But since this path is hardcoded here:

https://github.com/symfony/flex/blob/441f671b86a1b651e969dbc380bfee05e004780f/src/PackageJsonSynchronizer.php#L166-L170

The controllers.json is not updated automatically and there's no output telling you to manually do this either. So you're left a little lost in what is still missing. Also, figuring out what to manually add in controllers.json is quite tricky since most existing UX bundles don't document this manual setup.

Before I start hacking away at a PR, any suggestions how we can solve this properly? Or do we accept that this is not configurable and those who use custom paths just have to deal with it?

Thank you in advance.

View more
4 comments 👍 1
rskuipers

rskuipers

27th Dec 2022 @ 21:16

Bug help wanted

The friendly-errors-webpack-plugin has a built-in transformer/formatter for when a module is missing. To see the behavior, try (in any JavaScript file):

require('foo'); // foo is not a module that is installed

The error is:

This dependency was not found:

  • foo in ./app/Resources/assets/js/app.js To install it, you can run: npm install --save foo

The problem is the npm install part... which should be yarn add to avoid confusion with our users. There is an issue about this: https://github.com/geowarin/friendly-errors-webpack-plugin/issues/33

View more
2 comments
weaverryan

weaverryan

25th Jun 2017 @ 23:10

good first issue
View more
2 comments
Kocal

Kocal

28th Jan 2025 @ 21:55

good first issue help wanted

Hello,

if you plan an scheduled maintenance with an START and END date it will never appear on the dashboard. Only if you create them with an START date only it will appear. I think this is a bit confusing, because if i plan an schedule an weekly update, i want to declare an timeslot and dont want to enter again the cachet-scheduled-maintenance to enter an date at the end of my maintenance.

Can this function be controlled or changed?

Thanks

View more
5 comments
kash1983

kash1983

27th Jan 2025 @ 09:33

unconfirmed bug in dependency help wanted medium priority

Package

filament/filament

Package Version

v3.3.14

Laravel Version

v12.13.0

Livewire Version

No response

PHP Version

8.2

Problem description

I have Brand Resource with Categories Relation Manager.

In Categories Relation Manager, I have repeater for Menu Items that has File Upload for image.

After submitting the form: It doesn't let me click on the 'x' button to remove the image. Also when changing the image, it doesn't work. Need to upload the image twice.

Expected behavior

On clicking 'x' it should remove the image as it does normally. Uploading image on edit should work as intended.

Steps to reproduce

Use the repo I created. In that first create a brand, then create category with menu items. Now upload image for 1 menu item and save. Now open the same category with menu item and try removing the image. Doesn't work. Now try to change the image of that menu item, there will be an issue. Need to upload the same image twice.

Reproduction repository (issue will be closed if this is not valid)

https://github.com/faizanakbar10/filament-fileupload-repeater-issue

Relevant log output


View more
9 comments
faizanakbar10

faizanakbar10

12th May 2025 @ 12:04

help wanted

Users should be able to connect or disconnect their GitHub account after creating their account. Should be a new box on the settings page. Connecting their GitHub account will fill in their GitHub username.

Explain why we ask to connect their GitHub account (as opposed to let them fill in a text field for their username):

  1. We offer social authentication this way
  2. We use their GitHub account to verify they're real persons (and not bots)
  3. We integrate with GitHub for upcoming features
View more
5 comments
driesvints

driesvints

31st Jul 2021 @ 18:48

good first issue

There's no Expectation to expect a class to use HasRequestPagination rather than HasPagination.

View more
JonPurvis

JonPurvis

28th May 2025 @ 18:02

help wanted

Currently, for plural rules, the MessageFormatter polyfills uses the English rules for all locales (it ignores the locale). To be consistent with what we do in symfony/intl (used by symfony/polyfill-intl-icu to implement NumberFormatter and DateFormatter), we should rather fail explicitly here (using the English rules for a different locale would not give the right result anyway)

View more
2 comments
stof

stof

23rd Oct 2018 @ 15:34

help wanted

Hi,

With the polyfill, var_dump(mb_strlen(chr(254))) return 0. With the php8.0-mbstring extension, var_dump(mb_strlen(chr(254))) return 1;

versions : * v1.26.0

Thanks, Alex

View more
7 comments
alexchuin

alexchuin

18th Oct 2022 @ 12:51