Laravel的路由模型绑定如何显式指定?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1457个文字,预计阅读时间需要6分钟。
何时需要显式绑定模型与使用Laravel的隐式绑定?
在Laravel中,隐式绑定模型是自动将Eloquent模型与数据库表关联的一种机制。以下是一些情况下可能需要显式绑定模型:
1. 自定义模型关联:当你需要为模型关联指定不同的表名或别名时。
2.多表继承:当使用多表继承时,可能需要显式指定模型关联的表。
3.模型别名:如果模型名与数据库表名不匹配,或者需要使用别名来避免命名冲突。
4.复杂查询:在执行复杂查询时,可能需要显式指定模型以控制查询逻辑。
以下是一个简短的例子:
php
Route::get('/users', function () { return Model::with('posts')->get();});在这个例子中,Laravel会自动查找`users`表并绑定到`Model`类。如果需要显式绑定,可以这样做:
phpRoute::get('/users', function () { return App\Models\User::with('posts')->get();});
在这里,`App\Models\User`显式地指定了模型类,确保了查询的准确性。
什么时候需要显式绑定模型与使用 Laravel 的隐式绑定?我经常发现的一个常见问题没有适当或足够简单的回答。因此,我认为它没有像应有的那样频繁使用。
在前面的示例中,我们使用了以下隐式路由模型绑定技术。
use App\Models\User;
Route::get('/implicit-binding/{user}', function (User $user) {
return $user;
});
如果我们只想返回已验证的用户怎么办?我通常看到的是以下代码:
use App\Models\User;
Route::get('/implicit-binding/{user}', function (User $user) {
if ($user->email_verified_at != null) {
return $user;
}
abort(404);
});
如果我们可以跳过所有这些并使我们的代码看起来更整洁,那不是很好吗?我们可以通过显式路由模型绑定。
显式路由模型绑定
如果我们知道我们将只返回经过验证的用户,我们可以将模型绑定到特定的 URL 参数。例如,
use App\Models\User;
Route::get('/explicit-binding/{verifiedUser}', function (User $user) {
return $user;
});
在上面的代码中,每次我们verifiedUser在路由中指定时,我们都希望将User模型显式绑定到$user参数。我们可以将其更改为$verifiedUser保持一致,但这不是必需的。
怎么办?Laravel 如何知道只有在用户的电子邮件已通过验证后才应该返回用户?使用我们将创建的以下代码。
Route::bind('verifiedUser', function($value) {
return User::where('id', $value)
->where('email_verified_at', '!=', null)
->firstOrFail();
});
我们使用一种Route::bind方法并将其指定verifiedUser为第一个参数。通过 URL 参数 ( ) 传递的值(verifiedUser将是一个 ID)将作为参数传递$value。从那里,我们可以搜索 等于id和 的$value用户where(‘email_verified_at’, ‘!=’, null)。
我们把这段代码放在哪里?在我们的路由(web.php)文件中?没有。这实际上进入了RouteServiceProvider.这是一个方便的名字,因为它有Route。
在 中RouteServiceProvider,我们将把代码放在方法中boot。
<?php
namespace App\Providers;
use App\Models\User;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
Route::bind('verifiedUser', function($value) {
return User::where('id', $value)
->where('email_verified_at', '!=', null)
->firstOrFail();
});
}
// ...
}
就是这样。刷新你的路由。如果有任何资源包含未经验证的电子邮件地址,您将收到 404 错误,否则您将收到用户详细信息。
本文共计1457个文字,预计阅读时间需要6分钟。
何时需要显式绑定模型与使用Laravel的隐式绑定?
在Laravel中,隐式绑定模型是自动将Eloquent模型与数据库表关联的一种机制。以下是一些情况下可能需要显式绑定模型:
1. 自定义模型关联:当你需要为模型关联指定不同的表名或别名时。
2.多表继承:当使用多表继承时,可能需要显式指定模型关联的表。
3.模型别名:如果模型名与数据库表名不匹配,或者需要使用别名来避免命名冲突。
4.复杂查询:在执行复杂查询时,可能需要显式指定模型以控制查询逻辑。
以下是一个简短的例子:
php
Route::get('/users', function () { return Model::with('posts')->get();});在这个例子中,Laravel会自动查找`users`表并绑定到`Model`类。如果需要显式绑定,可以这样做:
phpRoute::get('/users', function () { return App\Models\User::with('posts')->get();});
在这里,`App\Models\User`显式地指定了模型类,确保了查询的准确性。
什么时候需要显式绑定模型与使用 Laravel 的隐式绑定?我经常发现的一个常见问题没有适当或足够简单的回答。因此,我认为它没有像应有的那样频繁使用。
在前面的示例中,我们使用了以下隐式路由模型绑定技术。
use App\Models\User;
Route::get('/implicit-binding/{user}', function (User $user) {
return $user;
});
如果我们只想返回已验证的用户怎么办?我通常看到的是以下代码:
use App\Models\User;
Route::get('/implicit-binding/{user}', function (User $user) {
if ($user->email_verified_at != null) {
return $user;
}
abort(404);
});
如果我们可以跳过所有这些并使我们的代码看起来更整洁,那不是很好吗?我们可以通过显式路由模型绑定。
显式路由模型绑定
如果我们知道我们将只返回经过验证的用户,我们可以将模型绑定到特定的 URL 参数。例如,
use App\Models\User;
Route::get('/explicit-binding/{verifiedUser}', function (User $user) {
return $user;
});
在上面的代码中,每次我们verifiedUser在路由中指定时,我们都希望将User模型显式绑定到$user参数。我们可以将其更改为$verifiedUser保持一致,但这不是必需的。
怎么办?Laravel 如何知道只有在用户的电子邮件已通过验证后才应该返回用户?使用我们将创建的以下代码。
Route::bind('verifiedUser', function($value) {
return User::where('id', $value)
->where('email_verified_at', '!=', null)
->firstOrFail();
});
我们使用一种Route::bind方法并将其指定verifiedUser为第一个参数。通过 URL 参数 ( ) 传递的值(verifiedUser将是一个 ID)将作为参数传递$value。从那里,我们可以搜索 等于id和 的$value用户where(‘email_verified_at’, ‘!=’, null)。
我们把这段代码放在哪里?在我们的路由(web.php)文件中?没有。这实际上进入了RouteServiceProvider.这是一个方便的名字,因为它有Route。
在 中RouteServiceProvider,我们将把代码放在方法中boot。
<?php
namespace App\Providers;
use App\Models\User;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/home';
/**
* Define your route model bindings, pattern filters, and other route configuration.
*
* @return void
*/
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
Route::bind('verifiedUser', function($value) {
return User::where('id', $value)
->where('email_verified_at', '!=', null)
->firstOrFail();
});
}
// ...
}
就是这样。刷新你的路由。如果有任何资源包含未经验证的电子邮件地址,您将收到 404 错误,否则您将收到用户详细信息。

