J'ai besoin d'utiliser React Router
avec un projet Laravel
.
Mais lorsque je crée un routeur sur le React Router
et que j'essaie d'accéder, Laravel
accuse Route pas d'erreur.
Comment puis-je utiliser React Router
pour gérer les itinéraires de projets Laravel?
render((
<Router history={browserHistory}>
<Route path="/" component={App}/>
<Route path="/profile" component={Profile}/> // this route I trying access
</Router>
), document.getElementById('root'));
Créez un itinéraire qui mappe tout à un contrôleur, comme suit:
Route::get('/{path?}', [
'uses' => 'ReactController@show',
'as' => 'react',
'where' => ['path' => '.*']
]);
Ensuite, dans votre contrôleur, affichez simplement la page HTML contenant le document racine de réaction:
class ReactController extends Controller {
public function show () {
return view('react');
}
}
Ensuite, faites tout comme d'habitude avec le routeur de réaction. Semble bien fonctionner pour moi.
Mise à jour pour Laravel 5.5 Si votre contrôleur renvoie uniquement une vue (comme dans l'exemple ci-dessus), vous pouvez échanger tout le code ci-dessus avec ceci dans votre fichier de routes:
Route::view('/{path?}', 'path.to.view')
->where('path', '.*')
->name('react');
Basé sur la réponse de Jake Taylor (ce qui est exact, d'ailleurs): il y a une petite erreur, il manque un guillemet après '/{path?}'
, juste le dernier.
De plus, si vous n'avez pas besoin d'utiliser un contrôleur et de simplement rediriger votre vue, vous pouvez l'utiliser comme ceci:
Route::get( '/{path?}', function(){
return view( 'view' );
} )->where('path', '.*');
Remarque: Assurez-vous simplement d’ajouter cette route à la fin de toutes vos routes dans le fichier routes (web.php pour Laravel 5.4), afin que toutes les routes valides existantes puissent être capturées le dernier.
Si vous utilisez v4, que diriez-vous d'utiliser <HashRouter>
?
Par exemple.
import React from 'react';
import {
HashRouter,
Route,
Link
}from 'react-router-dom';
import Profile from './Profile';
export default class App extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<HashRouter>
<div>
<div>
<ul>
<li><Link to="/profile" replace>Profile</Link></li>
</ul>
</div>
<div>
<Route path="/profile" component={Profile}/>
</div>
</div>
</HashRouter>
);
}
}
Dans le routeur de Laravel ...
Route::get('/', function(){
return view('index'); //This view is supposed to have the react app above
});
Avec HashRouter
, votre routage côté client est effectué avec #
(identificateur de fragment), qui n'est pas lu par le routage de Laravel (c'est-à-dire le routage côté serveur)
En arrivant sur cette page, l'URL est /
.
En cliquant sur le lien, l'URL /#/posts
apparaîtra et le composant apparaîtra.
Après cela, si vous actualisez la page, vous ne verrez plus l'erreur Route not exist
. En effet, du point de vue de Laravel, l’URL est toujours /
. (Le composant Profile
reste toujours là.)
https://reacttraining.com/react-router/web/api/HashRouter
J'espère que mon explication est claire.
Vous pouvez retourner votre page d'index et browserHistory of React gérera tout le reste.
Route::pattern('path', '[a-zA-Z0-9-/]+');
Route::any( '{path}', function( $page ){
return view('index');
});
Cela semble fonctionner pour moi
Route::get('{reactRoutes}', function () {
return view('welcome'); // your start view
})->where('reactRoutes', '^((?!api).)*$'); // except 'api' Word
Route::get('api/whatever/1', function() {
return [
'one' => 'two',
'first' => 'second'
];
});
Route::get('api/something/2', function() {
return [
'hello' => 'good bye',
'dog' => 'cat'
];
});