rutas organizar ordenar grupo crear como archivo agrupar agrupadas php laravel laravel-5.4

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''])}}