我最近从 Slim 2.X 迁移到 Slim 3.X,我发现了一个可能有点愚蠢但在某些方面让我烦恼的问题。
新的 Slim 3.X,作为与旧 2.X 版本的区别,它使用基于 Pimple 构建的依赖注入(inject)容器 (DIC) 实现了一个新的容器系统。 .
正如我一直在阅读的那样,我发现这是一个非常重要的改进,因为它允许您以多种不同的方式管理您的 PHP 应用程序。
当我开始玩弄它的新东西时,我发现了一些令人困惑的东西,这可能是我遗漏的东西。
我使用 PHPStorm;我喜欢这个 IDE 的地方之一是它的代码完成以及编写代码和理解类的便利(我实际上是一名学生,所以这对我有很大帮助)。
当我编写 Slim 路由时,如果我想访问存储在容器内的 View 对象,我必须使用 $this->view 变量来引用它。问题是,通常情况下,当我提到某个对象时,PHPStorm 会列出该对象内的方法和属性,但 $this 对象不会发生这种情况。
我想,在路由内部,Slim 将所有路由功能和所有容器对象存储到 $this 分配器中。
$container = $app->getContainer();
$container['view'] = new \Slim\Views\PhpRenderer('protected/views/');
$app->get('/products', function(Request $request, Response $response) {
$response = $this->view->render($response, 'products.php');
return $response;
})->setName('products');
当我访问我的 /products 路径时,它成功地呈现了我的产品模板并显示了预期显示的内容,所以没有问题。
问题是我希望 PHPStorm 知道路由中的 $this 变量存储了调用路由之前之前设置的所有容器。
我想过 /* @var */ 和 /* @global */ 或类似的东西但是在搜索了一段时间并尝试了不同的东西之后,我还没有' 找到任何可以工作的东西。
总而言之,我想说的是 PHPStorm 是否可以像这样列出容器对象的属性和方法:
谢谢!
最佳答案
最简单的方法是使用单独的 Action 类而不是使用闭包。这还具有更易于测试的好处。
首先创建你的 Action ,将它的依赖注入(inject)到它的构造函数中,并编写一个将被 Slim 调用的 `__invoke`` 方法:
class ProductsListAction {
protected $view;
public function __construct(\Slim\Views\PhpRenderer $view) {
$this->view = $view;
}
public function __invoke($request, $response, $args) {
$response = $this->view->render($response, 'products.php');
return $response;
}
}
为此,您现在需要一个 DIC 工厂:
$container['ProductsListAction'] = function ($c) {
return new ProductsListAction($c['view']);
};
您现在可以将新操作注册为可调用路由:
$app->get('/products', 'ProductListAction');
现在,PhpStorm 将在您的 ProductsListAction 类中正确地自动完成。
关于PHPStorm 和 Slim 3.X DIC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532754/
一般来说,我是Middleman和ruby的新手。我已经安装了Ruby我已经安装了Middleman和gem以使其运行。我需要使用slim而不是默认的模板系统。所以我安装了Slimgem。Slim的网站只说我需要'slim'才能让它工作。中间人网站说我只需要在config.rb文件中添加模板引擎,但是没有给出例子...对于没有ruby背景的人来说,这没有帮助。我在git上找了几个config.rb,它们都有:require'slim'和#Setslim-langoutputstyleSlim::Engine.set_default_options:pretty=>true#Se
我知道这篇文章在这里:RubySlim-Howdoyoudefineanelement'sclasswitharailshelperorvariable?我已经尝试了所有三种解决方案。不幸的是,对我来说,没有一个在工作。论坛.rb.panel.panel-heading.span=@forum.name.panel-body.row.col-md-7#{t('global.topic')}.col-md-3.value.title.col-md-1.value.topic.col-md-1.value.dateforum_feed.js.coffeewindow.ForumFeedUI
在SLIM中编写HTML注释时:/!Thefirstlineofcomments/!Thesecondlineofcomments输出变成所有其他生成的HTML格式和缩进都正确,因为我将pretty设置为true我正在编写供其他人使用的模板,因此我需要带有换行符的注释以提高可读性。 最佳答案 你可以像这样在Slim中实现单行多行注释:/!ThefirstlineofcommentsThesecondlineofcomments应该输出这个: 关于ruby-在Slim模板中,不同行的HTM
在给定span、文本和其他的情况下,如何将'Featured'文本嵌套在a标记中>span是sibling吗?liahref="#"class="selected"spanclass="icon-before"Featuredspanclass="icon-after" 最佳答案 liahref="#"class="selected"spanclass="icon-before"|Featuredspanclass="icon-after"给予:Featured 关于ruby-on-ra
我正在尝试在独立(非Rails)应用程序中做这样的事情:layout.slim:h1Hello.content=yield显示.slim:=object.name=object.description我不知道如何指定布局和模板。这对slim(或haml)有可能吗?谢谢。 最佳答案 layout.slim文件如下所示:h1Hello.content==yieldcontents.slim文件如下所示:=name这可以缩短,但为了便于解释,我将其分成了各个步骤。require'slim'#Simpleclasstorepresentan
我经常想嵌套元素,比如下面的导航:ullia(href="#")linkNamelia(href="#")linkNamelia(href="#")linkName是否可以将li和a放在同一行?像li>a这样的语法会很好。 最佳答案 我相信你可以做这样的事情ulli:ahref="#"Link1li:ahref="#"Link2参见内嵌标签:http://rdoc.info/gems/slim/file/README.md#Inline_tags 关于ruby-on-rails-slim
你如何在slim中写下以下内容?模板语言?JointheGooglegroupandletusknowwhatyouthink,orwhatotherfeaturesyou’dliketosee.我尝试了以下方法:p'Jointheahref=""GoogleGroup'andletusknowwhatyouthink,orwhatotherfeaturesyou’dliketosee但这行不通,因为“Group”和“and”这两个词之间没有空格。 最佳答案 显然你可以在引号后添加额外的空格:p'Jointheahref=""Goo
我正在尝试呈现一个以图标开头的链接。我正在使用Slim模板引擎以及BootstrapCSS.通常你可以通过以下方式做到这一点:MyProfile根据Slim的文档,我们可以使用==在不转义HTML的情况下呈现。因此,将其转换为Slim,我尝试了以下变体:li==link_to"MyProfile",current_userli==link_to"#{''.html_safe}MyProfile",current_userli=link_to"#{''.html_safe}MyProfile",current_user呈现的所有变体MyProfile转义i标签。如何阻止Slim或Rail
当类不应在Slim中显示时,我想删除类属性。在ERB中,我可以使用:/>我如何在Slim中执行此操作?我找到了这个,但我觉得必须有一个更惯用的解决方案:| 最佳答案 如果一个属性的值为nil,那么整个属性将被忽略(实际上这发生在nil或false大多数情况下,但看起来class属性对于false和true的行为不同):inputclass=('foo'ifcondition)这将输出如果条件为真,并且如果condition为假。 关于ruby-on-rails-当不应显示属性时,删除sl
一种方式:javascript_tagdo=="varall_product_ids=#{existing_ids.to_json};"=="varproducts_json=#{@filter.data.to_json};"或:=%Q{varall_product_ids=#{existing_ids.to_json};varproducts_json=#{@filter.data.to_json};}有没有更好的解决方案? 最佳答案 slimjavascript:varall_product_ids="#{existing_id