将 uri 参数添加到 laravel 中的路由名称
add uri parameter to Route name in laravel
我在做一个Laravel项目,做了一个简单的增删改查系统,但是有个小问题
为了在我的项目中生成URL系统,我做了一个Route::macro
并将其添加到 AppServiceProvider
:
Route::macro('crud', function () {
Route::group([
], function () {
// Route::resource('', 'CrudController');
Route::get('{model}', 'CrudController@index');
Route::get('{model}/create', 'CrudController@create');
Route::post('{model}', 'CrudController@store'); /** << post **/
Route::get('{model}/{id}', 'CrudController@show');
Route::get('{model}/{id}/edit', 'CrudController@edit');
Route::match(['PUT', 'PATCH'],'{model}/{id}', 'CrudController@update'); /** << post **/
Route::delete('{model}/{id}', 'CrudController@destroy'); /** << post **/
});
});
到目前为止效果很好,但问题是我需要使用 ->name()
,并向其中添加 $model
参数!
我正在尝试做的事情的例子:
Route::get('{model}', 'CrudController@index')->name('{model}.index');
有可能吗,提前致谢
您可以为模型的一组路由添加前缀
From the docs
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Route::macro('crud', function () {
Route::name('{model}.')->group(function () {
Route::get('{model}', 'CrudController@index')->name('index');
Route::get('{model}/create', 'CrudController@create')->name('create');
Route::post('{model}', 'CrudController@store')->name('store');
Route::get('{model}/{id}', 'CrudController@show')->name('show');
Route::get('{model}/{id}/edit', 'CrudController@edit')->name('edit');
Route::match(['PUT', 'PATCH'], '{model}/{id}', 'CrudController@update')->name('update');
Route::delete('{model}/{id}', 'CrudController@destroy')->name('destroy');
});
});
}
}
Result
+-----------+----------------------------+-----------------+------------------------------------------------------------+
| Method | URI | Name | Action |
+-----------+----------------------------+-----------------+------------------------------------------------------------+
| GET|HEAD | {model} | {model}.index | App\Http\Controllers\CrudController@index |
| POST | {model} | {model}.store | App\Http\Controllers\CrudController@store |
| GET|HEAD | {model}/create | {model}.create | App\Http\Controllers\CrudController@create |
| GET|HEAD | {model}/{id} | {model}.show | App\Http\Controllers\CrudController@show |
| PUT|PATCH | {model}/{id} | {model}.update | App\Http\Controllers\CrudController@update |
| DELETE | {model}/{id} | {model}.destroy | App\Http\Controllers\CrudController@destroy |
| GET|HEAD | {model}/{id}/edit | {model}.edit | App\Http\Controllers\CrudController@edit |
+-----------+----------------------------+-----------------+------------------------------------------------------------+
现在您可以访问 example.com/user/create
和 example.com/product/create
,它们都采用相同的控制器方法
希望对您有所帮助
在此示例中,您可以循环一些数字并动态创建一些路由:
for ($i = 0; $i < 5; $i++) {
Route::get('test/' . $i, 'Controller@test_' . $i)->name('test.' . $i);
}
您可以使用 "php artisan route:list" 检查所有添加的路由。
我不建议你这样做,但对于你的情况,你可以在 routes.php 的某个地方定义这样的数组,然后循环:
$models = ['user', 'owner', 'admin'];
foreach ($models as $model) {
Route::get($model, 'CrudController@index')->name($model . '.index');
}
或者您可以在配置中定义该数组(例如在 "config/app.php" 中),例如:
'models' => ['user', 'owner', 'admin'];
并且在 routes.php 中你可以用这个检索它(不要忘记 运行 "php artisan config:cache" 在改变 app.php 之后):
$models = config('app.models');
// foreach loop
你可以获取所有模型名称并循环遍历它们,并在运行时将模型名称添加到路由名称前缀中
loop (model in models)
Route::get("{model}","Atcion")->name("{model}.index")
endloop
希望我的answare对你的项目有所帮助
我在做一个Laravel项目,做了一个简单的增删改查系统,但是有个小问题
为了在我的项目中生成URL系统,我做了一个Route::macro
并将其添加到 AppServiceProvider
:
Route::macro('crud', function () {
Route::group([
], function () {
// Route::resource('', 'CrudController');
Route::get('{model}', 'CrudController@index');
Route::get('{model}/create', 'CrudController@create');
Route::post('{model}', 'CrudController@store'); /** << post **/
Route::get('{model}/{id}', 'CrudController@show');
Route::get('{model}/{id}/edit', 'CrudController@edit');
Route::match(['PUT', 'PATCH'],'{model}/{id}', 'CrudController@update'); /** << post **/
Route::delete('{model}/{id}', 'CrudController@destroy'); /** << post **/
});
});
到目前为止效果很好,但问题是我需要使用 ->name()
,并向其中添加 $model
参数!
我正在尝试做的事情的例子:
Route::get('{model}', 'CrudController@index')->name('{model}.index');
有可能吗,提前致谢
您可以为模型的一组路由添加前缀
From the docs
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Route::macro('crud', function () {
Route::name('{model}.')->group(function () {
Route::get('{model}', 'CrudController@index')->name('index');
Route::get('{model}/create', 'CrudController@create')->name('create');
Route::post('{model}', 'CrudController@store')->name('store');
Route::get('{model}/{id}', 'CrudController@show')->name('show');
Route::get('{model}/{id}/edit', 'CrudController@edit')->name('edit');
Route::match(['PUT', 'PATCH'], '{model}/{id}', 'CrudController@update')->name('update');
Route::delete('{model}/{id}', 'CrudController@destroy')->name('destroy');
});
});
}
}
Result
+-----------+----------------------------+-----------------+------------------------------------------------------------+
| Method | URI | Name | Action |
+-----------+----------------------------+-----------------+------------------------------------------------------------+
| GET|HEAD | {model} | {model}.index | App\Http\Controllers\CrudController@index |
| POST | {model} | {model}.store | App\Http\Controllers\CrudController@store |
| GET|HEAD | {model}/create | {model}.create | App\Http\Controllers\CrudController@create |
| GET|HEAD | {model}/{id} | {model}.show | App\Http\Controllers\CrudController@show |
| PUT|PATCH | {model}/{id} | {model}.update | App\Http\Controllers\CrudController@update |
| DELETE | {model}/{id} | {model}.destroy | App\Http\Controllers\CrudController@destroy |
| GET|HEAD | {model}/{id}/edit | {model}.edit | App\Http\Controllers\CrudController@edit |
+-----------+----------------------------+-----------------+------------------------------------------------------------+
现在您可以访问 example.com/user/create
和 example.com/product/create
,它们都采用相同的控制器方法
希望对您有所帮助
在此示例中,您可以循环一些数字并动态创建一些路由:
for ($i = 0; $i < 5; $i++) {
Route::get('test/' . $i, 'Controller@test_' . $i)->name('test.' . $i);
}
您可以使用 "php artisan route:list" 检查所有添加的路由。 我不建议你这样做,但对于你的情况,你可以在 routes.php 的某个地方定义这样的数组,然后循环:
$models = ['user', 'owner', 'admin'];
foreach ($models as $model) {
Route::get($model, 'CrudController@index')->name($model . '.index');
}
或者您可以在配置中定义该数组(例如在 "config/app.php" 中),例如:
'models' => ['user', 'owner', 'admin'];
并且在 routes.php 中你可以用这个检索它(不要忘记 运行 "php artisan config:cache" 在改变 app.php 之后):
$models = config('app.models');
// foreach loop
你可以获取所有模型名称并循环遍历它们,并在运行时将模型名称添加到路由名称前缀中
loop (model in models)
Route::get("{model}","Atcion")->name("{model}.index")
endloop
希望我的answare对你的项目有所帮助