【问题标题】:add uri parameter to Route name in laravel在laravel中将uri参数添加到路由名称
【发布时间】:2019-10-05 14:10:46
【问题描述】:

我正在做一个 Laravel 项目,我做了一个简单的 CRUD 系统,但是我有一个小问题

为了在我的项目中生成 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 **/
        });
    });

到目前为止效果很好,但问题是我需要使用 -&gt;name() 并为其添加 $model 参数!

我正在尝试做的示例:

Route::get('{model}', 'CrudController@index')->name('{model}.index');

可以吗?提前谢谢

【问题讨论】:

    标签: php laravel routes crud


    【解决方案1】:

    在此示例中,您可以循环一些数字并动态创建一些路由:

     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 中,您可以使用它来检索它(不要忘记在更改 app.php 后运行“php artisan config:cache”):

     $models = config('app.models');
     // foreach loop
    

    【讨论】:

      【解决方案2】:

      您可以为模型的一组路由添加名称前缀
      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/createexample.com/product/create,它们都采用相同的控制器方法

      希望对你有帮助

      【讨论】:

      • 你的想法不错,但是这种方式行不通,因为很遗憾,Laravel 不支持将参数传递给prefixname,错误:Route [admin.posts.index] not defined.
      猜你喜欢
      • 2017-05-22
      • 2014-09-29
      • 2017-03-24
      • 2019-10-15
      • 2019-05-26
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多