From 173231cf00b64742dc80207cb693bb6c421b5c5b Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov Date: Thu, 8 Apr 2021 16:42:28 -0400 Subject: [PATCH 1/4] Reorganize models and data docs - Split it into 2 separate pages, as there's a LOT of info crammed in one article right now - Add a flowchart diagram to the API process description - A few other small updates and improvements --- docs/.vuepress/config/locales/en/sidebar.js | 3 +- docs/.vuepress/public/en/api_flowchart.png | Bin 0 -> 134996 bytes docs/extend/api.md | 331 ++++++++++++ docs/extend/data.md | 562 -------------------- docs/extend/forms.md | 2 +- docs/extend/frontend.md | 2 +- docs/extend/models.md | 311 +++++++++++ docs/extend/routes.md | 2 +- 8 files changed, 647 insertions(+), 566 deletions(-) create mode 100755 docs/.vuepress/public/en/api_flowchart.png create mode 100644 docs/extend/api.md delete mode 100644 docs/extend/data.md create mode 100644 docs/extend/models.md diff --git a/docs/.vuepress/config/locales/en/sidebar.js b/docs/.vuepress/config/locales/en/sidebar.js index 9691e2907..6c2788f9e 100644 --- a/docs/.vuepress/config/locales/en/sidebar.js +++ b/docs/.vuepress/config/locales/en/sidebar.js @@ -8,7 +8,8 @@ module.exports = { 'start', 'frontend', 'routes', - 'data', + 'models', + 'api', 'distribution' ] }, diff --git a/docs/.vuepress/public/en/api_flowchart.png b/docs/.vuepress/public/en/api_flowchart.png new file mode 100755 index 0000000000000000000000000000000000000000..6eebe4f8682f48b4478fe05f621669fd54613806 GIT binary patch literal 134996 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%0D0&-#U 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 CS0QZx literal 0 HcmV?d00001 diff --git a/docs/extend/api.md b/docs/extend/api.md new file mode 100644 index 000000000..0d978f39a --- /dev/null +++ b/docs/extend/api.md @@ -0,0 +1,331 @@ +# API and Data Flow + +In the [previous article](models.md), we learned how Flarum uses models to interact with data. Here, we'll learn how to get that data from the database to the JSON-API to the frontend, and all the way back again. + +## API Request Lifecycle + +Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical API request: + +![Flarum API Flowchart](/en/api_flowchart.png) + +1. An HTTP request is sent to Flarum's API. Typically, this will come from the Flarum frontend, but external programs can also interact with the API. Flarum's API mostly follows the [JSON:API](https://jsonapi.org/) specification, so accordingly, requests should follow [said specification](https://jsonapi.org/format/#fetching). +2. The request is run through [middleware](middleware.md), and routed to the proper controller. You can learn more about controllers as a whole on our [routes and content documentation](routes.md). Assuming the request is to the API (which is the case for this section), the controller that handles the request will be a subclass of `Flarum\Api\AbstractSerializeController`. +3. Any modifications done by extensions to the controller via the [`ApiController` extender](#extending-api-controllers) are applied. This could entail changing sort, adding includes, changing the serializer, etc. +4. The `$this->data()` method of the controller is called, yielding some raw data that should be returned to the client. Typically, this data will take the form of a Laravel Eloquent model collection or instance, which has been retrieved from the database. That being said, the data could be anything as long as the controller's serializer can process it. Each controller is responsible for implementing its own `data` method. Note that for `PATCH`, `POST`, and `DELETE` requests, `data` will perform the operation in question, and return the modified model instance. +5. That data is run through any pre-serialization callbacks that extensions register via the [`ApiController` extender](#extending-api-controllers). +6. The data is passed through a [serializer](#serializers), which converts it from the backend, database-friendly format to the JSON:API format expected by the frontend. It also attaches any related objects, which are run through their own serializers. As we'll explain below, extensions can [add / override relationships and attributes](#attributes-and-relationships) at the serialization level. +7. The serialized data is returned as a JSON response to the frontend. +8. If the request originated via the Flarum frontend's `Store`, the returned data (including any related objects) will be stored as [frontend models](#frontend-models) in the frontend store. + +## API Endpoints + +We learned how to use models to interact with data, but we still need to get that data from the backend to the frontend. +We do this by writing API Controller [routes](routes.md), which implement logic for API endpoints. + +As per the JSON:API convention, we'll want to add separate endpoints for each operation we support. Common operations are: + +- Listing instances of a model (possibly including searching/filtering) +- Getting a single model instance +- Creating a model instance +- Updating a model instance +- Deleting a single model instance + +We'll go over each type of controler shortly, but once they're written, you can add these five standard endpoints (or a subset of them) using the `Routes` extender: + +```php + (new Extend\Routes('api')) + ->get('/tags', 'tags.index', ListTagsController::class) + ->get('/tags/{id}', 'tags.show', ShowTagController::class) + ->post('/tags', 'tags.create', CreateTagController::class) + ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) + ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) +``` + +::: warning +Paths to API endpoints are not arbitrary! To support interactions with frontend models: + +- The path should either be `/prefix/{id}` for get/update/delete, or `/prefix` for list/create. +- the prefix (`tags` in the example above) must correspond to the JSON:API model type. You'll also use this model type in your serializer's `$type` attribute, and when registering the frontend model (`app.store.models.TYPE = MODEL_CLASS`). +- The methods must match the example above. + +Also, remember that route names (`tags.index`, `tags.show`, etc) must be unique! +::: + +The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. + +### Listing Resources + +For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. + +```php +use Flarum\Api\Controller\AbstractListController; +use Psr\Http\Message\ServerRequestInterface as Request; +use Tobscure\JsonApi\Document; + +class ListTagsController extends AbstractListController +{ + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + return Tag::all(); + } +} +``` + +#### Pagination + +You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: + +```php + // The number of records included by default. + public $limit = 20; + + // The maximum number of records that can be requested. + public $maxLimit = 50; +``` + +You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: + +```php +$limit = $this->extractLimit($request); +$offset = $this->extractOffset($request); + +return Tag::skip($offset)->take($limit); +``` + +To add pagination links to the JSON:API document, use the `Document::addPaginationLinks` method. + +#### Sorting + +You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: + +```php + // The default sort field and order to use. + public $sort = ['name' => 'asc']; + + // The fields that are available to be sorted by. + public $sortFields = ['firstName', 'lastName']; +``` + +You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: + +```php +$sort = $this->extractSort($request); +$query = Tag::query(); + +foreach ($sort as $field => $order) { + $query->orderBy(snake_case($field), $order); +} + +return $query->get(); +``` + +#### Searching and Filtering + +Read our [searching and filtering](search.md) guide for more information! + +### Showing a Resource + +For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. +We'll learn about serializers [in just a bit](#serializers). + + +```php +use Flarum\Api\Controller\AbstractShowController; +use Illuminate\Support\Arr; +use Psr\Http\Message\ServerRequestInterface as Request; +use Tobscure\JsonApi\Document; + +class ShowTagController extends AbstractShowController +{ + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + return Tag::findOrFail($id); + } +} +``` + +### Creating a Resource + +For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: + +```php +use Flarum\Api\Controller\AbstractCreateController; +use Illuminate\Support\Arr; +use Psr\Http\Message\ServerRequestInterface as Request; +use Tobscure\JsonApi\Document; + +class CreateTagController extends AbstractCreateController +{ + public $serializer = TagSerializer::class; + + protected function data(Request $request, Document $document) + { + $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); + + return Tag::create([ + 'name' => Arr::get($attributes, 'name') + ]); + } +} +``` + +### Updating a Resource + +For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. + +### Deleting a Resource + +For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. + +```php +use Flarum\Api\Controller\AbstractDeleteController; +use Illuminate\Support\Arr; +use Psr\Http\Message\ServerRequestInterface as Request; + +class DeleteTagController extends AbstractDeleteController +{ + protected function delete(Request $request) + { + $id = Arr::get($request->getQueryParams(), 'id'); + + Tag::findOrFail($id)->delete(); + } +} +``` + +### Including Relationships + +To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: + +```php + // The relationships that are included by default. + public $include = ['user']; + + // Other relationships that are available to be included. + public $optionalInclude = ['discussions']; +``` + +You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: + +```php +$relations = $this->extractInclude($request); + +return Tag::all()->load($relations); +``` + +### Extending API Controllers + +It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender + +```php +use Flarum\Api\Event\WillGetData; +use Flarum\Api\Controller\ListDiscussionsController; +use Illuminate\Contracts\Events\Dispatcher; + +return [ + (new Extend\ApiController(ListDiscussionsController::class)) + ->setSerializer(MyDiscussionSerializer::class) + ->addInclude('user') + ->addOptionalInclude('posts') + ->setLimit(20) + ->setMaxLimit(50) + ->setSort(['name' => 'asc']) + ->addSortField('firstName') + ->prepareDataQuery(function ($controller) { + // Add custom logic here to modify the controller + // before data queries are executed. + }) +] +``` + +The `ApiController` extender can also be used to adjust data before serialization + +```php +use Flarum\Api\Event\WillSerializeData; +use Flarum\Api\Controller\ListDiscussionsController; +use Illuminate\Contracts\Events\Dispatcher; + +return [ + (new Extend\ApiController(ListDiscussionsController::class)) + ->prepareDataForSerialization(function ($controller, $data, $request, $document) { + $data->load('myCustomRelation'); + }), +] +``` + +## Serializers + +Before we can send our data to the frontend, we need to convert it to JSON:API format so that it can be consumed by the frontend. +You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). +Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. + +A serializer is just a class that converts some data (usually [Eloquent models](models.md#backend-models)) into JSON:API. +Serializers serve as intermediaries between backend and frontend models: see the [model documentation](models.md) for more information. +To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: + +```php +use Flarum\Api\Serializer\AbstractSerializer; +use Flarum\Api\Serializer\UserSerializer; + +class DiscussionSerializer extends AbstractSerializer +{ + protected $type = 'discussions'; + + protected function getDefaultAttributes($discussion) + { + return [ + 'title' => $discussion->title, + ]; + } +} +``` + +### Attributes and Relationships + +You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. + +```php + protected function user($discussion) + { + return $this->hasOne($discussion, UserSerializer::class); + } +``` + +### Extending Serializers + +To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: + +```php +use Flarum\Api\Serializer\UserSerializer; + +return [ + (new Extend\ApiSerializer(UserSerializer::class)) + // One attribute at a time + ->attribute('firstName', function ($serializer, $user, $attributes) { + return $user->first_name + }) + // Multiple modifications at once, more complex logic + ->mutate(function($serializer, $user, $attributes) { + $attributes['someAttribute'] = $user->someAttribute; + if ($serializer->getActor()->can('administrate')) { + $attributes['someDate'] = $serializer->formatDate($user->some_date); + } + + return $attributes; + }) + // API relationships + ->hasOne('phone', PhoneSerializer::class) + ->hasMany('comments', CommentSerializer::class), +] +``` + +### Non-Model Serializers and `ForumSerializer` + +Serializers don't have to correspond to Eloquent models: you can define JSON:API resources for anything. +For instance, Flarum core uses the [`Flarum\Api\Serializer\ForumSerializer`](https://api.docs.flarum.org/php/master/flarum/api/serializer/forumserializer) to send an initial payload to the frontend. This can include settings, whether the current user can perform certain actions, and other data. Many extensions add data to the payload by extending the attributes of `ForumSerializer`. \ No newline at end of file diff --git a/docs/extend/data.md b/docs/extend/data.md deleted file mode 100644 index 399468490..000000000 --- a/docs/extend/data.md +++ /dev/null @@ -1,562 +0,0 @@ -# Working with Data - -Data is the foundation of any forum, so you're going to need to play nice with it if you want your extension to do anything useful. This document runs through how data flows in Flarum, from the database to the JSON-API to the frontend, and all the way back again. - -Flarum makes use of [Laravel's Database component](https://laravel.com/docs/database). You should familiarize yourself with it before proceeding, as it is assumed as prior knowledge in the following documentation. - - -## API Request Lifecycle - -Before we go into detail about how to extend Flarum's data API, it's worth thinking about the lifecycle of a typical data request: - -1. An HTTP request is sent to Flarum's API. Typically, this will come from the Flarum frontend, but external programs can also interact with the API. Flarum's API mostly follows the [JSON:API](https://jsonapi.org/) specification, so accordingly, requests should follow [said specification](https://jsonapi.org/format/#fetching). -2. The request is run through [middleware](middleware.md), and routed to the proper controller. You can learn more about controllers as a whole on our [routes and content documentation](routes.md). Assuming the request is to the API (which is the case for this section), the controller that handles the request will be a subclass of `Flarum\Api\AbstractSerializeController`. -3. Any modifications done by extensions to the controller via the [`ApiController` extender](#extending-api-controllers) are applied. This could entail changing sort, adding includes, changing the serializer, etc. -4. The `$this->data()` method of the controller is called, yielding some raw data that should be returned to the client. Typically, this data will take the form of a Laravel Eloquent model collection or instance, which has been retrieved from the database. That being said, the data could be anything as long as the controller's serializer can process it. Each controller is responsible for implementing its own `data` method. Note that for `PATCH`, `POST`, and `DELETE` requests, `data` will perform the operation in question, and return the modified model instance. -5. That data is run through any pre-serialization callbacks that extensions register via the [`ApiController` extender](#extending-api-controllers). -6. The data is passed through a [serializer](#serializers), which converts it from the backend, database-friendly format to the JSON:API format expected by the frontend. It also attaches any related objects, which are run through their own serializers. As we'll explain below, extensions can [add / override relationships and attributes](#attributes-and-relationships) at the serialization level. -7. The serialized data is returned as a JSON response to the frontend. -8. If the request originated via the Flarum frontend's `Store`, the returned data (including any related objects) will be stored as [frontend models](#frontend-models) in the frontend store. - -## Migrations - -If we want to use a custom model, or add attributes to an existing one, we will need to modify the database to add tables / columns. We do this via migrations. - -Migrations are like version control for your database, allowing you to easily modify Flarum's database schema in a safe way. Flarum's migrations are very similar to [Laravel's](https://laravel.com/docs/migrations), although there are some differences. - -Migrations live inside a folder suitably named `migrations` in your extension's directory. Migrations should be named in the format `YYYY_MM_DD_HHMMSS_snake_case_description` so that they are listed and run in order of creation. - -### Migration Structure - -In Flarum, migration files should **return an array** with two functions: `up` and `down`. The `up` function is used to add new tables, columns, or indexes to your database, while the `down` function should reverse these operations. These functions receive an instance of the [Laravel schema builder](https://laravel.com/docs/8.x/migrations#creating-tables) which you can use to alter the database schema: - -```php - function (Builder $schema) { - // up migration - }, - 'down' => function (Builder $schema) { - // down migration - } -]; -``` - -For common tasks like creating a table, or adding columns to an existing table, Flarum provides some helpers which construct this array for you, and take care of writing the `down` migration logic while they're at it. These are available as static methods on the `Flarum\Database\Migration` class. - -### Migration Lifecycle - -Migrations are applied when the extension is enabled for the first time or when it's enabled and there are some outstanding migrations. The executed migrations are logged in the database, and when some are found in the migrations folder of an extension that aren't logged as completed yet, they will be executed. - -Migrations can also be manually applied with `php flarum migrate` which is also needed to update the migrations of an already enabled extension. To undo the changes applied by migrations, you need to click "Uninstall" next to an extension in the Admin UI, or you need to use the `php flarum migrate:reset` command. Nothing can break by running `php flarum migrate` again if you've already migrated - executed migrations will not run again. - -There are currently no composer-level hooks for managing migrations at all (i.e. updating an extension with `composer update` will not run its outstanding migrations). - -### Creating Tables - -To create a table, use the `Migration::createTable` helper. The `createTable` helper accepts two arguments. The first is the name of the table, while the second is a `Closure` which receives a `Blueprint` object that may be used to define the new table: - -```php -use Flarum\Database\Migration; -use Illuminate\Database\Schema\Blueprint; - -return Migration::createTable('users', function (Blueprint $table) { - $table->increments('id'); -}); -``` - -When creating the table, you may use any of the schema builder's [column methods](https://laravel.com/docs/8.x/migrations#creating-columns) to define the table's columns. - -### Renaming Tables - -To rename an existing database table, use the `Migration::renameTable` helper: - -```php -return Migration::renameTable($from, $to); -``` - -### Creating/Dropping Columns - -To add columns to an existing table, use the `Migration::addColumns` helper. The `addColumns` helper accepts two arguments. The first is the name of the table. The second is an array of column definitions, with the key being the column name. The value of each item is an array with the column definitions, as understood by Laravel's `Illuminate\Database\Schema\Blueprint::addColumn()` method. The first value is the column type, and any other keyed values are passed through to `addColumn`. - -```php -return Migration::addColumns('users', [ - 'email' => ['string', 'length' => 255, 'nullable' => true], - 'discussion_count' => ['integer', 'unsigned' => true] -]); -``` - -To drop columns from an existing table, use the `Migration::dropColumns` helper, which accepts the same arguments as the `addColumns` helper. Just like when dropping tables, you should specify the full column definitions so that the migration can be rolled back cleanly. - -### Renaming Columns - -To rename columns, use the `Migration::renameColumns` helper. The `renameColumns` helper accepts two arguments. The first is the name of the table, while the second is an array of column names to rename: - -```php -return Migration::renameColumns('users', ['from' => 'to']); -``` - -### Data Migrations (Advanced) - -A migration doesn't have to change database structure: you could use a migration to insert, update, or delete rows in a table. For instance, you could use migrations to assign [custom permissions](permissions.md) to groups other than Admin, or provide some initial data for a custom Eloquent model. Since you have access to the [Eloquent Schema Builder](https://laravel.com/docs/8.x/migrations#creating-tables), anything is possible (although of course, you should be extremely cautious and test your extension extensively). - -Data migrations are the recommended way to specify default settings and permissions. - -## Backend Models - -With all your snazzy new database tables and columns, you're going to want a way to access the data in both the backend and the frontend. On the backend it's pretty straightforward – you just need to be familiar with [Eloquent](https://laravel.com/docs/8.x/eloquent). - -### Adding New Models - -If you've added a new table, you'll need to set up a new model for it. Rather than extending the Eloquent `Model` class directly, you should extend `Flarum\Database\AbstractModel` which provides a bit of extra functionality to allow your models to be extended by other extensions. - - - -### Relationships - -You can also add [relationships](https://laravel.com/docs/8.x/eloquent-relationships) to existing models using the `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`and `relationship` methods on the `Model` extender. The first argument is the relationship name; the rest of the arguments are passed into the equivalent method on the model, so you can specify the related model name and optionally override table and key names: - -```php - new Extend\Model(User::class) - ->hasOne('phone', 'App\Phone', 'foreign_key', 'local_key') - ->belongsTo('country', 'App\Country', 'foreign_key', 'other_key') - ->hasMany('comment', 'App\Comment', 'foreign_key', 'local_key') - ->belongsToMany('role', 'App\Role', 'role_user', 'user_id', 'role_id') -``` - -Those 4 should cover the majority of relations, but sometimes, finer-grained customization is needed (e.g. `morphMany`, `morphToMany`, and `morphedByMany`). ANY valid Eloquent relationship is supported by the `relationship` method: - -```php - new Extend\Model(User::class) - ->relationship('mobile', 'App\Phone', function ($user) { - // Return any Eloquent relationship here. - return $user->belongsToMany(Discussion::class, 'recipients') - ->withTimestamps() - ->wherePivot('removed_at', null); - }) -``` - - -## Serializers - -The next step is to expose your new data in Flarum's JSON:API so that it can be consumed by the frontend. You should become familiar with the [JSON:API specification](https://jsonapi.org/format/). Flarum's JSON:API layer is powered by the [tobscure/json-api](https://github.com/tobscure/json-api) library. - -JSON:API resources are defined by **serializers**. To define a new resource type, create a new serializer class extending `Flarum\Api\Serializer\AbstractSerializer`. You must specify a resource `$type` and implement the `getDefaultAttributes` method which accepts the model instance as its only argument: - -```php -use Flarum\Api\Serializer\AbstractSerializer; -use Flarum\Api\Serializer\UserSerializer; - -class DiscussionSerializer extends AbstractSerializer -{ - protected $type = 'discussions'; - - protected function getDefaultAttributes($discussion) - { - return [ - 'title' => $discussion->title, - ]; - } -} -``` - -### Attributes and Relationships - -You can also specify relationships for your resource. Simply create a new method with the same name as the relation on your model, and return a call to `hasOne` or `hasMany` depending on the nature of the relationship. You must pass in the model instance and the name of the serializer to use for the related resources. - -```php - protected function user($discussion) - { - return $this->hasOne($discussion, UserSerializer::class); - } -``` - -To add **attributes** and **relationships** to an existing resource type, use the `ApiSerializer` extender: - -```php -use Flarum\Api\Serializer\UserSerializer; - -return [ - (new Extend\ApiSerializer(UserSerializer::class)) - // One attribute at a time - ->attribute('firstName', function ($serializer, $user, $attributes) { - return $user->first_name - }) - // Multiple modifications at once, more complex logic - ->mutate(function($serializer, $user, $attributes) { - $attributes['someAttribute'] = $user->someAttribute; - if ($serializer->getActor()->can('administrate')) { - $attributes['someDate'] = $serializer->formatDate($user->some_date); - } - - return $attributes; - }) - // API relationships - ->hasOne('phone', PhoneSerializer::class) - ->hasMany('comments', CommentSerializer::class), -] -``` - -## API Endpoints - -Once you have defined your resources in serializers, you will need to expose them as API endpoints by adding routes and controllers. - -Following JSON-API conventions, you can add five standard routes for your resource type using the `Routes` extender: - -```php - (new Extend\Routes('api')) - ->get('/tags', 'tags.index', ListTagsController::class) - ->get('/tags/{id}', 'tags.show', ShowTagController::class) - ->post('/tags', 'tags.create', CreateTagController::class) - ->patch('/tags/{id}', 'tags.update', UpdateTagController::class) - ->delete('/tags/{id}', 'tags.delete', DeleteTagController::class) -``` - -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement your JSON-API resources. - -### Listing Resources - -For the controller that lists your resource, extend the `Flarum\Api\Controller\AbstractListController` class. At a minimum, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a collection of models. The `data` method accepts the `Request` object and the tobscure/json-api `Document`. - -```php -use Flarum\Api\Controller\AbstractListController; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ListTagsController extends AbstractListController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - return Tag::all(); - } -} -``` - -### Showing a Resource - -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model: - -```php -use Flarum\Api\Controller\AbstractShowController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class ShowTagController extends AbstractShowController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - return Tag::findOrFail($id); - } -} -``` - -### Creating a Resource - -For the controller that creates a resource, extend the `Flarum\Api\Controller\AbstractCreateController` class. This is the same as the show controller, except the response status code will automatically be set to `201 Created`. You can access the incoming JSON:API document body via `$request->getParsedBody()`: - -```php -use Flarum\Api\Controller\AbstractCreateController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; -use Tobscure\JsonApi\Document; - -class CreateTagController extends AbstractCreateController -{ - public $serializer = TagSerializer::class; - - protected function data(Request $request, Document $document) - { - $attributes = Arr::get($request->getParsedBody(), 'data.attributes'); - - return Tag::create([ - 'name' => Arr::get($attributes, 'name') - ]); - } -} -``` - -### Updating a Resource - -For the controller that updates a resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the create controller, you can access the incoming JSON:API document body via `$request->getParsedBody()`. - -### Deleting a Resource - -For the controller that deletes a resource, extend the `Flarum\Api\Controller\AbstractDeleteController` class. You only need to implement a `delete` method which enacts the deletion. The controller will automatically return an empty `204 No Content` response. - -```php -use Flarum\Api\Controller\AbstractDeleteController; -use Illuminate\Support\Arr; -use Psr\Http\Message\ServerRequestInterface as Request; - -class DeleteTagController extends AbstractDeleteController -{ - protected function delete(Request $request) - { - $id = Arr::get($request->getQueryParams(), 'id'); - - Tag::findOrFail($id)->delete(); - } -} -``` - -### Including Relationships - -To include relationships when **listing**, **showing**, or **creating** your resource, specify them in the `$include` and `$optionalInclude` properties on your controller: - -```php - // The relationships that are included by default. - public $include = ['user']; - - // Other relationships that are available to be included. - public $optionalInclude = ['discussions']; -``` - -You can then get a list of included relationships using the `extractInclude` method. This can be used to eager-load the relationships on your models before they are serialized: - -```php -$relations = $this->extractInclude($request); - -return Tag::all()->load($relations); -``` - -### Pagination - -You can allow the number of resources being **listed** to be customized by specifying the `limit` and `maxLimit` properties on your controller: - -```php - // The number of records included by default. - public $limit = 20; - - // The maximum number of records that can be requested. - public $maxLimit = 50; -``` - -You can then extract pagination information from the request using the `extractLimit` and `extractOffset` methods: - -```php -$limit = $this->extractLimit($request); -$offset = $this->extractOffset($request); - -return Tag::skip($offset)->take($limit); -``` - -To add pagination links to the JSON:API document, use the [`Document::addPaginationLinks` method](https://github.com/tobscure/json-api#meta--links). - -### Sorting - -You can allow the sort order of resources being **listed** to be customized by specifying the `sort` and `sortField` properties on your controller: - -```php - // The default sort field and order to use. - public $sort = ['name' => 'asc']; - - // The fields that are available to be sorted by. - public $sortFields = ['firstName', 'lastName']; -``` - -You can then extract sorting information from the request using the `extractSort` method. This will return an array of sort criteria which you can apply to your query: - -```php -$sort = $this->extractSort($request); -$query = Tag::query(); - -foreach ($sort as $field => $order) { - $query->orderBy(snake_case($field), $order); -} - -return $query->get(); -``` - -### Extending API Controllers - -It is possible to customize all of these options on _existing_ API controllers too via the `ApiController` extender - -```php -use Flarum\Api\Event\WillGetData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->setSerializer(MyDiscussionSerializer::class) - ->addInclude('user') - ->addOptionalInclude('posts') - ->setLimit(20) - ->setMaxLimit(50) - ->setSort(['name' => 'asc']) - ->addSortField('firstName') - ->prepareDataQuery(function ($controller) { - // Add custom logic here to modify the controller - // before data queries are executed. - }) -] -``` - -The `ApiController` extendercan also be used to adjust data before serialization - -```php -use Flarum\Api\Event\WillSerializeData; -use Flarum\Api\Controller\ListDiscussionsController; -use Illuminate\Contracts\Events\Dispatcher; - -return [ - (new Extend\ApiController(ListDiscussionsController::class)) - ->prepareDataForSerialization(function ($controller, $data, $request, $document) { - $data->load('myCustomRelation'); - }), -] -``` - -## Frontend Models - -Now that you have exposed your data in Flarum's JSON:API, it's finally time to bring it to life and consume it on the frontend. - -### Fetching Data - -Flarum's frontend contains a local data `store` which provides an interface to interact with the JSON:API. You can retrieve resource(s) from the API using the `find` method, which always returns a promise: - -```js -// GET /api/discussions?sort=createdAt -app.store.find('discussions', {sort: 'createdAt'}).then(console.log); - -// GET /api/discussions/123 -app.store.find('discussions', 123).then(console.log); -``` - -Once resources have been loaded, they will be cached in the store so you can access them again without hitting the API using the `all` and `getById` methods: - -```js -const discussions = app.store.all('discussions'); -const discussion = app.store.getById('discussions', 123); -``` - -The store wraps the raw API resource data in model objects which make it a bit easier to work with. Attributes and relationships can be accessed via pre-defined instance methods: - -```js -const id = discussion.id(); -const title = discussion.title(); -const posts = discussion.posts(); // array of Post models -``` - -You can learn more about the store in our [API documentation](https://api.docs.flarum.org/js/master/class/src/common/store.js~store). - -### Adding New Models - -If you have added a new resource type, you will need to define a new model for it. Models must extend the `Model` class and re-define the resource attributes and relationships: - -```js -import Model from 'flarum/common/Model'; - -export default class Tag extends Model { - title = Model.attribute('title'); - createdAt = Model.attribute('createdAt', Model.transformDate); - parent = Model.hasOne('parent'); - discussions = Model.hasMany('discussions'); -} -``` - -You must then register your new model with the store: - -```js -app.store.models.tags = Tag; -``` - - - -### Extending Models - -To add attributes and relationships to existing models, modify the model class prototype: - -```js -Discussion.prototype.user = Model.hasOne('user'); -Discussion.prototype.posts = Model.hasMany('posts'); -Discussion.prototype.slug = Model.attribute('slug'); -``` - - - -### Saving Resources - -To send data back through the API, call the `save` method on a model instance. This method returns a Promise which resolves with the same model instance: - -```js -discussion.save({ title: 'Hello, world!' }).then(console.log); -``` - -You can also save relationships by passing them in a `relationships` key. For has-one relationships, pass a single model instance. For has-many relationships, pass an array of model instances. - -```js -user.save({ - relationships: { - groups: [ - store.getById('groups', 1), - store.getById('groups', 2) - ] - } -}) -``` - -### Creating New Resources - -To create a new resource, create a new model instance for the resource type using the store's `createRecord` method, then `save` it: - -```js -const discussion = app.store.createRecord('discussions'); - -discussion.save({ title: 'Hello, world!' }).then(console.log); -``` - -### Deleting Resources - -To delete a resource, call the `delete` method on a model instance. This method returns a Promise: - -```js -discussion.delete().then(done); -``` diff --git a/docs/extend/forms.md b/docs/extend/forms.md index b20211644..803793b17 100644 --- a/docs/extend/forms.md +++ b/docs/extend/forms.md @@ -102,7 +102,7 @@ const value = Stream(); ## Making Requests -In our [models and data](data.md) documentation, you learned how to work with models, and save model creation, changes, and deletion to the database via the Store util, which is just a wrapper around Flarum's request system, which itself is just a wrapper around [Mithril's request system](https://mithril.js.org/request.html). +In our [models](models.md) documentation, you learned how to work with models, and save model creation, changes, and deletion to the database via the Store util, which is just a wrapper around Flarum's request system, which itself is just a wrapper around [Mithril's request system](https://mithril.js.org/request.html). Flarum's request system is available globally via `app.request(options)`, and has the following differences from Mithril's `m.request(options)`: diff --git a/docs/extend/frontend.md b/docs/extend/frontend.md index 43f117070..f72c5d5dc 100644 --- a/docs/extend/frontend.md +++ b/docs/extend/frontend.md @@ -106,7 +106,7 @@ src/forum/ └── index.js ``` -`components`, `models`, and `utils` are directories that contain files where you can define custom [components](#components), [models](data.md#frontend-models), and reusable util helper functions. +`components`, `models`, and `utils` are directories that contain files where you can define custom [components](#components), [models](models.md#frontend-models), and reusable util helper functions. Please note that this is all simply a recommendation: there's nothing forcing you to use this particular file structure (or any other file structure). The most important file here is `index.js`: everything else is just extracting classes and functions into their own files. Let's go over a typical `index.js` file structure: diff --git a/docs/extend/models.md b/docs/extend/models.md new file mode 100644 index 000000000..bb6456fda --- /dev/null +++ b/docs/extend/models.md @@ -0,0 +1,311 @@ +# Models and Migrations + +At the foundation, any forum revolves around data: users provide discussions, posts, profile information, etc. Our job as forum developers is to provide a great experience for creating, reading, updating, and deleting this data. This article will discuss how Flarum stores and access data. In the [next article](api.md), we'll follow up on this by explaining how data flows through the API. + +Flarum makes use of [Laravel's Database component](https://laravel.com/docs/database). You should familiarize yourself with it before proceeding, as it is assumed as prior knowledge in the following documentation. + +## The Big Picture + +Before we delve into implementation details, let's define some key concepts. + +**Migrations** allow you to modify the database. If you're adding a new table, defining a new relationship, adding a new column to a table, or making some other DB structural change, you'll need to use a migration. + +**Models** provide a convenient, code-based API for creating, reading, updating, and deleting data. On the backend, they are represented by PHP classes, and are used to interact with the MySQL database. On the frontend, they are represented by JS classes, and are used to interact with the [JSON:API](api.md), which we'll discuss in the next article. + +## Migrations + +If we want to use a custom model, or add attributes to an existing one, we will need to modify the database to add tables / columns. We do this via migrations. + +Migrations are like version control for your database, allowing you to easily modify Flarum's database schema in a safe way. Flarum's migrations are very similar to [Laravel's](https://laravel.com/docs/migrations), although there are some differences. + +Migrations live inside a folder suitably named `migrations` in your extension's directory. Migrations should be named in the format `YYYY_MM_DD_HHMMSS_snake_case_description` so that they are listed and run in order of creation. + +### Migration Structure + +In Flarum, migration files should **return an array** with two functions: `up` and `down`. The `up` function is used to add new tables, columns, or indexes to your database, while the `down` function should reverse these operations. These functions receive an instance of the [Laravel schema builder](https://laravel.com/docs/6.x/migrations#creating-tables) which you can use to alter the database schema: + +```php + function (Builder $schema) { + // up migration + }, + 'down' => function (Builder $schema) { + // down migration + } +]; +``` + +For common tasks like creating a table, or adding columns to an existing table, Flarum provides some helpers which construct this array for you, and take care of writing the `down` migration logic while they're at it. These are available as static methods on the [`Flarum\Database\Migration`](https://api.docs.flarum.org/php/master/flarum/database/migration) class. + +### Migration Lifecycle + +Migrations are applied when the extension is enabled for the first time or when it's enabled and there are some outstanding migrations. The executed migrations are logged in the database, and when some are found in the migrations folder of an extension that aren't logged as completed yet, they will be executed. + +Migrations can also be manually applied with `php flarum migrate` which is also needed to update the migrations of an already enabled extension. To undo the changes applied by migrations, you need to click "Uninstall" next to an extension in the Admin UI, or you need to use the `php flarum migrate:reset` command. Nothing can break by running `php flarum migrate` again if you've already migrated - executed migrations will not run again. + +There are currently no composer-level hooks for managing migrations at all (i.e. updating an extension with `composer update` will not run its outstanding migrations). + +### Creating Tables + +To create a table, use the `Migration::createTable` helper. The `createTable` helper accepts two arguments. The first is the name of the table, while the second is a `Closure` which receives a `Blueprint` object that may be used to define the new table: + +```php +use Flarum\Database\Migration; +use Illuminate\Database\Schema\Blueprint; + +return Migration::createTable('users', function (Blueprint $table) { + $table->increments('id'); +}); +``` + +When creating the table, you may use any of the schema builder's [column methods](https://laravel.com/docs/6.x/migrations#creating-columns) to define the table's columns. + +### Renaming Tables + +To rename an existing database table, use the `Migration::renameTable` helper: + +```php +return Migration::renameTable($from, $to); +``` + +### Creating/Dropping Columns + +To add columns to an existing table, use the `Migration::addColumns` helper. The `addColumns` helper accepts two arguments. The first is the name of the table. The second is an array of column definitions, with the key being the column name. The value of each item is an array with the column definitions, as understood by Laravel's `Illuminate\Database\Schema\Blueprint::addColumn()` method. The first value is the column type, and any other keyed values are passed through to `addColumn`. + +```php +return Migration::addColumns('users', [ + 'email' => ['string', 'length' => 255, 'nullable' => true], + 'discussion_count' => ['integer', 'unsigned' => true] +]); +``` + +To drop columns from an existing table, use the `Migration::dropColumns` helper, which accepts the same arguments as the `addColumns` helper. Just like when dropping tables, you should specify the full column definitions so that the migration can be rolled back cleanly. + +### Renaming Columns + +To rename columns, use the `Migration::renameColumns` helper. The `renameColumns` helper accepts two arguments. The first is the name of the table, while the second is an array of column names to rename: + +```php +return Migration::renameColumns('users', ['from' => 'to']); +``` + +### Default Settings and Permissions + +Data migrations are the recommended way to specify default settings and permissions: + +```php +return Migration::addSettings([ + 'foo' => 'bar', +]); +``` + +and + +```php +use Flarum\Group\Group; + +return Migration::addPermissions([ + 'some.permission' => Group::MODERATOR_ID +]); +``` + +Note that this should only be used then adding **new** permissions or settings. If you use these helpers, and the settings/permissions already exist, you'll end up overriding those settings on all sites where they have been manually configured. + +### Data Migrations (Advanced) + +A migration doesn't have to change database structure: you could use a migration to insert, update, or delete rows in a table. The migration helpers that add [defaults for settings/permissions](#default-settings-and-permissions) are just one case of this. For instance, you could use migrations to create default instances of a new model your extension adds. Since you have access to the [Eloquent Schema Builder](https://laravel.com/docs/6.x/migrations#creating-tables), anything is possible (although of course, you should be extremely cautious and test your extension extensively). + +## Backend Models + +With all your snazzy new database tables and columns, you're going to want a way to access the data in both the backend and the frontend. On the backend it's pretty straightforward – you just need to be familiar with [Eloquent](https://laravel.com/docs/6.x/eloquent). + +### Adding New Models + +If you've added a new table, you'll need to set up a new model for it. Rather than extending the Eloquent `Model` class directly, you should extend `Flarum\Database\AbstractModel` which provides a bit of extra functionality to allow your models to be extended by other extensions. See the Eloquent docs linked above for examples of what your model class should look like. + + + +### Relationships + +You can also add [relationships](https://laravel.com/docs/6.x/eloquent-relationships) to existing models using the `hasOne`, `belongsTo`, `hasMany`, `belongsToMany`and `relationship` methods on the `Model` extender. The first argument is the relationship name; the rest of the arguments are passed into the equivalent method on the model, so you can specify the related model name and optionally override table and key names: + +```php + new Extend\Model(User::class) + ->hasOne('phone', 'App\Phone', 'foreign_key', 'local_key') + ->belongsTo('country', 'App\Country', 'foreign_key', 'other_key') + ->hasMany('comment', 'App\Comment', 'foreign_key', 'local_key') + ->belongsToMany('role', 'App\Role', 'role_user', 'user_id', 'role_id') +``` + +Those 4 should cover the majority of relations, but sometimes, finer-grained customization is needed (e.g. `morphMany`, `morphToMany`, and `morphedByMany`). ANY valid Eloquent relationship is supported by the `relationship` method: + +```php + new Extend\Model(User::class) + ->relationship('mobile', 'App\Phone', function ($user) { + // Return any Eloquent relationship here. + return $user->belongsToMany(Discussion::class, 'recipients') + ->withTimestamps() + ->wherePivot('removed_at', null); + }) +``` + +## Frontend Models + +Flarum provides a simple toolset for working with data in the frontend in the form of frontend models. There's 2 main concepts to be aware of: + +- Model instances are objects that represent a record from the database. You can use their methods to get attributes and relationships of that record, save changes to the record, or delete the record. +- The Store is a util class that caches all the models we've fetched from the API, links related models together, and provides methods for getting model instances from both the API and the local cache. + +### Fetching Data + +Flarum's frontend contains a local data `store` which provides an interface to interact with the JSON:API. You can retrieve resource(s) from the API using the `find` method, which always returns a promise: + +```js +// GET /api/discussions?sort=createdAt +app.store.find('discussions', {sort: 'createdAt'}).then(console.log); + +// GET /api/discussions/123 +app.store.find('discussions', 123).then(console.log); +``` + +Once resources have been loaded, they will be cached in the store so you can access them again without hitting the API using the `all` and `getById` methods: + +```js +const discussions = app.store.all('discussions'); +const discussion = app.store.getById('discussions', 123); +``` + +The store wraps the raw API resource data in model objects which make it a bit easier to work with. Attributes and relationships can be accessed via pre-defined instance methods: + +```js +const id = discussion.id(); +const title = discussion.title(); +const posts = discussion.posts(); // array of Post models +``` + +You can learn more about the store in our [API documentation](https://api.docs.flarum.org/js/master/class/src/common/store.js~store). + +### Adding New Models + +If you have added a new resource type, you will need to define a new model for it. Models must extend the `Model` class and re-define the resource attributes and relationships: + +```js +import Model from 'flarum/common/Model'; + +export default class Tag extends Model { + title = Model.attribute('title'); + createdAt = Model.attribute('createdAt', Model.transformDate); + parent = Model.hasOne('parent'); + discussions = Model.hasMany('discussions'); +} +``` + +You must then register your new model with the store: + +```js +app.store.models.tags = Tag; +``` + + + +### Extending Models + +To add attributes and relationships to existing models, modify the model class prototype: + +```js +Discussion.prototype.user = Model.hasOne('user'); +Discussion.prototype.posts = Model.hasMany('posts'); +Discussion.prototype.slug = Model.attribute('slug'); +``` + + + +### Saving Resources + +To send data back through the API, call the `save` method on a model instance. This method returns a Promise which resolves with the same model instance: + +```js +discussion.save({ title: 'Hello, world!' }).then(console.log); +``` + +You can also save relationships by passing them in a `relationships` key. For has-one relationships, pass a single model instance. For has-many relationships, pass an array of model instances. + +```js +user.save({ + relationships: { + groups: [ + store.getById('groups', 1), + store.getById('groups', 2) + ] + } +}) +``` + +### Creating New Resources + +To create a new resource, create a new model instance for the resource type using the store's `createRecord` method, then `save` it: + +```js +const discussion = app.store.createRecord('discussions'); + +discussion.save({ title: 'Hello, world!' }).then(console.log); +``` + +### Deleting Resources + +To delete a resource, call the `delete` method on a model instance. This method returns a Promise: + +```js +discussion.delete().then(done); +``` + +## Backend Models vs Frontend Models + +Often, backend and frontend models will have similar attributes and relationships. This is a good pattern to follow, but isn't always true. + +The attributes and relationships of backend models are based on the **database**. Each column in the model's table will map to an attribute on the backend model. + +The attributes and relationships of frontend models are based on the output of [**API Serializers**](api.md). These will be covered more in depth in the next article, but it's worth that a serializer could output all, any, or none of the backend model's attributes, and the names under which they're accessed might be different in the backend and frontend. + +Furthermore, when you save a backend model, that data is being written directly to the database. But when you save a frontend model, all you're doing is triggering a request to the API. In the [next article](api.md), we'll learn how to handle these requests in the backend, so your requested changes are actually reflected in the database. \ No newline at end of file diff --git a/docs/extend/routes.md b/docs/extend/routes.md index c0eebb2c7..a4579b46d 100644 --- a/docs/extend/routes.md +++ b/docs/extend/routes.md @@ -134,7 +134,7 @@ class HelloWorldController implements RequestHandlerInterface ### API Controllers -The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement new JSON-API resources. See [Working with Data](/extend/data.md) for more information. +The `Flarum\Api\Controller` namespace contains a number of abstract controller classes that you can extend to easily implement new JSON-API resources. See [Working with Data](api.md) for more information. ## Frontend Routes From a03f5c0fd2de8d3b9a5b09a80eeb2ab1bf4d5f3f Mon Sep 17 00:00:00 2001 From: David Wheatley Date: Wed, 28 Apr 2021 19:43:10 +0100 Subject: [PATCH 2/4] Update docs/extend/models.md --- docs/extend/models.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/extend/models.md b/docs/extend/models.md index bb6456fda..1e4152dc9 100644 --- a/docs/extend/models.md +++ b/docs/extend/models.md @@ -306,6 +306,6 @@ Often, backend and frontend models will have similar attributes and relationship The attributes and relationships of backend models are based on the **database**. Each column in the model's table will map to an attribute on the backend model. -The attributes and relationships of frontend models are based on the output of [**API Serializers**](api.md). These will be covered more in depth in the next article, but it's worth that a serializer could output all, any, or none of the backend model's attributes, and the names under which they're accessed might be different in the backend and frontend. +The attributes and relationships of frontend models are based on the output of [API Serializers](api.md). These will be covered more in depth in the next article, but it's worth that a serializer could output all, any, or none of the backend model's attributes, and the names under which they're accessed might be different in the backend and frontend. -Furthermore, when you save a backend model, that data is being written directly to the database. But when you save a frontend model, all you're doing is triggering a request to the API. In the [next article](api.md), we'll learn how to handle these requests in the backend, so your requested changes are actually reflected in the database. \ No newline at end of file +Furthermore, when you save a backend model, that data is being written directly to the database. But when you save a frontend model, all you're doing is triggering a request to the API. In the [next article](api.md), we'll learn how to handle these requests in the backend, so your requested changes are actually reflected in the database. From 3686b5d45049dd5b47746217b978abe84a1ee05b Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov Date: Wed, 28 Apr 2021 14:48:22 -0400 Subject: [PATCH 3/4] Update laravel links --- docs/extend/README.md | 2 +- docs/extend/models.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/extend/README.md b/docs/extend/README.md index 730f71250..1e128d35c 100644 --- a/docs/extend/README.md +++ b/docs/extend/README.md @@ -29,7 +29,7 @@ If you are aiming to address a bug or shortcoming of the core, or of an existing - [Developers explaining their workflow for extension development](https://discuss.flarum.org/d/6320-extension-developers-show-us-your-workflow) - [Extension namespace tips](https://discuss.flarum.org/d/9625-flarum-extension-namespacing-tips) - [Mithril js documentation](https://mithril.js.org/) -- [Laravel API Docs](https://laravel.com/api/6.x/) +- [Laravel API Docs](https://laravel.com/api/8.x/) - [Flarum API Docs](https://api.flarum.org) - [ES6 cheatsheet](https://github.com/DrkSephy/es6-cheatsheet) - [Flarum Blank Extension Generator](https://discuss.flarum.org/d/11333-flarum-extension-generator-by-reflar/) diff --git a/docs/extend/models.md b/docs/extend/models.md index 1e4152dc9..dde8c092e 100644 --- a/docs/extend/models.md +++ b/docs/extend/models.md @@ -22,7 +22,7 @@ Migrations live inside a folder suitably named `migrations` in your extension's ### Migration Structure -In Flarum, migration files should **return an array** with two functions: `up` and `down`. The `up` function is used to add new tables, columns, or indexes to your database, while the `down` function should reverse these operations. These functions receive an instance of the [Laravel schema builder](https://laravel.com/docs/6.x/migrations#creating-tables) which you can use to alter the database schema: +In Flarum, migration files should **return an array** with two functions: `up` and `down`. The `up` function is used to add new tables, columns, or indexes to your database, while the `down` function should reverse these operations. These functions receive an instance of the [Laravel schema builder](https://laravel.com/docs/8.x/migrations#creating-tables) which you can use to alter the database schema: ```php Date: Wed, 28 Apr 2021 14:49:57 -0400 Subject: [PATCH 4/4] Spacing cleanup --- docs/extend/api.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/extend/api.md b/docs/extend/api.md index 0d978f39a..f4c795a17 100644 --- a/docs/extend/api.md +++ b/docs/extend/api.md @@ -127,9 +127,7 @@ Read our [searching and filtering](search.md) guide for more information! ### Showing a Resource -For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. -We'll learn about serializers [in just a bit](#serializers). - +For the controller that shows a single resource, extend the `Flarum\Api\Controller\AbstractShowController` class. Like for the list controller, you need to specify the `$serializer` you want to use to serialize your models, and implement a `data` method to return a single model. We'll learn about serializers [in just a bit](#serializers). ```php use Flarum\Api\Controller\AbstractShowController;