5
votes

I have a Laravel project that I copied from my Ubuntu server and now I am trying to run it my local machine (XAMPP on Mac) I have been struggling with this for a few days now and I feel like I am going insane.

When I paste my project in XAMPP htdocs folder I get this error:

View [welcome] not found

Which php artisan cache:clear makes that go away, then I get this error:

The bootstrap/cache directory must be present and writable

Then I do this, php artisan cache:clear which gives me a new error:

Class view does not exist

Then after that no matter what I do either in terminal or viewing the web browser, I always get the error

Class view does not exist

Then I have tried composer update still the same error.....what am I doing wrong?

This has been a nightmare.

13
can you share more details on which system you are tryings its windows or mac ? - Ashfaque Ali Solangi
This is on a mac. - user979331
Use Laravel Valet. XAMPP sucks TBH. - Paras
Try deleting the vendor folder then run composer install - Ibrahim Mohamed
check Illuminate\View\ViewServiceProvider::class, in confi/app.php - Dhruv Raval

13 Answers

4
votes

Last time i checked Laravel doesnt run on XAMPP but rather on the PHP installed when installing XAMPP so the project can be saved anywhere on the computer.

Given this being the fact, you will need to just have an active PHP installation and then you copy only the relevant files of the project onto the new computer (such files that you will get when you push your project onto GitHub). It doesn`t come with cache issues then all you need to do afterwards is to

php artisan key:generate

then composer install or composer update to get the vendor packages from online

My money right now is on picking the relevant files and reinstall with them According to my own installation when changing the computer this is the list you will have to copy enter image description here

4
votes

I just tried to reproduce your issue on my mac. So i have installed XAMPP with the PHP version 7.1.25 which is the equivalent version of my local PHP version

So I installed the XAMPP and started server.

Downloaded my laravel project folder from my ubuntu server and copied it to htdocs (XAMPP)

When i tried to run http://localhost/myproject/public it shows the exception like

There is no existing directory at "/Applications/XAMPP/xamppfiles/htdocs/myproject/storage/logs" and its not buildable: Permission denied

Then i gave full permission to the storage folder

chmod -R 777 storage

And changed ownership for the files inside myproject folder.

Here i just checked the ownership of the dashboard directory which is running perfectly and given the same user ownership of myproject directory.

chown -R root:admin .  

Then following commands

composer install
php artisan cache:clear
php artisan view:clear
php artisan route:clear

After this my laravel code runs perfectly.

Class view does not exist

is probably a ownership issue of the directory

2
votes

For me (when developing on xampp, what I do for all my projects) - I'd not recommend to put your stuff in the htdocs folder. Laravel expects to not be hosted on a subfodler e.g. (localhost/my-project). So you should set up a virtual host in order to make it work easily (e.g. my-project.test) which is a bit annoying.

Simple solution is using the php artisan serve command in order to simply setup a local server on port 8000.

Don't forget to start xampp for the mysql server.

Some typical tips were already mentioned:

  • delete vendor folder & run composer install (install composer if you haven't)
  • run composer dump-autoload
  • run php artisan key:generate
  • ofcourse don't forget the migration php artisan migrate
  • and clear your full cache php artisan cache:clear

Usually you do not need to set any file permissions afaik

1
votes

chmod -R 777 storage/

If you have a different user for apache2 (usually www-data), also do:

chown -R www-data storage/

You could also check if it runs with the built-in server:

php artisan serve

1
votes

You can create .htaccess file and add below data into .htaccess file

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REQUEST_URI} !^public
 RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

After create .htaccess file, set laravel root path in terminal and run below command in terminal

php artisan serve
1
votes

Since your Apache is already serving then you have permission problems only. And since you're using Mac, the default user name and group in Apache conf is _www for Mac and not www-data that is for Ubuntu. You can see it in the httpd.conf file :

<IfModule unixd_module>
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.  
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User _www
Group _www

</IfModule>

Now, use terminal, get in your project directory let's say cd /var/www/laravel-project1 and make sure that the group _www (or the user too in some case of your App environment logic` has access (read and write) to :

All public directory and sub-directories containing assets if you have.

sudo chgrp -R _www public
sudo chmod -R 774 public

Storage directory and sub-directories specified here (storage/framework -> all, storage/logs -> all, storage/app -> public directory only), and bootstrap/cache directory and files

sudo chgrp -R _www storage/framework storage/logs storage/app/public bootstrap/cache
sudo chmod -R 774 storage/framework storage/logs storage/app/public bootstrap/cache

That should get rid of all of your permissions problem to access pages.

BUT now if on using the page, sessions and logs files that are created you get other problems, there might be a last problem of permission which is called UMask, which tell Apache or Web Server like Nginx what permission to assign to newly created directory or files for the user _www. By default Apache umask is 0002, which give 0775 for directory and 0664 for new file. If ever umask value was changed to 0022 like it's the default in Nginx, then the equivalent permissions 0755 or 0644 will not be sufficient for your Apache group _www to write in the directories that have group _www. So you can either change umask to 0002 or change owner to _www :

sudo chown -R _www public storage/framework storage/logs storage/app/public

So that depends on your configs.

1
votes

