6.7 KiB
Laravel Image Cropper - Testing Guide
Installation Complete ✅
The Laravel Image Cropper package has been successfully installed and integrated into your project.
What Was Installed
- Package:
takeone/cropper:@dev - Cropper Library: Cropme.js (lightweight image cropping)
- Portrait Rectangle Configuration: 300px × 400px (3:4 ratio)
- Storage Directory:
storage/app/public/images/profiles/
Files Modified
1. composer.json
- Added VCS repository
- Added package dependency
2. resources/views/layouts/app.blade.php
- Added
@stack('modals')for modal injection
3. resources/views/family/profile-edit.blade.php
- Replaced old image upload modal with
<x-takeone-cropper>component - Configured for portrait rectangle cropping
- Added image display with fallback to default avatar
4. app/Http/Controllers/FamilyController.php
- Updated
uploadProfilePicture()method to handle base64 images - Saves cropped images to
storage/app/public/images/profiles/ - Updates user's
profile_picturefield in database
5. resources/views/vendor/takeone/components/widget.blade.php
- Published and customized widget component
- Added custom upload URL support
- Added page reload after successful upload
- Improved error handling
How to Test
Step 1: Start the Development Server
php artisan serve
Step 2: Navigate to Profile Edit Page
Open your browser and go to:
http://localhost:8000/profile/edit
Step 3: Test the Cropper
-
Click "Change Photo" button
- A modal should popup with a file selector
-
Select an Image
- Click "Choose File" and select any image from your computer
- The image should load in the cropping interface
-
Crop the Image
- You'll see a portrait rectangle overlay (300×400px)
- Use the Zoom Level slider to zoom in/out
- Use the Rotation slider to rotate the image
- Drag the image to position it within the rectangle
-
Save the Image
- Click "Crop & Save Image" button
- Button should show "Uploading..." while processing
- You should see "Saved successfully!" alert
- Modal should close automatically
- Page should reload
- Your new profile picture should appear in the profile picture box
Step 4: Verify the Upload
Check that the image was saved:
dir storage\app\public\images\profiles\
You should see a file named profile_{user_id}.png
Step 5: Verify Database Update
The users table should have the profile_picture field updated with:
images/profiles/profile_{user_id}.png
Expected Behavior
✅ Success Indicators
- Modal opens when clicking "Change Photo"
- Image loads in cropper after selection
- Portrait rectangle viewport is visible (taller than wide)
- Zoom and rotation sliders work smoothly
- Image can be dragged/positioned
- "Crop & Save Image" button uploads successfully
- Success alert appears
- Page reloads automatically
- New profile picture displays in the profile box
❌ Potential Issues
Modal doesn't appear:
- Check browser console (F12) for JavaScript errors
- Verify
@stack('modals')is inresources/views/layouts/app.blade.php - Ensure jQuery and Bootstrap are loaded
Upload fails:
- Check
storage/app/public/images/profiles/directory exists - Verify storage link:
php artisan storage:link - Check file permissions on storage directory
- Review Laravel logs:
storage/logs/laravel.log
Image doesn't display after upload:
- Verify storage is linked
- Check the
profile_picturefield in database - Ensure the file exists in
public/storage/images/profiles/ - Clear browser cache
Cropper shows square instead of rectangle:
- Verify the component has
width="300"andheight="400" - Check that
shape="square"(not "circle")
Package Bug Note
⚠️ Known Issue: The package's service provider has a namespace bug in the route registration. This doesn't affect functionality because we're using our own custom route (profile.upload-picture) instead of the package's default route.
The error you might see when running php artisan route:list:
Class "takeone\cropper\Http\Controllers\ImageController" does not exist
This can be safely ignored as we're not using that route.
Customization Options
Change Aspect Ratio
Edit resources/views/family/profile-edit.blade.php:
<!-- Current: 3:4 portrait -->
<x-takeone-cropper
width="300"
height="400"
/>
<!-- Square: 1:1 -->
<x-takeone-cropper
width="300"
height="300"
/>
<!-- Wide rectangle: 16:9 -->
<x-takeone-cropper
width="400"
height="225"
/>
<!-- Tall portrait: 2:3 -->
<x-takeone-cropper
width="300"
height="450"
/>
Change to Circular Crop
<x-takeone-cropper
width="300"
height="300"
shape="circle"
/>
Change Storage Folder
<x-takeone-cropper
folder="avatars"
/>
Custom Filename Pattern
<x-takeone-cropper
filename="user_{{ auth()->id() }}_{{ time() }}"
/>
File Structure
takeone/
├── storage/
│ └── app/
│ └── public/
│ └── images/
│ └── profiles/ ← Uploaded images here
│ └── profile_1.png
├── public/
│ └── storage/ ← Symlink to storage/app/public
│ └── images/
│ └── profiles/
│ └── profile_1.png ← Publicly accessible
├── resources/
│ └── views/
│ ├── family/
│ │ └── profile-edit.blade.php ← Profile edit page
│ ├── layouts/
│ │ └── app.blade.php ← Main layout with @stack('modals')
│ └── vendor/
│ └── takeone/
│ └── components/
│ └── widget.blade.php ← Customized cropper widget
└── app/
└── Http/
└── Controllers/
└── FamilyController.php ← Upload handler
Support
If you encounter any issues:
- Check the browser console (F12) for JavaScript errors
- Review Laravel logs:
storage/logs/laravel.log - Verify all files were modified correctly
- Ensure storage permissions are correct
- Clear all caches:
php artisan config:clear && php artisan route:clear && php artisan view:clear
Next Steps
- Test the cropper functionality
- Upload a test image
- Verify it displays correctly
- Customize the aspect ratio if needed
- Add additional validation if required
- Consider adding image optimization/compression
Installation Date: January 26, 2026
Package Version: dev-main
Laravel Version: 12.0
Status: ✅ Ready for Testing