I am new to php and I was doing some tests to make an MVC project with php, the problem is that when using autoload to import the classes, php does not recognize them, but it suggests it when using it, this is my code.
composition of folders and files
--public
--index.php
--src
--vendor
--composer.json
--composer.lock
--Router.php
composer.json
enter image description here
Router.php
enter image description here
public/index.php
enter image description here
message error
[Wed Dec 28 16:40:52 2022] PHP Fatal error: Uncaught Error: Class "MVC\Router" not found in C:\apache\htdocs\test\public\index.php:5
try to create everything again using composer init and then update by making a change in composer.json but it didn't work.
I also moved the router class to another folder to see if the error had to do with the routes but it gave me the same error, I appreciate your help in advance
Related
I installed composer and laravel and installed some packages
all work fine, but now I created my own class under the folder services
I gave it name space of Services like that:
namespace Services;
And the class name is UploadToImgurService
I run the composer command:
composer dump-autoload
And in my controller I wrote:
use Services\UploadToImgurService;
But I get this error:
Class 'Services\UploadToImgurService' not found
What did I did wrong?
Is there anything else that I should do with composer for autoloading the service class?
EDIT
I found a solution
I edited y composer.json file and added to psr-4 the line
"Services\\" : "app/services"
But why It didn't workt before? The line :
"App\\": "app/",
was there, maybe it loaded the class but under the app namespace?
If you are using a case sensitive file system, you will need to have the Services folder with upper case S.
Your idea is right, but let me try to explain how the psr-4 autoloading works.
You can define root namespaces in your composer.json file and map it to any project directory. Inside the defined directories, your classes should get the root namespace. The namespace segments after the root are build by your sub directory structure and the class name is equal to the file name (PSR-4 Autoloading).
E.g
"MyNamespace\\WithSubNamespace\\": "cool/project"
cool/project/MyClass.php -> MyNamespace\WithSubNamespace\MyClass
cool/project/SubDirectory/AnotherClass.php -> MyNamespace\WithSubNamespace\SubDirectory\AnotherClass
In Laravel, the app directory is mapped to the App namespace as default. Optionally, you can change the root namespace with the command php artisan app:name [NewRootNamespaceName], but the autoloader only finds classes inside the app directory.
If you create a new directory outside of "app", you have to add the directory to your psr-4 namespace mapping in the composer.json file.
In your example, you define a new root namespace in the existing app directory, so your issue was that the root namespace was unknown and you solved it by adding the line in your composer.json.
This is possible, because psr-4 provides a huge flexibility. But personally, i would not recommend to use different root namespaces in the same project.
I hope i could help and maybe this is also interesting for you: composer.json PSR-4.
maybe you forgot to add this line of code
require_once('vendor/autoload.php');
Once I was getting the error:
Fatal error: Uncaught Error: Class "..." not found
in /var/www/html/... on line ...
I was requiring autoload file this way:
require 'vendor/autoload.php';
After I changed the line to:
require __DIR__.'/vendor/autoload.php';
it started working...
Weird, since the the vendor folder was in the same directory as the file which was calling it.
BTW, I was using Composer 2 and PHP 8.1.
I have cloned the project from Github and tried to run the migration to make the database but it does not work. Why?
I get the following error:
bash: ./yii: No such file or directory
Path to yii file is incorrect. make sure current directory of command line is set to project root where 'yii' file is stored.
Tried to run the trans.php program from wamp server from the path
C:\wamp\www\sep24\e\trans.php
I have included the AWS folder in
C:\wamp\www\sep24\e\Amazon\
And AWS credential file in wamp/www folder as well user directory for the access
C:\wamp\www\.aws\credentials & C:\Users\username\.aws\credentials
This is my program
<?php
define('ROOT', dirname(__FILE__));
require ROOT . '/vendor/autoload.php';
use Amazon\Aws\ElasticTranscoder\ElasticTranscoderClient;
-------------
------------
// no error here.
?>
When i'm trying to run the program, I get this error
Fatal error: require(): Failed opening required 'C:\wamp\www\sep24\e/src/functions.php' (include_path='.;C:\php\pear') in C:\wamp\www\sep24\e\vendor\composer\autoload_real.php on line 54
I have included all the packages of AWS which I downloaded from the git.
What change should I make ?
There are two main problems are:
1 Composer Autoloading
The AWS dependency needs to be downloaded with Composer,
if you want the Composer Autoloader to work correctly.
Do not move folders around, when working with Composer.
The autoloading expects the files and folders inside the vendor folder.
I have included all the packages of AWS which I downloaded from the git.
You don't need to do this manually.
2 The use statement is wrong.
Change use Amazon\Aws\ElasticTranscoder\ElasticTranscoderClient;
to use \Aws\ElasticTranscoder\ElasticTranscoderClient;
3 Example Application
Because it is your third question and you seem to have problems with the application structure in connection with Composer, i will provide a simple PHP application template to demonstrate how you work with the AWS dependency.
This example provides a basic namespaced PHP application and includes the Client class from the AWS dependency(, which you have to fetched by Composer).
You find the file over here:
https://www.dropbox.com/s/q1b406thgu3146n/php-app-composer-aws.zip?dl=0
Extract the test folder into your www folder.
Then execute a composer install and run index.php.
You will end up with a error from TranscoderClient, because it expects a configuration. Not part of the problem.
Use composer.
Create testaws directory and put composer.json file with content below (you can adjust it to your needs for example PHP version or dev packages)
{
"name": "yourname/sampleapp",
"description": "Sample app",
"require": {
"php": ">=5.5.0",
"aws/aws-sdk-php" : "dev-master"
},
}
run composer install
then in index.php in testaws directory put this line in index.php
require __DIR__ . '/vendor/autoload.php';
After you do this steps it should work. More about composer you will find there
Also you can find sample project here
Delete the vendors folder and run composer install.
I have made a small project with symfony 2.4 at my local system. I have uploaded all the project files to my shared hosting server with same directory structure and database. Only the name of my public directory is "public_html" instead of "web". I don't have SSH access to this server. When i run the website by typing the domain name then it shows blank page. I see below given error in my server's log file:
adminhelpline.com [Sun Apr 20 17:08:55 2014] [error] [client 5.10.83.33:35937] AH01215: PHP Warning: require_once(/home/sites/adminhelpline.com/vendor/composer/autoload_real.php): failed to open stream: No such file or directory in /home/sites/adminhelpline.com/vendor/autoload.php on line 5
My Autoload file looks like this:
<?php
// autoload.php #generated by Composer
require_once __DIR__ . '/composer' . '/autoload_real.php';
return ComposerAutoloaderInit48e5d1e7fa77bf3d631b331b6343761b::getLoader();
Can anyone help me to sort out the problem?
it's quite simply. what the error log tells you that the file autoload_real.php in the folder /home/sites/adminhelpline.com/vendor/composer doesn't exist.
check the structure of your folders I assume you use some sort of ftp client? the worst case try to change the autoload.php not to include that file and see what you get or just move the file to the same folder as the autoload.php and change line 5 folder structure.
Execute composer update in your local machine, and then deploy the generated vendor/ folder.
This folder will contain the dependencies and the generated autoload
I started working on yii framework in last 2-3 days....
i am trying to follow this tutorial simple mailer ....
After copying the files into extension folder and after writing these lines into configuration file, when I openned the index page of my test application, it gives me the following exception:
throw new CException(Yii::t('yii','Object configuration must be an array containing a "class" element.'));
and below is the screenshot of stacktrace:
Can anyone help me out here?
after copying the files into extension folder
You have to copy simplemailer into modules directory '/protected/modules/...
cp modules/SimpleMailer/commands/MailerCommand.php commands/
Execute installations:
http://www.yiiframework.com/extension/simplemailer#hh6
cd /your/app/directory/protected
./yiic migrate create add_simplemailer_tables
--templateFile=application.modules.SimpleMailer.migrations.template
./yiic migrate up
cp modules/SimpleMailer/commands/MailerCommand.php commands/