看起来它不适用于 PSR-0 或 PSR-4,您可以阅读有关 PSR here 的更多信息。我认为应该练习 PSR-0 或 PSR-4,因为它允许您完成模块化文件夹结构,同时轻松创建其他人以及您可以通过最少的设置重新/使用的代码。
我通过识别应用程序的核心组件开始为项目创建文件夹结构。例如,使用登录系统进行身份验证、注册、发送密码提醒等是很常见的……一旦我想到了一个模块,我就制作了一个或多或少遵循以下模式的composer 包:
src/
Assets/
css/
js/
less/
sass/
Controllers/
AuthController.php
UserController.php
Repositories/
UserRepository.php
Services/
Views/
partials/
login.blade.php
status-menu.blade.php
password/
recover.blade.php
reset.blade.php
MyServiceProvider.php
routes.php
composer.json
为了让 composer 自动加载你的命名空间,你需要指定一个符合 PSR-0 或 PSR-4 的路径。例如,在我的 composer.json 文件上方的 login 包中,如下所示:
{
"name": "robert/login",
"description": "description",
"authors": [
{
"name": "Robert Stanfield",
"email": "your@email.com"
}
],
"require": {
"php": ">=5.4.0"
},
"autoload": {
"psr-4": {
"Robert\\Login\\": "src/"
}
},
"minimum-stability": "stable"
}
请注意自动加载部分中的 psr-4 行...您可以通过 composer 文档了解更多信息。
现在我将所有这些代码放在版本控制系统中,例如 SVN 或 GIT,这样我就可以在任何其他我可能会用到它的项目中使用它。
您的主要项目可能是一个可以在项目之间重用的样板项目......像这样:
composer.json
index.php
public/
vendor/
现在您可能想要创建一个 Core 包或一些类似名称,其中包含您的应用特定代码,这些代码不能在其他项目中使用。
您的index.php 文件将如下所示:
// Use composer's autoloader
require('vendor/autoload.php');
// Code to handle loading all your service providers...
// maybe have like an array of service providers and then foreach over them...
现在我可以简单地使用 UserRepository 类,例如通过编写以下代码:
use Robert\Login\Repositories\UserRepository;
class UserController
{
protected $userRepo;
public function __construct(UserRepository $repo)
{
$this->userRepo = $repo;
}
public function showInactiveUsers()
{
$users = $this->userRepo->getInactiveUsers();
// TODO: generate $view
return $view;
}
}
请记住,您可以使用 Composer 在自己的包中要求包,因此解耦代码应该没有问题。通过使用 composer,您可以获得使用 PHP 社区已经创建的包的额外好处。
主要项目composer.json 文件应该需要您创建的包...例如,如果我的登录包位于 git://example.com/robert/login.git
{
"minimum-stability": "stable",
"repositories": [
{
"type": "git",
"url": "git://example.com/robert/login.git"
}
],
"require": {
"robert/login": "dev-master"
}
}
Composer 可以安装任何版本的包...您也可以在 composer 文档中阅读更多相关信息,它基本上适用于您的标签和分支名称 :)
您还需要创建一个程序来编译和/或缩小您的资产,并将它们放在您的公共文件夹中。在纯 JavaScript 或 CSS 的情况下,这减少了 HTTP 请求并减少了带宽。您可以使用诸如gulp 之类的东西来完成此操作。
希望我涵盖了所有内容...这是一个很大的想法,但很简单:)