我正在使用Laravel构建RESTful API.我的API总是返回JSON.我想做的是将响应逻辑保持在一个地方.以下是我现在在API控制器中执行此操作的方法Route::controller()
.有趣且超有用的例子来了:
public function getDouble($number) {
try {
if (!is_numeric($number)) {
throw new HttpException(400, 'Invalid number.');
}
$response = $number * 2;
$status = 200;
}
catch (HttpException $exception) {
$response = $exception->getMessage();
$status = $exception->getStatusCode();
}
return response()->json($response, $status);
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,我的API路由将由/double/13
GET方法访问.问题是我在每个方法中重复这个try ... catch块.我希望我的API方法如下:
public function getDouble($number) {
if (!is_numeric($number)) {
throw new HttpException(400, 'Invalid number.');
}
return $number;
}
Run Code Online (Sandbox Code Playgroud)
然后,捕获这些异常并在另一个地方形成JSON.在良好的应用程序架构方面,这里最好的方法是什么?
我想Exception
从我的一个控制器(或将来在几个控制器中)捕获所有普通的异常(类的实例)来统一它们的行为.我知道如何在Exceptions/Handler.php中为异常创建全局处理程序,但是如何将它们限制为某个特定的控制器呢?
我想要做的是在我的API控制器中抛出Exception时以JSON格式返回这样的数组:
[
'error' => 'Internal error occurred.'
]
Run Code Online (Sandbox Code Playgroud)
我可能决定抛出自己的异常类,ApiException
但我也希望提供第三方异常,例如数据库错误.
我应该直接将一些值传递给请求对象吗?如果是这样,怎么样?或许还有另一种方式?
我正在尝试垂直对齐文本块。我有一个:before
伪元素,我想要实现的是将两者对齐到中间。
是否可以在没有额外包装的情况下实现它?我的问题是这样的:
\n\n\n\nHTML:
\n\n<div class="fail">Something\'s wrong</div>\n<div class="success">\n <span>Perfect middle</span>\n</div>\n
Run Code Online (Sandbox Code Playgroud)\n\nCSS 失败:
\n\n.fail\n{\n background: orange;\n font-size: 30px;\n display: inline-block;\n}\n\n.fail:before\n{\n background: red;\n content: \'\xe2\x9c\x97\';\n text-align: center;\n display: inline-block;\n line-height: 60px;\n margin-right: 10px;\n vertical-align: middle;\n width: 60px;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\nCSS 成功:
\n\n.success\n{\n font-size: 30px;\n background: lime;\n display: inline-block;\n}\n\n.success:before\n{\n background: green;\n content: \'\xe2\x9c\x93\';\n text-align: center;\n display: inline-block;\n line-height: 60px;\n margin-right: 10px;\n vertical-align: middle;\n width: 60px;\n}\n\n.success span {\n vertical-align: middle;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n从这张照片上可能不太明显,但左边那张太高了,大约有2-3个像素的差异。这对于较小的元素尤其重要。
\n\n所以我的问题是:我可以只用一个 HTML 标签来实现完美的中间 + …
Laravel 5 中的所有控制器仍然以Controller
后缀命名,例如AuthController
和PasswordController
。是否有任何理由使用自己的控制器遵循此约定,或者这些后缀只是前命名空间时代的遗留物?
我大部分时间都使用基于操作的 URL 生成,因此我避免使用类似 的链接url('home')
,但更喜欢类似的链接action('HomeController@index)
。这样我就可以轻松地更改 URL 模式。
但action('Home@index')
要优雅得多。背后有什么陷阱吗?
每当我在Laravel网站上回顾历史时,我看到的回答如下:
{}
Run Code Online (Sandbox Code Playgroud)
当我前往我之前的位置时,它也显示了那些括号.
如果我使用"禁用缓存"选项在Chrome中启动"开发人员工具",则不会出现此问 该Content-Type
的精选返回什么确实application/json
.在Firefox中没有这样的问题.
这是因为我的一个中间件.我编写了AjaxJson中间件来将所有Ajax请求转换为JSON响应.奇怪的是,当我回到历史时,谷歌Chrome会向Ajax发出此请求.它包含此标头:
X-Requested-With:XMLHttpRequest
因此$request->ajax()
返回true
.
这是我的中间件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Response;
class AjaxJson
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
if (!$request->ajax()) {
return $response;
}
if (!$response instanceof Response) {
return $response;
}
return response()->json($response->getOriginalContent(), $response->status());
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我发现了响应头的no-store
值Cache-Control …
我发现Swift 3.1中String
的#function
文字返回的内容很奇怪。这里:
class FunctionLiteralTest {
func weirdo() -> String {
return #function
}
func weirdo(parameter: Int) -> String {
return #function
}
func weirdo(_ parameter: Int) -> String {
return #function
}
func weirdo(_ parameter: Int, _ anotherParameter: Int) -> String {
return #function
}
}
let functionLiteralTest = FunctionLiteralTest()
functionLiteralTest.weirdo() // returns "weirdo()"
functionLiteralTest.weirdo(parameter: 1) // returns "weirdo(parameter:)"
functionLiteralTest.weirdo(1) // returns "weirdo"
functionLiteralTest.weirdo(1, 2) // returns "weirdo"
Run Code Online (Sandbox Code Playgroud)
当未标记所有参数时,将完全跳过括号。我很明白,如果#function
返回的函数名也没有括号,也就没有任何参数。
那是合理的行为还是错误?
git pull
在git中,如果有任何未提交的修改则无法执行,出现以下错误:
错误:无法使用变基拉取:您有未暂存的更改。
错误:请提交或隐藏它们。
但它适用于未跟踪的文件。我发现这非常烦人,git stash
每次我想要拉取时都需要这样做,即使我的更改与拉取的文件无关。
如果我的更改与拉取的更改不冲突,是否有任何解决方法允许拉取?我真的不明白为什么如果拉力不会破坏任何东西它就不起作用。如果这是一个安全问题,那么为什么它适用于新文件?理论上,拉取可以引入相同路径的新文件。
有什么解决方案可以让它变得更容易吗?
我从未意识到PHP中的函数可以具有自己的静态变量,如下所示:
function example() {
static $heavy;
if ($heavy === null) {
$heavy = new HeavyClass();
}
return $heavy->doSomething();
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否可以从外部访问此静态值?诸如之类的东西example::$heavy
显然不起作用。
当我们尝试直接更改 prop 值时,Vue.js 会显示警告,如下所示:
Vue.component('Games', {
template: `
<div>
<ol>
<li v-for="game in games">{{ game }}</li>
</ol>
<button @click="clear">Clear games</button>
</div>
`,
props: ['games'],
methods: {
clear: function () {
this.games = [];
}
}
});
Run Code Online (Sandbox Code Playgroud)
显示的警告是:
避免直接改变 prop,因为每当父组件重新渲染时,值都会被覆盖。相反,根据道具的值使用数据或计算属性。
我知道为什么会发生这种情况,但令我惊讶的是它不会发生在.push()
. 如果我更改方法以向数组添加值而不是重写它,则不会发出警告:
methods: {
add: function () {
this.games.push('Whatever');
}
}
Run Code Online (Sandbox Code Playgroud)
为什么没有警告?如何直接推送到道具很好而重写不是?
我的 React 应用程序使用next-i18next
package.json。我想在我的插值中放入一些 React 组件:
import React from 'react';
import { useTranslation } from 'next-i18next';
import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
export default function Review({ text, author }) {
const { t } = useTranslation('reviews');
return (
<article>
<p>{text}</p>
<footer>
{t('footer', { author: <a href={author.url}>{author.name}</a> })}
</footer>
</article>
);
}
export const getStaticProps = async ({ locale }) => ({
props: {
...await serverSideTranslations(locale, ['reviews']),
}
});
Run Code Online (Sandbox Code Playgroud)
和reviews.json
:
import React from 'react';
import { useTranslation } …
Run Code Online (Sandbox Code Playgroud)