jjzjj

php - 如何检查许多 Controller 方法正在处理的对象是否存在 DRY 和 Laravel 风格?

coder 2024-04-20 原文

在 Laravel Controller 中,我有几个方法都是从获取数据库记录开始,然后在检查是否找到数据后继续渲染 View ,或者在没有数据的情况下转到 404 页面.

这是一个例子:

<?php

function get_show_user($id)
{
    $user = static::get_user($user_id);
    if (!$user) {
        return Response::error('404', static::$some_common_error404_message);
    }
    return View::make('users.show_readonly_user_data')->with('user', $user);
}

function get_edit_user($id)
{
    $user = static::get_user($user_id);
    if (!$user) {
        return Response::error('404', static::$some_common_error404_message);
    }

    return View::make('users.display_edit_user_form')->with('user', $user);
}

我在这些方法中重复整个 if (!$user) 语句,即使它们都做同样的事情。

我宁愿做这样的事情:

function get_show_user($id)
{
    $user = Users::find($id);
    static::go404_if_null($user);
    return View::make('users.show_readonly_user_data')->with('user', $user);
}

function get_edit_user($id)
{
    $user = Users::find($id);
    static::go404_if_null($user);
    return View::make('users.display_edit_user_form')->with('user', $user);
}

实现这种 DRY 功能的最佳方式是什么?

显然,一个简单的return Response::error('404') 在常见的存在性检查器方法中不起作用,因为它只会从该方法返回。

Event::fire('404') 似乎也不理想,因为它不会终止触发它的方法。

也许这里需要使用异常,但我不确定这个,或者它应该如何在 Laravel 中完成。我应该在哪里捕获 Controller 的 404 异常?

最佳答案

我认为解决这个问题的最佳方法是在 Controller 上添加前置过滤器。

public static $require_user = array(
    'edit_user',
    'show_user',
);

public function before()
{
    $route = Request::route();
    if ( in_array( $route->controller_action, static::$require_user ) )
    {
        $this->user = User::find( $route->parameters[0] );
        if ( is_null($this->user) ) return Response::error('404');
    }
}

在构建 Controller 之后但在调用方法之前调用过滤器之前。如果前过滤器返回 null 以外的任何内容,则不会调用该方法,因此会停止执行。

这里我们获得了当前正在执行的路由,因此我们可以检查将针对我们的数组 $require_user 调用哪个方法。这让我们可以使用不需要用户 ID 的方法,例如登录。

然后我们检索用户实例,从传递给方法的内容中获取 id。您可能应该在此处添加更多错误处理。

最后,我们检查返回的用户是否为空,即未找到。如果是这种情况,我们将返回 404 响应,停止执行该方法。

希望对您有所帮助!

关于php - 如何检查许多 Controller 方法正在处理的对象是否存在 DRY 和 Laravel 风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13000134/

