$image->move(public_path('images/users/'.$id.''), $new_name);
Should be
$image->move(public_path('storage/images/users/'.$id.''), $new_name);
Since the symlink is the storage folder in public_html. But yeah. take a look below on a better way to deal with it using the storage driver driver.
https://laravel.com/docs/5.7/requests#storing-uploaded-files
In default laravel installation, there's a storage disk setup that is called public.
To use it an example would be:
$path = $image->storeAs('images/users'.$id, $new_name, 'public');
This would put the file inside storage/app/public/images/users/1 which can be reached from inside public_html/storage/images/users/1
To change default path or setup a new disk, take a look at the config/filesystems.php file.
Then you could use something like
Storage::disk('public')->url($path);
To output a public url to the file, so as long as you store the path, it should be easy. I think you can omit the disk('public') if you use standard setup since it will default to the storage folder.
-url('/images/users/3/1343051701.png') }})