子类化迁移器不适用于命名空间迁移

     2023-03-14     285

关键词:

【中文标题】子类化迁移器不适用于命名空间迁移【英文标题】:Subclassing Migrator not working for namespaced migration 【发布时间】:2015-07-03 13:09:12 【问题描述】:

我有一些命名空间的迁移,但由于命名空间,我无法通过 Class Not Found 错误。 In an earlier question, Antonio Carlos Ribeiro 声明:

Laravel 迁移器不适用于命名空间迁移。在这种情况下,最好的办法是继承并替换 Migrator 类,就像 Christopher Pitt 在他的博客文章中解释的那样:https://medium.com/laravel-4/6e75f99cdb0。

我已经尝试过这样做(当然是composer dump-autoload),但我继续收到 Class Not Found 错误。我已将项目文件设置为

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

我知道我一定是在做一些愚蠢的事情(我的直觉是 Migrator.php 中的 $class = "Truancy\\" . studly_case($file); 是错误的),但我无法拧下这个灯泡。 migrate 命令显然成功地找到了我的迁移文件,并且正确的类名在类映射中,所以它必须在从文件中解析类名本身的过程中,子类和替换应该解决这个问题。关于我哪里出错的任何建议?

【问题讨论】:

这是一个很长的问题。为什么要让它变得困难并首先创建自定义迁移? 做工匠转储自动加载 正如我所指出的,我运行了 dump-autoload 并得到了想要的结果;问题似乎是当 Laravel 尝试解析迁移文件中的类名时 - 它忽略了子类应该处理的命名空间。 好的,此时我已经确定我可能没有注册 MigrationServiceProvider。当我弄清楚如何适当地处理它(我显然只希望它应用于命名空间迁移)时,我会在这里发布。 【参考方案1】:

好的,我已经完成了这项工作。事实证明,Medium.com 文章假设您只知道将他谈到的文件放在哪里,而我不知道。我做了几处更改,现在一切正常:

    我创建了一个新的appTruancy\providers 子文件夹,并将其添加到composer.json 我将Migrator.phpMigrationServiceProvider.php 都移到了新文件夹中 我将这两个文件中的命名空间更改为 Truancy\Providers 以匹配目录结构 我在appTruancy\config\app.phpproviders 数组中添加了'Truancy\Providers\MigrationsServiceProvider' 我在migration 文件中的Schema 前面添加了一个\ 以引用基本命名空间。 我运行了 dump-autoload 来更新类映射

这是我不能 100% 确定所有更改都是必需的情况之一,但布局确实有意义,所以我很满意。所以,简而言之,如果你想命名你的迁移,你需要继承 Migrator 类,如上面列出的 Medium.com 文章中所述,但你需要在config\app 中注册服务提供者,确保两个文件中的类名是一致的。

【讨论】:

AWS cognito 用户迁移池触发器不适用于登录流程

】AWScognito用户迁移池触发器不适用于登录流程【英文标题】:AWScognitousermigrationpooltriggernotworkingonloginflow【发布时间】:2020-10-0222:24:54【问题描述】:我正在使用具有认知执行角色的Lambda函数使用AWS认知池迁移以下是我的新池应... 查看详情

子类化 UITableViewCell 不适用于出队

】子类化UITableViewCell不适用于出队【英文标题】:SubclassedUITableViewCellnotworkingwithdequeue【发布时间】:2013-06-3022:32:09【问题描述】:我用一个新类symbolCell子类化UITableViewCell,它有一个头文件、实现和xib文件。我在我的mainViewControll... 查看详情

内联属性实例化不适用于通用 UICollectionViewCell 子类

】内联属性实例化不适用于通用UICollectionViewCell子类【英文标题】:InlinepropertyinstantiationnotworkingforgenericUICollectionViewCellsubclasses【发布时间】:2016-07-0501:54:13【问题描述】:如果我定义一个UICollectionViewCell子类:classTestCell<T>:U... 查看详情

Django South 迁移不适用于 null = True 和空白 = True

】DjangoSouth迁移不适用于null=True和空白=True【英文标题】:DjangoSouthmigrationnotworkingwithnull=Trueandblank=True【发布时间】:2012-03-2209:20:56【问题描述】:我正在使用South和Django进行数据库迁移。在我的models.py中,我更改了其中一个字段c... 查看详情

Laravel 8 迁移:DB:unprepared 不适用于共享托管服务器

】Laravel8迁移:DB:unprepared不适用于共享托管服务器【英文标题】:Laravel8migration:DB:unpreparedisnotworkingonsharedhostingserver【发布时间】:2021-10-1006:15:49【问题描述】:我的迁移在本地服务器上按预期工作,但是当我尝试在实时共享托... 查看详情

为啥扩展方法不适用于命名空间别名?

