Skip to content
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

Sorting in lens: Call undefined method getMedia() #65

Closed
krns opened this issue Mar 28, 2019 · 3 comments
Closed

Sorting in lens: Call undefined method getMedia() #65

krns opened this issue Mar 28, 2019 · 3 comments

Comments

@krns
Copy link

krns commented Mar 28, 2019

Thanks for your work, we really like this package. Today we detected the following behaviour.

Our model Tool uses the HasMediaTrait and implements HasMedia.

The fields of the resource Tool look like this:

Images::make(__('models/tool.attributes.image'), 'tool_images')
                ->thumbnail('thumb'),

Text::make(__('models/tool.attributes.name'), 'name')
                ->sortable()
                ->rules('required', 'max:255'),

Everything works fine on the index view, also sorting by name column works.
The Tool resource has a lens which has the same fields and same configuration.
Requesting the lens also works, but sorting by name column in the lens results in the following error:

exception: "Symfony\Component\Debug\Exception\FatalThrowableError"
file: "/app/vendor/ebess/advanced-nova-media-library/src/Fields/Media.php"
line: 209
message: "Call to undefined method stdClass::getMedia()"
trace: [,…]
0: {file: "/app/vendor/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php", line: 60,…}
1: {file: "/app/vendor/laravel/framework/src/Illuminate/Support/Collection.php", line: 418,…}
2: {file: "/app/vendor/laravel/framework/src/Illuminate/Support/HigherOrderCollectionProxy.php", line: 61,…}
3: {file: "/app/vendor/laravel/nova/src/Lenses/Lens.php", line: 163, function: "__call",…}
4: {file: "/app/vendor/laravel/nova/src/Http/Requests/LensRequest.php", line: 47,…}
5: {file: "/app/app/Nova/Lenses/MyLense.php", line: 33, function: "withOrdering",…}
6: {file: "/app/vendor/laravel/nova/src/Http/Controllers/LensController.php", line: 30, function: "query",…}
7: {function: "show", class: "Laravel\Nova\Http\Controllers\LensController", type: "->"}
8: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php", line: 54,…}
9: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php", line: 45,…}
10: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php", line: 219,…}
11: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Route.php", line: 176,…}
12: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php", line: 682, function: "run",…}
13: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 30,…}
14: {file: "/app/vendor/laravel/nova/src/Http/Middleware/Authorize.php", line: 18,…}
15: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
16: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
17: {file: "/app/vendor/laravel/nova/src/Http/Middleware/BootTools.php", line: 20,…}
18: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
19: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
20: {file: "/app/vendor/laravel/nova/src/Http/Middleware/DispatchServingNovaEvent.php", line: 20,…}
21: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
22: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
23: {file: "/app/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php", line: 43,…}
24: {file: "/app/vendor/laravel/nova/src/Http/Middleware/Authenticate.php", line: 31, function: "handle",…}
25: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
26: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
27: {file: "/app/vendor/laravel/framework/src/Illuminate/Auth/Middleware/EnsureEmailIsVerified.php",…}
28: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
29: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
30: {file: "/app/app/Http/Middleware/Localization.php", line: 25, function: "Illuminate\Routing\{closure}",…}
31: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
32: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
33: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php",…}
34: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
35: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
36: {file: "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php",…}
37: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
38: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
39: {file: "/app/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php",…}
40: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
41: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
42: {file: "/app/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php", line: 63,…}
43: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
44: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
45: {,…}
46: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
47: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
48: {file: "/app/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php", line: 66,…}
49: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
50: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
51: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 104,…}
52: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php", line: 684, function: "then",…}
53: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php", line: 659,…}
54: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php", line: 625,…}
55: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Router.php", line: 614,…}
56: {file: "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php", line: 176,…}
57: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 30,…}
58: {file: "/app/vendor/laravel/nova/src/Http/Middleware/ServeNova.php", line: 26,…}
59: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
60: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
61: {file: "/app/vendor/beyondcode/laravel-query-detector/src/QueryDetectorMiddleware.php", line: 33,…}
62: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
63: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
64: {file: "/app/vendor/fideloper/proxy/src/TrustProxies.php", line: 57,…}
65: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
66: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
67: {,…}
68: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
69: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
70: {,…}
71: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
72: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
73: {,…}
74: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
75: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
76: {,…}
77: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 151,…}
78: {file: "/app/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php", line: 53,…}
79: {file: "/app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php", line: 104,…}
80: {file: "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php", line: 151,…}
81: {file: "/app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php", line: 116,…}
82: {file: "/app/public/index.php", line: 55, function: "handle",…}

Do you have some ideas? Thanks in advance!

@krns krns changed the title Sort in lens: Call undefined method getMedia() Sorting in lens: Call undefined method getMedia() Mar 28, 2019
@krns
Copy link
Author

krns commented Mar 28, 2019

Solved the problem.

The resolve method of the Media.php depends on the resource.

/**
 * @param HasMedia $resource
 * @param null $attribute
 */
public function resolve($resource, $attribute = null)
{
    $this->value = $resource->getMedia($attribute ?? $this->attribute)
…

When passing a lens to your resource you have to pass the resource explicitly because of the lens constructor:

/**
 * Create a new lens instance.
 *
 * @param  \Illuminate\Database\Eloquent\Model|null  $resource
 * @return void
 */
public function __construct($resource = null)
{
    $this->resource = $resource ?: new stdClass;
}
public function lenses(Request $request): array
{
    return [
        // Not working
        new MyLens,

        // Working
        new MyLens($this),
    ];
}

@lunwhl
Copy link

lunwhl commented Apr 3, 2019

how to solve this? i get call to undefined method getMedia()

@krns
Copy link
Author

krns commented Apr 3, 2019

Pass the resource to your lens constructor (see #65 (comment))

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

No branches or pull requests

3 participants