有时候,尤其是在刚开始工作时,你会觉得尽管你按照指示来做,却好像没有进步——而别人都觉得这很容易。
这确实会让人感到非常沮丧,我想描述一下即使过了几十年后,我仍然会遇到类似的问题。所以我在这里尝试详细记录我在尝试解决问题时的各种失败和失误。这是我的第一篇相关文章,但我希望以后能写更多类似的分享。
我们来学学 Laravel 吧。Laravel 力求提供出色的开发体验,
无论你是 PHP web 框架的新手还是拥有多年经验的老手,
Laravel 被誉为“开发者的框架”,尤其是在 PHP 社区中,因为它比其他框架更简朴,并且采取了简单而严谨的架构设计。我之前接触过一些其他的 PHP 框架——Drupal 7、Drupal 8+、Symfony、WordPress、Concrete5、PrestaShop、CodeIgniter 等,所以我并不是毫无准备地进入这个领域。
我会从一台最基础的笔记本电脑开始,看看能做些什么。
安装先决条件(简要:问题:无,信心:满分)
在创建你第一个 Laravel 应用之前,请确保你的本地机器上安装了 PHP、Composer 和 Laravel 安装器。此外,你需要安装 Node 和 NPM 或者 Bun,以便编译前端资源。
好的。没问题。我会用 apt install
安装一些 PHP,从 getcomposer.org 下载 Composer,然后弄清楚如何安装 Laravel 安装器。我的发行版似乎自带了 Node 22,或者我在之前设置其他东西时已经安装了它,这样应该就都搞定了。
$ composer global require laravel/installer
砰!搞定。目前还没有遇到问题,我们开局不错,信心空前高涨。
创建一个新的Laravel项目(注意:有些问题,信心:高)
$ laravel new example-app
zsh: 找不到命令: laravel
哦,也许我得再看看那份过分的自信了。
看来composer并没有把任何东西安装到常规的二进制路径里,而且composer安装程序也没有做任何事情来将自己的路径添加到系统路径里。以前我从未遇到过这种情况,因为我直接从它们出现的路径运行composer安装的二进制文件,无论是哪个路径。比如,对于Drupal,有vendor/drush/drush/drush
或vendor/bin/drush
,这取决于你使用的版本。我需要为自己创建一个符号链接或别名,还是需要找到laravel二进制文件在composer添加它的位置?
不知道,我得找找这个。
我在 Stack Overflow 上找到了一些线索:你可以使用 composer global config bin-dir --absolute
这个命令来找到 composer 的二进制目录,在 composer 的现代版本中,所有可执行命令都会被放置在该目录下,而不是迷失在层级结构中。这样就不用担心找不到命令了。
好的,我可以在我的启动脚本里加点东西,把路径加进去……不过那个命令不只是生成路径……
$ composer global config bin-dir --absolute
当前目录变更为 /home/moopet/.config/composer
这是 /home/moopet/.config/composer/vendor/bin
... 而且我不能将整个字符串当作目录来使用。也许我需要使用 tail
来获取最后一行,或者其他工具。等等,还有一个 SO 回答中的评论提到了使用 --quiet
标志。这个标志是用来干什么的?我来试试 composer --help
:
用法如下:
list [选项或参数] [--] [<命名空间或名称>]
注:<namespace>
可以是命名空间或名称。
结果在仅运行 composer
命令时,实际上给出了关于 list
命令的帮助信息,而不是 composer
本身。这让我困惑了好一会儿。
-q --安静模式:不显示任何消息
嗯,这听上去好像没啥用!我们需要点实际的输出。还有啥别的没?
--raw 输出原始命令列表
--format=FORMAT 输出格式 (txt、xml、json、或 md) [默认为: "txt"]
这可能是这些里的一个吧?
“--raw” 选项没有,和“--format” 选项也没有。
果然,这些是 list
的选项,而不是通用的参数。
让我们用 --quiet
运行一下,就当是为了好玩和闹着玩,随便玩玩。
$ composer 全局配置 命令 bin-dir --绝对路径 --静默
/home/moopet/.config/composer/vendor/bin
嗯,还真没想到,竟然成功了。但是文档做得真的很差。
我会把它加到我的 shell 启动脚本里面,并加上一小段防护代码,这样我们就可以继续了。
如果存在命令 `composer`,则
export PATH=$(composer global config bin-dir --absolute --quiet):$PATH
全屏模式 退出全屏
创建一个新的 Laravel 项目,第二部分(问题:挺多一些问题——信心:不太确定)
这次当我运行 laravel new example-app
时,它会提示我一些问题。因为我还没读到文档的相关部分,所以我就选择了默认选项,除了选择启动套件。我选择了'Breeze',因为文档中就是这样建议的。
直到一切都挺好的,直到出现问题。
- composer.json 根节点的要求是 laravel/pint ^1.0,可以通过 laravel/pint 的 v1.0.0, v1.1.0, v1.1.1 版本来满足。
- laravel/pint 的 v1.0.0 到 v1.1.1 版本需要
ext-xml
扩展,请确保你还没有在系统中安装或启用 PHP 的xml
扩展。
等会儿,PHP 需要 XML 扩展?这从没列为需求。好的,我快速安装一下 apt install php-xml
。
好了,都装好了。我再试试安装。
执行 laravel new example-app
在 NewCommand.php 的第 789 行:
提示:应用程序已经存在!
哎。
所以安装程序进行了一部分,因为没有验证依赖项而中途失败了,应用程序现在处于损坏状态。这迹象不太好。Laravel是第几版,是11版本吗?
他们现在肯定已经有一些基本的需求检查了吧?哦好吧,我执行 rm -r example-app
,然后重新开始,还没有真正开始,所以也没什么损失。
简单说来,可能是DOM扩展、XML扩展,或是cURL扩展。
- phpunit/phpunit[11.0.1, ..., 11.4.3] 需要 PHP 的 dom 扩展,但你的系统中未安装。请安装或启用 PHP 的 dom 扩展。
- 根 composer.json 文件要求 phpunit/phpunit ^11.0.1,满足条件的版本包括 phpunit/phpunit[11.0.1, ..., 11.4.3]。
所以我就需要安装 php-dom
吗?不是的。试试别的。再去看 Stack Overflow。结果发现我需要安装 php-curl
。真是这样啊。
接着,删掉目录(用rm -r
),然后重新运行一下安装向导。
设置一个新的 Laravel 项目,第三次尝试(简而言之:问题仍然存在,但最近的成功增强了信心)
它提示我选择要使用的数据库服务器是哪一个。所有选项旁边都显示“缺少PDO扩展”。
唉。
我跳出安装程序,再次删除整个目录,然后运行 apt install php8.3-mysql
,因为没有直接可用的 php-pdo
包,也没有可工作的 php-mysql
别名,所以我不得不进行了一些繁琐的 apt search
。
Illuminate\Database\QueryException,
SQLSTATE[HY000] [2002] 连接被拒 (连接: MySQL, SQL:select 存在 (select 1 from information_schema.tables where table_schema = 'laravel_example_app' and table_name = 'migrations' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED')) as 'exists')
等等,这什么情况?这个安装程序从未让我输入数据库连接信息。它正试着对啥东西运行SQL命令。这到底是怎么一回事呢?
巧的是,我局域网里另一台主机上有一个 MySQL 服务器正在运行,本来打算用它(虽然自带数据库并没有被列为 Laravel 的必备条件)。我本应该安装 SQLite 的,那样可能就没问题了,因为 SQLite 无需任何凭证。
sudo apt install php8.3-sqlite
再试试看。
用户输入:删除 example-app 目录:
rm -r example-app
用户输入:使用 Laravel 创建新的 example-app 应用程序:laravel new example-app
... (省略号)
太棒了!黑客式的语气:“我进来了!”赢了!成功的宝宝。
最后我觉得我做成了吧?
但如果有人问我这大概要花多久,根据热情的文档和良好的声誉,我会说大概20分钟。如果我是为了工作的目的来做这件事,我的项目经理会根据以往的经验将其估计时间翻倍或四倍。
花了多久时间?一个傍晚花了一个小时左右,第二天也差不多用了一个小时。我没有急着完成,但这并不简单。
而且你知道吗?我对这并不满意。它没有使用MySQL,因为安装程序的那部分似乎完全出问题了。我使用的是SQLite,但这与实际生产环境还是有些距离。所以在开始实际教程之前,待办事项清单上还有一些事情需要做。
但它确实运行了,构建过程一切顺利。
我已经准备好进入下一阶段:修复当我打开浏览器中的演示页面时,控制台中出现的错误 JsonException
、Syntax error
和 ProcessTimedOutException
。
唉。
要是所有事情出厂设定就都完美该多好,不是吗?
...
- 大家:晚了
共同学习,写下你的评论
评论加载中...
作者其他优质文章