Skip to content

[12.x] Add whenJson/whenNotJson methods #55581

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed

Conversation

tomirons
Copy link
Contributor

I find the when/not when methods very readable and needed something similar for JSON strings. Hence a PR to support it!

Before:

$stringable = str();

if ($stringable->isJson()) {
    // do something...
} else {
    // do something else
}

After

str()->whenJson(function () {
    // do something...
}, function () {
    // do something else
})

*/
public function whenJson($callback, $default = null)
{
return $this->when($this->isJson(), $callback, $default);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To allow for the higher order functions that the when method is capable of, I suggest changing this to:

return $this->when($this->isJson(), ...func_get_args());

This allows the func_num_args() call in when to properly pick up $callback or $default being used.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, I'm not quite following what you're trying to say. The method parameters and parameters passed to the when function are the same as whenEmpty and whenNotEmpty.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nevermind. I didn't realize the rest of Stringable is doing the same as you suggested...

Copy link
Contributor

@AndrewMast AndrewMast Apr 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tomirons Considering the rest of the Stringable class, you should discard what I was saying. But to clarify what I meant:

When only one method is provided to the when (the condition, in this case, $this->isJson()), a HigherOrderWhenProxy instance is returned. This allows for method calls such as $conditionableObject->when(true)->prepend('key.')->unless(false)->append('.key'); or something like that. It also allows for $object->when()->methodThatReturnsTrue()->doThis(); (also with properties).

When doing $this->when($this->isJson(), $callback, $default);, it forces 3 arguments no matter what, even if nothing is provided for $default in whenJson. So this would mean that when would never be able to be a higher order method in this case. But also considering the $callback method is required, it's best to keep it as-is.

@rodrigopedra
Copy link
Contributor

rodrigopedra commented Apr 28, 2025

You can already do this:

$stringable->when(fn ($s) => $s->isJson(), function () {
    // do something...
}, function () {
    // do something else
});

Otherwise, why not propose the addition of also:

  • whenAscii() from Stringable@isAscii()
  • whenUrl() from Stringable@isUrl()
  • whenUuid() from Stringable@isUuid()
  • whenUlid() from Stringable@isUlid()
  • whenEmpty() from Stringable@isEmpty()
  • whenNotEmpty() from Stringable@isNotEmpty()
  • whenMatch() from Stringable@isMatch()

I actually have a Str::whenUuid() macro in a project using event sourcing in models with auto-increment IDs, but that are UUID routable.

@AndrewMast
Copy link
Contributor

@rodrigopedra We already have many of those for the Stringable class:

@rodrigopedra
Copy link
Contributor

rodrigopedra commented Apr 28, 2025

@AndrewMast didn't know about those.

Thanks for the heads up.

So probably the macro I got isn't even being called 😅

Might be a left over from before it was added.

@rodrigopedra
Copy link
Contributor

Actually just checked and it is called, as my macro is named whenUuid.

As I added to my last comment must be a left over from before whenIsUuid was added, or even an oversight.

Refactoring already, thanks again @AndrewMast for the heads-up!

@taylorotwell
Copy link
Member

Thanks for your pull request to Laravel!

Unfortunately, I'm going to delay merging this code for now. To preserve our ability to adequately maintain the framework, we need to be very careful regarding the amount of code we include.

If applicable, please consider releasing your code as a package so that the community can still take advantage of your contributions!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants