小编J. *_*Doe的帖子

什么时候在 Laravel 中使用 Repository vs Service vs Trait?

为了避免 Laravel 中的代码重复,我想要一个由多个控制器使用的方法,它在数据库中插入一些行并更新另一个表中的一些数据。

我想过使用 Repository,但我在某处读到 Repository 更适合用于检索数据,不应该用于插入。

所以我现在要使用 Traits。但我有点困惑...

有人可以简单地解释一下这些(存储库/服务/特征)中每一个的最佳用法是什么,它们有什么不同?

php laravel

15
推荐指数
1
解决办法
4100
查看次数

无法选择ip = inet_pton($ ip)的位置

我在数据库中有一个唯一的列,名为 ip

BINARY(16)使用PHP函数将IP地址转换为IP地址(不排序规则)后,将其存储在此列中

$store_ip = inet_pton($ip);
Run Code Online (Sandbox Code Playgroud)

当我尝试两次插入相同的IP时,它可以正常工作并失败,因为它是唯一的,

但是,当我尝试选择IP时,它将不起作用,并且始终返回FALSE(未找到)

<?php

try {
    $ip = inet_pton($_SERVER['REMOTE_ADDR']);
    $stmt = $db->prepare("SELECT * FROM `votes` WHERE ip=?");
    $stmt->execute([$ip]);
    $get = $stmt->fetch();

    if( ! $get){
        echo 'Not found';
    }else{
        echo 'Found';
    }

    // close connection
    $get = null;
    $stmt = null;

} catch (PDOException $e) {
    error_log($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)

我插入IP的部分:

<?php

if( ! filter_var($ip, FILTER_VALIDATE_IP)){
        return FALSE;
}

$ip = inet_pton($_SERVER['REMOTE_ADDR']);

try {
    $stmt = $db->prepare("INSERT INTO votes(ip, answer) VALUES(?,?)");
    $stmt->execute([$ip, $answer]);
    $stmt = null; …
Run Code Online (Sandbox Code Playgroud)

php mysql pdo

14
推荐指数
2
解决办法
592
查看次数

在 Ubuntu 20.04 上更新 PHP 7.4 不会更新到最新版本

我只是想在新的 Ubuntu 20.04 上安装 PHP 7.4,

做一个简单的apt install php php-cli安装默认7.4版本,

但是当我这样做时apt update && apt upgrade,版本仍然7.4.3不是7.4.5

请注意,我知道这可以通过添加ppa:ondrej/php存储库来解决。

我只是想了解,如果 Ubuntu 默认附带 7.4,为什么不更新到最新版本?即使在 2-3 年后,我们也会一直7.4.3使用 Ubuntu 20.04.0(不是下一个版本)吗?唯一的选择是添加ondrej/php存储库?

编辑:PHP 7.4.6 已于几周前发布,但我服务器上的版本仍停留在 7.4.3 上。

php ubuntu php-7.4

7
推荐指数
3
解决办法
2254
查看次数

我们可以使用 $_SERVER['REQUEST_TIME_FLOAT'] 来获得可靠的处理时间吗?

我看到每个人都建议使用一个变量,例如

$start_time = microtime(TRUE);
Run Code Online (Sandbox Code Playgroud)

在脚本的顶部,然后在最后一行我们做:

$process_time = microtime(TRUE) - $start_time;
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们能否可靠地使用$_SERVER['REQUEST_TIME_FLOAT']和跳过 $start_time ?如果是这样,为什么每个人仍然建议在顶部使用 $start_time ?

我的意思的例子:

<?php
// No need for $start_time...

// All the stuff we do to have the benchmark at the end

// Only this line needed to display execution time
echo "Processed in: ". bcsub(microtime(TRUE), "{$_SERVER['REQUEST_TIME_FLOAT']}", 4);
?>
Run Code Online (Sandbox Code Playgroud)

php execution-time time-measurement

5
推荐指数
1
解决办法
1425
查看次数

MySQL 5.7时间戳字段显示日期时间?

我的数据库中有一列名为time。此列的类型为timestamp,默认值为CURRENT_TIMESTAMP

但是在一些插入之后,phpMyAdmin它在其中将值显示为datetime,例如2019-05-05 04:24:45,甚至在那里也显示了时区并且可以更改!

我以为MySQL的时间戳是4个字节(相比于datetime的8个字节),并且不存储时区,数据与INT(10)相同,例如:(1557094115自1970年以来经过的秒数或类似的东西)

谁能解释一下,是bug还是什么?

MySQL版本5.7.25

编辑1(屏幕截图):

这是一TIMESTAMP列,默认值为CURRENT_TIMESTAMP 在此处输入图片说明

正如您所看到的那样DATETIME,我无法将它与unix_timestamp的整数值进行比较...也可以将TimeZone更改为任何值(我认为时间戳记不存储时区...) 在此处输入图片说明

编辑2:

如果(基于一个答案)MySQL在内部将其存储为整数,那么为什么不能将其与整数进行比较?(以下查询无效)

DELETE FROM `table` WHERE time < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL :days DAY))
Run Code Online (Sandbox Code Playgroud)

