Laravel Collective does not work - composer-php

I am trying to learn Laravel using the Laracasts and it's very interesting.
In the step of creating forms, I would like to use Laravel Collective. So I went to the website http://laravelcollective.com/docs/5.1/html and tried what's written, but I get the following error:
FatalErrorException in ProviderRepository.php line 146:
Class 'Collective\Html\HtmlServiceProvider' not found
Here's my code:
app.php
'providers' => [
...
Illuminate\View\ViewServiceProvider::class,
Collective\Html\HtmlServiceProvider::class,
...
],
'aliases' => [
...
'View' => Illuminate\Support\Facades\View::class,
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class
],
composer.json
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.1.*",
"laravelcollective/html": "5.1.*"
},
Any idea what I can do to solve my problem?

Related

I'm getting error Class 'Tymon\JWTAuth\Providers\JWTAuthServiceProvider' not found

I'm installing jwt-auth package.I run this command
composer require tymon/jwt-auth
There is composer.json file
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"require": {
"php": "^7.2",
"fideloper/proxy": "^4.0",
"laravel/framework": "^6.2",
"laravel/tinker": "^2.0",
"tymon/jwt-auth": "^1.0"
},
And there is app.php file
'providers' => [
........
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
],
'aliases' => [
........
'JWTAuth' =>Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
],
When is I run this command.
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
getting error.
In ProviderRepository.php line 208:
Class 'Tymon\JWTAuth\Providers\JWTAuthServiceProvider' not found
You are probably reading old docs or watching some tutorial video for old version.
It should be:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Docs: https://jwt-auth.readthedocs.io/en/develop/laravel-installation/

Zend Service Manager - Service not found exception when trying to use phpdebugbar

