Problem with composer package on production server - Laravel project - php

My problem is BadMethodCallException when trait method calls.
The package is kalnoy/nestedset for Laravel. On my local server all works perfect, but then I create my app on production server, I always have this exception:
Method Illuminate\Database\Query\Builder::descendants does not exist.
What I tried to do without result:
1. composer init
2. composer dump-autoload
3. delete and deployed project few times
4. composer require kalnoy/nestedset
5. Many hours of googling.
What thoughts about it? Has anyone had such a problem and sloved it?
My model:
namespace App;
use Illuminate\Database\Eloquent\Model,
Kalnoy\Nestedset\NodeTrait;
class Category extends Model
{
use NodeTrait;
protected $table = 'categories';
public function getOnMainItems($limit = 6)
{
return Category::where('main', 1)->limit($limit)->get();
}
}
Method what "doesn't exist":
namespace App\Services;
use App\Category;
use Kalnoy\Nestedset\Collection;
class CategoryService
{
/**
* #param string $slug
* #return array $categories
*/
public function getCatalogCategoriesForFilter(string $slug = '')
{
$categories = [];
if ($slug !== '') {
$currentCategory = Category::where([['category_slug', $slug], ['active', 1]])->limit(1)->get();
$categoriesByParent = Category::defaultOrder()->descendantsOf($currentCategory[0]->id);
foreach ($categoriesByParent as $category) {
$categories[] = $category->id;
}
}
return $categories;
}
}
My composer.json file
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": "^7.1.3",
"darryldecode/cart": "~4.0",
"doctrine/dbal": "^2.8",
"fideloper/proxy": "^4.0",
"kalnoy/nestedset": "^4.3",
"laravel/framework": "5.6.*",
"laravel/tinker": "^1.0",
"predis/predis": "^1.1"
},
"require-dev": {
"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"#php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"#php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"#php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
Thanks everyone.
UPDATE:
Error message:
(1/1) BadMethodCallException
Method Illuminate\Database\Query\Builder::descendants does not exist.
in Builder.php line 2816
at Builder->__call('descendants', array(2))
in Builder.php line 1286
at Builder->__call('descendants', array(2))
in CategoryService.php line 38
at CategoryService->getCatalogCategories('postelnoe-bele')
in GoodsController.php line 41

Thanks everyone who helps me.
I sloved this.
The problem was in
Category::where('active', 1)->descendants($categoryId);
The Category::where('active', 1) returns queryBuilder object, which has not descendants method, it availabe on Category (model object).
The right way is
Category::descendants($categoryId);
I was embarrassed cause wrong way works on my local server. If somebody can explain this thing I would very grateful.

Related

include_once(/payment.php): failed to open stream: No such file or directory

i am using laravel to develop an payments application for that i am using this packageas they mentioned i clone the repository and move easebuz-lib directory inside the project folder,i have created on controller called payController and in this one i included as they mentioned( include_once('easebuzz-lib/easebuzz_payment_gateway.php');) i changed according to the project folder it's working fine but it's failing inside the other easebuzz_payment_gateway.php i could not able to figure out why it's failing can you please help me to fix this issue..?
payController.php
<?php
namespace App\Http\Controllers;
use Easebuzz;
use Illuminate\Support\Facades\Request;
include_once('../easebuzz-lib/easebuzz_payment_gateway.php');
class PayController extends Controller
{
public function pay(Request $request){
$key = config('constants.easebuzz')['merchant_key'];
$salt = config('constants.easebuzz')['salt'];
$env = config('constants.easebuzz')['env'];
$easebuzzObj = new Easebuzz($key,$salt,$env);
$postData = [
"txnid" => 'TEST'.rand(0,100),
"amount" => '10.00',
"firstname" => 'sai',
"email" =>'sai',
"phone" => 'sai',
"productinfo" => 'This is for dummy test',
"surl" => "http://127.0.0.1:8000/response.php",
"furl" => "http://127.0.0.1:8000/response.php",
];
$easebuzzObj->initiatePaymentAPI($postData);
var_dump($easebuzzObj);
}
}
easebuzz_payment_gateway.php
public function initiatePaymentAPI($params, $redirect=True){
//initially it was include_once('payment.php') i changed to following way
include_once('/payment.php');
// generate transaction ID and push into $params array
// $txnid = substr(hash('sha256', mt_rand() . microtime()), 0, 20);
// $params['txnid'] = $txnid;
return initiate_payment($params, $redirect, $this->MERCHANT_KEY, $this->SALT, $this->ENV);
}
composer.json
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"php": "^7.3|^8.0",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.0.1",
"laravel/framework": "^8.75",
"laravel/sanctum": "^2.11",
"laravel/tinker": "^2.5"
},
"require-dev": {
"facade/ignition": "^2.5",
"fakerphp/faker": "^1.9.1",
"laravel/sail": "^1.0.1",
"mockery/mockery": "^1.4.4",
"nunomaduro/collision": "^5.10",
"phpunit/phpunit": "^9.5.10"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
},
"classmap": ["easebuzz-lib/"]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"#php artisan package:discover --ansi"
],
"post-update-cmd": [
"#php artisan vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"#php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"#php artisan key:generate --ansi"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
},
"minimum-stability": "dev",
"prefer-stable": true
}
It would be better to not use include_once here, instead add path to this library to classmap in composer.json:
{
"autoload": {
"classmap": ["path/to/easebuzz-lib/"]
}
}
then run:
composer dump-autoload
Also you should not edit files in library, especially restore this thing:
include_once('/payment.php');
to original:
include_once('payment.php');
Go to payment.php and add line for check whether function exists
if(!function_exists('response')) {

Laravel don't triger to ComposerServiceProvider Class

The "view()->share(...)" I placed in the boot method of the ComposerServiceProvider file does not work. But when I put it in AppServiceProvider it works. I also added ComposerServiceProvider to "providers" section in app.php file.
The error:
ErrorException
Undefined variable: test (View: /Users/devtools/Projects/sites/laravel/resources/views/components/backend/sidebar/menu-list.blade.php)
http://localhost/tr/admin/settings
What could be the problem? Thanks for help.
They are my codes:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
// ...
public function boot()
{
// This code works when I put it in AppServiceProvider.php
view()->composer('*', function ($view) {
view()->share('test', 'deneme');
});
}
}
config/app.php:
// ...
'providers' => [
/*
* Application Service Providers...
*/
App\Providers\ComposerServiceProvider::class,
],
routers/web.php:
Route::prefix(LaravelLocalization::setLocale() . "/admin")
->name('admin.')
->middleware(['localeSessionRedirect', 'localizationRedirect', 'localize', 'auth', 'verified'])
->group(function ()
{
Route::get('/', function () {
return view('backend.home');
})->name('home');
});
composer.json
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"require": {
"php": "^7.2.5|^8.0",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^6.3.1|^7.0.1",
"laravel/framework": "^7.29",
"laravel/tinker": "^2.5",
"laravel/ui": "^2.4",
"mcamara/laravel-localization": "^1.6"
},
"require-dev": {
"almasaeed2010/adminlte": "~3.0",
"facade/ignition": "^2.0",
"fakerphp/faker": "^1.9.1",
"mockery/mockery": "^1.3.1",
"nunomaduro/collision": "^4.3",
"phpunit/phpunit": "^8.5.8|^9.3.3"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"#php artisan package:discover --ansi"
],
"post-root-package-install": [
"#php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"#php artisan key:generate --ansi"
]
}
}
As you can see these are the file name and paths
SOLUTION:
The problem was that I deleted the "data" folder in
"storage/framework/cache/". When I ran the "php artisan cache:clear"
command, it gave an error. I added the folder and it's okay.
try this :
View::composer('*', function($view)
{
$view->share('test', 'deneme');
});
and do not forget to add this too:
use View;

