使用单个laravel实例的多个项目

kan*_*han 10 php projects instance laravel laravel-4

我是Laravel的新手.根据我对这个框架的研究,我发现它对我的项目非常有用.但是我在定制它时遇到了困难,因为Laravel框架的单个实例用于多个项目.我不想遵循Laravel中提供的多站点方法,即在项目的模型和控制器中使用目录结构,因为我无法在Git中的一个步骤中推送与项目相关的更改.

我想要这样的东西.

  • 常见的Laravel框架(具有通用库和供应商文件.还具有不同项目使用的通用功能)

    应用程序/控制器

    应用程序/模型

    应用程序/意见

    供应商

    引导

  • Proj1(拥有自己的实体,能够使用常见Laravel框架中的公共库和模型函数)

    应用程序/控制器

    应用程序/模型

    应用程序/意见

    引导

  • Proj2(拥有自己的实体,能够使用常见Laravel框架中的公共库和模型函数)

    应用程序/控制器

    应用程序/模型

    应用程序/意见

    引导

即,新项目必须有自己的应用程序目录,并且能够使用来自普通项目的模型函数.

这将简化我的任务,对我即将开展的项目非常有用.如果有人可以帮助我,我会非常感激.

Ant*_*iro 18

使用命名空间来组织和分离事物

创建PSR-4自动加载条目以按名称空间分隔项目文件:

"psr-4": {
    "App\\Core\\": "app/App/Core",
    "App\\Main\\": "app/App/Main",
    "App\\Project1\\": "app/App/Project1",
    "App\\Project2\\": "app/App/Project2"
},
Run Code Online (Sandbox Code Playgroud)

你在Core中常见的一切,在相关的项目文件中都不常见.

现在您只需要在他们各自的文件夹中创建文件并命名它们:

这是Core中的BaseController,由您的所有控制器使用:

<?php namespace App\Core\Controllers;

use Controller; // This is the Laravel Controller

class BaseController extends Controller {

}
Run Code Online (Sandbox Code Playgroud)

这是使用您的核心控制器的主应用程序的BaseController:

<?php namespace App\Main\Controllers;

use App\Core\Controllers\BaseController as CoreBaseController;

class BaseController extends CoreBaseController {

}
Run Code Online (Sandbox Code Playgroud)

这是使用其基本控制器的Main应用程序的HomeController,因为它们位于您甚至不需要导入文件的同一名称空间中:

<?php namespace App\Main\Controllers;

class HomeController extends BaseController {

}
Run Code Online (Sandbox Code Playgroud)

Laravel中的每个单独的类文件都可以这样组织,甚至是您的视图,因此您可以拥有这些文件:

app/App/Core/Controllers/BaseController.php

app/App/Main/Controllers/BaseController.php
app/App/Main/Controllers/HomeController.php

app/App/Project1/Controllers/BaseController.php
app/App/Project1/Controllers/PostsController.php
app/App/Project1/Controllers/UsersController.php

app/App/Project1/Models/User.php
app/App/Project1/Models/Post.php
app/App/Project1/Models/Roles.php
Run Code Online (Sandbox Code Playgroud)

然后您的路线可以分开(组织)并以命名空间为前缀:

Route::group(['prefix' => 'project1', 'namespace' => 'App\Project1\Controllers'], function()
{
    Route::get('/', 'HomeController@index');

    Route::get('posts', 'PostsController@index']);
});
Run Code Online (Sandbox Code Playgroud)

给那些网址:

http://yourdomain.com/project1
http://yourdomain.com/project1/posts
Run Code Online (Sandbox Code Playgroud)

并将操作指向这些控制器操作:

App\Project1\Controllers\HomeController@index
App\Project1\Controllers\PostsController@index  
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是可以做到的(这绝不是一种糟糕的方法 - 我实际上很喜欢它),但需要做更多的工作来保持项目之间的单一性。当您有一个项目的速度比其他项目快,并且各种组件需要升级但可能会影响其他项目的功能时,问题就开始了。根据我的经验,从长远来看,为每个“项目”创建一个新的 Laravel 项目并将您的组件作为模块使用会更容易、更干净和更安全。 (2认同)

pet*_*les 1

这里没有真正需要回答的问题,但总的来说,您想要做的事情是非常可行的。

您可以在 apps 文件夹下为每个项目创建一个目录,并为您在其下面创建的结构中的每个类创建命名空间。然后,您可以使用 PSR(最好是 PSR-4)自动加载来使这些类可访问。

您可以将每个项目的路由放在自己的路由文件中,然后将它们包含在主路由文件中,或者您可以为每个项目创建一个服务提供程序,将其添加到您的应用程序配置文件中,并使用它来加载该项目的路由项目。

然而,话虽如此,这不是我会做的。你还没有说为什么你想以这种方式构建你的项目,所以你可能有一个很好的理由,但我个人更喜欢将公共库放入自己的包中(有助于确保清晰的边界和干净的 API)并使用 Composer 来将他们拉入每个项目。