子类迁移不工作的命名空间迁移(Subclassing Migrator not working fo

2019-10-22 19:58发布

我有一些命名空间的迁移,我不能让过去由于命名空间中找不到类的错误。 在前面的问题 , 安东尼奥·卡洛斯·里贝罗说:

Laravel迁移不玩与命名空间迁移不错。 在这种情况下,最好的办法是继承和替代迁移类的,像克里斯托弗·皮特在他的博客中解释说: https://medium.com/laravel-4/6e75f99cdb0 。

我曾尝试做(随后所以composer dump-autoload ,当然),但我继续接收找不到类的错误。 我有设置为项目文件

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);在Migrator.php是错误的),但我不能拧开这个灯泡。 迁移命令显然是成功地找到我的迁移文件,并正确的类名是在类映射,所以它必须解决从文件,其子类和替换是应该解决的类名本身的过程中的某个地方。 任何建议,在那里我已经错了吗?

Answer 1:

好吧,我已经得到了这个工作。 事实证明,在Medium.com本文假设你只知道往哪里放,他谈到了文件,这是我没有。 我已经做了一些改动,现在一切正常:

  1. 我创建了一个新的appTruancy\providers子文件夹,并把它添加到composer.json
  2. 我既感动Migrator.phpMigrationServiceProvider.php到新文件夹
  3. 我改变了命名空间这两个文件的Truancy\Providers相匹配的目录结构
  4. 我添加'Truancy\Providers\MigrationsServiceProvider'providers在阵列appTruancy\config\app.php
  5. 我添加了一个\前面Schemamigration文件以引用基础的命名空间。
  6. 我跑转储自动加载更新类映射

这是那些我不能肯定100%,所有的变化都必须情形之一的,但布局有一定道理,所以我很高兴。 因此,概括地说,如果你想给你的命名空间迁移,您需要继承上面列出的Medium.com文章中描述的迁移类的,但你需要注册的服务提供商config\app ,确保在这两个文件中的类名是一致的。



文章来源: Subclassing Migrator not working for namespaced migration