Lumen using Graph API with socialite

I am trying to get my app to redirect to the Facebook login page so I can access thee Graph API endpoints.
In bootstrap/app.php have
$app->register(App\Providers\AuthServiceProvider::class);
// $app->register(App\Providers\EventServiceProvider::class);
class_alias(Laravel\Socialite\Facades\Socialite::class, 'Socialite');
$app->register(Laravel\Socialite\SocialiteServiceProvider::class);
My controller is:
<?php
namespace App\Http\Controllers\Facebook;
use App\Http\Controllers\Controller;
use Laravel\Socialite\Facades\Socialite;
class FacebookController extends Controller
{
public function redirectToProvider(Request $request)
{
return Socialite::with('facebook')->redirect();
}
public function handleProviderCallback(Request $request)
{
//here you hadle input user data
$user = Socialite::with('facebook')->user();
}
}
My routes:
Route::get('facebook','App\Http\Controllers\AuthController#redirectToProvider');
Route::get('callback','App\Http\Controllers\AuthController#handleProviderCallback');
My composer.json
{
"name": "laravel/lumen",
"description": "The Laravel Lumen Framework.",
"keywords": ["framework", "laravel", "lumen"],
"license": "MIT",
"type": "project",
"require": {
"php": "^7.2.5",
"facebook/graph-sdk": "^5.6",
"laravel/lumen-framework": "^7.0",
"laravel/socialite": "^4.2",
"laravel/ui": "^2.0"
},
"require-dev": {
"fzaninotto/faker": "^1.9.1",
"mockery/mockery": "^1.3.1",
"phpunit/phpunit": "^8.5"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"classmap": [
"tests/"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"post-root-package-install": [
"#php -r \"file_exists('.env') || copy('.env.example', '.env');\""
]
}
}
All posts I have seen use the config/servcies.php or config/app.php files however I cannot and these files in lumen
Unsure if this is helpful but get these errors when go to the http://local/admin/facebook/login page
at /Applications/MAMP/htdocs/facebook/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php:230
at Laravel\Lumen\Application->handleDispatcherResponse(array(0))
(/Applications/MAMP/htdocs/facebook/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php:170)
at Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(object(Request))
(/Applications/MAMP/htdocs/facebook/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php:426)
at Laravel\Lumen\Application->sendThroughPipeline(array(), object(Closure))
(/Applications/MAMP/htdocs/facebook/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php:172)
at Laravel\Lumen\Application->dispatch(null)
(/Applications/MAMP/htdocs/facebook/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php:109)
at Laravel\Lumen\Application->run()
(/Applications/MAMP/htdocs/facebook/public/index.php:28)

Laravel Error Call to undefined method Pelago\Emogrifier::disableInvisibleNodeRemoval()

I was cloning our laravel web-api project in gitlab. Then I want to migrate and serve in order to test the api's in postman. But when I do a migrate or serve, there is an error
In CssInlinerPlugin.php line 18:
Call to undefined method Pelago\Emogrifier::disableInvisibleNodeRemoval()
Can someone help me with this? I dont know how to solve this because even google doesnt have an answer. Thanks in advance.
CssInlinerPlugin.php
<?php
namespace Snowfire\Beautymail;
class CssInlinerPlugin implements \Swift_Events_SendListener
{
/**
* #var \Pelago\Emogrifier
*/
protected $inliner;
/**
* Initialize the CSS inliner.
*/
public function __construct()
{
$this->inliner = new \Pelago\Emogrifier();
$this->inliner->disableInvisibleNodeRemoval();
}
/**
* Inline the CSS before an email is sent.
*
* #param \Swift_Events_SendEvent $evt
*/
public function beforeSendPerformed(\Swift_Events_SendEvent $evt)
{
$message = $evt->getMessage();
$properTypes = [
'text/html',
'multipart/alternative',
'multipart/mixed',
];
if ($message->getBody() && in_array($message->getContentType(), $properTypes)) {
$this->inliner->setHtml($message->getBody());
$message->setBody($this->inliner->emogrify());
}
foreach ($message->getChildren() as $part) {
if (strpos($part->getContentType(), 'text/html') === 0) {
$this->inliner->setHtml($part->getBody());
$message->setBody($this->inliner->emogrify());
}
}
}
/**
* Do nothing.
*
* #param \Swift_Events_SendEvent $evt
*/
public function sendPerformed(\Swift_Events_SendEvent $evt)
{
// Do Nothing
}
}
Composer.json
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.0.0",
"fideloper/proxy": "~3.3",
"guzzlehttp/guzzle": "^6.3",
"laravel/framework": "5.5.*",
"laravel/passport": "^4.0",
"laravel/tinker": "~1.0",
"laravelcollective/html": "^5.5",
"maatwebsite/excel": "~2.1.0",
"nexmo/laravel": "^1.0",
"pusher/pusher-http-laravel": "^4.0",
"pusher/pusher-php-server": "^3.0",
"pusher/pusher-push-notifications": "1.0",
"snowfire/beautymail": "dev-master"
},
"require-dev": {
"filp/whoops": "~2.0",
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~6.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"#php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"#php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"#php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
}
}
When i do composer install
$ composer install
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Nothing to install or update
Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet instead.
Package phpunit/phpunit-mock-objects is abandoned, you should avoid using it. No replacement was suggested.
Generating optimized autoload files
Carbon 1 is deprecated, see how to migrate to Carbon 2.
https://carbon.nesbot.com/docs/#api-carbon-2
You can run ".\vendor\bin\upgrade-carbon" to get help in updating carbon and other frameworks and libraries that depend on it.
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> #php artisan package:discover
In CssInlinerPlugin.php line 18:
Call to undefined method Pelago\Emogrifier::disableInvisibleNodeRemoval()
Script #php artisan package:discover handling the post-autoload-dump event returned with error code 1
It looks like that package has an open issue for this: https://github.com/Snowfire/Beautymail/issues/111
They list a couple solutions here. Maybe try to change the version to 2.2.0?