有关php - 如何检查许多 Controller 方法正在处理的对象是否存在 DRY 和 Laravel 风格?的更多相关文章

  1. php - Silex:动态路由缩放代码库 - 2

    我的路由定义如下所示(使用this作为引用以在代码中获得更好的顺序):$app->get('/actor/{id}','TMDb\Controller\TMDbController::actorAction');这就是我的Controller的样子:classTMDbController{publicfunctionactorAction(Request$request,Application$app){...}}它成功了,但我还没有找到在我的ActionController中获取id值的方法。 最佳答案

  2. php - 在不创建虚拟主机的情况下配置 laravel - 2

    我是Laravel的新蜜蜂。我可以按照此tutorial中给出的方式制作虚拟主机来运行它.但是我有没有其他方法可以在不触及我的conf文件或不创建虚拟主机的情况下正确配置和运行laravel?我还没有找到任何答案。 最佳答案 打开CLI,导航到你的laravel根文件夹$cd./path/to/laravel-installation并为Laravel4输入:$phpartisanserve对于laravel3类型:$php-Slocalhost:8000-tpublic现在您可以在浏览器上访问localhost:8000

  3. php - 为 Controller 设置变量 - Laravel 4 - 2

    事情是这样的。我需要以某种方式为整个Controller设置一个全局变量。我需要它,因为Controller中的所有操作都需要通过GET方法接收数据。我认为也许将它放在__construct中会使它像这样工作:publicfunction__construct(){$this->team_id=Input::get('team_id');}但是它说找不到team_id....感谢您的帮助,阿拉 最佳答案 在将其设置为__construct之前,您是否在Controller类中设置了全局变量名称$team_id?

  4. php - laravel 4 auth::attempt 明文密码 - 2

    你如何告诉laravelauth::attempt密码字段以明文形式存储而不是假设它是散列的?在guard.php中publicfunctionattempt(array$credentials=array(),$remember=false,$login=true){$this->fireAttemptEvent($credentials,$remember,$login);$user=$this->provider->retrieveByCredentials($credentials);//IfanimplementationofUserInterfacewas

  5. php - 对象构造函数的参数统计(外部方法) - 2

    我写了一个自动加载类的代码,我遇到了一个问题,我认为是因为实现/设计类型的弱点。我想要做的是计算对象(外部)的默认参数。我可以计算传递给构造函数的参数的数量,但我需要检查内部对象构造函数,而该方法对我没有帮助。代码示例://Thisissimplefunctiontest($arg1,$arg2,$arg3){returnfunc_num_args();}//HowcanIcountlikethis?classload{publicfunction__construct($id="",$path=""){}}$l=newload();//Howtocou

  6. php - Laravel:无法检索关系 - 2

    当我使用::where()语法时,Laravel4似乎无法获得关系。所以这就是我所拥有的:<?php//worksfine$questions=Auth::user()->questions;//error$questions=User::where('profilename','=',$username)->questions;//error$questions=User::where('profilename','=',$username)->get()->questions;?>第

  7. php - Laravel Eloquent 模型——模型扩展模型 - 2

    是否可以用另一个模型扩展laravel4eloquent模型,假设我有一个扩展eloquent类的用户模型,另外还有第二个类,一个扩展用户类的管理员类?如果我只是将管理员类链接到用户,我必须通过首先获取用户的管理员属性然后获取管理员属性来访问管理员属性。编辑:假设我的管理员没有扩展用户。我必须访问例如像这样的电话号码(管理员属性)$user=User::find(1);$phone=$user->administrator->phone;但是通过让管理员扩展用户,我可以像这样直接访问电话号码$user=Administrator::find(1);(请注意,传递给管理员的id与我用来获

  8. php - 在 PHP 中将对象和整数相加的语义? - 2

    classwat{public$a=3.14;public$x=9;public$y=2;}$a=newwat();var_dump(1000+$a);var_dump($a+1000);输出是:int(1001)int(1001)好吧,添加wat*objecttoaninteger显然不是正确的做法,因为PHP提示说“Objectofclasswatcouldnotbeconvertedtoint”,但是,它有什么作用?(我问这个也有一个实际的原因,我想重构一个函数来摆脱“PHPNotice”,同时仍然保持行为完全不变。)*:http://img.youtube.com/vi/kXE

  9. php - 如何在 Laravel 中列出嵌套表格中的所有项目 - 2

    我正在使用Laravel的EloquentORM,但在急切加载要显示的项目时遇到了问题。场景如下:用户关注博客博客有帖子我有一个名为Relationships的数据库表,该表用于存储用户ID和博客ID,以显示哪个用户正在关注哪个博客。我有一个用于描述博客的博客表,还有一个用于帖子的表。关系表将是我的数据透视表,用于将用户与博客表连接在一起。现在,我需要在列表中列出用户关注的所有博客中的所有帖子。这是我的用户模型:publicfunctionfollowing(){return$this->has_many_and_belongs_to('Blog','re

  10. php - PHP 中的对象赋值 - 2

    我是一名PHP学习者。请帮助我处理以下PHPOOP代码:classx{}$x=newx;$x->name="Chandan";classyextendsx{}//Inheritance$y=newy;var_dump($x);//objectX;ShowsNamepropertyvar_dump($y);//objecty;Empty$y=$x;var_dump($x);//objectX;name=chandanvar_dump($y);//objectX;name=chandan$x->name="Debasis";var_dump($x

随机推荐

  1. php - 如何使用 PHP 从 SFTP 服务器下载文件 - 2

    我希望允许用户直接从sftp服务器下载文件,但在浏览器中。我找到了读取文件和回显字符串的方法(使用ssh2.sftp或phpseclib的连接),但我需要下载,而不是读取。另外,我见过建议从sftp服务器下载到Web服务器,然后从Web服务器使用readfile()到用户本地磁盘的解决方案。但这意味着两个文件传输,如果文件很大,我想这会很慢。可以直接从sftp下载到用户的磁盘吗?欢迎任何回复! 最佳答案 如果您将文件的直接链接添加到您的html(即下载文本),您不需要任何php来允许用户直接从SFTP服务器下载。当然,如果您不想公开

  2. php - 使用 AJAX 和 Codeigniter 从数据库中删除用户 - 2

    我正在尝试使用AJAX和CodeIgniter从数据库中删除用户。当我单击删除链接时,用户被删除但页面被重定向并显示成功消息。AJAX在我的代码中似乎不起作用。这是HTML:<tableclass="tabletable-hover"><thead><tr><th>#</th><th>FirstName</th><th>LastName</th><th>Email</th><th>Username</th><t

  3. php - 应用程序/控制台 Assets :install to S3 using stream wrapper errors - 2

    我有一个流包装器配置为使用Gaufrette与amazons3一起工作bundle来管理文件系统。我可以使用assetic成功转储Assets,我当前的配置如下:knp_gaufrette:adapters:amazon:amazon_s3:amazon_s3_id:site_store.s3bucket_name:%site_store.bucket_name%create:truefilesystems:amazon:adapter:amazonstream_wrapper:protocol:s3filesystems:-amazonassetic:read_from:%cdn_p

  4. javascript - 多个用户的服务器发送事件 - 2

    我正在尝试使用新的Server-SentEventsAPI编写聊天程序,但是,我一直无法弄清楚如何向不同的用户发送不同的事件。由于所有代码都出现在一个PHP文件中,我不确定只向每个用户发送特定事件的最佳方式。您能提供的任何帮助将不胜感激。(我正在使用PHP和Javascript) 最佳答案 假设以下是您的sender.php代码(一个php文件)echo"event:ping\n";$msg1="Thisisfirstuser";echo'data:{"msg":"&#

  5. php - Codeigniter - 从下拉列表中获取值传递给 Controller - 2

    我正在尝试从具有3个选项的表单中传递一个值,因此当用户单击任何选项时,它应该将值传递给Controller​​。我在想也许我可以有像`onChange="selectedValue"这样的东西。我试图从View中抓取帖子,但没有成功。任何帮助将不胜感激查看<label>Reports</label><form><selectNAME="hours"><optionvalue="24">24</option><optionvalue="12">12</

  6. php - 这条线如何运作 : require_once ('Zend/Registry.php' );? - 2

    我在win7上安装了ZendFramework2(ZendFramework+ZendServer)。在Zend/Apache2/htdocs/hello1.php中,我将脚本放在下面:<?phprequire_once('Zend/Registry.php');$registry=Zend_Registry::getInstance();$registry['name']='QuentinZervaas';echosprintf('Mynameis%s',$registry['name']);?&g

  7. php - 为用户存储密码历史的最佳技术? - 2

    我正在开发一个PHP登录系统。我想实现一个限制,以便用户不能使用他们以前使用过的密码(最多5个旧密码)。存储密码的最佳选择是什么?我想出了两个想法:1)表:密码列:密码ID、用户ID、密码1、密码2、密码3、密码4、密码5、上次更改、当前密码。每个用户都有自己的行。随着时间的推移填充列并相应地重写。或2)表:密码列:密码ID、用户ID、密码、更改日期。每个用户最多有6行。PHP将处理计算出当前的截止日期。 最佳答案 选项2是两个选项中更好的一个,除了您实际上不必担心删除行。大多数RDBMS都有一种基于某些东西选择前N条记录的方法。选

  8. php - 一个网页上的多个部分 - 2

    我是一个完全的编程初学者,试图吸收HTML、PHP和MYSQL。这是我的第一个问题。我计划建立一个同时显示“管理”部分和注册用户/成员(member)部分的网站。为了提供更好的画面,请想一想YELP,其中商业机构的部分在顶部,评论在下部。不同之处在于企业所有者/管理员可以访问/编辑业务部分,但不能在评论部分这样做;底部的评论/成员(member)用户反之亦然。我应该如何规划布局?将它们与两个不同的PHP代码放在一个html页面下吗?有人可以提供布局结构作为指导吗?例子<html><?phpinclude(businessowner_admin.php);//witha

  9. php - preg_match 获取文本 - 2

    我有test.php和test1.php我有这个PHP代码正在运行<?php$Text=file_get_contents("http://inviatapenet.gethost.ro/sop/test.php");preg_match_all('~fid="(.*?)"~si',$Text,$Match);$fid=$Match[1][1];echo$fid;?>我想做的是从test.php中获取文本从这个fid='gty5etrf'JavaScript我只需要fid的内容<scripttype='text/

  10. php - 在 Amazon 的 S3 上批量恢复以前的版本 - 2

    所以。我是个白痴。星期五,我以编程方式覆盖了存储桶中的大约14,000个文件,直到今天才意识到这一点。幸运的是,这些文件是有版本控制的。不幸的是,我找不到一个清楚的例子来说明如何编写脚本来遍历文件,然后恢复第二个最近的版本。我一直在浏览Boto文档,我看到了如何删除版本,而不是恢复。如果有人能给我一些显示如何恢复特定版本的代码,我很乐意使用php或python。 最佳答案 这需要您多加注意。我不想尝试为您提供完整的解决方案,因为我没有时间对其进行彻底测试,也不想做出任何promise。但是,也许这会有所帮助。首先,假设我们想要在bo