Skip to content

Commit e4effb2

Browse files
authored
Merge pull request #89 from kapasifulop/v5
Add current_route_is() helper function for route name checking + Route::multilingualResource
2 parents 9afbdbb + 8982a63 commit e4effb2

File tree

6 files changed

+1069
-0
lines changed

6 files changed

+1069
-0
lines changed

README.md

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,42 @@ return [
9090
];
9191
```
9292

93+
**Important for Resource Routes:** When using `multilingualResource`, don't forget to add translations for all resource route segments that contain parameters:
94+
95+
```php
96+
Route::multilingualResource('test', 'TestController');
97+
```
98+
99+
```php
100+
<?php
101+
102+
// resources/lang/fr/routes.php
103+
104+
return [
105+
'test' => 'teste',
106+
'test/{test}' => 'teste/{test}'
107+
];
108+
```
109+
110+
This will generate the following:
111+
112+
| Method | URI | Name | Action |
113+
|-----------|----------------------------|-------------------|-------------------------------------------|
114+
| GET\|HEAD | test | en.test.index | App\Http\Controllers\TestController@index |
115+
| GET\|HEAD | test/create | en.test.create | App\Http\Controllers\TestController@create |
116+
| POST | test | en.test.store | App\Http\Controllers\TestController@store |
117+
| GET\|HEAD | test/{test} | en.test.show | App\Http\Controllers\TestController@show |
118+
| GET\|HEAD | test/{test}/edit | en.test.edit | App\Http\Controllers\TestController@edit |
119+
| PUT | test/{test} | en.test.update | App\Http\Controllers\TestController@update |
120+
| DELETE | test/{test} | en.test.destroy | App\Http\Controllers\TestController@destroy |
121+
| GET\|HEAD | fr/teste | fr.test.index | App\Http\Controllers\TestController@index |
122+
| GET\|HEAD | fr/teste/create | fr.test.create | App\Http\Controllers\TestController@create |
123+
| POST | fr/teste | fr.test.store | App\Http\Controllers\TestController@store |
124+
| GET\|HEAD | fr/teste/{test} | fr.test.show | App\Http\Controllers\TestController@show |
125+
| GET\|HEAD | fr/teste/{test}/edit | fr.test.edit | App\Http\Controllers\TestController@edit |
126+
| PUT | fr/teste/{test} | fr.test.update | App\Http\Controllers\TestController@update |
127+
| DELETE | fr/teste/{test} | fr.test.destroy | App\Http\Controllers\TestController@destroy |
128+
93129
To retrieve a route, you can use the `localized_route(string $name, array $parameters, string $locale = null, bool $absolute = true)` instead of the `route` helper:
94130

95131
```php
@@ -106,6 +142,13 @@ current_route('fr'); // Returns the current request's route in French version
106142
current_route('fr', route('fallback')); // Returns the fallback route if the current route is not registered in French
107143
```
108144

145+
To check if the current route matches a specific route name (without locale prefix), you can use the `current_route_is(string $name)` helper:
146+
147+
```php
148+
current_route_is('home'); // Returns true if current route is 'en.home', 'fr.home', etc.
149+
current_route_is('photos.show'); // Returns true if current route is 'en.photos.show', 'fr.photos.show', etc.
150+
```
151+
109152
### Renaming the routes
110153

111154
```php
@@ -216,6 +259,117 @@ URL::signedLocalizedRoute('unsubscribe', ['user' => 1]);
216259
URL::temporarySignedLocalizedRoute('unsubscribe', now()->addMinutes(30), ['user' => 1]);
217260
```
218261

262+
### Multilingual Resource Routes
263+
264+
You can also register multilingual resource routes using the `multilingualResource` method:
265+
266+
```php
267+
Route::multilingualResource('photos', 'PhotoController');
268+
```
269+
270+
This will generate all the standard resource routes for each configured locale:
271+
272+
| Method | URI | Name | Action |
273+
|-----------|----------------------------|-------------------|-------------------------------------------|
274+
| GET\|HEAD | photos | en.photos.index | App\Http\Controllers\PhotoController@index |
275+
| GET\|HEAD | photos/create | en.photos.create | App\Http\Controllers\PhotoController@create |
276+
| POST | photos | en.photos.store | App\Http\Controllers\PhotoController@store |
277+
| GET\|HEAD | photos/{photo} | en.photos.show | App\Http\Controllers\PhotoController@show |
278+
| GET\|HEAD | photos/{photo}/edit | en.photos.edit | App\Http\Controllers\PhotoController@edit |
279+
| PUT | photos/{photo} | en.photos.update | App\Http\Controllers\PhotoController@update |
280+
| DELETE | photos/{photo} | en.photos.destroy | App\Http\Controllers\PhotoController@destroy |
281+
| GET\|HEAD | fr/photos | fr.photos.index | App\Http\Controllers\PhotoController@index |
282+
| GET\|HEAD | fr/photos/create | fr.photos.create | App\Http\Controllers\PhotoController@create |
283+
| POST | fr/photos | fr.photos.store | App\Http\Controllers\PhotoController@store |
284+
| GET\|HEAD | fr/photos/{photo} | fr.photos.show | App\Http\Controllers\PhotoController@show |
285+
| GET\|HEAD | fr/photos/{photo}/edit | fr.photos.edit | App\Http\Controllers\PhotoController@edit |
286+
| PUT | fr/photos/{photo} | fr.photos.update | App\Http\Controllers\PhotoController@update |
287+
| DELETE | fr/photos/{photo} | fr.photos.destroy | App\Http\Controllers\PhotoController@destroy |
288+
289+
#### Limiting resource routes to specific actions
290+
291+
```php
292+
Route::multilingualResource('photos', 'PhotoController')->only(['index', 'show']);
293+
```
294+
295+
#### Excluding specific actions
296+
297+
```php
298+
Route::multilingualResource('photos', 'PhotoController')->except(['create', 'edit']);
299+
```
300+
301+
#### Custom parameter names
302+
303+
```php
304+
Route::multilingualResource('photos', 'PhotoController')->parameters([
305+
'photos' => 'photo_id'
306+
]);
307+
```
308+
309+
#### Limiting to specific locales
310+
311+
```php
312+
Route::multilingualResource('photos', 'PhotoController')->onlyLocales(['fr']);
313+
Route::multilingualResource('photos', 'PhotoController')->exceptLocales(['en']);
314+
```
315+
316+
#### Laravel 12.x Resource Features
317+
318+
All Laravel 12.x resource route features are supported:
319+
320+
```php
321+
// Customize missing model behavior
322+
Route::multilingualResource('photos', 'PhotoController')
323+
->missing(function (Request $request) {
324+
return Redirect::route('photos.index');
325+
});
326+
327+
// Include soft deleted models
328+
Route::multilingualResource('photos', 'PhotoController')->withTrashed(['show']);
329+
330+
// Apply constraints to specific parameters
331+
Route::multilingualResource('photos', 'PhotoController')->whereParam('photos', '[0-9]+');
332+
```
333+
334+
#### Using chainable methods
335+
336+
Like regular multilingual routes, you can chain all the same methods:
337+
338+
```php
339+
// Set custom name
340+
Route::multilingualResource('photos', 'PhotoController')->name('gallery');
341+
342+
// Add middleware
343+
Route::multilingualResource('photos', 'PhotoController')->middleware(['auth', 'verified']);
344+
345+
// Add route constraints
346+
Route::multilingualResource('photos', 'PhotoController')->where('photos', '[0-9]+');
347+
348+
// Set default parameters
349+
Route::multilingualResource('photos', 'PhotoController')->defaults(['format' => 'json']);
350+
351+
// Exclude specific locales
352+
Route::multilingualResource('photos', 'PhotoController')->exceptLocales(['en']);
353+
354+
// Set different names per locale
355+
Route::multilingualResource('photos', 'PhotoController')->names([
356+
'en' => 'pictures',
357+
'fr' => 'images'
358+
]);
359+
360+
// Chain multiple methods together
361+
Route::multilingualResource('photos', 'PhotoController')
362+
->only(['index', 'show', 'edit'])
363+
->exceptLocales(['en'])
364+
->name('gallery')
365+
->middleware('auth')
366+
->parameters(['photos' => 'photo_id'])
367+
->withTrashed(['show'])
368+
->missing(function (Request $request) {
369+
return redirect()->route('gallery.index');
370+
});
371+
```
372+
219373
## Upgrading from 1.x to 2.x
220374

221375
To update from 1.x to 2.x, you simply have to rename the namespace occurrences in your application from `LaravelMultilingualRoutes` to `MultilingualRoutes`. The most common use case would be the `DetectRequestLocale` middleware.

src/Macros/RouterMacros.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace ChinLeung\MultilingualRoutes\Macros;
44

55
use ChinLeung\MultilingualRoutes\MultilingualRegistrar;
6+
use ChinLeung\MultilingualRoutes\MultilingualResourcePendingRegistration;
67
use ChinLeung\MultilingualRoutes\MultilingualRoutePendingRegistration;
78
use Closure;
89

@@ -30,6 +31,30 @@ public function multilingual(): Closure
3031
};
3132
}
3233

34+
/**
35+
* Register multilingual resource routes.
36+
*
37+
* @param string $key
38+
* @param string $controller
39+
* @param array $options
40+
* @return \Closure
41+
*/
42+
public function multilingualResource(): Closure
43+
{
44+
return function ($key, $controller, array $options = []) {
45+
$registrar = $this->container && $this->container->bound(MultilingualRegistrar::class)
46+
? $this->container->make(MultilingualRegistrar::class)
47+
: new MultilingualRegistrar($this);
48+
49+
return new MultilingualResourcePendingRegistration(
50+
$registrar,
51+
$key,
52+
$controller,
53+
$options['locales'] ?? locales()
54+
)->options($options);
55+
};
56+
}
57+
3358
/**
3459
* Check if a route with the given name exists for the current locale.
3560
*

src/MultilingualRegistrar.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,15 @@ protected function finalizeRoute(Route $route, string $key, string $locale, arra
223223
$route->setBindingFields($bindingFields);
224224
}
225225

226+
// Apply Laravel 12.x resource features
227+
if (isset($options['missing'])) {
228+
$route->action['missing'] = $options['missing'];
229+
}
230+
231+
if (isset($options['withTrashed']) && $options['withTrashed'] === true) {
232+
$route->action['withTrashed'] = true;
233+
}
234+
226235
return $route;
227236
}
228237

0 commit comments

Comments
 (0)