class not found with composer autoloader

I have this in my composer.json
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=7.0.0",
"alchemy/zippy": "^0.4.8",
"barryvdh/laravel-debugbar": "^3.1",
"fideloper/proxy": "~3.3",
"graham-campbell/exceptions": "^10.0",
"intervention/image": "^2.4",
"intervention/imagecache": "^2.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"laravelcollective/html": "^5.5",
"symfony/dom-crawler": "^3.3"
},
"files": [
"vendor/redbutton/text-image-alpha/vendor/autoload.php"
],
"require-dev": {
"filp/whoops": "^2.1",
"fzaninotto/faker": "~1.4",
"mockery/mockery": "0.9.*",
"phpunit/phpunit": "~6.0"
},
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [
]
}
},
"scripts": {
"post-root-package-install": [
"#php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"#php artisan key:generate"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"#php artisan package:discover"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true
}
}
The php files for my package are in a laravel installation:
/vendor/redbutton/text-image-alpha/src/
When I try to call a file I get the message:
Class 'Class 'RedButton\TextImageAlpha\TextImageAlpha' not found' not found
I use this to try and call the class:
$image = new \RedButton\TextImageAlpha\TextImageAlpha( 'some string' );
The file in /vendor/redbutton/text-image-alpha/src/TextImageAlpha.php looks like this:
<?php
namespace RedButton\TextImageAlpha;
use RedButton\TextImageAlpha\Exceptions;
use RedButton\Tools\Objects;
/**
* TextImageAlpha class convert a text to image.
*
* #author Tomas Rathouz <trathouz at gmail.com>
*/
class TextImageAlpha
{
// lots of code
}
This is my first composer package and I don't really have an idea of what is going wrong here. Could someone please explain to me what I'm doing wrong?
Good news. I've looked at your package at Bitbucket and you're doing it right in its composer.json:
Drop unnecessary code from composer.json
I've noticed in pasted composer.json there is manual adding of some vendor file.
"files": [
"vendor/redbutton/text-image-alpha/vendor/autoload.php"
],
/vendor nested in /vendor doesn't make sense as it might duplicate autoloading and break it.
Also I don't see redbutton/text-image-alpha in require section, where it should be.
How to add package the right way?
To install your package just call composer:
composer require redbutton/text-image-alpha
And that's it.
It should appear in require section in composer.json. Composer will autoload it by rules in composer.json of the package - here.
Test
I've tried following code and class is found correctly:
<?php
require __DIR__ . '/vendor/autoload.php';
$image = new \RedButton\TextImageAlpha\TextImageAlpha('some string');
var_dump($image);
Having composer.json:
{
"require": {
"redbutton/text-image-alpha": "^1.0"
}
}

Categories