小编Joh*_*nes的帖子

Laravel策略 - 如何传递多个参数

我正在尝试授权用户角色删除/更新帖子.我正在使用策略这样做,但我只能将一个参数传递给策略函数.如果我传递的不仅仅是用户和另一个变量,则该变量不会传递给该函数.

模特:用户有很多字符,一个字符可以发布多个帖子.因此,出于授权目的,我必须将帖子的character_id与当前角色的id进行比较......-

根据文档,您可以将更多倍数传递给Gate Facade:

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});
Run Code Online (Sandbox Code Playgroud)

但无论如何我都找不到政策.我必须做的是注入Request对象以获取授权所需的对象.基本上我甚至不需要用户对象.

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}
Run Code Online (Sandbox Code Playgroud)

使用Request对象可以工作,但感觉非常hacky.有没有更好的方法来实现这一目标?

编辑:

CharacterLocationController我有一个方法show,我想在显示资源之前授权该操作.

public function show(Request $request, Character $character, Location $location)
{
    $this->authorize([$location, $character]);
    ...
}
Run Code Online (Sandbox Code Playgroud)

政策是这样注册的:'App\Location' => 'App\Policies\LocationPolicy'AuthServiceProvider

我将转发的数组转储到策略函数中,它只输出$location.

public function show(User $user, $data) {
    dd($data); // expecting location and character
    return !$location->private || $location->authorized->contains($this->character);
}
Run Code Online (Sandbox Code Playgroud)

php authorization laravel laravel-5.2

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

基于Laravel会话的auth:api中间件无法正常工作

我尝试使用Laravel 5.3的Auth Scaffolding,包括api路由.我想为api后卫使用会话驱动程序,但显然这没有任何影响.我登录到使用有效的用户应用程序之后(所以我从获取/login/home)我试图进入的路径/api/user,但它总是重定向我/home.该RedirectIfAuthenticated中间件将用户重定向.

以下是我尝试过的内容以及测试应用程序的快速概述:

// In "app\Http\Middleware\RedirectIfAuthenticated.php"
if (Auth::guard($guard)->check()) {
    return redirect('/home');
}
Run Code Online (Sandbox Code Playgroud)

$guard为null,浏览时if为true /api/user.

// In "config\auth.php"
'api' => [
    'driver' => 'session', // changed from token to session
    'provider' => 'users',
],
Run Code Online (Sandbox Code Playgroud)

我改变了api后卫的司机session.

// In "app\Http\Kernel.php"
'api' => [
    'throttle:60,1',
    'bindings',
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Session\Middleware\StartSession::class,
],
Run Code Online (Sandbox Code Playgroud)

我添加了中间件以支持api中间件中的cookie

// In "routes\api.php"
Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:api');
Run Code Online (Sandbox Code Playgroud)

这是一个新的Laravel安装附带的示例.

// In "app\Providers\RouteServiceProvider.php"
Route::group([
    'middleware' => 'api', …
Run Code Online (Sandbox Code Playgroud)

php laravel laravel-5.3

7
推荐指数
1
解决办法
7088
查看次数

当时jquery多个延迟

我在同步脚本加载和使用jQuery执行它时遇到问题.

我看起来像这样:

// Load Libraries in 'when'
$.when(
    loadJSFile("lib1.js"),
    loadJSFile("lib2.js")
    loadJSFile("lib3.js")
).then(function() {
    // Load JS files that use the library files
    loadJSFile("file1.js");
    loadJSFile("file2.js");
    loadJSFile("file3.js");
    // needs to return deferred object...
}).then(function() {
    // Call functions declared in file1, file2 and file3
    func1();
    func2();
    func3();
});
Run Code Online (Sandbox Code Playgroud)

loadJSFile通过$ .getScript加载一个javascript文件,如果它尚未包含在DOM中,则返回$ .getScript Promise,或者不返回任何内容(如果已经包含).

我认为第一个调用必须返回Promise/Deferred,但是如何使用3个Deferred对象?

上面的代码在加载file1到file3之前调用3个函数(func1,func2和func3)...

javascript jquery

6
推荐指数
1
解决办法
95
查看次数

websocket + vuejs:屏幕闪烁,可见胡须代码

我使用websockets和vuejs构建了一个web应用程序.

在DOM中,我想循环遍历vuejs处理的数据.然而,在建立websocket连接并且已经接收到数据之后,在时间线中稍后设置数据.

到那时(大约0.5秒),你可以在网站上看到vuejs的胡子代码,然后看到它闪烁并添加真实数据.

我从websocket连接接收数据时创建ViewModel,如下所示:

onMessage: function (e) {
    new Vue({
        el: '#messages',
        data: {
            messages: e.data
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过在页面加载时初始化ViewModel,并在以后设置数据:

var vms = {
    messages: new Vue({
        el: '#messages',
        data: {
            messages: {
            }
        }
    })
};
Run Code Online (Sandbox Code Playgroud)

onMessageWebSocket的事件:

var vm = vms.messages;
vm.$data = { messages: body };
Run Code Online (Sandbox Code Playgroud)

但问题是,在vm初始化之前仍有延迟.顺序是这样的:

页面加载 - >可见胡子代码 - >胡须代码被隐藏,因为数据被设置为空对象 - >实际数据显示在websocket收到之后

关于这个问题的任何想法/最佳实践?

javascript websocket vue.js

6
推荐指数
1
解决办法
5379
查看次数

乳胶 - 使用 [mathescape] 在 lstlisting 中转义美元符号

我在经过数学处理的 lstlisting 环境中转义美元符号时遇到问题

\begin{lstlisting}[mathescape]
  $\delta$(Z, $\varepsilon$, $S) = (R, $\varepsilon$)
                             ^ 
\end{lstlisting}
Run Code Online (Sandbox Code Playgroud)

相关问题的回答的帮助下,我有了使用另一个符号而不是像这样的美元符号的想法:

\lstset{
  literate={\§}{{\textcolor{black}{\$}}}1
}
Run Code Online (Sandbox Code Playgroud)

但是当我在列表中使用时,我得到的\$不是$.

latex tex listings

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

graphviz - 每个标签有多个链接

我正在寻找一种方法来为 svg 导出的标签添加多个链接,但我不能有多个边缘。

现在我有这样的事情:

Node1 -> Node2 [ href="some.resource.xyz", label="Resource\nAdditionalInfo" ]
Run Code Online (Sandbox Code Playgroud)

我需要的是有这样的东西:

Node1 -> Node2 [
  label="Resource\n              # href to "some.resource.xyz"
         Additional Information" # href to some.additional.info
]
Run Code Online (Sandbox Code Playgroud)

svg graphviz

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

vuejs2 - 如何为单个文件组件层次结构创建事件总线

我在这里找到了LinusBorg的解决方案,它在任何Vue实例中全局注册总线.有没有办法在组件层次结构中定义它,以便我可以创建多个范围的总线?基本上,如果我有一些带有一些子节点的"root"级组件,则应该为"root"级别组件和它的子节点而不是所有Vue实例设置事件总线.

我不能用简单的$emit$on,因为层次不局限于简单的parent-child通信.所以事件必须通过多个级别传递.

vue.js vue-component

4
推荐指数
1
解决办法
1398
查看次数

Laravel - 如何注册自定义广播器

我想用BroadcastManager注册一个自定义广播器,而不必更改内部框架代码......

现在我必须在Illuminate\Broadcasting\BroadcasterManager课堂上做这样的事情:

protected function createMyCustomDriver(array $config) {
  // return instance....
}
Run Code Online (Sandbox Code Playgroud)

但是有一种扩展方法,但我不知道它是否适用于这个用例或如何使用它...

目标是使用Broadcaster实现,该实现使用ZMQ将这些广播事件发送到WebSocket php服务器实例.

任何帮助赞赏!

编辑:链接到api doc http://laravel.com/api/5.1/Illuminate/Broadcasting/BroadcastManager.html

php laravel-5.1

3
推荐指数
1
解决办法
1454
查看次数

如何使用CSS重新创建tex的过括号

我需要将一些公式放到HTML中,并要对值的来源进行描述。在TeX中,我将简单地使用overbracket / underbracket软件包(例如,请参见https://tex.stackexchange.com/questions/132526/overbrace-with-square-bracket)。

是否有类似的“库”或仅使用CSS就能达到相同效果的“库”?(只用方括号就可以了)。

我自己尝试重新创建外观类似的东西,但是在尝试显示支架时遇到了问题。

例如,我尝试使用表格来使描述显示在公式的上方或下方,但随后公式的一部分不再与其余公式在同一行。另外,使用边框我无法重新创建链接中所示的方括号...

编辑:所以这应该可视化我遇到的问题:

的CSS

table {
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)

html

<table>
  <tr><td>+1</td><tr>
  <tr><td>value #1</td><tr>
</table>
<table>
  <tr><td>value #2</td><tr>
  <tr><td>+1</td><tr>
</table>
= 10
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/jcqjr8ge/

基本上,所有的“ +1”和“ = 10”应该在同一行上,因为对这些值的描述应该在这些值的上方或下方。

html css

3
推荐指数
1
解决办法
135
查看次数

javascript - 以编程方式添加和删除智能 getter

我正在尝试以编程方式从对象中添加和删除(用于缓存目的)getter。我正在添加一个这样的吸气剂:

Object.defineProperty(obj, 'text', {
  get: getter
})
Run Code Online (Sandbox Code Playgroud)

obj.text 只应在第一次访问时对其进行评估,并将计算出的值缓存以供后续调用使用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get展示了如何实现这样的智能 getter:

get notifier() {
  delete this.notifier;
  return this.notifier = document.getElementById('bookmarked-notification-anchor');
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法delete this.text在我的getter函数中使用。我发现的是,这this是对象的原型而不是实例 - 对吗?如果是这样,我如何删除实例的 getter 并将其替换为计算值?

编辑:

根据评论,getter 和 object 看起来像这样:

var obj = {}
obj.value = '2018-04-21T12:00:00Z000'

Object.defineProperty(obj, 'text', {
  get: function () {
    delete this.text  // doesn't seem to work

    if (this.value == null) return ''
    var text = this.value.split('T')[0].split('-').reverse().join('.')
    this.text = text
    return text // return this.text ends in …
Run Code Online (Sandbox Code Playgroud)

javascript getter defineproperty

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

laravel 5 - 启用本地资产文件的缓存

我目前正在使用 Laravel 5 开发应用程序,但遇到了以下问题:

例如,当我包含来自外部服务器的 .js 文件时,脚本加载了未修改的 304 - 这很好。根据 chrome 的网络选项卡,它在 146 毫秒内加载。当我包含本地资产时,使用 {{ asset('path to asset') }} 我总是得到 200,并且加载文件需要更长的时间(大约 800 毫秒)。

如何管理缓存资产文件?我猜这是浏览器或网络服务器的问题。

  • 浏览器:Chrome 43.0.2357.52
  • 网络服务器:我正在使用 artisan 内置网络服务器

php caching google-chrome laravel laravel-artisan

0
推荐指数
1
解决办法
3042
查看次数