SQLSTATE [22007]:无效的日期时间格式:1292错误的日期时间值:第1行的“时间”列为“ 1555980012”

我也在Sequel Pro和MySQLWorkbench中尝试了相同的结果

mysql datetime timestamp phpmyadmin

2
推荐指数
1
解决办法
299
查看次数

如何在 Laravel 中设置非必需的验证规则?

我正在尝试在 Laravel 5.8 中进行一些表单验证,

但即使在没有required规则的字段上,它也会抛出错误......

例如:

request()->validate([
    'username' => ['required','alpha_num','max:40'],
    'email'   => ['email','max:100'],
]);
Run Code Online (Sandbox Code Playgroud)

如果我将email表单上的字段保留为“空”(不是必需的),则它无法提交并显示此错误:The email must be a valid email address.

我不明白,为什么会发生这种情况?required当这是 Laravel 验证的行为时,规则的用途是什么?

来自 CodeIgniter 社区,这令人困惑。

我还应该nullable在可以为空的字段中包含规则吗?

php laravel

2
推荐指数
1
解决办法
668
查看次数

Laravel back() 或 redirect() 在 Traits 中不起作用

我在所有 Traits 中都使用了 Laravel 助手,假设助手函数在任何地方都可以工作。

但是,虽然有些功能像abort()工作一样,但我刚刚意识到return redirect()并且return back()不起作用!

有人可以解释一下为什么吗?

在此之后,我有点犹豫是否要相信 Laravel...我的意思是,如果下次在abort(403)某些地方不起作用(因为我不知道哪个功能在哪里起作用)并且有人做了他们不允许的事情怎么办去做!

简化示例:

namespace App\Http\Traits;
trait TestTrait{
    public function doBack(){
        return back();
    }

    public function doRedirect(){
        return redirect()->route('test');
    }

    public function doAbort(){
        abort(403);
    }
}


use App\Http\Traits\TestTrait;
class TestController extends Controller{
    use TestTrait;

    public function testingBack(){
        $this->doBack();
    }

    public function testingRedirect(){
        $this->doRedirect();
    }

    public function testingAbort(){
        $this->doAbort();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例控制器中,testingAbort()方法可以工作,但testingRedirect()不能testingBack()!他们显示一个空白页面。

我假设我必须在控制器本身(而不是在 Traits 中)进行重定向,但这会导致在控制器方法中重复大量条件代码,而且我也不确定为什么会发生这种情况。

php laravel

2
推荐指数
1
解决办法
503
查看次数

如何在 Laravel Fortify 中对忘记密码请求进行速率限制?

我正在使用 Fortify (Laravel 8),它确实为login和提供了 RateLimiter two-factor,但不为forgot-password请求提供。

如果没有(IP 地址)RateLimiter,一个非常简单的机器人就可以执行大量外发电子邮件,基本上会导致电子邮件服务暂停,或者在使用按发送电子邮件数量收费的 SMTP 服务时造成巨大成本。

我已经尝试过:

RateLimiter::for('forgot-password', function (Request $request) {
   return Limit::perMinute(1)->by($request->ip());
});
Run Code Online (Sandbox Code Playgroud)

在我的FortifyServiceProvider.php,但它不起作用!

文件中也没有routes/web.php手动应用节流中间件的路由。

php laravel fortify

2
推荐指数
1
解决办法
3918
查看次数

了解OPCache行为

即使网站落后于CloudFlare CDN,我们还是决定使用OPCache来减少服务器上的负载,因为最大(峰值)每秒约有400个活动用户(大多数情况下为50-100 u / s)。

但是大多数页面的每个用户都有一些不同的数据,例如用户的仪表板概述,大多数数据是相同的,但是每个用户需要更新的数字却有所不同。

我的问题是:

  1. 在这样的网站上使用OPCache是​​否明智?
  2. 它将如何处理具有唯一查询的页面?是否会比不使用OPCache运行更多的RAM(为每个用户缓存多个页面)?
  3. 它会影响诸如注册/登录等页面的性能吗?
  4. 读到所有PHP应用程序都应使用OPCache,对吗?

PS该网站在PHP 7.3.4上运行

php caching cloudflare

1
推荐指数
2
解决办法
161
查看次数