I ran into the same problem as you, but not moving from ubuntu to mac, it was from windows to linux, I was in a total mess, but only git rescued me, it might give you a bit of pain, but it is going to save you in the future. Here is the steps you need to do.

  1. Create empty repository on the mac using this command git init --bare.
  2. Clone the repository to the ubuntu using git clone.
  3. Copy your laravel code to the clone you made in step 2.
  4. Push the files from the ubuntu to the MAC.
  5. Test the project.

The directory you will create in the mac, it can be inside the htdocs of the xammp. I know it might be painful task to do, but it is quite worth it.

Sources for more information: git-scm Getting Git on Server

If you need more help, I'll be more than happy to discuss it with you.

1
votes

Note: The following works for Laravel 5.x but also 4.2, not tested with other versions

Why not using Git? (If you are not familiar with it, have a look at the official website, there are also tons of tutorials on the web)

Usually, copy-pasting entire projects is not a good idea, because of some file/directory permissions and other not-so-good stuff.

That's what I did to move my project from Windows to my Ubuntu Server:

  • Put your project on a git repository (GitHub, GitLab, or whatever), the .gitignore files provided with the Laravel apps are, in most cases, good enough
  • On your new machine, clone your repository
  • Do a

    composer dump-autoload
    composer install
    
  • To migrate your db, do

    php artisan migrate
    

    and if you have seeding, do this

    php artisan db:seed
    

Then, if you have problem with file/folder permissions, do not EVER do a chmod -R 777 path/, if you have to do this to solve your problem, you are doing something wrong. This command grants all privileges to anyone to all the files and folders in the path folder.

In your case, you have to do the following:

  • First, find which username is apache using to run the server (usually it's www-data)

    ps aux | egrep '(apache|httpd)'
    
  • Then, change the project directory owner to apache's user (example for www-data apache user)

    sudo chown -R www-data:www-data /var/htdocs/your-project/
    
  • Set folders permissions

    sudo find /var/htdocs/your-project/ -type d -exec chmod 755 {} \;
    
  • Set files permissions

    sudo find /var/htdocs/your-project/ -type f -exec chmod 644 {} \;
    
  • To fix the bootstrap/cache and storage/ permission problem, do

    sudo chown -R www-data:www-data /var/htdocs/your-project/
    

Laravel 5.x

    sudo chmod -R ug+rwx /var/htdocs/your-project/storage /var/htdocs/your-project/bootstrap/cache

Laravel 4.2

    sudo chmod -R ug+rwx /var/htdocs/your-project/storage /var/htdocs/your-project/app/bootstrap/cache

Then, you should be good.

Doing that way, you can easily move your project from a machine to another without struggling with permission fixes or anything.

More info and source for files and folders permissions command-line instructions, see Laravel 5 Files Folders Permission and Ownership Setup

0
votes

Go to your project folder add run these commands from terminal

sudo chmod -R 777 your_projrct/storage

sudo chmod -R 777 your_projrct/bootstrap/cache

sudo chown -R :www-data your_project

sudo chmod -R g+s your_project

then php artisan key:generate and composer install

0
votes

when user/group www-data are unkown; most Linux distributions use apache:

chown -R apache:apache dirname

while on OSX, this would be user/group _www:

chown -R _www:_www dirname

adding the current user to group _www might make life easier, in general.

0
votes

To isolate your issues:

  1. Get your code into a repository(bitbucket or github)
  2. Clone the repository into your local environment
  3. Run composer install
  4. Run php artisan serve. This way you rule out xampp as an issue.
  5. In your browser go to localhost:8000

If you already have your entire codebase on your local box(including the vendor folder) then skip steps 1 and 2. Step 3 wouldn't hurt, but you can probably skip that too.

Once you get everything working, switch to xampp.

0
votes

First of all:

composer update
composer dumpautoload
php artisan cache:clear

And then just configure a virtual host

1. Create a local domain for your app

Edit hosts file and redirect all requests from your domain to 127.0.0.1:

127.0.0.1   lara.vel

2. Configure a Virtual Host

Edit \xampp\apache\conf\extra\httpd-vhosts.conf:

<VirtualHost lara.vel:80>
  DocumentRoot "C:\xampp\htdocs\laravel\public"
  ServerAdmin laravel.dev
  <Directory "C:\xampp\htdocs\laravel">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
  </Directory>
</VirtualHost>

Done! Open up your domain in your browser, You'll see your project there!


The other way is simple, Just run artisan serve.

Please vote up if you found this answer useful.

0
votes

I think if you copied the project from Ubuntu so it is a permissions problem.

first get users on your Mac machine by typing this in terminal

users

then copy the user you just got for example (username) and use it in this command

sudo chown -R username project-directory

then check for yourproject-directory/bootstrap/cache if it not exists, go create it. else run this command:

sudo chmod -R guo+w project-directory/bootstrap/cache

then

sudo chmod -R guo+w project-directory/storage

then clear composer autoload and cache and config using artisan command

composer dump-autoload
php artisan cache:clear
php artisan view:clear
php artisan route:clear

now try to run the project if the problem still exists, you need to check config/app.php if it contains Illuminate\View\ViewServiceProvider::class the view service provider.

if it is not there, so add it