标签: symfony-components

如何在symfony2中创建自定义事件

我想创建调用的自定义事件,user_logged以便我可以将我的侦听器附加到这些事件.

我想在用户登录时执行一些功能.

php events symfony observer-pattern symfony-components

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

为简单的应用程序生成PHAR

我正在尝试使用Symfony2控制台库构建CLI工具.我有一些基本的工作,现在我想把它打包成一个phar.我已经阅读了一些例子,但我看到的那些非常简单(3个文件,没有命名空间等).

在我的src/目录中,我有以下内容:

在此输入图像描述

上面src/我有一个console.php我执行运行应用程序.我也有一个vendors/目录,因为我正在使用composer来安装依赖项.console.php很简单:

#!/usr/bin/env php
<?php

set_time_limit(0);
$loader = require 'vendor/autoload.php';

use Symfony\Component\Console\Application;
use Bendihossan\Pinfo\Command\EnvironmentCommand;
use Bendihossan\Pinfo\Command\ExtensionsCommand;
use Bendihossan\Pinfo\Command\RunAllCommand;

$console = new Application();

$console->add(new RunAllCommand());
$console->add(new EnvironmentCommand);
$console->add(new ExtensionsCommand);

$console->run();
Run Code Online (Sandbox Code Playgroud)

从我对构建一个phar的理解(我很少)我认为我需要将其console.php作为存根和其他所有内容src/添加到我的所有依赖项中vendors/.

查看phpmaster.com上的示例代码,他们手动指定每个文件包含在phar中使用file_get_contents,但是我需要维护我的目录结构才能使用composer的自动加载器并保持PSR-0目录结构.

有没有一种简单的方法来创建.phar并在其中维护我的目录结构,所以我仍然可以使用composer的自动加载器?

php packaging phar composer-php symfony-components

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

Symfony Dependency Injection注入了新的类实例

我正在使用symfony/dependency-injection组件(注意:不使用完整的堆栈框架)

在注册新服务时,我想在构造函数中注入一个类的新实例.例:

$container->register('session', 'Vendor\Core\Session')
    ->addArgument(new PhpBridgeSessionStorage());
Run Code Online (Sandbox Code Playgroud)

该示例非常有效,但如果我想使用yml文件来定义此服务该怎么办?就像是:

services:
  session:
    class: Vendor\Core\Session
    arguments: [ new Class\To\Inject ]
Run Code Online (Sandbox Code Playgroud)

我是否被迫将Class\To\Inject定义为新服务?或者创建一个服务工厂?

php yaml dependency-injection symfony symfony-components

8
推荐指数
1
解决办法
5826
查看次数

Laravel 4队列:听取时间

我跑了php artisan queue:listen大约27分钟后,它停止处理更多的工作.在我的错误日志中,我看到错误:

exception 'Symfony\Component\Process\Exception\RuntimeException' with message 'The process timed out.' in /var/www/l4site/vendor/symfony/process/Symfony/Component/Process/Process.php:413
Stack trace:
#0 /var/www/l4site/vendor/symfony/process/Symfony/Component/Process/Process.php(201): Symfony\Component\Process\Process->wait(NULL)
#1 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(63): Symfony\Component\Process\Process->run()
#2 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(50): Illuminate\Queue\Listener->runProcess(Object(Symfony\Component\Process\Process), 128)
#3 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php(69): Illuminate\Queue\Listener->listen(NULL, 'default', 0, 128, 60)
#4 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Console/Command.php(108): Illuminate\Queue\Console\ListenCommand->fire()
#5 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Command/Command.php(240): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Console/Command.php(96): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Application.php(193): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#8 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Application.php(106): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /var/www/l4site/artisan(59): Symfony\Component\Console\Application->run()
#10 {main}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是一个错误吗?我不认为听众应该超时!


更新

第二轮听众在3小时后超时.我用php-fgm在nginx上运行Laravel 4.

php laravel symfony-components laravel-4

7
推荐指数
3
解决办法
5181
查看次数

Goutte/Guzzle可以强制进入UTF-8模式吗?

我正在使用Goutte从UTF-8网站上搜索,Goutte内部使用Guzzle.该网站声明了UTF-8的元标记,因此:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

但是,内容类型标题是:

Content-Type: text/html
Run Code Online (Sandbox Code Playgroud)

并不是:

Content-Type: text/html; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

