php - Laravel 5 动态运行迁移

标签 php laravel laravel-5

所以我在 Packages/Sitemanager/Blog 结构中创建了我自己的博客包我有一个如下所示的服务提供商:

namespace Sitemanager\Blog;

use Illuminate\Support\ServiceProvider as LaravelServiceProvider;

class BlogServiceProvider extends LaravelServiceProvider {

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = false;

    /**
     * Bootstrap the application events.
     *
     * @return void
     */
    public function boot() {

        $this->handleConfigs();
        $this->handleMigrations();
        $this->handleViews();
        $this->handleRoutes();
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register() {

        // Bind any implementations.
        $this->app->make('Sitemanager\Blog\Controllers\BlogController');
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides() {

        return [];
    }

    private function handleConfigs() {

        $configPath = __DIR__ . '/config/blog.php';

        $this->publishes([$configPath => config_path('blog.php')]);

        $this->mergeConfigFrom($configPath, 'blog');
    }

    private function handleTranslations() {

        $this->loadTranslationsFrom(__DIR__.'/lang', 'blog');
    }

    private function handleViews() {

        $this->loadViewsFrom(__DIR__.'/views', 'blog');

        $this->publishes([__DIR__.'/views' => base_path('resources/views/vendor/blog')]);
    }

    private function handleMigrations() {

        $this->publishes([__DIR__ . '/migrations' => base_path('database/migrations')]);
    }

    private function handleRoutes() {

        include __DIR__.'/routes.php';
    }
}

现在,我想做的是动态运行迁移,如果它们从未在我想的安装过程之前或之内运行过的话。我在旧文档中看到你可以这样:

Artisan::call('migrate', array('--path' => 'app/migrations'));

但是,这在 laravel 5 中是无效的,我该如何处理呢?

最佳答案

Artisan::call('migrate', array('--path' => 'app/migrations'));

将在 Laravel 5 中工作,但您可能需要进行一些调整。

首先,由于 Laravel 5,您需要在文件顶部添加 use Artisan; 行(其中 use Illuminate\Support\ServiceProvider... 是)命名空间。 (您也可以执行 \Artisan::call - \ 很重要)。

您可能还需要这样做:

Artisan::call('migrate', array('--path' => 'app/migrations', '--force' => true));

--force 是必需的,因为默认情况下,Laravel 会提示您在生产中选择是/否,因为它是一个潜在的破坏性命令。如果没有 --force,您的代码将只是坐在那里旋转它的轮子(Laravel 正在等待 CLI 的响应,但您不在 CLI 中)。 p>

enter image description here

我鼓励您在服务提供商的 boot 方法之外的地方 做这些事情。这些可能是繁重的调用(依赖于您不想在每次页面浏览时都进行的文件系统和数据库调用)。考虑使用显式安装控制台命令或路由。

关于php - Laravel 5 动态运行迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953783/

相关文章:

php - Lavel 5.x 与 Redis 队列生成大量日志

php - Laravel Eloquent 分配给模型属性

php - Laravel 验证规则的自定义错误消息 : Dimensions

php - 扩展 Laravel 的抽象 TestCase 类时出错(错误是说我的扩展类必须是抽象的)

php - 如果存在mysql错误

php - XMPP 和 PHP 流式传输

php - Laravel - 多对多关系

php - 如何在 Laravel 5.1 中设置数据库、服务器、用户名和密码?

php - 从 URI 和 Web Root 中提取公共(public)路径

php - PHP fatal error :require_once():必须打开失败