子类化迁移器不适用于命名空间迁移
Subclassing Migrator not working for namespaced migration
我有一些命名空间迁移,但由于命名空间,我无法克服 Class Not Found 错误。 In an earlier question, Antonio Carlos Ribeiro 表示:
Laravel migrator doesn't play nice with namespaced migrations. Your best bet in this case is to subclass and substitute the Migrator class, like Christopher Pitt explains in his blog post: https://medium.com/laravel-4/6e75f99cdb0.
我试过这样做(当然是 composer dump-autoload
之后),但我继续收到 Class 未找到错误。我已将项目文件设置为
inetpub
|--appTruancy
|--database
|--2015_04_24_153942_truancy_create_districts.php
|--MigrationsServiceProvider.php
|--Migrator.php
迁移文件本身如下:
<?php
namespace Truancy;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class TruancyCreateDistricts extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('districts', function($table) {
$table->string('id')->unique()->primary()->nullable(false);
$table->string('district');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('districts');
}
}
Migrator.php如下:
namespace Truancy;
use Illuminate\Database\Migrations\Migrator as Base;
class Migrator extends Base{
/**
* Resolve a migration instance from a file.
*
* @param string $file
* @return object
*/
public function resolve($file)
{
$file = implode("_", array_slice(explode("_", $file), 4));
$class = "Truancy\" . studly_case($file);
return new $class;
}
}
MigrationServiceProvider.php如下:
<?php
namespace Truancy;
use Illuminate\Support\ServiceProvider;
class TruancyServiceProvider extends ServiceProvider{
public function register()
{
$this->app->bindShared(
"migrator",
function () {
return new Migrator(
$this->app->make("migration.repository"),
$this->app->make("db"),
$this->app->make("files")
);
}
);
}
}
autoload_classmap.php 中生成的行符合预期:
'Truancy\Migrator' => $baseDir . '/appTruancy/database/migrations/Migrator.php',
'Truancy\TruancyCreateDistricts' => $baseDir . '/appTruancy/database/migrations/2015_04_24_153942_truancy_create_districts.php',
'Truancy\TruancyServiceProvider' => $baseDir . '/appTruancy/database/migrations/MigrationsServiceProvider.php'
我正在调用 php artisan migrate --path="appTruancy/database/migrations"
,但收到错误消息:
PHP Fatal error: Class 'TruancyCreateDistricts' not found in
C:\inetpub\laravel\vendor\laravel\framework\src\Illuminate\Database
\Migrations\Migrator.php on line 297
我知道我一定是在做一些蠢事(我的直觉是 $class = "Truancy\" . studly_case($file);
in Migrator.php 是错误的),但我无法拧开这个灯泡。迁移命令显然成功地找到了我的迁移文件,并且正确的类名在类映射中,因此它必须在从文件中解析类名本身的过程中的某个地方,子类和替换应该解决这个问题。关于我哪里出错了有什么建议吗?
好的,我已经开始工作了。事实证明,Medium.com 文章假设您只知道将他谈到的文件放在哪里,而我不知道。我做了几处更改,现在一切正常:
- 我创建了一个新的
appTruancy\providers
子文件夹,并将其添加到 composer.json
- 我将
Migrator.php
和 MigrationServiceProvider.php
都移到了新文件夹中
- 我将这两个文件中的命名空间更改为
Truancy\Providers
以匹配目录结构
- 我在
appTruancy\config\app.php
中的 providers
数组中添加了 'Truancy\Providers\MigrationsServiceProvider'
- 我在
migration
文件中的 Schema
前面添加了一个 \
来引用基本命名空间。
- I 运行 dump-autoload 更新 classmap
这是我不能 100% 确定是否需要所有更改的情况之一,但布局确实有意义,所以我对此感到满意。因此,简而言之,如果您尝试对迁移进行命名空间,则需要按照上面列出的 Medium.com 文章中的描述子 class 迁移器 class,但是您随后需要在 config\app
中注册服务提供商,确保两个文件中的 class 名称一致。
我有一些命名空间迁移,但由于命名空间,我无法克服 Class Not Found 错误。 In an earlier question, Antonio Carlos Ribeiro 表示:
Laravel migrator doesn't play nice with namespaced migrations. Your best bet in this case is to subclass and substitute the Migrator class, like Christopher Pitt explains in his blog post: https://medium.com/laravel-4/6e75f99cdb0.
我试过这样做(当然是 composer dump-autoload
之后),但我继续收到 Class 未找到错误。我已将项目文件设置为
inetpub
|--appTruancy
|--database
|--2015_04_24_153942_truancy_create_districts.php
|--MigrationsServiceProvider.php
|--Migrator.php
迁移文件本身如下:
<?php
namespace Truancy;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class TruancyCreateDistricts extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('districts', function($table) {
$table->string('id')->unique()->primary()->nullable(false);
$table->string('district');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('districts');
}
}
Migrator.php如下:
namespace Truancy;
use Illuminate\Database\Migrations\Migrator as Base;
class Migrator extends Base{
/**
* Resolve a migration instance from a file.
*
* @param string $file
* @return object
*/
public function resolve($file)
{
$file = implode("_", array_slice(explode("_", $file), 4));
$class = "Truancy\" . studly_case($file);
return new $class;
}
}
MigrationServiceProvider.php如下:
<?php
namespace Truancy;
use Illuminate\Support\ServiceProvider;
class TruancyServiceProvider extends ServiceProvider{
public function register()
{
$this->app->bindShared(
"migrator",
function () {
return new Migrator(
$this->app->make("migration.repository"),
$this->app->make("db"),
$this->app->make("files")
);
}
);
}
}
autoload_classmap.php 中生成的行符合预期:
'Truancy\Migrator' => $baseDir . '/appTruancy/database/migrations/Migrator.php',
'Truancy\TruancyCreateDistricts' => $baseDir . '/appTruancy/database/migrations/2015_04_24_153942_truancy_create_districts.php',
'Truancy\TruancyServiceProvider' => $baseDir . '/appTruancy/database/migrations/MigrationsServiceProvider.php'
我正在调用 php artisan migrate --path="appTruancy/database/migrations"
,但收到错误消息:
PHP Fatal error: Class 'TruancyCreateDistricts' not found in
C:\inetpub\laravel\vendor\laravel\framework\src\Illuminate\Database
\Migrations\Migrator.php on line 297
我知道我一定是在做一些蠢事(我的直觉是 $class = "Truancy\" . studly_case($file);
in Migrator.php 是错误的),但我无法拧开这个灯泡。迁移命令显然成功地找到了我的迁移文件,并且正确的类名在类映射中,因此它必须在从文件中解析类名本身的过程中的某个地方,子类和替换应该解决这个问题。关于我哪里出错了有什么建议吗?
好的,我已经开始工作了。事实证明,Medium.com 文章假设您只知道将他谈到的文件放在哪里,而我不知道。我做了几处更改,现在一切正常:
- 我创建了一个新的
appTruancy\providers
子文件夹,并将其添加到composer.json
- 我将
Migrator.php
和MigrationServiceProvider.php
都移到了新文件夹中 - 我将这两个文件中的命名空间更改为
Truancy\Providers
以匹配目录结构 - 我在
appTruancy\config\app.php
中的 - 我在
migration
文件中的Schema
前面添加了一个\
来引用基本命名空间。 - I 运行 dump-autoload 更新 classmap
providers
数组中添加了 'Truancy\Providers\MigrationsServiceProvider'
这是我不能 100% 确定是否需要所有更改的情况之一,但布局确实有意义,所以我对此感到满意。因此,简而言之,如果您尝试对迁移进行命名空间,则需要按照上面列出的 Medium.com 文章中的描述子 class 迁移器 class,但是您随后需要在 config\app
中注册服务提供商,确保两个文件中的 class 名称一致。