因此,当我刮,Goutte没有发现它是UTF-8,并且错误地抓取数据.远程站点不在我的控制之下,所以我无法解决问题!这是一组用于复制问题的脚本.一,刮刀:

<?php

require_once realpath(__DIR__ . '/..') . '/vendor/goutte/goutte.phar';

$url = 'http://crawler-tests.local/utf-8.php';
use Goutte\Client;

$client = new Client();
$crawler = $client->request('get', $url);
$text = $crawler->text();
echo 'Whole page: ' . $text . "\n";
Run Code Online (Sandbox Code Playgroud)

现在要放置在Web服务器上的测试页面:

<?php
// Correct
#header('Content-Type: text/html; charset=utf-8');

// Incorrect
header('Content-Type: text/html');
?>  
<!DOCTYPE html>
<html>
    <head>
        <title>UTF-8 test</title>
        <meta charset="utf-8" />
    </head>
    <body>
        <p>When the Content-Header header is incomplete, the pound sign …
Run Code Online (Sandbox Code Playgroud)

php web-scraping goutte guzzle symfony-components

6
推荐指数
2
解决办法
8902
查看次数

为什么我不能让Symfony Finder像服务一样?

我使用Symfony标准版并试图让Symfony Finder组件像服务一样,但没有找到它.要使用Finder,我需要手动创建它,如:

$finder = new Symfony\Component\Finder\Finder();
Run Code Online (Sandbox Code Playgroud)

为什么我无法从服务容器中获取它?这是错的吗?

PS Symfony Filesystem组件存在于服务容器中,并按名称提供filesystem.

php symfony symfony-components symfony-filesystem symfony-finder

6
推荐指数
2
解决办法
2917
查看次数

从一个命令中运行多个 Symfony 控制台命令

我在 Symfony 控制台应用程序中定义了两个命令,clean-redis-keys并且clean-temp-files. 我想定义一个clean执行这两个命令的命令。

我该怎么做?

php symfony-components symfony-console

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

验证器组件中的转换

我目前正在将Symfony Validator组件集成到自定义PHP应用程序中.到目前为止,一切都工作得很好,我可以验证我的用户输入.

现在我想将验证消息转换为另一个语言环境并集成了翻译组件(无论如何由于DefaultTranslator中的TranslatorInterface的延迟而需要它).

默认转换程序仅支持硬编码到ValidationConstraints中的语言环境.据我所知,我需要指定一个自定义转换器实例,它从Validator组件中的xliff文件加载字符串.

这是我有多远,但德国翻译可悲的是没有加载:

    $translator = new Translator('de_DE');
    $translator->setFallbackLocale('en_GB');
    $translator->addLoader('xliff', new XliffFileLoader());

    $builder = new ValidatorBuilder();
    $validator = $builder
            ->setTranslator($translator)
            ->getValidator();
    $violations = $validator->validateValue($input, self::getValidationConstraints());
Run Code Online (Sandbox Code Playgroud)

有什么建议我可能会错过这里吗?

symfony symfony-components

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

将 Symfony\Console 用于交互式 php cli 应用程序

我想开发一个基于交互式命令的 php 应用程序,所以我做了一些研究并碰到了 Symfony\Console 组件。这很棒,因为它让met运行

php script.php command --option
Run Code Online (Sandbox Code Playgroud)

但是,脚本然后运行命令并关闭,我希望能够运行另一个命令。所以基本上,像

php script.php
Run Code Online (Sandbox Code Playgroud)

然后在 php://stdin 上监听命令,结构为

command --option
Run Code Online (Sandbox Code Playgroud)

然后运行命令并开始侦听新命令。当运行特定的“退出”命令时,脚本应终止。

我对 Symfony 和 Console 组件比较陌生,所以对如何使用 Symfony\Console 实现这一点有什么想法吗?因为我真的很喜欢 Symfony\Console 抽象所有命令的方式。

php console command-line-interface symfony symfony-components

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

如何使用Symfony Finder组件按DESC顺序对文件进行排序?

默认情况下,Symfony Finder组件ASC顺序对文件进行排序.

//sorting by ASC order
$finder->files()->in($this->getDumpPath())->sortByModifiedTime();
Run Code Online (Sandbox Code Playgroud)

我怎样才能按文件排序DESC

php symfony symfony-components symfony-finder

5
推荐指数
3
解决办法
3181
查看次数

使用OptionsResolver组件进行高级类型验证