I'm trying to use https://github.com/php-middleware/phpdebugbar in a clean Zend Expressive Skeleton application.
I know the instructions on this page suggest using this DI configuration (if using pimple):
$container[Psr\Http\Message\ResponseInterface::class] = new Zend\Diactoros\ResponseFactory();
$container[Psr\Http\Message\StreamFactoryInterface] = new Zend\Diactoros\StreamFactory();
So I tried using this (I'm using zend service manager):
return [
'dependencies' => [
'factories' => [
Psr\Http\Message\ResponseInterface::class => new Zend\Diactoros\ResponseFactory(),
'Psr\Http\Message\StreamFactoryInterface' => new Zend\Diactoros\StreamFactory(),
],
],
];
But I'm running into the following error:
PHP Fatal error: Uncaught Zend\ServiceManager\Exception\ServiceNotFoundException: Unable to resolve service "Psr\Http\Message\ResponseInterface" to a factory; are you certain you provided it during configuration? in /www/develop.expressive.centralsemi.com/htdocs/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:687
I also tried this:
return [
'dependencies' => [
'factories' => [
Psr\Http\Message\ResponseInterface::class => new Zend\Diactoros\ResponseFactory(),
Psr\Http\Message\StreamFactoryInterface::class => new Zend\Diactoros\StreamFactory(),
],
],
];
and this:
return [
'dependencies' => [
'factories' => [
Psr\Http\Message\ResponseInterface::class => Zend\Diactoros\ResponseFactory::class,
Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
],
],
];
But still no luck.
Admittedly, I'm not familiar with Zend/Diactoros, but I don't understand how Zend\Diactoros\ResponseFactory can be a factory, it doesn't have an __invoke() method. So I feel like that is the core of my issue. Am I supposed to create my own factory for this? I feel like that is not the intended way to do this.
Note, I've also tried following these instructions. And while there is no error, it doesn't seem like it's showing up at all:
https://docs.zendframework.com/zend-expressive/v3/cookbook/debug-toolbars/
I'm sure I'm missing some key part, but what is it that I'm missing?
My composer.json:
{
"name": "zendframework/zend-expressive-skeleton",
"description": "Zend expressive skeleton. Begin developing PSR-15 middleware applications in seconds!",
"type": "project",
"homepage": "https://github.com/zendframework/zend-expressive-skeleton",
"license": "BSD-3-Clause",
"keywords": [
"skeleton",
"middleware",
"psr",
"psr-7",
"psr-11",
"psr-15",
"zf",
"zendframework",
"zend-expressive"
],
"config": {
"sort-packages": true
},
"extra": {
"zf": {
"component-whitelist": [
"zendframework/zend-expressive",
"zendframework/zend-expressive-helpers",
"zendframework/zend-expressive-router",
"zendframework/zend-httphandlerrunner",
"zendframework/zend-expressive-fastroute",
"zendframework/zend-expressive-twigrenderer"
]
}
},
"support": {
"issues": "https://github.com/zendframework/zend-expressive-skeleton/issues",
"source": "https://github.com/zendframework/zend-expressive-skeleton",
"rss": "https://github.com/zendframework/zend-expressive-skeleton/releases.atom",
"slack": "https://zendframework-slack.herokuapp.com",
"forum": "https://discourse.zendframework.com/c/questions/expressive"
},
"require": {
"php": "^7.1",
"zendframework/zend-component-installer": "^2.1.1",
"zendframework/zend-config-aggregator": "^1.0",
"zendframework/zend-diactoros": "^1.7.1 || ^2.0",
"zendframework/zend-expressive": "^3.0.1",
"zendframework/zend-expressive-helpers": "^5.0",
"zendframework/zend-stdlib": "^3.1",
"zendframework/zend-servicemanager": "^3.3",
"zendframework/zend-expressive-fastroute": "^3.0",
"zendframework/zend-expressive-twigrenderer": "^2.0"
},
"require-dev": {
"filp/whoops": "^2.1.12",
"php-middleware/php-debug-bar": "^3.0",
"phpunit/phpunit": "^7.0.1",
"roave/security-advisories": "dev-master",
"squizlabs/php_codesniffer": "^2.9.1",
"zendframework/zend-expressive-tooling": "^1.0",
"zfcampus/zf-development-mode": "^3.1"
},
"autoload": {
"psr-4": {
"App\\": "src/App/src/",
"PhpDebugBar\\": "src/PhpDebugBar/src/"
}
},
"autoload-dev": {
"psr-4": {
"AppTest\\": "test/AppTest/"
}
},
"scripts": {
"post-create-project-cmd": [
"#development-enable"
],
"development-disable": "zf-development-mode disable",
"development-enable": "zf-development-mode enable",
"development-status": "zf-development-mode status",
"expressive": "expressive --ansi",
"check": [
"#cs-check",
"#test"
],
"clear-config-cache": "php bin/clear-config-cache.php",
"cs-check": "phpcs",
"cs-fix": "phpcbf",
"serve": "php -S 0.0.0.0:8080 -t public/",
"test": "phpunit --colors=always",
"test-coverage": "phpunit --colors=always --coverage-clover clover.xml"
}
}
I figured it out. The instructions at https://docs.zendframework.com/zend-expressive/v3/cookbook/debug-toolbars/ are correct. The only additional step which is required is adding invokables and aliases entries to the configuration.
Mine were in /config/autoload/zend-expressive-tooling-factories.global.php:
return [
'dependencies' => [
'invokables' => [
Zend\Diactoros\ResponseFactory::class => Zend\Diactoros\ResponseFactory::class,
Zend\Diactoros\StreamFactory::class => Zend\Diactoros\StreamFactory::class,
],
'aliases' => [
Psr\Http\Message\ResponseFactoryInterface::class => Zend\Diactoros\ResponseFactory::class,
Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
]
],
];
I originally just had the aliases section and not the invokables section. Once I added that, everything just worked.
try creating an alias first and then provide it to a factory
return [
'dependencies' => [
'factories' => [
Psr\Http\Message\ResponseInterface::class => Zend\Diactoros\ResponseFactory::class,
'Psr\Http\Message\StreamFactoryInterface' => Zend\Diactoros\StreamFactory::class,
],
'aliases' => [
ClassThatImplementsResponseInterface::class => Psr\Http\Message\ResponseInterface::class,
ClassThatImplementsStreamFactoryInterface::class => 'Psr\Http\Message\StreamFactoryInterface',
]
],
];
UPDATE:
As #d.lanza38 discovered this is the wright configuration
return [
'dependencies' => [
'invokables' => [
Zend\Diactoros\ResponseFactory::class => Zend\Diactoros\ResponseFactory::class,
Zend\Diactoros\StreamFactory::class => Zend\Diactoros\StreamFactory::class,
],
'aliases' => [
Psr\Http\Message\ResponseFactoryInterface::class => Zend\Diactoros\ResponseFactory::class,
Psr\Http\Message\StreamFactoryInterface::class => Zend\Diactoros\StreamFactory::class,
]
],
];
I am writing an other answer as it is easier to read.
OK. I just did a fresh install of Zend Expressive 3 and https://github.com/php-middleware/phpdebugbar:
composer require --dev php-middleware/php-debug-bar
composer dump-autoload
Created /config/autoload/debugbar.local.php
return array_merge(PhpMiddleware\PhpDebugBar\ConfigProvider::getConfig(), [
'phpmiddleware' => [
'phpdebugbar' => [
'javascript_renderer' => [
'base_url' => '/razvan.ionascu/ze-api/public',
],
'collectors' => [
DebugBar\DataCollector\ConfigCollector::class, // Service names of collectors
],
'storage' => null, // Service name of storage
],
],
'dependencies' => [
'factories' => [
\PhpMiddleware\PhpDebugBar\PhpDebugBarMiddleware::class => \PhpMiddleware\PhpDebugBar\PhpDebugBarMiddlewareFactory::class,
\DebugBar\DataCollector\ConfigCollector::class => \PhpMiddleware\PhpDebugBar\ConfigCollectorFactory::class,
\PhpMiddleware\PhpDebugBar\ConfigProvider::class => \PhpMiddleware\PhpDebugBar\ConfigProvider::class,
\DebugBar\DebugBar::class => \PhpMiddleware\PhpDebugBar\StandardDebugBarFactory::class,
JavascriptRenderer::class => NewJavascriptRendererFactory::class,
],
],
]);
For this to work you need to create a new JavascriptRendererFactory. The current one seaches for the wrong config key, ConfigProvider::class instead of 'config' :
class NewJavascriptRendererFactory
{
public function __invoke(ContainerInterface $container): JavascriptRenderer
{
$debugbar = $container->get(DebugBar::class);
$config = $container->get('config');
$rendererOptions = $config['phpmiddleware']['phpdebugbar']['javascript_renderer'];
$renderer = new JavascriptRenderer($debugbar);
$renderer->setOptions($rendererOptions);
return $renderer;
}
}
added the following aliases and factories to /confog/atuoload/dependencies.global.php
'aliases' => [
\Psr\Http\Message\ResponseFactoryInterface::class => ResponseFactory::class,
\Psr\Http\Message\StreamFactoryInterface::class => StreamFactory::class,
],
'factories' => [
...
\DebugBar\JavascriptRenderer::class => JavascriptRendererFactory::class,
...
],
Added a new pipeline to /config/pipeline.php
//only works in development mode
if (!empty($container->get('config')['debug'])) {
$app->pipe(\PhpMiddleware\PhpDebugBar\PhpDebugBarMiddleware::class);
}
As I mentioned in an earlier comment, I have also configured https://docs.zendframework.com/zend-servicemanager/reflection-abstract-factory/ , so I don't need to create a factory for each service()
See the working debug bar here

after I change composer.json file Script #php artisan package:discover handling the post-autoload-dump event returned with error code 1

after I change composer.json file below errors are displayed. how can I fix it?
Script #php artisan package:discover handling the post-autoload-dump event returned with error code 1
"require": {
"php": "^7.1.3",
"consoletvs/charts": "5.*",
"fideloper/proxy": "^4.0",
"genealabs/laravel-caffeine": "^0.7.1",
"laravel/framework": "5.7.*",
"laravel/tinker": "^1.0",
"laravelcollective/html": "5.7.*" //I changed this line
},
Change to this in your composer.json file:
"laravelcollective/html": "^5.7"
Then update composer: composer update
add your new provider to the providers array of config/app.php:
'providers' => [
// ...
Collective\Html\HtmlServiceProvider::class,
// ...
],
add two class aliases to the aliases array of config/app.php:
'aliases' => [
// ...
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
// ...
],

Laravel Weblee\Mandrill\MandrillServiceProvider' class not found

I am trying to "merge" Mandrill in Laravel. I always get the same error on my page. Class 'Weblee\Mandrill\MandrillServiceProvider' not found. The weird thing is that I did name the class in my config.app.
Steps that I did.
Mandrill template and stuff around
Complete .env file with the data it needs.
Included "weblee/mandrill": "dev-master" en my composer.json after laravel/framework
2 folders in vendor, weblee and Mandrill.
added provider and alias
composer update composer dump-autoload/ composer install ==> returning error Script php artisan clear-compiled handling the pre-update-cmd event returned with an error
[RuntimeException] Error Output: PHP Fatal error: Class Weblee\Mandrill\MandrillServiceProvider' not found in /var/www/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php on line 146
This is my config/app.php
'providers' => [
Weblee\Mandrill\MandrillServiceProvider::class,
],
'aliases' => [
*Other aliases*
'MandrillMail' => 'Weblee\Mandrill\MandrillFacade',
],
cmposer.json
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.1.*",
"weblee/mandrill": "dev-master"
},
rest of code
Here is the way to do this
First, install weblee package using composer.json file.
Add this in your composer.json file
"require": {
"php": "^7.1.3",
"laravel/framework": "5.8.*",
"laravel/tinker": "^1.0",
"weblee/mandrill": "dev-master"
},
And after that run composer update
then add your Weblee\Mandrill\MandrillServiceProvider::class, in config\app.php
One more thing
'aliases' => [
*Other aliases*
'MandrillMail' => Weblee\Mandrill\MandrillFacade::class,
],
Don't use single quotes