】为啥扩展方法不适用于命名空间别名?【英文标题】:Whydoextensionmethodsnotworkwithnamespacealiasing?为什么扩展方法不适用于命名空间别名?【发布时间】:2011-03-2105:30:18【问题描述】:这可能是一个无知的问题,但我不确定为什么... 查看详情

MS Access Requery 不适用于 MySQL->Oracle 迁移

】MSAccessRequery不适用于MySQL->Oracle迁移【英文标题】:MSAccessRequerynotworkingonMySQL->Oraclemigration【发布时间】:2011-05-2000:26:55【问题描述】:我们有一个MS访问前端和一个MySQL后端。当我们使用MySQL后端重新查询时,一切正常。当... 查看详情

实体框架代码第一次自动迁移不适用于 Oracle 数据库

】实体框架代码第一次自动迁移不适用于Oracle数据库【英文标题】:EntityFrameworkcodefirstautomigrationnotworkingwithOracledatabase【发布时间】:2021-06-2018:16:16【问题描述】:我在使用Oracle数据库时遇到了一些问题。当我使用EntityFramework6运... 查看详情

php 常量()不适用于命名空间?

】php常量()不适用于命名空间?【英文标题】:Phpconstant()notworkingwithnamespace?【发布时间】:2014-01-2400:43:38【问题描述】:以下不起作用:useapplication\\components\\auditor\\AuditLevel;publicfunctionactionAudit()$data=unserialize($_POST[\'data\']);$mess... 查看详情

为啥`XmlDocument.LoadXml()`不适用于命名空间?

】为啥`XmlDocument.LoadXml()`不适用于命名空间?【英文标题】:Whydoes`XmlDocument.LoadXml()`notworkwithnamespace?为什么`XmlDocument.LoadXml()`不适用于命名空间?【发布时间】:2018-11-1701:07:05【问题描述】:我有一个写成字符串的XML标记:<w:sy... 查看详情

枚举器在迁移中实例化后修改了集合

】枚举器在迁移中实例化后修改了集合【英文标题】:Collectionwasmodifiedaftertheenumeratorwasinstantiatedinmigration【发布时间】:2022-01-2108:50:36【问题描述】:我正在尝试迁移,但出现此错误:Collectionwasmodifiedaftertheenumeratorwasinstantiated我... 查看详情

如何子类化和重新实现命名空间中包含的类?

】如何子类化和重新实现命名空间中包含的类?【英文标题】:Howtosubclassandreimplementaclasscontainedinanamespace?【发布时间】:2018-03-1012:11:46【问题描述】:我正在尝试使用PCLVisualizer来可视化点云。https://github.com/PointCloudLibrary/pcl/blob/... 查看详情

BeautifulSoup.find_all() 方法不适用于命名空间标签

】BeautifulSoup.find_all()方法不适用于命名空间标签【英文标题】:BeautifulSoup.find_all()methodnotworkingwithnamespacedtags【发布时间】:2017-11-2414:32:33【问题描述】:我今天在使用BeautifulSoup时遇到了一个非常奇怪的行为。我们来看一个很简... 查看详情

创建数据库迁移(代码片段)

系列文章总目录创建项目创建类库.NETCore项目,命名为Nm.Reservation.Migrations。项目右键>属性>应用程序>默认命名空间,删除默认命名空间,依次创建文件夹Nm、Reservation、Migrations,这样操作是为了在文件夹内创建的文件可以... 查看详情

010.里式转换命名空间字段属性索引器

1、isasis:判断对象和类型的兼容兼容---true不兼容---false子类兼容父类子类对象is父类类型--true对象is类型(对象为此类型的对象对象为此类型的子类的对象--true)publicclassPerson{}publicclassStudent:Person{}Personper=newPerson();Studentstu=newStudent(... 查看详情

子类化集合命名元组

】子类化集合命名元组【英文标题】:Subclassingcollectionsnamedtuple【发布时间】:2017-11-0308:39:16【问题描述】:Python的namedtuple作为一个轻量级的、不可变的数据类非常有用。我喜欢将它们用于簿记参数而不是字典。当需要更多功能... 查看详情

windowsserver2016-图形化迁移fsmo角色

上章节我们简单介绍了三种不同方式查看FSMO主机角色信息,在开篇之前我们简单回顾一下FSMO五种操作主机角色:林范围操作主机角色有两种,分别是架构主机角色(SchemaMaster)和域命名主机角色(DomainNamingMaster);及域范围操... 查看详情

如何实现 IDbContextFactory 以用于实体框架数据迁移

】如何实现IDbContextFactory以用于实体框架数据迁移【英文标题】:HowtoimplementIDbContextFactoryforusewithEntityFrameworkdatamigrations【发布时间】:2012-07-0820:45:51【问题描述】:我正在尝试使用实体框架数据迁移,如thispost中所述。但是,当... 查看详情