我需要允许类型实现两个接口(FooBar),而不是其中之一.

interface Foo {};
interface Bar {};

class Foz implements Foo {};
class Baz implements Bar {};
class Foobar implements Foo, Bar {};

$resolver = new OptionsResolver();
$resolver->setRequired('data');
$resolver->setAllowedTypes('data', ['Foo', 'Bar']);
Run Code Online (Sandbox Code Playgroud)

错误!允许FozBaz实例.


我需要允许类型的子类Bar,而不是Bar实例.

class Bar {};
class Foobar extends Bar {};
class FoobarBaz extends Foobar {};

$resolver = new OptionsResolver();
$resolver->setRequired('data');
$resolver->setAllowedTypes('data', ['Bar']);
Run Code Online (Sandbox Code Playgroud)

错误!也允许Bar实例.


我可以重新设计我的类/接口,但这不是设计问题.那么,用这个组件可以实现吗?

php symfony symfony-components options-resolver

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

扩展Symfony2控制器解析器

我正在创建一个bundle,如果request是Ajax请求,它可以将fooAction重命名为fooAjaxAction.正如那个问题的答案所说,我必须扩展控制器解析器类.ResourceNotFoundException如果我更改config.yml中的controller_resolver.class,我有一个.但如果我不这样做,我没有任何错误(但没有覆盖,所以这不是我想要的)

我的问题是:如何注册我的新控制器解析器并使用它?我是对的 ?错了吗?

这就是我所做的:

您可以在packagist中找到我的Bundle进行测试并通过以下方式下载:

composer require "/prefix-bundle":"dev-dev"

在AppKernel.php中激活它:

<?php 
// AppKernel.php
new \PrefixBundle\PrefixBundle()
Run Code Online (Sandbox Code Playgroud)

配置

# App/Config/config.yml
parameters:
    controller_resolver.class: PrefixBundle\Component\Controller\ControllerResolver
Run Code Online (Sandbox Code Playgroud)

所以这是我的自定义控制器.

<?php 
namespace \PrefixBundle\Component\Controller;

use Symfony\Component\HttpKernel\ControllerControllerResolver as BaseControllerResolver;
use Symfony\Component\HttpFoundation\Request;

class ControllerResolver extends BaseControllerResolver
{

    public function getArguments(Request $request, $controller)
    {
        parent::getArguments($request, $controller);
    }
}
Run Code Online (Sandbox Code Playgroud)

我假设这个控制器没有做任何事情,我将来会添加逻辑.

php symfony symfony-components

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

成功登录后,Silex不会指示

我在使用Silex和安全服务方面遇到了一些问题.

当用户(正确)将数据输入我的登录表单时,它不会被重定向到应用程序URL.他仍然在同一页面,并在登录表单页面中进行调试,在安全提供程序中没有任何内容表明他已经过身份验证.但是,在"成功登录"之后,如果我直接在浏览器中输入网址,我可以访问,因为我已通过身份验证.像这个过程:

首页 - >登录检查(登录确定) - >主页(未经验证) - >/app(已验证)

如果登录工作正常,我希望它直接重定向到/ app,并理解为什么在我的主页中,即使成功登录后,安全提供商仍然说我没有经过身份验证.

我正在写下面的代码:

的index.php

<?php

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Validator\Constraints as Assert;

require_once __DIR__.'/../vendor/autoload.php';

$app = new Silex\Application();

/**
 * App Registrations & Debug Setting
 */

$app
    ->register(new Silex\Provider\TwigServiceProvider(), array('twig.path' => __DIR__.'/../views'))
    ->register(new Silex\Provider\UrlGeneratorServiceProvider())
    ->register(new Silex\Provider\SessionServiceProvider())
    ->register(new Silex\Provider\FormServiceProvider())
    ->register(new Silex\Provider\ValidatorServiceProvider())
    ->register(new Silex\Provider\TranslationServiceProvider(), array(
        'translator.messages' => array(),
    ))
    ->register(new Silex\Provider\DoctrineServiceProvider(), array(
        'db.options' => array(
            'driver'   => 'pdo_mysql',
            'dbname'   => 'pomodesk',
            'host'     => 'localhost',
            'user'     => 'root',
            'password' => 'root'
        )
    ))
    ->register(new Silex\Provider\SecurityServiceProvider(), …
Run Code Online (Sandbox Code Playgroud)

php authentication silex symfony-components

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