Changing controller path

Alright so i've been trying to change my controller path (so my project is more structured) but sadly everytime i try to route with the controller like so:
Route::get('/', ['as' => 'home', 'uses' => 'PagesController#index']);
Now that returns me a error page:
ReflectionException
Class PagesController does not exist
So I think let me psr-4 autoload it and/or add it in the classmap so this is what my composer.json looks like:
{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"require": {
"laravel/framework": "4.2.*",
"cartalyst/sentinel": "dev-master",
"guzzlehttp/guzzle": "4.*",
"way/generators": "2.*"
},
"repositories": [
{
"type": "composer",
"url": "http://packages.cartalyst.com"
}
],
"autoload": {
"classmap": [
"app/database/migrations",
"app/database/seeds",
"app/strifemods/Controllers",
"app/strifemods/Models"
],
"psr-4": {
"Strifemods\\": "app/Strifemods"
}
},
"scripts": {
"post-install-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-update-cmd": [
"php artisan clear-compiled",
"php artisan optimize"
],
"post-create-project-cmd": [
"php artisan key:generate"
]
},
"config": {
"preferred-install": "dist"
},
"minimum-stability": "dev",
"prefer-stable": true
}
After that it's still not working so i decide to look over in my dear /vendor/composer/ directory to see if its actually being loaded.
// autoload_classmap.php #generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'CreateSessionTable' => $baseDir . '/app/database/migrations/2014_07_06_213148_create_session_table.php',
'DatabaseSeeder' => $baseDir . '/app/database/seeds/DatabaseSeeder.php',
'IlluminateQueueClosure' => $vendorDir . '/laravel/framework/src/Illuminate/Queue/IlluminateQueueClosure.php',
'MigrationCartalystSentinelAlterThrottle' => $vendorDir . '/cartalyst/sentinel/src/migrations/2013_11_26_025024_migration_cartalyst_sentinel_alter_throttle.php',
'MigrationCartalystSentinelAlterUsers' => $vendorDir . '/cartalyst/sentinel/src/migrations/2013_11_26_023520_migration_cartalyst_sentinel_alter_users.php',
'MigrationCartalystSentinelInstallActivations' => $vendorDir . '/cartalyst/sentinel/src/migrations/2013_11_26_014954_migration_cartalyst_sentinel_install_activations.php',
'MigrationCartalystSentinelInstallGroups' => $vendorDir . '/cartalyst/sentinel/src/migrations/2012_12_06_225929_migration_cartalyst_sentinel_install_groups.php',
'MigrationCartalystSentinelInstallReminders' => $vendorDir . '/cartalyst/sentinel/src/migrations/2013_11_26_022418_migration_cartalyst_sentinel_install_reminders.php',
'MigrationCartalystSentinelInstallThrottle' => $vendorDir . '/cartalyst/sentinel/src/migrations/2012_12_06_225988_migration_cartalyst_sentinel_install_throttle.php',
'MigrationCartalystSentinelInstallUsers' => $vendorDir . '/cartalyst/sentinel/src/migrations/2012_12_06_225921_migration_cartalyst_sentinel_install_users.php',
'MigrationCartalystSentinelInstallUsersGroupsPivot' => $vendorDir . '/cartalyst/sentinel/src/migrations/2012_12_06_225945_migration_cartalyst_sentinel_install_users_groups_pivot.php',
'MigrationCartalystSentinelRenameAlterGroups' => $vendorDir . '/cartalyst/sentinel/src/migrations/2013_11_26_023945_migration_cartalyst_sentinel_rename_alter_groups.php',
'MigrationCartalystSentinelRenameAlterGroupsUsersPivot' => $vendorDir . '/cartalyst/sentinel/src/migrations/2013_11_26_024557_migration_cartalyst_sentinel_rename_alter_groups_users_pivot.php',
'SessionHandlerInterface' => $vendorDir . '/symfony/http-foundation/Symfony/Component/HttpFoundation/Resources/stubs/SessionHandlerInterface.php',
'Strifemods\\Controllers\\BaseController' => $baseDir . '/app/strifemods/Controllers/BaseController.php',
'Strifemods\\Controllers\\PagesController' => $baseDir . '/app/strifemods/Controllers/PagesController.php',
'Whoops\\Module' => $vendorDir . '/filp/whoops/src/deprecated/Zend/Module.php',
'Whoops\\Provider\\Zend\\ExceptionStrategy' => $vendorDir . '/filp/whoops/src/deprecated /Zend/ExceptionStrategy.php',
'Whoops\\Provider\\Zend\\RouteNotFoundStrategy' => $vendorDir . '/filp/whoops/src/deprecated/Zend/RouteNotFoundStrategy.php',
);
And it is being loaded but it cant find the class, can anyone shed some light on this and help me out ;) would appriciate it.
The error is technically correct. Although PagesController exists, it only exists in that somewhere there's a class with that name. Since the class is namespaced however, it should be referred to as Strifemods\Controllers\PagesController except for when in the context of Strifemods\Controllers.
Using your routes as an example, you'd do it like so:
Route::get('/', [
'as' => 'home',
'uses' => 'Strifemods\Controllers\PagesController#index'
]);
Should you have sub-namespaces within your controllers, say API and Admin, you can do something like the following:
Route::group(['namespace' => 'Strifemods\Controllers\API'], function()
{
Route::get('/', [
'as' => 'api.home',
'uses' => 'PagesController#index'
]);
});
Route::group(['namespace' => 'Strifemods\Controllers\Admin'], function()
{
Route::get('/', [
'as' => 'admin.home',
'uses' => 'PagesController#index'
]);
});
That allows you to have Strifemods\Controllers\API\PagesController and Strifemods\Controllers\Admin\PagesController. Hope that helps.
That is how you can make your project more structured:
Every route file (web.php, api.php ...) declared in a map() method, in a file
\app\Providers\RouteServiceProvider.php
when you mapping a route file you can set a ->namespace($this->namespace) for it, you will see it there among examples.
It means that you can create more files to make your project more structured!
And set different namespaces for each of them.
But I prefer set empty string for the namespace ""
it gives you set your controllers to rout in a native php way, see the example:
Route::resource('/users', UserController::class);
Route::get('/agents', [AgentController::class, 'list'])->name('agents.list');
Now you can double click your controller names in your IDE to get there quickly and conveniently.

Resources