I'm trying to create a MVC structure and use composer to autoload everything.
But I keep getting this error:
Fatal error: Uncaught Error: Class 'App\Init' not found in C:\wamp64\www\activity\Public\index.php on line 5
|MainFolder
|App
|Public
|Vendor
|ACT
|composer
|autoload.php
|composer.json
composer.json:
{
"name": "vendor/activity",
"description": "descrip",
"require": {
"php": ">=5.6.25"
},
"authors":[
{
"name": "John Doe",
"email": "johndoe#gmail.com"
}
],
"autoload":{
"psr-4": {
"ACT\\": "vendor/",
"App\\": "/"
}
},
"config":{
"bin-dir": "bin"
}
}
App\init.php
<?php
namespace App;
class Init
{
public function __construct()
{
echo "Loaded!!";
}
}
Public\index.php
<?php
require_once '../vendor/autoload.php';
$init = new \App\Init;
\Vendor\composer\autoload_namespaces.php
<?php
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
"ACT" => array($vendorDir . false),
"App" => array($baseDir . '/'),
);
Obs: Already did composer dump-autoload
Don't manually put things in /vendor.
While adhering to #1, don't reference /vendor in autoload, the packages should all have their own fully-functionaly autoloaders that composer will find and use.
You need to specify more of the path in your autoload.
"autoload":{
"psr-4": {
"App\\": "App/"
}
},
Think of it like telling composer "look for things starting with the namespace foo\bar\ in the following folder".
Note: The folder name doesn't have to match the namespace.
Eg: Following the suggested Vendor\Package\ scheme for PSR/Composer
{
"autoload": {
"psr-4": {
"sammitch\\meatstacker\\": "src/"
}
}
}
And then:
\sammitch\meatstacker\Client maps to src/Client.php
\sammitch\meatstacker\Bread\Rye maps to src/Bread/Rye.php
and so on
Related
I have composer.json file:
{
"name": "marko/art-empire",
"description": "Social network",
"type": "project",
"authors": [
{
"name": "Marko Ilic",
"email": "markowebdeveloper#gmail.com"
}
],
"require": {},
"autoload": {
"psr-4": {
"Songs\\": "songs/"
}
}
}
autoload_psr4.php file:
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Songs\\' => array($baseDir . '/songs'),
);
RandomSong.php file in songs folder (which is in root directory):
namespace Song;
class RandomSong
{
public function songName()
{
return 'Random Song';
}
}
test.php file:
require 'vendor/autoload.php';
use Songs\RandomSong;
$randomSong = new RandomSong();
echo $randomSong->songName();
As you can see I am trying to autoload RandomSong class, but I keep getting:
Fatal error: Uncaught Error: Class 'Songs\RandomSong' not found in test.php
Please help, thanks.
Your namespace is called Song, but you refer to it as Songs
Your RandomSong uses Song namespace, while your loader is for Songs namespace.
I have a project to test and play around, with the following structure:
app/
controllers/
HomeController.php
handlers/
models/
vendor/
composer/
psr/
pusher/
pusher-php-server/
src/
Pusher.php
PusherException.php
PusherInstance.php
tests/
composer.json
autoload.php
index.php
I tried to require the Pusher autoloader in my index file:
require 'vendor/autoload.php';
Which is the following:
// autoload.php #generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInite16b90ab01042d2a69b1d54243c9e23a::getLoader();
Now, in my HomeController.php, I have the following code:
namespace App\controllers;
use \App\handlers\Views as View;
use \App\models\Home_model as Home;
use \App\controllers\SessionController;
use \Pusher\Pusher as Pusher;
class HomeController {
private $pusher;
public function __construct() {
$options = array(
'cluster' => 'hmm',
'encrypted' => true
);
$this->pusher = new Pusher(
'secret',
'secret',
'secret',
$options
);
}
public function index() {
$data['message'] = 'hello world';
$this->pusher->trigger('my-channel', 'my-event', $data);
return $this->view->render('views/home/index.php');
}
}
But this returns me an error:
Fatal error: Class 'Pusher\Pusher' not found in
And I'm not sure what I'm doing wrong. Could someone explain me what I'm doing wrong?
In composer.json I get the following:
{
"name": "pusher/pusher-php-server",
"description" : "Library for interacting with the Pusher REST API",
"keywords": ["php-pusher-server", "pusher", "rest", "realtime", "real-time", "real time", "messaging", "push", "trigger", "publish", "events"],
"license": "MIT",
"require": {
"php": "^5.4 || ^7.0",
"ext-curl": "*",
"psr/log": "^1.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8 || ^5.7"
},
"autoload": {
"psr-4": {
"Pusher\\": "src/"
}
},
"autoload-dev": {
"psr-4": { "": "tests/" }
},
"config": {
"preferred-install": "dist"
},
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
On Github, they mention that the library depends on cURL and JSON modules.
Not realy sure if this has something to do with my issue?
I'm still stuck, so any help is greatly appreciated.
Also, I'm using a .htaccess file, to rewrite my urls.
I have managed your code to work with right composer.json next to index.php:
{
"name": "awesome/project",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "Author",
"email": "author#gmail.com"
}
],
"autoload": {
"psr-4": {
"": ""
}
},
"require": {
"pusher/pusher-php-server": "dev-master"
}
}
Then just run composer install.
My index.php contents:
<?php
require 'vendor/autoload.php';
use app\controllers\HomeController;
$ctrl = new HomeController();
I have setup a folder structure like this for a package of legacy classes
vendorname/legacy/src/ClassA.php
namespace Vendorname\Legacy;
class ClassA{}
vendorname/legacy/src/Folder/Class2.php
namespace Vendorname\Legacy\Folder;
class FolderClass2{}
With composer I'm loading this from a github repo like this:
"repositories": [
{
"type": "vcs",
"url": "git#bitbucket.org:username/vendorname-legacy-classes.git"
}
],
"require": {
"vendorname/legacy": "master#dev"
}
When I load ClassA like this it works:
use Vendorname\Legacy\ClassA;
$a = new ClassA();
However none of my subfolder'd classes work:
use Vendorname\Legacy\Folder\FolderClassB;
$b = new FolderClassB();
Class 'Vendorname\\Legacy\\Folder\\FolderClassB' not found
I have already defined the source folder with a file vendor\vendorname\composer.json
{
"name": "vendorname/legacy",
"description": "Vendorname Legacy classes",
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-4": {
"Vendorname\\Legacy\\": "src"
}
},
"extra": {
"branch-alias": {
"master": "master"
}
}
}
you need to define one thing more to your composer.json
{
"autoload": {
"psr-4": {"Vendorname\\Legacy\\": "vendorname/legacy/src/"}
}
}
my composer.json content is:
{
"require": {
"rlanvin/php-rrule": "1.*"
}
}
my own autolader is:
function __autoload($class_name) {
include __DIR__.'/classes/'.$class_name . '.php';
}
Problem is: when I want to add tha composer autoloader with
require_once 'vendor/autoload.php';
My own autoloader does not work any more. (Class not found !)
How to make noth work (the composer autolader and mine) ?
regards
I tried:
<?php
require 'vendor/autoload.php';
User::get(1);
User.php is in /classes
composer.json
{
"require": {
"rlanvin/php-rrule": "1.*"
},
"autoload": {
"psr-0": {
"": "classes"
}
}
}
and 'got Class User not found'
It works find with my autloader:
function autoload($class_name) {
include __DIR.'/classes/'.$class_name . '.php';
}
You don't need your autoloader. Composer has plenty of options: PSR-0, PSR-4, classmap and files. Try classmap.
{
"require": {
"rlanvin/php-rrule": "1.*"
},
"autoload": {
"classmap": [
"classes"
]
}
}
UPDATED: Or even better use psr-0 in the following way
{
"require": {
"rlanvin/php-rrule": "1.*"
},
"autoload": {
"psr-0": {
"": "classes"
}
}
}
The file autoload_psr4.php not contains the namespace from "autoload-dev" section only from "autoload" section.
When my composer.json reads
"autoload": {
"psr-4": {
"Namespace\\": "src/"
}
},
"autoload-dev": {
"prs-4": {
"Namespace\\Tests\\": "tests/"
}
}
And I run
composer require vendor/namespace 1.0-dev
My /vendor/composer/autoload_prs4.php file appears as
// autoload_psr4.php #generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Namespace\\' => array($baseDir . '/src'),
);
Thanks!
My guess is that you're showing the composer.json of vendor/namespace package. If that's the case:
Take a look at the docs. It says: "autoload-dev (root only)". root only means it only applies to the root package. As you included the package, the shown composer.json file is not the root package and the autoload-dev section is thus ignored.
Since this is the first Search Engine result when searching for "autoload-dev not working": In composer.json, if "autoload-dev" was added after defining and using "autoload", run $ composer dump-autoload.
In name error, psr, prs, fffff
"autoload": {
"psr-4": {
"Namespace\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"Namespace\\Tests\\": "tests/"
}
}