Je vais ici donner des explications pour le routage sous Laravel, montrer comment générer des URL avec ou sans paramètre en fonction du fichier web.php. Je vais également vous donner une solution pour mettre en place un routage dynamique en fonction d’une table présente dans ma base de données. Cette solution sort d’un cas concret. Le site en question est un site de petites annonces et le routage multi langue doit afficher soit une catégorie soit une annonce en fonction de l’url. Pour cela, j’ai besoin d’une table que j’ai appelé core_url_rewrite en clin d’œil à Magento, d’un controller et de vues que je vous laisse le soin de faire vous-même.
Routage de base
Exemple de génération d’url sans paramètre.
// #### Dans routes\web.php
Route::get('mon_ex_1', ['as'=>'ex1','uses'=>'Frontend\ExempleController@index']);
// #### Appel dans fichier php
echo route('ex1');
// => http://www.crabcake.ch/blog/mon_ex_1
// #### Dans appel dans template blade
{{ url('mon_ex_1') }}
//ou
{{ URL::route('ex1') }}
// => http://www.crabcake.ch/blog/mon_ex_1
Exemple de génération d’url avec paramètre
// #### Dans routes\web.php
Route::get('{lang}/mon_ex_2', ['as'=>'ex2','uses'=>'Frontend\ExempleController@index']);
// #### Appel dans fichier php
$url2 = route('ex2',['lang'=>'fr']);
// => http://www.crabcake.ch/blog/fr/mon_ex_2
Exemple de génération d’url avec paramètre et avec paramètre optionnel
// #### Dans routes\web.php
Route::get('{lang}/mon_ex_2', ['as'=>'ex2','uses'=>'Frontend\ExempleController@index']);
// ou
Route::get('{lang}/mon_ex_2/{id?}', ['as'=>'ex2','uses'=>'Frontend\ExempleController@index']);
// #### Appel dans fichier php
echo route('ex2',['lang'=>'fr']);
// => http://www.crabcake.ch/blog/fr/mon_ex_3
echo route('ex3',['lang'=>'fr','id'=>22]);
// => http://www.crabcake.ch/blog/fr/mon_ex_3/22
Routage depuis une base de données
La table est toute simple. Je vous donne ici le fichier de migration. Je vous laisse le soin de la peupler correctement selon vos besoins, mais j’en profite pour montrer comment insérer des données ou peupler une table dans le fichier de migration laravel.
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CoreUrlRewrite extends Migration { public function up() { Schema::create('core_url_rewrite', function (Blueprint $table) { $table->increments('id');
$table->string('lang');
$table->string('request_path')->default('');
$table->string('id_categorie')->default('');
$table->string('id_file')->default('');
});
// Insert some stuff
DB::table('core_url_rewrite')->insert(
array(
'lang' => 'fr',
'request_path' => 'suisse',
'id_categorie' => '2',
'id_file' => ''
) );
DB::table('core_url_rewrite')->insert( array(
'lang' => 'fr',
'request_path' => 'studio-lumineux',
'id_categorie' => '',
'id_file' => '3'
)
);
}
public function down()
{
Schema::drop('core_url_rewrite');
}
}
Le contrôleur que j’ai appelé DynamicController qui se trouve bien sur sous app\ Controllers\ DynamicController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Facades\DB; class DynamicController extends Controller { public function manage($lang,$url) { $categories = DB::table('core_url_rewrite')->where('lang', '=', $lang)->where('request_path', '=', $url)->get();
if($categories->count()==0){
echo "No route in url_rewrite";
exit();
}
$categorie = $categories->first();
if($categorie->id_categorie){
$cat = \App\Categorie::find($categorie->id_categorie);
dd($cat);
$modelCat = new \App\MyClasses\Categorie($lang,$cat);
return view('frontend.categories',array('categorie'=>$modelCat));
} elseif($categorie->id_file){
$annnonce = \App\File::find($categorie->id_categorie);
dd($annnonce);
return view('frontend.categories',array('categorie'=>$cat));
}
}
}
Il faut bien évidemment également modifier le fichier web.php Pour ne pas perdre les autres routeurs, il faut ajouter notre nouvelle route tout à la fin du fichier.
Route::get('{slug1}/{slug2}', 'DynamicController@manage')
->where('slug1', implode('|', array_flip(config('app.languages'))))
->where('slug2', '([A-Za-z0-9-_]+)');
Nous prenons soins dans ce routage de contrôler si la langue correspond à une des langues présentes dans notre fichier de config (->where(‘slug1’, implode(‘|’, array_flip(config(‘app.languages’))) ) et si la page a une URL plausible ( ->where(‘slug2’, ‘([A-Za-z0-9-_]+)’) ). Voilà, vous avez maintenant mis en place un système de routage en fonction de la base de données. Pour tester votre page naviguez par exemple à l’url http://www.votre-site.com/fr/suisse