tenancy-docs/source/docs/v1/filesystem-tenancy.blade.md
lukinovec f84ab20c5e
Update filesystem tenancy documentation (#201)
* Update filesystem bootstrapper page WIP

* Filesystem bootstrapper rewrite

* Correct writing

* Update 'is not set' to 'is null'

* Update the suffix base comment to be more understandable

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Update storage path helper suffix explanation

* Improve docs page in response to review

* Use the actual suffix instead of the $suffix variable

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Include the file structure tenancy image in the repo

* Use the actual suffix instead of the $suffix variable again

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Specify what `asset()` returns

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Restructure assets section

* Use 'returned' instead of 'retrieved'

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Apply suggestions from code review

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>

* Say that configuring the asset URL changes the helper's behavior

* Update global assets section according to review

* Update disabling asset() section according to suggestion

* Change 'ID' to 'key'

* Update `Storage` facade section

* Specify the asset() output with ASSET_URL configured

Co-authored-by: Samuel Štancl <samuel.stancl@gmail.com>
2022-09-28 15:05:41 +02:00

2.7 KiB

title description extends section
Filesystem Tenancy Filesystem Tenancy with stancl/tenancy — A Laravel multi-database tenancy package that respects your code.. _layouts.documentation content

Filesystem Tenancy

Note: It's important to differentiate between storage_path() and the Storage facade. The Storage facade is what you use to put files into storage, i.e. Storage::disk('local')->put(). storage_path() is used to get the path to the storage directory.

The storage_path() will be suffixed with a directory named config('tenancy.filesystem.suffix_base') . $uuid.

The root of each disk listed in tenancy.filesystem.disks will be suffixed with config('tenancy.filesystem.suffix_base') . $uuid.

However, this alone would cause unwanted behavior. It would work for S3 and similar disks, but for local disks, this would result in /path_to_your_application/storage/app/tenant1e22e620-1cb8-11e9-93b6-8d1b78ac0bcd/. That's not what we want. We want /path_to_your_application/storage/tenant1e22e620-1cb8-11e9-93b6-8d1b78ac0bcd/app/.

That's what the root_override section is for. %storage_path% gets replaced by storage_path() after tenancy has been initialized. The roots of disks listed in the root_override section of the config will be replaced accordingly. All other disks will be simply suffixed with tenancy.filesystem.suffix_base + the tenant UUID.

Since storage_path() will be suffixed, your folder structure will look like this:

The folder structure

If you write to these directories, you will need to create them after you create the tenant. See the docs for PHP's mkdir.

Logs will be saved to storage/logs regardless of any changes to storage_path().

One thing that you will have to change if you use storage similarly to the example on the image is your use of the helper function asset() (that is, if you use it).

You need to make this change to your code:

-  asset("storage/images/products/$product_id.png");
+  tenant_asset("images/products/$product_id.png");

Note that all (public) tenant assets have to be in the app/public/ subdirectory of the tenant's storage directory, as shown in the image above.

This is what the backend of tenant_asset() returns:

// TenantAssetsController
return response()->file(storage_path('app/public/' . $path));

With default filesystem configuration, these two commands are equivalent:

Storage::disk('public')->put($filename, $data);
Storage::disk('local')->put("public/$filename", $data);

If you want to store something globally, simply create a new disk and don't add it to the tenancy.filesystem.disks config.