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

时间:2014-03-21 09:40:23

标签: php laravel laravel-4 instance projects

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

我想要这样的东西。

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

    应用程序/控制器

    应用程序/模型

    应用程序/观点

    供应商

    自举

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

    应用程序/控制器

    应用程序/模型

    应用程序/观点

    自举

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

    应用程序/控制器

    应用程序/模型

    应用程序/观点

    自举

即,新项目必须有自己的app目录,并且能够使用普通项目中的模型函数。

这将简化我的任务,对我即将开展的项目非常有用。 如果有人能帮助我,我真的很感激。

2 个答案:

答案 0 :(得分: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"
},

您在Core中常见的所有内容,相关项目文件中的所有内容都不常见。

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

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

<?php namespace App\Core\Controllers;

use Controller; // This is the Laravel Controller

class BaseController extends Controller {

}

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

<?php namespace App\Main\Controllers;

use App\Core\Controllers\BaseController as CoreBaseController;

class BaseController extends CoreBaseController {

}

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

<?php namespace App\Main\Controllers;

class HomeController extends BaseController {

}

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

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

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

    Route::get('posts', 'PostsController@index']);
});

给那些网址:

http://yourdomain.com/project1
http://yourdomain.com/project1/posts

将动作指向那些控制器动作:

App\Project1\Controllers\HomeController@index
App\Project1\Controllers\PostsController@index  

答案 1 :(得分:0)

这里不是一个真正需要回答的问题,但总的来说,你想做的事情是非常可行的。

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

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

但是,所有这些都说,这不是我要做的。您还没有说过为什么要以这种方式构建项目,所以您可能有一个很好的理由,但我个人更喜欢将公共库放入自己的包中(有助于确保清晰的边界和干净的apis)并使用作曲家将他们带入每个项目。