是的!实际上,MongoDB是Laravel项目的绝佳选择。随着我们开始使用MongoDB进行Laravel开发,我们将通过构建博客应用程序的示例来了解如何构建。
这里提供的安装命令已在MacOS上测试过,但如果你在Windows命令行或Linux机器上工作,不应遇到问题。你需要访问一个已经运行的MongoDB实例。
(你可以边看边编码,也可以从这个GitHub仓库下载完整代码。)
由于Laravel是PHP框架,你需要在计算机上安装PHP。此步骤可能因操作系统而异。有关此步骤的更多详细信息,请参阅官方安装文档。在我们的演练中,你需要在计算机上安装PHP 7.4。
下一步是安装Composer。Composer是PHP的库和依赖管理器,允许你在项目中添加你想要使用的库。
一旦安装了PHP和Composer,你就可以安装Laravel了。
在终端窗口中,输入以下命令
composer global require "laravel/installer"
export PATH=$PATH:$HOME/.composer/vendor/bin
要启动一个Laravel项目,运行以下命令。对于我们的项目,我们将使用 myapp
作为应用程序的名称
laravel new myapp
这将创建一个名为 myapp
的文件夹,其中包含初始的Laravel项目结构。
如果您从 myapp
文件夹运行以下命令,您应该会在 http://localhost:8000 上看到一个运行的Web应用程序和初始的Laravel页面
cd myapp
php artisan serve
在我们可以安装Laravel的MongoDB库之前,我们需要安装MongoDB的PHP扩展。运行以下命令
sudo pecl install mongodb
您还需要确保在您的php.ini文件中启用了mongodb扩展。您的php.ini文件的位置将根据您的操作系统而有所不同。将以下行添加到您的php.ini文件中
extension="mongodb.so"
最后,从您的Laravel项目目录运行以下命令以添加Laravel的MongoDB包
composer require mongodb/laravel-mongodb
为了使Laravel能够与您的MongoDB数据库通信,您需要在Laravel项目的“config\database.php”文件中的“connections”对象下添加您的数据库连接信息,如下例所示
'connections' => [
'mongodb' => [
'driver' => 'mongodb',
'dsn' => env('DB_URI', 'mongodb+srv://username:password@<atlas-cluster-uri>/myappdb?retryWrites=true&w=majority'),
'database' => 'myappdb',
],
请确保包括正确的认证信息。
在 config\database.php 中设置默认数据库连接名称
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/
'default' => env('DB_CONNECTION', 'mongodb'),
如果您的Laravel项目没有自动加载依赖项,您可能还需要在 app.php 文件的服务提供者部分添加以下内容
'providers' => [
/*
* Laravel Framework Service Providers...
*/
MongoDB\Laravel\MongoDBServiceProvider::class,
Laravel的Eloquent库 允许我们从Laravel模型直接映射和执行数据库CRUD操作(创建、读取、更新、删除)。
假设我们有一个名为“posts”的MongoDB集合,"posts"集合中的一个示例文档可能如下所示
{
"title":"First Blog Post",
"body" :"Lorem Ipsum, etc.",
"slug" :"first-blog-post"
}
如果您使用MongoDB Atlas,您可以使用 Atlas控制台 将此文档记录直接插入名为“myappdb”的数据库中。
我们的第一步是创建一个Laravel模型来表示博客文章。从项目目录中,运行以下命令
php artisan make:model Post -mc
这将创建一个 App/Models/Post.php 和一个 App/Http/Controllers/PostController.php 文件。
默认情况下,Artisan创建的模型继承自 Illuminate\Database\Eloquent\Model。
但是,对于MongoDB,我们想要扩展MongoDB Eloquent模型,因此我们需要编辑 App/Models/Post.php。我们的Post模型应该如下所示
namespace App\Models;
use MongoDB\Laravel\Eloquent\Model;
class Post extends Model
{
protected $connection = 'mongodb';
}
请注意,当存储新数据时,Laravel将自动为您在MongoDB数据库中创建集合。默认情况下,集合名称是所使用的模型的复数形式(在本例中是“posts”)。但是,您可以通过在模型上设置collection属性来覆盖它,如下所示
protected $collection = 'blog_posts';
如果您使用多个数据库,您还希望在上面的模型上指定数据库连接名称。
接下来,我们可以使用Post模型从MongoDB数据库中读取和显示我们的博客文章。首先,让我们在PostController中创建一个函数来获取使用slug的博客文章
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function show($slug)
{
return view('post', [
'post' => Post::where('slug', '=', $slug)->first()
]);
}
}
在上面的示例中,我们只是通过其slug名称检索文章。MongoDB Eloquent模型支持所有标准的Eloquent查询方法,但它们还支持特定于MongoDB自身的查询。有关更多详细信息,请参阅 https://github.com/mongodb/laravel-mongodb。
接下来,让我们将以下行添加到routes\web.php文件中,为博客文章创建一个路由
Route::get('/post/{slug}', [PostController::class, 'show']);
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/post/{slug}', [PostController::class, 'show']);
最后,让我们添加一个视图来格式化和样式化博客文章数据以便显示。视图名称需要与我们在控制器中使用的视图名称匹配。我们可以通过创建文件 myapp/resources/views/post.blade.php 并包含以下内容来实现:
<!DOCTYPE html>
<html>
<head>
<title>MyBlog</title>
</head>
<body>
<h1>{{$post->title}}</h1>
<div>{{$post->body}}</div>
</body>
</html>
现在我们可以在 http://localhost:8000/post/first-blog-post 上看到我们的文章。
现在,假设你还想创建一个API,你可以用它来在应用程序中创建博客文章。首先,我们想在PostController中添加一个存储文章的方法
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
class PostController extends Controller
{
public function show($slug)
{
return view('post', [
'post' => Post::where('slug', '=', $slug)->first()
]);
}
public function store(Request $request)
{
$post = new Post;
$post->title = $request->title;
$post->body = $request->body;
$post->slug = $request->slug;
$post->save();
return response()->json(["result" => "ok"], 201);
}
}
接下来,我们想在App\routes\api.php中为文章配置资源路由
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PostController;
Route::resource('posts', PostController::class)->only([
'destroy', 'show', 'store', 'update'
]);
最后,我们可以通过向 http://localhost:8000/api/posts 发送POST请求来测试我们的API。以下是一个使用Postman应用程序的示例
文档
{
"title" : "Second Post",
"body" : "This is my second post.",
"slug" : "second-blog-post"
}
我们可以检查MongoDB数据库,并看到博客文章已被存储
我们还应该能够通过访问 http://localhost:8000/post/second-blog-post 来看到新文章。
你可能已经注意到,如果没有在模型上指定主键,则使用_id属性作为每条记录的主键。
要删除记录,我们可以使用该id来查找并删除记录。由于我们已为文章定义了资源路由,我们只需要在PostController中添加一个destroy()方法
public function destroy($postId)
{
$post = Post::find($postId);
$post->delete();
return response()->json(["result" => "ok"], 200);
}
然后,我们可以向API端点 http://localhost:8000/api/posts/<post_id> 发送DELETE请求来删除文章。
我们已经创建了创建和删除博客文章的API。我们可能还想创建一个用于更新博客文章的API。这与前面的示例非常相似。我们只需要向PostController添加一个方法
public function update(Request $request, $postId)
{
$post = Post::find($postId);
$post->title = $request->title;
$post->body = $request->body;
$post->slug = $request->slug;
$post->save();
return response()->json(["result" => "ok"], 201);
}
现在,我们可以向API端点 http://localhost:8000/api/posts/<post_id> 发送PUT请求,并提供更新后的博客文章内容。
是的。Laravel-MongoDB库很好地集成到Laravel Eloquent模型中,允许开发人员无需额外努力即可使用MongoDB。