-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PHPORM-186 GridFS adapter for Filesystem (#2985)
- Loading branch information
Showing
5 changed files
with
383 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
.. _laravel-filesystems: | ||
|
||
================== | ||
GridFS Filesystems | ||
================== | ||
|
||
.. facet:: | ||
:name: genre | ||
:values: tutorial | ||
|
||
.. meta:: | ||
:keywords: php framework, gridfs, code example | ||
|
||
Overview | ||
-------- | ||
|
||
You can use the | ||
`GridFS Adapter for Flysystem <https://flysystem.thephpleague.com/docs/adapter/gridfs/>`__ | ||
to store large files in MongoDB. | ||
GridFS lets you store files of unlimited size in the same database as your data. | ||
|
||
|
||
Configuration | ||
------------- | ||
|
||
Before using the GridFS driver, install the Flysystem GridFS package through the | ||
Composer package manager by running the following command: | ||
|
||
.. code-block:: bash | ||
|
||
composer require league/flysystem-gridfs | ||
|
||
Configure `Laravel File Storage <https://laravel.com/docs/{+laravel-docs-version+}/filesystem>`__ | ||
to use the ``gridfs`` driver in ``config/filesystems.php``: | ||
|
||
.. code-block:: php | ||
|
||
'disks' => [ | ||
'gridfs' => [ | ||
'driver' => 'gridfs', | ||
'connection' => 'mongodb', | ||
// 'database' => null, | ||
// 'bucket' => 'fs', | ||
// 'prefix' => '', | ||
// 'read-only' => false, | ||
// 'throw' => false, | ||
], | ||
], | ||
|
||
You can configure the disk the following settings in ``config/filesystems.php``: | ||
|
||
.. list-table:: | ||
:header-rows: 1 | ||
:widths: 25 75 | ||
|
||
* - Setting | ||
- Description | ||
|
||
* - ``driver`` | ||
- **Required**. Specifies the filesystem driver to use. Must be ``gridfs`` for MongoDB. | ||
|
||
* - ``connection`` | ||
- The database connection used to store jobs. It must be a ``mongodb`` connection. The driver uses the default connection if a connection is not specified. | ||
|
||
* - ``database`` | ||
- Name of the MongoDB database for the GridFS bucket. The driver uses the database of the connection if a database is not specified. | ||
|
||
* - ``bucket`` | ||
- Name or instance of the GridFS bucket. A database can contain multiple buckets identified by their name. Defaults to ``fs``. | ||
|
||
* - ``prefix`` | ||
- Specifies a prefix for the name of the files that are stored in the bucket. Using a distinct bucket is recommended | ||
in order to store the files in a different collection, instead of using a prefix. | ||
The prefix should not start with a leading slash ``/``. | ||
|
||
* - ``read-only`` | ||
- If ``true``, writing to the GridFS bucket is disabled. Write operations will return ``false`` or throw exceptions | ||
depending on the configuration of ``throw``. Defaults to ``false``. | ||
|
||
* - ``throw`` | ||
- If ``true``, exceptions are thrown when an operation cannot be performed. If ``false``, | ||
operations return ``true`` on success and ``false`` on error. Defaults to ``false``. | ||
|
||
You can also use a factory or a service name to create an instance of ``MongoDB\GridFS\Bucket``. | ||
In this case, the options ``connection`` and ``database`` are ignored: | ||
|
||
.. code-block:: php | ||
|
||
use Illuminate\Foundation\Application; | ||
use MongoDB\GridFS\Bucket; | ||
|
||
'disks' => [ | ||
'gridfs' => [ | ||
'driver' => 'gridfs', | ||
'bucket' => static function (Application $app): Bucket { | ||
return $app['db']->connection('mongodb') | ||
->getMongoDB() | ||
->selectGridFSBucket([ | ||
'bucketName' => 'avatars', | ||
'chunkSizeBytes' => 261120, | ||
]); | ||
}, | ||
], | ||
], | ||
|
||
Usage | ||
----- | ||
|
||
A benefit of using Laravel Filesystem is that it provides a common interface | ||
for all the supported file systems. You can use the ``gridfs`` disk in the same | ||
way as the ``local`` disk. | ||
|
||
.. code-block:: php | ||
|
||
$disk = Storage::disk('gridfs'); | ||
|
||
// Write the file "hello.txt" into GridFS | ||
$disk->put('hello.txt', 'Hello World!'); | ||
|
||
// Read the file | ||
echo $disk->get('hello.txt'); // Hello World! | ||
|
||
To learn more Laravel File Storage, see | ||
`Laravel File Storage <https://laravel.com/docs/{+laravel-docs-version+}/filesystem>`__ | ||
in the Laravel documentation. | ||
|
||
Versioning | ||
---------- | ||
|
||
File names in GridFS are metadata in file documents, which are identified by | ||
unique ObjectIDs. If multiple documents share the same file name, they are | ||
considered "revisions" and further distinguished by creation timestamps. | ||
|
||
The Laravel MongoDB integration uses the GridFS Flysystem adapter. It interacts | ||
with file revisions in the following ways: | ||
|
||
- Reading a file reads the last revision of this file name | ||
- Writing a file creates a new revision for this file name | ||
- Renaming a file renames all the revisions of this file name | ||
- Deleting a file deletes all the revisions of this file name | ||
|
||
The GridFS Adapter for Flysystem does not provide access to a specific revision | ||
of a filename. You must use the | ||
`GridFS API <https://www.mongodb.com/docs/php-library/current/tutorial/gridfs/>`__ | ||
if you need to work with revisions, as shown in the following code: | ||
|
||
.. code-block:: php | ||
|
||
// Create a bucket service from the MongoDB connection | ||
/** @var \MongoDB\GridFS\Bucket $bucket */ | ||
$bucket = $app['db']->connection('mongodb')->getMongoDB()->selectGridFSBucket(); | ||
|
||
// Download the last but one version of a file | ||
$bucket->openDownloadStreamByName('hello.txt', ['revision' => -2]) | ||
|
||
.. note:: | ||
|
||
If you use a prefix the Filesystem component, you will have to handle it | ||
by yourself when using the GridFS API directly. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.