解决 Laravel 中
$request->none
方法不存在的问题
在 Laravel 开发中,有时会遇到
$request->none
方法不存在的问题。这是因为 Laravel 的
IlluminateHttpRequest
类并没有提供方法。介绍几种解决这个问题的方法,并提供相应的代码示例。
1. 使用方法的反向逻辑
Laravel 的类提供了方法来检查请求中是否存在某个参数。我们可以利用这个方法的反向逻辑来实现方法的功能。
phpif (!request()->has('parameter_name')) {// 参数不存在时的处理逻辑}
示例代码
假设我们有一个表单提交,需要检查和是否都不存在:
phpif (!request()->has('email') && !request()->has('phone')) {// email 和 phone 都不存在时的处理逻辑}
2. 自定义类
如果需要频繁使用方法,可以考虑自定义一个类,并在其中添加方法。
创建自定义类
创建一个新的类:
bashphp artisan make:request CustomRequest
修改
CustomRequest
类

在生成的
CustomRequest
类中添加方法:
phpnamespace AppHttpRequests;use IlluminateFoundationHttpformRequest;
class CustomRequest extends FormRequest{public function none(array $keys){foreach ($keys as $key) {if ($this->has($key)) {return false;}}
return true;}// 其他方法和验证规则
使用自定义类
在控制器中使用自定义的
CustomRequest
类:
phpnamespace AppHttpControllers;use AppHttpRequestsCustomRequest;
class ExampleController extends Controller{public function store(CustomRequest $request){if ($request->none(['email', 'phone'])) {// email 和 phone 都不存在时的处理逻辑}}}
3. 扩展类
另一种方法是扩展
IlluminateHttpRequest
类,并添加方法。
创建扩展类
创建一个新的扩展类:
phpnamespace AppHttp;use IlluminateHttpRequest as BaseRequest;
class Request extends BaseRequest{public function none(array $keys){foreach ($keys as $key) {if ($this->has($key)) {return false;}}
return true;}
注册扩展类
在
AppServiceProvider
中注册扩展类:
phpnamespace AppProviders;use IlluminateSupportServiceProvider;use AppHttpRequest as CustomRequest;
class AppServiceProvider extends ServiceProvider{public function register(){$this->app->bind('IlluminateHttpRequest', CustomRequest::class);}
public function boot(){//}
使用扩展类
在控制器中直接使用扩展后的类:
phpnamespace AppHttpControllers;use IlluminateHttpRequest;
class ExampleController extends Controller{public function store(Request $request){if ($request->none(['email', 'phone'])) {// email 和 phone 都不存在时的处理逻辑}}}
通过以上几种方法,我们可以在 Laravel 中实现类似方法的功能,从而更好地处理请求中的参数检查问题。能对你的开发工作有所帮助。
Linux:$()和()都能执行指令,有什么区别呢?
需要分情况:1、file=$(ls /tmp) 这里$file是字符串 file = (ls /tmp) 这里$file是数组2、$(ls /tmp) 会把显示的结果作为命令执行(ls /tmp) 只显示结果
LINUX SHELL AWK 符号问题 awk 'BEGIN{var=" ' "$file" ' "}END{print var;}' "$file"
其实很简单,这样写是由于单引号和双引号的区别。
单引号括起来的内容中,特殊字符会自动转译,即$会当成一个普通字符。
双引号括起来的内容中:特殊字符不会转译,所以$file会被当成一个变量。
$file等价于\$file如果语句写成:awk BEGIN{var=$file}END{print var;}输出就会是字符串为$file,而不是,所以如果你想要结果是的话,那个语句其实也能写成:awk BEGIN{var= $file }END{print var;},这是最正确和简洁的写法。
也就是哪里特殊符号需要不转义,就用双引号,其他语句用单引号(语句可看成三段1. BEGIN{var=2. $file3. }END{print var;})。
nginx中proxy_set_header Host $host;的作用!~请详解!~
nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。
其中proxy_set_header指令就是该模块需要读取的配置文件。
在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。
Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】。
同理,X_Forward_For字段表示该条http请求是有谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头:proxy_set_header Host $http_host;proxy_set_header X-Forward-For $remote_addr;这里的$http_host和$remote_addr都是nginx的导出变量,可以再配置文件中直接使用。
如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。
因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。
发表评论