1. Statamic
2. Juzaweb
3. Lavalite
4. Microweber
5. Filament
6. PyroCMS
example.com {
root ./public
fastcgi / 127.0.0.1:9000 php
rewrite {
to {path} {path}/ /index.php?{query}
}
}
原因是没有开启openssl扩展。
不过,在windows环境下还有一个需要注意的,就是php.ini文件中extension_dir需要修改为绝对路径,
如下:
extension_dir="C:\phpstudy_pro\Extensions\php\php7.4.3nts\ext"
mysql_real_escape_string在php8不能用,mysqli_escape_string需要mysqli。
pdo也有一个过滤非法字符函数就是quote(),在laravel中用法如下。
DB::connection()->getPdo()->quote()
caddy和php容器不同时需要分别设置root路径,参考以下caddyfile文件。
mysite.com {
// 这是caddy容器下的laravel目录
root * /srv/mysite.com/public
encode zstd gzip
file_server
try_files {path} /index.php?{query}
php_fastcgi * php_docker:9000 {
// 这是php容器下的laravel目录
root /var/www/html/mysite.com/public
}
log {
output file /data/caddy.log
}
}
您可能已经尝试过 Laravel Octane 和 RoadRunner,这是一款用 Go 编写的简洁的小型 PHP 服务器。在 Octane 和 RoadRunner 的基本安装中,您会注意到一个 .rr.yaml 文件被写入项目文件夹,但实际上是空的。同样,如果您尝试使用 ./rr 运行 RoadRunner 二进制文件,那么它将因缺少配置值而失败,相反,您应该通过 php artisan octane:start 命令运行 Octane。
这是有效的,因为 octane:start 命令在托管进程中运行 RoadRunner 二进制文件本身,同时通过带有一些环境变量的命令行参数配置服务器。
如果我们想在没有 start 命令的情况下运行 RoadRunner 二进制文件,我们必须使用相同的命令参数运行它,或者自己填写 .rr.yaml 配置。这些值需要如下:
http:
address: 127.0.0.1:8000
pool:
num_workers: 0
max_jobs: 500
supervisor:
exec_ttl: 30s
static:
dir: public
middleware: ["static"]
server:
command: "php ./vendor/bin/roadrunner-worker"
env:
- APP_ENV: production
- APP_BASE_PATH: "/path/to/your/laravel/protect"
- LARAVEL_OCTANE: "1"
rpc:
listen: tcp://127.0.0.1:6001
logs:
mode: production
level: debug
output: stdout
encoding: json
虽然配置中有两个部分您可能希望更改。即服务器命令的 envs。要运行该过程,您必须通过此文件对APP_BASE_PATH和APP_ENV进行硬编码,这可能会很痛苦。
另一件需要注意的事情是,默认情况下,Laravel Octane 在项目的 .gitignore 文件中安装了带有 .rr.yaml 配置文件的 RoadRunner,因此您必须在每台机器上进行设置,除非您决定更改它,尽管目前我认为最好添加您使用的每台设备的配置,因为基本路径可能会在每台机器上更改。
修改后的 .rr.yaml 文件到位后,您现在可以运行 ./rr serve 命令并运行服务器,而无需使用 artisan。
为什么要直接运行 RoadRunner?
这可能会成为一个问题,为什么直接使用 road runner 二进制文件可能更好,答案是,对于大多数人来说,事实并非如此。就我自己而言,我打算在未来构建更多的 roadrunner,包括在 docker 容器中运行服务器。因此,我实际上需要 RoadRunner 将其日志记录信息直接输出到 stdout 中,而不是使用 octane:start 命令将此日志记录信息混淆为自己的格式,从而使查看请求状态变得非常简单。
希望这对一些希望更深入地了解 RoadRunner 以及如何在基本设置之外对其进行自定义的人有用。如果您想了解有关 RoadRunner 配置中可用选项的更多信息,可以在文档中阅读相关内容。
在安装laravel octane扩展后,运行roadrunner时,出现Undefined constant "Laravel\Octane\Commands\Concerns\SIGINT"错误。
这是因为代码中没有检查是否安装了pcntl扩展导致的,也就是说roadrunner需要pcntl库。
因此,安装ext-pcntl扩展后运行即可。
这种情况是原有laravel项目迁移时,文件目录没有完全迁移导致的。
主要是storage目录下的结构与原项目不同。
尝试把原项目的storage目录拷贝的迁移项目中。
首先,在config/app.php里timezone设置为Asia/Shanghai,
其次,model文件中如下设置serializeDate,
use DateTimeInterface;
// 仅设置此方法可行protected function serializeDate(DateTimeInterface $date)
{
return $date->format('Y-m-d H:i:s');
}
// 仅设置以下属性无效protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
];
一个接口允许游客访问,同时支持已登录用户相关的一些判断,比如是否点过赞。
此时,该接口不受路由保护,但需要获取用户信息,通常使用的$request→user(),在没有添加auth:sanctum中间件时,此时始终返回null。
以下方法可以在没有添加auth中间件的路由中获取用户信息。
$user = auth('sanctum')->user();//查询用户信息
RUN apt-get install -y zip libzip-dev && docker-php-ext-install zip
首先,安装libzip库,然后就是docker-php-ext-install来安装zip扩展即可。
写法如下,需要注意的是e参数是一条数据对象,不是字段值。下面代码中e不是attachement的值。
field: 'attachement', title: 'attachement', templet: function (e) {
switch (e.attachement.content_type) {
case 'text':
return e.attachement.content;
break;
case 'image':
return "<img src=\"" + e.attachement.content + "\" style=\"width:100px;height:100px;\">";
break;
case 'video':
break;
}
}
以下两种方式都可以。
1. request→merge()
$request->merge(['user_id' => 1]);
2. request→offsetSet()
$request->offsetSet('user_id', 1);
使用seeder可以批量生成数据
public function run()
{
$faker = Faker::create();
$limit = 10;
for ($i = 0; $i < $limit; $i++) {
DB::table('posts')->insert([
'title' => substr($faker->sentence($faker->numberBetween(1,5),true), 0, -1), //Remove . from the end
'category' => $faker->randomElement(['travel', 'life style', 'in focus', 'globe']),
'tags' => implode(',', $faker->randomElements(['Meklowski', 'Incident', 'East', 'Charles Jo.', 'Space', 'Universe', 'DIY', 'Tuts'], $faker->numberBetween(1,8)) ),
'content' => $faker->text(6000)
]);
}
}
Route::group(function () {
Route::get('/list', [\App\Http\Controllers\Controller::class, 'list']);
});
group下只有一个路由会有如上报错。
- 创建函数库:app/Helpers/ArrayHelper.php
<?php
if (!function_exists('flatten')) {
function flatten(array &$list): array
{
$flat = [];
while ($e = array_pop($list)) {
if (is_array($e)) {
array_push($list, array_values($e));
} else {
$flat[] = $e;
}
}
return $flat;
}
}
2. 设置自动加载
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
},
"files": [
"app/helpers.php"
]
},
3. 运行自动加载命令
composer dump-autoload
在Laravel中,门面类(Facade)是一种提供简单接口以访问底层实现的功能的类。Laravel自带了许多门面类,例如File、Log等。如果你想自定义一个门面类,可以按照以下步骤进行:
创建门面类文件:
在Laravel项目的app目录下创建一个新的文件,例如MyFacade.php。
命名空间:
在MyFacade.php文件中,使用适当的命名空间。例如:
php复制代码<?php namespace App\Facades; use Illuminate\Support\Facades\Facade;
创建门面类:
在MyFacade.php文件中,继承Facade类并实现getFacadeAccessor方法。该方法用于指定底层实现的类名。例如:
php复制代码<?php namespace App\Facades; use Illuminate\Support\Facades\Facade; class MyFacade extends Facade { protected static function getFacadeAccessor() { return 'my-service'; } }
在上面的示例中,我们将底层实现的类名设置为 'my-service'。
4. 注册门面类:
在Laravel项目中,门面类的注册通常在bootstrap目录下的app.php文件中完成。找到以下代码:
php复制代码// Laravel Facades... require_once __DIR__.'/../app/Http/Facades/Route.php'; require_once __DIR__.'/../app/Http/Facades/Request.php'; require_once __DIR__.'/../app/Http/Facades/Response.php'; require_once __DIR__.'/../app/Http/Facades/View.php';
在文件末尾添加以下代码以注册自定义门面类:
php复制代码// Custom Facade... require_once __DIR__.'/../app/Facades/MyFacade.php';
使用自定义门面类:
现在你可以在Laravel项目中使用自定义门面类了。例如,在控制器或任何其他类中,使用以下代码:
php复制代码use App\Facades\MyFacade;
然后,你可以像使用内置的门面类一样使用自定义门面类。例如,调用底层实现的方法:
php复制代码$result = MyFacade::someMethod($param1, $param2);
比如,需要判断模型中是否有user_id字段,用以下方法即可。
Schema::hasColumn($this->model->getTable(), 'user_id')
如下所示,在model文件中的$casts属性定义时间格式即可。
protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
'updated_at' => 'datetime:Y-m-d H:i:s'
];
修改config/App.php文件中的timezone
'timezone' => 'Asia/Shanghai',