我是一名Composer初学者,我正在尝试使一个项目依赖于另一个项目,而这两个项目只存在于我的本地机器上.
我的库项目(ProjectA)中的composer.json是:
{
"name" : "project/util",
"type" : "library"
}
Run Code Online (Sandbox Code Playgroud)
我在这个项目的基础文件夹中初始化了git.
我的composer.json在项目中取决于第一个(ProjectB):
{
"repositories": [
{
"name" : "util",
"type" : "git",
"url" : "/d/workspaces/util"
}
],
"require": {
"project/util" : "*"
},
}
Run Code Online (Sandbox Code Playgroud)
当我composer install从ProjectB 运行时,我收到以下错误:
Run Code Online (Sandbox Code Playgroud)[RuntimeException] Failed to clone , could not read packages from it fatal: repository '' does not exist
我认为存储库的url有问题,但我不确定还有什么要写在那里.
我正在尝试使用Slim3框架以及Twig模板系统在php中创建一个身份验证系统,对于数据库,我正在使用MySQL和PDO。我也在尝试使用模型视图控制器设计模式来实现它。但是我很难理解如何为Web应用程序使用MVC结构。我在网上查看了过多的解释,似乎没有明确的答案。很多人说要使用PHP框架,例如Laravel,Symfony或CodeIgniter,因为他们显然采用了类似MVC的结构。但是,我宁愿保持简单,并手动编写代码,而不是使用框架。
我目前对MVC有两种解释。此图中描绘了第一个:
我看到的另一种解释是:(摘自该YouTube视频)
我已经做了研究。问题和答案,如这和这个是有帮助的。但是我仍然不确定如何构造自己的应用程序,特别是识别和理解MVC的模型方面。现在,我将说明身份验证应用程序的注册过程。这样您就知道我的代码是如何工作的。
首先,我有一个SQLQueries类,该类将一系列SQL语句简单地放入函数中。然后,我有一个SQLWrapper类,该类具有的功能可以例如在数据库中存储新用户的详细信息。此类还从SQLQueries类调用函数。我也有一个ValidateSanitize类,该类具有清理用户输入以及检查用户输入在表单中是否有效的功能。我认为这三个类是MVC模型方面的一部分,但我不确定。我看到了许多其他的使用“用户模型类”的教程,但我的应用程序中找不到它们。
我的视图只是显示HTML的Twig模板,例如主页,注册,登录等。然后我有了控制器。我打算让多个控制器执行不同的操作。目前,我只实现了AuthController,该控制器负责注册和登录用户。
因此,AuthController要做的第一件事是在名为getRegisterForm的函数中显示注册表。用户提交表单后,postRegisterForm函数将获取该用户输入并将其分配给有污染的变量。
public function postRegisterForm($request, $response)
{
$arr_tainted_params = $request->getParsedBody();
$tainted_email = $arr_tainted_params['email']; it a variable
$tainted_username = $arr_tainted_params['username'];
$tainted_password = $arr_tainted_params['password'];
$tainted_password_confirm = $arr_tainted_params['password_confirm'];
Run Code Online (Sandbox Code Playgroud)
接下来,实例化所有前面的三个类以及数据库详细信息,以便可以在AuthController中使用它们的功能:
$sanitizer_validator = $this->container->ValidateSanitize;
$sql_wrapper = $this->container->SQLWrapper;
$sql_queries = $this->container->SQLQueries;
$db_handle = $this->container->get('dbase');
Run Code Online (Sandbox Code Playgroud)
然后,使用sanitize_input函数清除受污染的用户详细信息。然后,将清理后的用户详细信息输入到validate函数中,以确保它们不会触发任何验证冲突。密码也在此处散列:
$cleaned_email = $sanitizer_validator->sanitize_input($tainted_email, FILTER_SANITIZE_EMAIL);
$cleaned_username = $sanitizer_validator->sanitize_input($tainted_username, FILTER_SANITIZE_STRING);
$cleaned_password = $sanitizer_validator->sanitize_input($tainted_password, FILTER_SANITIZE_STRING);
$cleaned_password_confirm = $sanitizer_validator->sanitize_input($tainted_password_confirm, FILTER_SANITIZE_STRING);
$hashed_cleaned_password = password_hash($cleaned_password, PASSWORD_DEFAULT);
$sanitizer_validator->check_email_exists($cleaned_email);
$sanitizer_validator->validate_email($cleaned_email);
$sanitizer_validator->validate_username($cleaned_username);
$sanitizer_validator->validate_password($cleaned_password);
$sanitizer_validator?validate_password_confirm($cleaned_password_confirm);
Run Code Online (Sandbox Code Playgroud)
最后,有一个if语句,检查所有验证错误消息是否为空。如果是的话,我们将为SQLWrapper类提供数据库详细信息以及SQLQueries类对象。然后,通过调用SQLWrapper类store-details函数将用户详细信息插入数据库。最后,我们将用户定向到登录页面,以便用户可以登录其新注册的帐户。
if ($sanitizer_validator->get_validate_messages('email_error') == ' …Run Code Online (Sandbox Code Playgroud) 我正在开发一个包含多个Composer软件包的应用程序。
首先,我有一个“主”应用程序(在Composer中将是一个“项目”),它将包含所有必要的文件和文件夹:
app/
public/
index.php
logs/
config.php
..etc..
Run Code Online (Sandbox Code Playgroud)
这不是问题。我只是在composer文件中将类型设置为“ project”,以便可以使用进行安装composer create-project foo/bar。
我还将为主应用程序构建一些可选扩展。他们将是他们自己的Composer软件包。这都不是问题。我只是将它们设置为“ library”类型,并使用安装它们composer install foo/the-extension。
扩展将具有自己的名称空间,其中一些将具有自己的依赖性。其中的几个甚至将具有相同的依赖关系。
这是必需的,因为它们都是可选的。您可以安装一个或另一个。
当前,我已经在主应用程序中创建了一个名为“ / dev”的新文件夹,在开发过程中我拥有了所有扩展名。然后,在主应用程序中,我正在加载所有扩展自动加载器:
# Main apps autoloader
require_once __DIR__ . '/vendor/autoload.php';
# Extensions
require_once __DIR__ . '/dev/foo/vendor/autoload.php';
require_once __DIR__ . '/dev/bar/vendor/autoload.php';
...etc...
Run Code Online (Sandbox Code Playgroud)
这可行,但是有一些缺点:
拥有一个以上的自动装带器永远都不是一件好事,因为那样会导致事情混乱。
那么,有人知道这种处理方式是正确的吗,还是“情况好了,如果对您有用,就是那样”的情况之一吗?
一段时间以来一直在寻找一个好的解决方案,但没有找到任何解决方案。如果我在此处错过了一些答案,请将其标记为重复,我将删除此帖子。
正如@sammitch在下面的答案中指出的那样,我可以使用Composers的“存储库”键添加扩展名。这样可以消除多重自动加载器的问题。但是,这会使开发流程变得很尴尬:
composer update在主应用程序中执行一个(以获取新提交)我宁愿不必每次都更改扩展代码来查看所有更改是否有效。