Skip to content

[ExpressionLanguage] throws an exception on calling uncallable method #24041

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

Merged
merged 1 commit into from
Sep 5, 2017
Merged

[ExpressionLanguage] throws an exception on calling uncallable method #24041

merged 1 commit into from
Sep 5, 2017

Conversation

fmata
Copy link
Contributor

@fmata fmata commented Aug 30, 2017

Q A
Branch? 2.7
Bug fix? yes
New feature? no
BC breaks? no
Deprecations? no
Tests pass? yes
Fixed tickets n/a
License MIT
Doc PR n/a

When we evaluate an expression, if a callable is incorrect (not exists or not accessible) a warning is printed.
This PR handles this case and throws a \RuntimeException when is_callable() returns false :

$el = new ExpressionLanguage();
$el->evaluate('foo.myfunction()', array('foo' => new \stdClass()));

Before:
Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'stdClass' does not have a method 'myfunction' in /home/.../src/Symfony/Component/ExpressionLanguage/Node/GetAttrNode.php on line 84

After:
Fatal error: Uncaught RuntimeException: Unable to call method "myfunction" of object "stdClass". in /home/.../src/Symfony/Component/ExpressionLanguage/Node/GetAttrNode.php:81

@@ -77,8 +77,11 @@ public function evaluate($functions, $values)
if (!is_object($obj)) {
throw new \RuntimeException('Unable to get a property on a non-object.');
}
if (($toCall = array($obj, $this->nodes['attribute']->attributes['value'])) && !is_callable($toCall)) {
Copy link
Member

Choose a reason for hiding this comment

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

if (!is_callable($toCall = array($obj, $this->nodes['attribute']->attributes['value']))) {

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@@ -164,6 +164,15 @@ public function testRegisterAfterEval($registerCallback)
}

/**
* @expectedException \RuntimeException
Copy link
Member

Choose a reason for hiding this comment

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

please add also an @expectedExceptionMessage annotation

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Done. I did not add before to be consistent with the codebase in this component. I use @expectedExceptionMessageRegExp instead :)

@fabpot
Copy link
Member

fabpot commented Sep 5, 2017

Thank you @fmata.

@fabpot fabpot merged commit c8b65ae into symfony:2.7 Sep 5, 2017
fabpot added a commit that referenced this pull request Sep 5, 2017
…able method (fmata)

This PR was merged into the 2.7 branch.

Discussion
----------

[ExpressionLanguage] throws an exception on calling uncallable method

| Q             | A
| ------------- | ---
| Branch?       | 2.7
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | n/a
| License       | MIT
| Doc PR        | n/a

When we evaluate an expression, if a callable is incorrect (not exists or not accessible) a warning is printed.
This PR handles this case and throws a \RuntimeException when `is_callable()` returns `false` :

```php
$el = new ExpressionLanguage();
$el->evaluate('foo.myfunction()', array('foo' => new \stdClass()));
```

**Before:**
`Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'stdClass' does not have a method 'myfunction' in /home/.../src/Symfony/Component/ExpressionLanguage/Node/GetAttrNode.php on line 84`

**After:**
`Fatal error: Uncaught RuntimeException: Unable to call method "myfunction" of object "stdClass". in /home/.../src/Symfony/Component/ExpressionLanguage/Node/GetAttrNode.php:81`

Commits
-------

c8b65ae [ExpressionLanguage] throws an exception on calling uncallable method
@fabpot fabpot mentioned this pull request Sep 11, 2017
This was referenced Oct 5, 2017
@fmata fmata deleted the expressionlanguage_iscallable branch March 9, 2018 19:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants