Laravel将Markdown保存到数据库 - 不要理解

时间:2016-06-09 21:37:22

标签: laravel markdown laravel-5.2

我不愿意发布这个,但我无法理解降价实际上是如何拯救"到数据库。

当我创建迁移时,我将添加列并指定值的类型(即整数,文本,字符串等),并且在网站上的操作过程中,用户将输入不同的信息然后保存在DB中。没问题。

我似乎无法绕过降价过程。我已经阅读过关于保存HTML或保存markdown文件,在运行时呈现,所有这些的优点和缺点。

所以,说我使用像Tiny MCE这样的编辑器,它将自己附加到textarea。当我点击"提交"在表格上,这是如何运作的?验证如何工作?您可以直接回答我的问题或提供一些资源来帮助我进一步理解。我有一个基于Laravel的应用程序,所以我猜测我需要使用像https://github.com/GrahamCampbell/Laravel-Markdown这样的包以及一个编辑器(即Tiny MCE)。

谢谢!

2 个答案:

答案 0 :(得分:6)

让我们从一个更基本的例子开始:StackOverflow。在编写/编辑问题或答案时,您要在textarea字段中键入Markdown文本。低于textarea的预览,显示转换为HTML的Markdown文本。

这种方式的工作方式(简化了一点)是StackOverflow使用JavaScript库将Markdown解析为HTML。这种解析完全发生在客户端(在浏览器中),并且没有任何内容发送到服务器。在textarea按下每个按键时,预览会快速更新,因为服务器没有来回。

但是,当您提交问题/答案时,预览中的HTML将被丢弃,并且textarea中的Markdown文本将转发到StackOverflow服务器,并将其保存到数据库中。在某些时候,服务器还将Markdown转换为HTML,以便当另一个用户独自出现并请求查看该问题/答案时,该文档将由服务器以HTML格式发送给用户。我说“在某些时候”,因为这是你必须决定转换何时发生的地方。您有两种选择:

  1. 如果服务器在将HTML保存到数据库时转换HTML,则它将保存为两列,一列用于Markdown,另一列用于HTML。稍后,当用户请求查看文档时,将从数据库中检索HTML文档并将其返回给用户。但是,如果用户请求编辑文档,则将从数据库中检索Markdown文档并将其返回给用户,以便她可以对其进行编辑。

  2. 如果服务器仅将Markdown文本存储到数据库中,那么当用户请求查看文档时,将从数据库中检索Markdown文档,转换为HTML然后返回给用户。但是,如果用户请求编辑文档,则将从数据库中检索Markdown文档并将其返回给用户(跳过转换步骤),以便她可以对其进行编辑。

  3. 请注意,在任一选项中,服务器都在转换为HTML。转换发生的唯一时间客户端(在浏览器中)是用于预览。但“预览”转换不用于在编辑模式之外显示文档或将文档存储在数据库中。

    StackOverflow和TinyMCE之间的唯一区别在于,在TinyMCE中,预览也是编辑器。在幕后,仍然会发生相同的过程,当您提交时,它是发送到服务器的Markdown。用于预览的HTML仍然被丢弃。

    实现此类系统时的主要问题是,如果用于预览的Markdown实现与服务器使用的实现不同,则预览可能不是非常准确。因此,通常最好选择两个非常相似的实现,或者,如果可用,对两者使用相同的实现。

答案 1 :(得分:0)

实际上很简单。

在论坛上,在论坛中,使用了BBCodes,它们基本上都是伪标签,允许您在某些方面格式化文本。例如, "use strict"; var renderer, scene, camera, light, geometry, material, mesh; var scene2, mesh1, mesh2, mesh3, mesh4; window.onload = function() { renderer = new THREE.WebGLRenderer(); renderer.setSize(750, 750); renderer.setClearColor( 0x102030, 1); document.body.appendChild(renderer.domElement); scene = new THREE.Scene(); // the base scene camera = new THREE.PerspectiveCamera(30, 1); camera.position.set(0, 0, 30); camera.lookAt(new THREE.Vector3(0,0,0)); light = new THREE.AmbientLight(0x444444); scene.add(light); light = new THREE.DirectionalLight(0xff8888, 1); light.position.set(10, 10, 20); scene.add(light); light = new THREE.DirectionalLight(0x88ff88, 1); light.position.set(-10, 10, 20); scene.add(light); mesh1 = makebox(-3, -3, 0); // a couple of individual objects scene.add(mesh1); mesh2 = makebox(-3, 3, 0); scene.add(mesh2); scene2 = new THREE.Scene(); // a sub-scene, the boxes on the right mesh3 = makebox( 0, -3, 0); scene2.add(mesh3); mesh4 = makebox( 0, 3, 0); scene2.add(mesh4); scene2.position.set(3, 0, 0); scene.add(scene2); fnloop(); } function fnloop() { mesh1.rotateY(.01); // individual object scene2.rotateY(-.01); // scene of 2 objects renderer.render(scene, camera); requestAnimationFrame(fnloop); } function makebox(x, y, z) { geometry = new THREE.BoxGeometry(1, 2, 3); material = new THREE.MeshPhongMaterial( { color:0xffffff, wireframe:false } ); mesh = new THREE.Mesh(geometry, material); mesh.position.set(x, y, z); return mesh; } 用于表示“将此文字设为粗体”。在Markdown中,它发生的情况完全相同,但与[b][/b]*text*等其他字符相同。

这样做只会让您的用户使用特定的格式,否则如果您允许编写纯HTML,则会出现 XSS(跨站点脚本)问题,而且不是一个好主意。

然后,您应该将HTML保存在数据库中。例如,您可以使用markdown-js这是一个将Markdown解析为HTML的Markdown解析器。

我已经看到TinyMCE默认不使用Markdown,因为它只是一个WYSIWYG编辑器,但看起来像是it also supports a markdown-like formatting

Laravel-Markdown是服务器端降价渲染助手,您可以在Laravel Blade视图中使用它。 markdown-js是客户端,例如,它可用于显示您实时写入的内容。