Skip to content

Commit

Permalink
[4.x] Laravel 12 support (#1321)
Browse files Browse the repository at this point in the history
* Add Laravel 12 support, drop Laravel 11 support

* Fix RLS tree generation (specify schema name in generateTrees())

* ci fixes, use stable virtualcolumn version

---------

Co-authored-by: lukinovec <[email protected]>
  • Loading branch information
stancl and lukinovec authored Feb 25, 2025
1 parent 657e165 commit 8960a83
Show file tree
Hide file tree
Showing 49 changed files with 81 additions and 28 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
strategy:
matrix:
include:
- laravel: "^11.0"
- laravel: "^12.0"
php: "8.4"

steps:
Expand Down
16 changes: 12 additions & 4 deletions .github/workflows/queue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,19 @@ jobs:
steps:
- name: Prepare composer version constraint prefix
run: |
BRANCH=${GITHUB_REF#refs/heads/}
if [[ $BRANCH =~ ^[0-9]\.x$ ]]; then
echo "VERSION_PREFIX=${BRANCH}-dev" >> $GITHUB_ENV
if [[ $GITHUB_REF == refs/tags/* ]]; then
# For refs like "refs/tags/v3.9.0", remove "refs/tags/v" prefix to get just "3.9.0"
VERSION=${GITHUB_REF#refs/tags/v}
echo "VERSION_PREFIX=${VERSION}" >> $GITHUB_ENV
else
echo "VERSION_PREFIX=dev-${BRANCH}" >> $GITHUB_ENV
BRANCH=${GITHUB_REF#refs/heads/}
if [[ $BRANCH =~ ^[0-9]\.x$ ]]; then
# Branches starting with %d.x need to use -dev suffix
echo "VERSION_PREFIX=${BRANCH}-dev" >> $GITHUB_ENV
else
# All other branches use dev-${branch} prefix
echo "VERSION_PREFIX=dev-${BRANCH}" >> $GITHUB_ENV
fi
fi
- name: Clone test suite
Expand Down
15 changes: 7 additions & 8 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,24 @@
"require": {
"php": "^8.4",
"ext-json": "*",
"illuminate/support": "^10.1|^11.3",
"illuminate/support": "^12.0",
"laravel/tinker": "^2.0",
"facade/ignition-contracts": "^1.0.2",
"spatie/ignition": "^1.4",
"ramsey/uuid": "^4.7.3",
"stancl/jobpipeline": "2.0.0-rc2",
"stancl/virtualcolumn": "dev-master",
"stancl/jobpipeline": "2.0.0-rc5",
"stancl/virtualcolumn": "^1.5.0",
"spatie/invade": "*",
"laravel/prompts": "0.*"
},
"require-dev": {
"laravel/framework": "^10.1|^11.3",
"orchestra/testbench": "^8.0|^9.0",
"laravel/framework": "^12.0",
"orchestra/testbench": "^10.0",
"league/flysystem-aws-s3-v3": "^3.12.2",
"doctrine/dbal": "^3.6.0",
"spatie/valuestore": "^1.2.5",
"pestphp/pest": "^2.0",
"larastan/larastan": "^3.0",
"aws/aws-sdk-php-laravel": "~3.0"
"pestphp/pest": "^3.0",
"larastan/larastan": "^3.0"
},
"autoload": {
"psr-4": {
Expand Down
5 changes: 4 additions & 1 deletion src/RLS/PolicyManagers/TableRLSManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,10 @@ public function generateTrees(): array
$builder = $this->database->getSchemaBuilder();

// We loop through each table in the database
foreach ($builder->getTableListing() as $table) {
foreach ($builder->getTableListing(schema: $this->database->getConfig('search_path')) as $table) {
// E.g. "public.table_name" -> "table_name"
$table = str($table)->afterLast('.')->toString();

// For each table, we get a list of all foreign key columns
$foreignKeys = collect($builder->getForeignKeys($table))->map(function ($foreign) use ($table) {
return $this->formatForeignKey($foreign, $table);
Expand Down
2 changes: 2 additions & 0 deletions tests/AutomaticModeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
use Stancl\Tenancy\Listeners\BootstrapTenancy;
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;
use function Stancl\Tenancy\Tests\withTenantDatabases;

beforeEach(function () {
Event::listen(TenancyInitialized::class, BootstrapTenancy::class);
Expand Down
1 change: 1 addition & 0 deletions tests/Bootstrappers/BootstrapperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\CacheTenancyBootstrapper;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
$this->mockConsoleOutput = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\BroadcastChannelPrefixBootstrapper;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
Event::listen(TenancyInitialized::class, BootstrapTenancy::class);
Expand Down
1 change: 1 addition & 0 deletions tests/Bootstrappers/CacheTagsBootstrapperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Stancl\Tenancy\Bootstrappers\CacheTagsBootstrapper;
use Stancl\Tenancy\Events\TenancyEnded;
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
config(['tenancy.bootstrappers' => [CacheTagsBootstrapper::class]]);
Expand Down
1 change: 1 addition & 0 deletions tests/Bootstrappers/DatabaseSessionBootstrapperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Stancl\Tenancy\Listeners;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

/**
* This collection of regression tests verifies that SessionTenancyBootstrapper
Expand Down
3 changes: 3 additions & 0 deletions tests/Bootstrappers/DatabaseTenancyBootstrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
use Stancl\Tenancy\Events\TenancyInitialized;
use Stancl\Tenancy\Listeners\BootstrapTenancy;
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Tests\Etc\Tenant;

use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
Event::listen(TenancyInitialized::class, BootstrapTenancy::class);
Expand Down
1 change: 1 addition & 0 deletions tests/Bootstrappers/FilesystemTenancyBootstrapperTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use Stancl\Tenancy\Listeners\DeleteTenantStorage;
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
Event::listen(TenancyInitialized::class, BootstrapTenancy::class);
Expand Down
1 change: 1 addition & 0 deletions tests/BroadcastingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\BroadcastingConfigBootstrapper;
use Illuminate\Contracts\Broadcasting\Broadcaster as BroadcasterContract;
use function Stancl\Tenancy\Tests\withTenantDatabases;

beforeEach(function () {
withTenantDatabases();
Expand Down
2 changes: 1 addition & 1 deletion tests/CachedTenantResolverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
use Illuminate\Support\Facades\Route as RouteFacade;
use Illuminate\Support\Facades\Schema;
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\PathIdentificationManager;
use Stancl\Tenancy\Resolvers\RequestDataTenantResolver;
use function Stancl\Tenancy\Tests\pest;

test('tenants can be resolved using cached resolvers', function (string $resolver) {
$tenant = Tenant::create(['id' => $tenantKey = 'acme']);
Expand Down
1 change: 1 addition & 0 deletions tests/CloneActionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Stancl\Tenancy\Tests\Etc\HasMiddlewareController;
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
use function Stancl\Tenancy\Tests\pest;

test('a route can be universal using path identification', function (array $routeMiddleware, array $globalMiddleware) {
foreach ($globalMiddleware as $middleware) {
Expand Down
3 changes: 1 addition & 2 deletions tests/CombinedDomainAndSubdomainIdentificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
declare(strict_types=1);

use Illuminate\Support\Facades\Route;
use Stancl\Tenancy\Database\Concerns\HasDomains;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomainOrSubdomain;
use Stancl\Tenancy\Database\Models;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
Route::group([
Expand Down
1 change: 1 addition & 0 deletions tests/CommandsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\FilesystemTenancyBootstrapper;
use Stancl\Tenancy\Database\Exceptions\TenantDatabaseDoesNotExistException;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
if (file_exists($schemaPath = 'tests/Etc/tenant-schema-test.dump')) {
Expand Down
1 change: 1 addition & 0 deletions tests/DatabaseUsersTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledPostgreSQLSchemaManager;
use Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledPostgreSQLDatabaseManager;
use Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledMicrosoftSQLServerDatabaseManager;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
config([
Expand Down
1 change: 1 addition & 0 deletions tests/DomainTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
InitializeTenancyByDomain::$onFail = null;
Expand Down
1 change: 1 addition & 0 deletions tests/EarlyIdentificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
use Stancl\Tenancy\Tests\Etc\EarlyIdentification\ControllerWithMiddleware;
use Stancl\Tenancy\Tests\Etc\EarlyIdentification\ControllerWithRouteMiddleware;
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
config()->set([
Expand Down
1 change: 1 addition & 0 deletions tests/EventListenerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Stancl\Tenancy\Listeners\QueueableListener;
use Stancl\Tenancy\Bootstrappers\RedisTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
FooListener::$shouldQueue = false;
Expand Down
1 change: 1 addition & 0 deletions tests/Features/NoAttachTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

test('sqlite ATTACH statements can be blocked', function (bool $disallow) {
if (php_uname('m') == 'aarch64') {
Expand Down
1 change: 1 addition & 0 deletions tests/Features/RedirectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Illuminate\Support\Facades\Route;
use Stancl\Tenancy\Features\CrossDomainRedirect;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

test('tenant redirect macro replaces only the hostname', function () {
config([
Expand Down
1 change: 1 addition & 0 deletions tests/Features/TenantConfigTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use Stancl\Tenancy\Listeners\BootstrapTenancy;
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

afterEach(function () {
TenantConfig::$storageToConfigMap = [];
Expand Down
2 changes: 2 additions & 0 deletions tests/MailTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
use Stancl\Tenancy\Listeners\BootstrapTenancy;
use Stancl\Tenancy\Listeners\RevertToCentralContext;
use Stancl\Tenancy\Bootstrappers\MailConfigBootstrapper;
use function Stancl\Tenancy\Tests\pest;
use function Stancl\Tenancy\Tests\withTenantDatabases;

beforeEach(function() {
config(['mail.default' => 'smtp']);
Expand Down
1 change: 1 addition & 0 deletions tests/MaintenanceModeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Illuminate\Support\Facades\Route;
use Stancl\Tenancy\Middleware\CheckTenantForMaintenanceMode;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomain;
use function Stancl\Tenancy\Tests\pest;
use Stancl\Tenancy\Tests\Etc\Tenant;

beforeEach(function () {
Expand Down
3 changes: 2 additions & 1 deletion tests/ManualModeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@
use Stancl\Tenancy\Listeners\CreateTenantConnection;
use Stancl\Tenancy\Listeners\UseCentralConnection;
use Stancl\Tenancy\Listeners\UseTenantConnection;
use \Stancl\Tenancy\Tests\Etc\Tenant;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

test('manual tenancy initialization works', function () {
Event::listen(TenantCreated::class, JobPipeline::make([CreateDatabase::class])->send(function (TenantCreated $event) {
Expand Down
1 change: 1 addition & 0 deletions tests/OriginHeaderIdentificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Stancl\Tenancy\Tests\Etc\Tenant;
use Illuminate\Support\Facades\Route;
use Stancl\Tenancy\Middleware\InitializeTenancyByOriginHeader;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
InitializeTenancyByOriginHeader::$onFail = null;
Expand Down
1 change: 1 addition & 0 deletions tests/PathIdentificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\Resolvers\PathTenantResolver;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
// Make sure the tenant parameter is set to 'tenant'
Expand Down
1 change: 1 addition & 0 deletions tests/PendingTenantsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Stancl\Tenancy\Events\PendingTenantPulled;
use Stancl\Tenancy\Events\PullingPendingTenant;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

test('tenants are correctly identified as pending', function (){
Tenant::createPending();
Expand Down
12 changes: 7 additions & 5 deletions tests/Pest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

namespace Stancl\Tenancy\Tests;

use Stancl\Tenancy\Tests\TestCase;
use Stancl\JobPipeline\JobPipeline;
use Illuminate\Support\Facades\Event;
Expand All @@ -8,14 +10,14 @@

uses(TestCase::class)->in(__DIR__);

function pest(): TestCase
{
return Pest\TestSuite::getInstance()->test;
}

function withTenantDatabases()
{
Event::listen(TenantCreated::class, JobPipeline::make([CreateDatabase::class])->send(function (TenantCreated $event) {
return $event->tenant;
})->toListener());
}

function pest(): TestCase
{
return \Pest\TestSuite::getInstance()->test;
}
1 change: 1 addition & 0 deletions tests/PreventAccessFromUnwantedDomainsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
use Stancl\Tenancy\Middleware\PreventAccessFromUnwantedDomains;
use Stancl\Tenancy\Middleware\InitializeTenancyByDomainOrSubdomain;
use Stancl\Tenancy\Tests\Etc\EarlyIdentification\ControllerWithMiddleware;
use function Stancl\Tenancy\Tests\pest;

test('correct routes are accessible in route-level identification', function (RouteMode $defaultRouteMode) {
config()->set([
Expand Down
2 changes: 2 additions & 0 deletions tests/QueueTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
use Stancl\Tenancy\Bootstrappers\PersistentQueueTenancyBootstrapper;
use Stancl\Tenancy\Listeners\QueueableListener;
use function Stancl\Tenancy\Tests\pest;
use function Stancl\Tenancy\Tests\withTenantDatabases;

beforeEach(function () {
config([
Expand Down
1 change: 1 addition & 0 deletions tests/RLS/PolicyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Stancl\Tenancy\RLS\PolicyManagers\TableRLSManager;
use Stancl\Tenancy\RLS\PolicyManagers\TraitRLSManager;
use Stancl\Tenancy\Bootstrappers\PostgresRLSBootstrapper;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
TraitRLSManager::$excludedModels = [Article::class];
Expand Down
1 change: 1 addition & 0 deletions tests/RLS/TableManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Stancl\Tenancy\RLS\PolicyManagers\TableRLSManager;
use Stancl\Tenancy\Bootstrappers\PostgresRLSBootstrapper;
use Stancl\Tenancy\Database\Exceptions\RecursiveRelationshipException;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
TableRLSManager::$scopeByDefault = true;
Expand Down
1 change: 1 addition & 0 deletions tests/RLS/TraitManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
use Stancl\Tenancy\RLS\PolicyManagers\TraitRLSManager;
use Stancl\Tenancy\Bootstrappers\PostgresRLSBootstrapper;
use Stancl\Tenancy\Database\Concerns\BelongsToPrimaryModel;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
TraitRLSManager::$implicitRLS = true;
Expand Down
1 change: 1 addition & 0 deletions tests/RequestDataIdentificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedByRequestDataException;
use Stancl\Tenancy\Middleware\InitializeTenancyByRequestData;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
config([
Expand Down
1 change: 1 addition & 0 deletions tests/ResourceSyncingTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
use Stancl\Tenancy\Tests\Etc\ResourceSyncing\CentralUser as BaseCentralUser;
use Stancl\Tenancy\ResourceSyncing\CentralResourceNotAvailableInPivotException;
use Stancl\Tenancy\ResourceSyncing\Events\SyncedResourceSavedInForeignDatabase;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
config(['tenancy.bootstrappers' => [
Expand Down
1 change: 1 addition & 0 deletions tests/ScopeSessionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Stancl\Tenancy\Middleware\InitializeTenancyBySubdomain;
use Stancl\Tenancy\Middleware\ScopeSessions;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
Route::group([
Expand Down
1 change: 1 addition & 0 deletions tests/SessionSeparationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Stancl\Tenancy\Middleware\InitializeTenancyByPath;
use Stancl\Tenancy\Middleware\PreventAccessFromUnwantedDomains;
use Stancl\Tenancy\Tests\Etc\Tenant;
use function Stancl\Tenancy\Tests\pest;

// todo@tests write similar low-level tests for the cache bootstrapper? including the database driver in a single-db setup

Expand Down
1 change: 1 addition & 0 deletions tests/SingleDatabaseTenancyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use Stancl\Tenancy\Database\Concerns\BelongsToTenant;
use Stancl\Tenancy\Database\Concerns\BelongsToPrimaryModel;
use Stancl\Tenancy\Database\Concerns\HasScopedValidationRules;
use function Stancl\Tenancy\Tests\pest;

beforeEach(function () {
Schema::create('posts', function (Blueprint $table) {
Expand Down
Loading

0 comments on commit 8960a83

Please sign in to comment.