tpojka / app-feed
阅读和发布应用 允许用户导入新的订阅链接。同时,允许用户对每篇文章进行投票,同时明确显示平均投票数。
Requires
- php: ^7.2.5
- ext-simplexml: *
- debril/feed-io: ^4.7
- doctrine/dbal: ^2.11
- fideloper/proxy: ^4.2
- fruitcake/laravel-cors: ^2.0
- guzzlehttp/guzzle: ^6.3
- kevinrob/guzzle-cache-middleware: ^3.3
- laravel/framework: ^7.24
- laravel/tinker: ^2.0
- predis/predis: ^1.1
- willvincent/laravel-rateable: ^2.2
Requires (Dev)
- ext-json: *
- facade/ignition: ^2.0
- fzaninotto/faker: ^1.9.1
- mockery/mockery: ^1.3.1
- nunomaduro/collision: ^4.1
- phpunit/phpunit: ^8.5
This package is auto-updated.
Last update: 2024-09-29 05:29:19 UTC
README
我决定使用Laravel框架,因为我最熟悉它。无论如何,我在想如何以通用的概念来解决这个问题,以便这个概念可以很容易地用于/移植到其他框架或语言。
我在Homestead环境中工作,以下是我本地机器上使用的系统规范
- Vagrant: 2.2.8(最新版为2.2.10);主机操作系统macOS
- Homestead镜像盒子:9.5.1(最新版为10.1.1);客户操作系统Ubuntu
- PHP: 7.4.13
- MySQL: 5.7.31-0ubuntu0.18.04.1(Ubuntu)
此外,为了更好的缓存机制,应在应用程序将要使用的系统上安装memcached或redis。
###解决方案描述
1.) 使用MySQL Workbench来描述数据库和表之间的关系。EER图存储在数据库/bckp/app_feed.png(与根路径相关)图像中。除了MySQL Workbench,我还使用了PHPStorm和DataGrip的数据库图可视化。
2.) 对于关系方案,我决定遵循alexdebril/feed-io包的大部分结构,因为它主要被使用,还有一个用于Symfony的包,它使用这个包,因此移植到Symfony应该非常容易。使用MySQL,表如下所示
- reader_results(有一个订阅)
- feeds(属于reader_result;有许多分类;有许多条目)
- items(属于feed;有许多分类;有一个作者;有许多媒体;有许多评分)
- authors(属于item)
- media(属于item)
- categories [多态](有许多订阅;有许多条目)
- ratings [多态、通用、从包中使用的]
3.) 使用Laravel框架来制作这个应用程序。
4.) 编写了几个测试来覆盖某些应用程序代码行为和确保执行无误。安装后,将运行composer test或./vendor/bin/phpunut命令来运行测试。
5.) 转到[HTTP_HOST]/items页面,可以查看分页的条目列表。每个条目都显示带有锚点的标题,该标题将重定向到原始文章页面、描述、作者和日期。如果条目有相关媒体,将显示第一张媒体图像。
6.) 对于评分系统,使用了willvincent/laravel-rateable包。我还创建了一个迁移文件,用于更新评分表,使user_id字段可选。如果不进行此更改,则在不注册/登录用户的情况下,包无法满足期望。对于此任务,由于没有提出使用它,因此没有使用用户表。然而,如果此包将来用于生产,则应使用包本身与users.user_id相关字段来使用此多态关系,并且应该以类似的方式调整任何其他使用。在条目页面上,有一个简单的评分文章的表单。输出结果将向上舍入为PHP_ROUND_HALF_UP整数。对于此任务,对每个访客的投票数没有限制。虽然在生产中,这应该考虑是否允许所有访客评分或仅注册/登录的访客或任何其他条件或规则。已使用AJAX post请求实现此功能。
7.) 可以通过[HTTP_HOST]/items/create页面访问带有表单的页面。表单的操作是[HTTP_HOST]/items,表单的方法是POST。表单有一个输入字段,名称为xml_link。如果提交未通过验证,则页面将重新加载并显示验证错误输出。如果表单已提交且数据正确,则将重定向到/items页面,并从数据库中显示新条目(文章),同时显示旧条目。
8.) 应用程序中使用了多个缓存层。使用了guzzle请求缓存以避免不必要的guzzle请求调用,所以如果在缓存存储中找到结果,则不会发起请求,而是使用缓存结果。另外,还有针对商品页面的数据库结果预览缓存。每个分页页面都存储在特定的键下。使用Memcached或Radis作为缓存存储引擎。
9.) 注意到错误处理和插入表单的验证。
### 安装
为了让应用程序正常运行,服务器机器上必须安装memcached或radis,因为使用了这个缓存引擎。我决定使用其中之一,因为遵循缓存逻辑的代码(即仅与数据库缓存结果相关的缓存逻辑)使用缓存标签,这些标签与这些类型的缓存引擎兼容。换句话说,如果不对memcached或redis使用,代码将需要进行修改(例如,在删除缓存键的地方)。
安装其中一个包后,应该在.env文件中设置该缓存驱动(默认值应该可以正常工作)。
还需要在.env文件中设置其他值。这些是APP_URL和DB_*。
composer install将安装所有需要的PHP包。
php artisan migrate将安装应用程序表。
composer test将执行可用的测试。