php - organizar - rutas agrupadas laravel
prefijo mĂșltiple con el mismo grupo de ruta (8)
Estoy escribiendo un sitio web bastante simple para una escuela ... este sitio web tiene noticias, artículos, videoclips ... etc.
la forma en que funciona es en la página de inicio que presentamos al visitante con algunas lecciones como
>math
>geography
>chemistry
el usuario selecciona 1 en estos y cambios en los contenidos del sitio web en función de la selección del usuario
por ejemplo, si el usuario selecciona matemática, verá noticias, artículos, videos sobre matemáticas y demás ... en este momento esto es lo que estoy haciendo (las súplicas ignoran los errores de sintaxis)
Route::group([''prefix''=>''math''], function () {
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
});
Route::group([''prefix''=>''geography''], function () {
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
});
Route::group([''prefix''=>''chemistry''], function () {
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
});
Básicamente, repetir todos los enlaces para cada prefijo ... pero a medida que crezcan los enlaces, se volverá cada vez más inmanejable ... ¿hay alguna forma mejor de hacerlo? algo como
Route::group([''prefix''=>[''chemistry'',''math'' , ''geography'' ], function () {
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
});
------------------------- actualización -------------
He intentado esto
$myroutes = function () {
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
};
Route::group([''prefix'' => ''chemistry''], $myroutes);
Route::group([''prefix'' => ''math''], $myroutes);
Route::group([''prefix'' => ''geography''], $myroutes);
y funciona bien, el problema es que el último prefijo se adjunta a todos los enlaces internos
por ejemplo, si hago clic en matemáticas
mis enlaces serán
site.com/math/news
pero todos los enlaces en la página cargada
<a href="{{route(''article_index'')"> link to article </a>
parece
site.com/geography/article
básicamente enlace obtener el último prefijo mencionado, independientemente de uno seleccionado actualmente
Creo que es mejor hacer:
Route::get(''/news/{group}'', ''NewsController@index'')->name(''news_index'');
Y luego simplemente ponga la condición en la función del controlador ya sea geografía / matemáticas / química / etc.
¿No crees?
En lugar de agrupar puede usar parámetros de ruta
Route::get(''/{prefix}/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/{prefix}/article'', ''ArticleController@index'')->name(''article_index'');
Podría intentar usar la opción as
dentro de sus grupos para decirle al enrutador que anteponga una cadena a cada nombre de ruta dentro de ese grupo. Para hacerlo, intente lo siguiente:
Route::group([''prefix'' => ''chemistry'', ''as'' => ''chemistry.''], $myroutes);
Route::group([''prefix'' => ''math'', ''as'' => ''math.''], $myroutes);
Route::group([''prefix'' => ''geography'', ''as'' => ''geography.''], $myroutes);
Entonces, lo que podrá hacer debería ser:
<a href="{{route(''chemistry.article_index'')}}"> link to article </a>
<a href="{{route(''math.article_index'')}}"> link to article </a>
<a href="{{route(''geography.article_index''}})"> link to article </a>
Espero eso ayude.
Solo por el bien de Curiosity intenté el parámetro opcional en la agrupación de rutas de prefijos en laravel y funcionó. Echale un vistazo:
Route::group([''prefix'' => ''{subject?}'', ''as''=> ''subject.'', where'' => [''subject'' => ''math|english|geo'']],function (){
Route::get(''news'', function (){
return ''This is the news'';
})->name(''news'');
});
Seguro que esta es la solución que soñaste.
Mucho antes de que esta sea la respuesta correcta, podría haber un pequeño problema. La route(''subject.news'')
llamada route(''subject.news'')
dará http://example.com/news
. Para hacerlo feliz, debe pasar el parámetro opcional a la función route()
, es decir, route(''subject.news'',''math'');
por ejemplo; entonces tendrás http://example.com/math/news
.
PD: Esto se hizo en Laravel 5.4.30 PHP 7.1
¿Por qué no hacerlo de esta manera?
$subjects = [
''chemistry'', ''geography'', ''math''
];
foreach ($subjects as $subject) {
Route::prefix($subject)->group(function () {
Route::get(''news'', ''NewsController@index'')->name(''news_index'');
Route::get(''article'', ''ArticleController@index'')->name(''article_index'');
});
}
Sé que esto es una manera elemental de hacerlo. Sin embargo, puede agregar sujetos fácilmente, es claro y fácil de entender.
Ya hay varias buenas respuestas aquí, probablemente sea solo una cuestión de preferencia personal o detalles más específicos del proyecto lo que conviene. Aquí hay otra opción para la pila.
No estoy seguro de por qué la respuesta de @Shams fue downvoted, parece ser el enfoque más limpio para mí, pero solo si los prefijos están restringidos para que solo se acepten los temas válidos. Algo como:
// Only 1 place to update if you add subjects
$subjectRegex = ''math|geography|chemistry'';
// Only 1 route per ''group''
Route::get(''{subject}/news'', ''NewsController@index'')->name(''news_index'')->where(''subject'', $subjectRegex);
Route::get(''{subject}/article'', ''ArticleController@index'')->name(''article_index'')->where(''subject'', $subjectRegex);
Como bonificación, tiene $subject
disponible en los métodos de su Controlador, lo que parece que podría ser útil, por ejemplo, puede usarlo para generar rutas dentro del tema actual:
route(''article_index'', [''subject'' => $subject])
Puedes intentar lo siguiente:
$myroutes = function () {
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
};
Route::group([''prefix'' => ''chemistry''], $myroutes);
Route::group([''prefix'' => ''math''], $myroutes);
Route::group([''prefix'' => ''geography''], $myroutes);
Use de la siguiente manera:
{!!URL::to(''chemistry/news'')!!}
{!!URL::to(''geography/news'')!!}
{!!URL::to(''math/news'')!!}
Puede RouteServiceProvider
en comodín el grupo de ruta y especificar los prefijos preferidos en su RouteServiceProvider
routes.php
Route::group([''prefix''=>''{slug}''],function (){
Route::get(''/news'', ''NewsController@index'')->name(''news_index'');
Route::get(''/article'', ''ArticleController@index'')->name(''article_index'');
});
Método de arranque de RouteServiceProvider
Route::bind(''slug'',function ($name){
$prefix = ["math","chemistry","geography"];
if(!in_array($name,$prefix))
{
//handle wrong prefixes
throw new /Exception("Something went wrong");
}
});
usar ruta nombrada
{{route(''news_index'',[''slug''=>''math''])}}