【问题标题】:Laravel 5 routing: admin, members, publicLaravel 5 路由:管理员、成员、公共
【发布时间】:2016-07-31 22:21:25
【问题描述】:

我的应用应该有管理、成员和公共区域,映射自 admin.mydomain.com、members.mydomain.com 和 www.mydomain.com。文档包含以下有关子域路由的示例:

Route::group(['domain' => '{account}.myapp.com'], function () {
  Route::get('user/{id}', function ($account, $id) {
    //
  });
});

但我不想硬编码或使用其他方式路由中的二级域名(本例中为 myapp.com)。所以我是这样设计的:

Route::pattern('domain', '.+\..+');
Route::group(['namespace' => 'Admin', 'domain' => 'admin.{domain}', 'middleware' => 'auth'],
  function () {
    Route::get('/edit/{id}/{name}', 'MyController@index');
});

然后我做了一个类似的控制器

class MyController extends Controller
{
    function index($id, $name) {
        dd($id);
    }
}

当我浏览 admin.mydomain.com/edit/1/alex 时,我得到输出“admin”。 当然,这是因为我使用 {domain} 作为模式。但我不想在所有管理控制器的每个操作中都接收域作为第一个参数。请帮助我以正确的方式做到这一点。

【问题讨论】:

  • 我没有亲自尝试过,但是您应该可以在控制器和请求本身之间放置一个中间件。您不会将第一个参数作为控制器中的子域,除非您特别希望将其传递给某些/所有控制器。

标签: php laravel routing


【解决方案1】:

一个想法是创建一个删除domain 参数的中间件:

namespace App\Http\Middleware;
use Closure;
class RemoveDomainMiddleware {

  public function handle($request, Closure $next)  {

    $request->route()->forgetParameter('domain');

    return $next($request);
  }
}

然后确保您在app/Http/Kernel.php 中注册中间件:

protected $routeMiddleware = [
    //......
    'domain' => \App\Http\Middleware\RemoveDomainMiddleware::class,
    //.....
];

最后,将中间件添加到您的组中:

Route::group([ 'middleware' => ['domain', 'auth'], 'namespace' => 'Admin', 'domain' => 'admin.{domain}'],
  //.....
});

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2018-09-21
    • 2016-04-21
    相关资源
    最近更新 更多